From 46b0220f5b4c4d564ef13bae7f3c616394d00cae Mon Sep 17 00:00:00 2001 From: Michael Hillcox Date: Sun, 5 Nov 2023 18:42:12 +0000 Subject: [PATCH 01/13] fix: #8 --- CHANGELOG.md | 16 +++------------- .../sunekaer/toolkit/commands/CommandKill.java | 9 ++++++++- gradle.properties | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c238f2c..8f47b94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,5 @@ -## 2.3.8 +## 2.3.9 -### Added +### Fixed -- Released for Forge & Fabric! ๐ŸŽ‰ -- Unrestricted `/tk enchant add [enchantment] [level]` command that will allow items to be enchanted upto level `255` (Minecraft's internal cap) -- Command to remove enchantments `/tk enchant remove [enchantment]` -- Command to repair items `/tk repair` (this works for anything with damage values) -- More kill targets (players and me) -- More lang keys to support up to 255 in roman numerals for enchantment values. - -### Changed - -- Merged all various kill commands into a single command -- Updated to 1.19.2 +- An issue causing the kill commands to not always kill all the entities and throw an error message instead. diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandKill.java b/common/src/main/java/com/sunekaer/toolkit/commands/CommandKill.java index 2f1b6c2..114e55f 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandKill.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/CommandKill.java @@ -25,6 +25,8 @@ import net.minecraft.world.entity.vehicle.AbstractMinecart; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; import java.util.function.BiPredicate; public class CommandKill { @@ -120,8 +122,13 @@ private static void yeetedEntitiesMessage(CommandSourceStack source, int yeetedA private static int yeetEntities(BiPredicate tester, ServerLevel level, Player player) { int entitiesKilled = 0; + Iterable entities = level.getAllEntities(); - for (Entity entity : level.getAllEntities()) { + // Copy the entities to a list to avoid concurrent modification + List entityList = new ArrayList<>(); + entities.forEach(entityList::add); + + for (Entity entity : entityList) { if (entity == null) { continue; } diff --git a/gradle.properties b/gradle.properties index 5b21218..27f9bee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.19.2 enabled_platforms=fabric,forge archives_base_name=ToolKit -mod_version=2.3.8 +mod_version=2.3.9 maven_group=com.sunekaer.mods architectury_version=6.5.77 From d5c6d1b3d4c94799c1cf1caf533642d19f7f8f5b Mon Sep 17 00:00:00 2001 From: Michael Hillcox Date: Sun, 7 Jan 2024 15:55:56 +0000 Subject: [PATCH 02/13] feat: loads of new commands and nice things --- .../java/com/sunekaer/toolkit/Toolkit.java | 11 +- .../com/sunekaer/toolkit/ToolkitPlatform.java | 12 ++ .../toolkit/commands/CommandHand.java | 66 ------- .../toolkit/commands/CommandHotbar.java | 54 ------ .../toolkit/commands/CommandInventory.java | 54 ------ .../toolkit/commands/CommandOreDist.java | 85 --------- .../toolkit/commands/FilterCommand.java | 17 ++ .../sunekaer/toolkit/commands/TKCommand.java | 42 ++-- .../DevEnvCommand.java} | 11 +- .../NightVisionCommand.java} | 19 +- .../commands/inventory/CopyCommand.java | 73 +++++++ .../inventory/InventoryCollector.java | 108 +++++++++++ .../commands/inventory/PrintCommand.java | 81 ++++++++ .../EnchantCommand.java} | 6 +- .../RepairItemCommand.java} | 19 +- .../SlayerCommand.java} | 4 +- .../level/BlockDistributionCommand.java | 98 ++++++++++ .../ClearCommand.java} | 98 +++++----- .../commands/level/DrainFluidCommand.java | 124 ++++++++++++ .../KillEntitiesCommand.java} | 5 +- .../commands/level/MineAreaCommand.java | 179 ++++++++++++++++++ .../toolkit/commands/player/FeedCommand.java | 21 ++ .../toolkit/commands/player/GodCommand.java | 24 +++ .../HealCommand.java} | 8 +- .../player/TeleportDimensionSpawnCommand.java | 78 ++++++++ .../toolkit/jobs/ServerTickJobRunner.java | 58 ++++++ .../toolkit/utils/ChunkRangeIterator.java | 75 ++++++++ .../sunekaer/toolkit/utils/CommandUtils.java | 7 +- .../toolkit/fabric/ToolkitFabric.java | 6 +- .../toolkit/fabric/ToolkitPlatformImpl.java | 34 ++++ .../sunekaer/toolkit/forge/ToolkitForge.java | 6 +- .../toolkit/forge/ToolkitPlatformImpl.java | 30 +++ settings.gradle | 2 +- 33 files changed, 1136 insertions(+), 379 deletions(-) delete mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/CommandHand.java delete mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/CommandHotbar.java delete mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/CommandInventory.java delete mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/CommandOreDist.java create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/FilterCommand.java rename common/src/main/java/com/sunekaer/toolkit/commands/{CommandDevEnv.java => dev/DevEnvCommand.java} (80%) rename common/src/main/java/com/sunekaer/toolkit/commands/{CommandNightVision.java => dev/NightVisionCommand.java} (65%) create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/inventory/InventoryCollector.java create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/inventory/PrintCommand.java rename common/src/main/java/com/sunekaer/toolkit/commands/{CommandEnchant.java => items/EnchantCommand.java} (97%) rename common/src/main/java/com/sunekaer/toolkit/commands/{CommandRepair.java => items/RepairItemCommand.java} (51%) rename common/src/main/java/com/sunekaer/toolkit/commands/{CommandSlayer.java => items/SlayerCommand.java} (96%) create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java rename common/src/main/java/com/sunekaer/toolkit/commands/{CommandClear.java => level/ClearCommand.java} (69%) create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/level/DrainFluidCommand.java rename common/src/main/java/com/sunekaer/toolkit/commands/{CommandKill.java => level/KillEntitiesCommand.java} (97%) create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/level/MineAreaCommand.java create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/player/FeedCommand.java create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/player/GodCommand.java rename common/src/main/java/com/sunekaer/toolkit/commands/{CommandHeal.java => player/HealCommand.java} (67%) create mode 100644 common/src/main/java/com/sunekaer/toolkit/commands/player/TeleportDimensionSpawnCommand.java create mode 100644 common/src/main/java/com/sunekaer/toolkit/jobs/ServerTickJobRunner.java create mode 100644 common/src/main/java/com/sunekaer/toolkit/utils/ChunkRangeIterator.java diff --git a/common/src/main/java/com/sunekaer/toolkit/Toolkit.java b/common/src/main/java/com/sunekaer/toolkit/Toolkit.java index 3d47c18..fa994bf 100644 --- a/common/src/main/java/com/sunekaer/toolkit/Toolkit.java +++ b/common/src/main/java/com/sunekaer/toolkit/Toolkit.java @@ -1,15 +1,14 @@ package com.sunekaer.toolkit; -import com.mojang.brigadier.arguments.ArgumentType; -import com.sunekaer.toolkit.commands.CommandClear; +import com.sunekaer.toolkit.commands.level.ClearCommand; import com.sunekaer.toolkit.commands.TKCommand; import com.sunekaer.toolkit.event.PlayerEvents; +import com.sunekaer.toolkit.jobs.ServerTickJobRunner; import com.sunekaer.toolkit.network.Handler; import dev.architectury.event.events.common.CommandRegistrationEvent; import dev.architectury.event.events.common.LifecycleEvent; import dev.architectury.event.events.common.PlayerEvent; -import net.minecraft.commands.synchronization.ArgumentTypeInfo; -import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import dev.architectury.event.events.common.TickEvent; import net.minecraft.server.MinecraftServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +32,7 @@ public static void init() { Handler.init(); LifecycleEvent.SERVER_STOPPING.register(Toolkit::onServerStopping); LifecycleEvent.SETUP.register(Toolkit::setup); - + TickEvent.SERVER_POST.register((server) -> ServerTickJobRunner.get().onTick(server)); } // Poor mans basic config system :cry: @@ -82,7 +81,7 @@ private static void setup() { } private static void onServerStopping(MinecraftServer minecraftServer) { - CommandClear.EXECUTOR.shutdownNow(); + ClearCommand.EXECUTOR.shutdownNow(); } public static class DefaultedValue implements Supplier { diff --git a/common/src/main/java/com/sunekaer/toolkit/ToolkitPlatform.java b/common/src/main/java/com/sunekaer/toolkit/ToolkitPlatform.java index c6f5751..9c935b2 100644 --- a/common/src/main/java/com/sunekaer/toolkit/ToolkitPlatform.java +++ b/common/src/main/java/com/sunekaer/toolkit/ToolkitPlatform.java @@ -1,10 +1,17 @@ package com.sunekaer.toolkit; import dev.architectury.injectables.annotations.ExpectPlatform; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import org.jetbrains.annotations.Nullable; import java.nio.file.Path; +import java.util.List; public class ToolkitPlatform { @ExpectPlatform @@ -21,4 +28,9 @@ public static TagKey getOresTag() { public static Path getGamePath() { throw new AssertionError(); } + + @ExpectPlatform + public static List getInventoryFromBlockEntity(Level level, BlockPos pos, @Nullable Direction direction) { + throw new AssertionError(); + } } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandHand.java b/common/src/main/java/com/sunekaer/toolkit/commands/CommandHand.java deleted file mode 100644 index 55e2cd6..0000000 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandHand.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.sunekaer.toolkit.commands; - -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.sunekaer.toolkit.network.Handler; -import com.sunekaer.toolkit.network.SetCopy; -import net.minecraft.ChatFormatting; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.core.Registry; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.tags.TagKey; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -public class CommandHand { - public static ArgumentBuilder register() { - return Commands.literal("hand") - .requires(cs -> cs.hasPermission(0)) //permission - .executes(ctx -> getHand( - ctx.getSource(), - ctx.getSource().getPlayerOrException() - ) - ); - } - - private static int getHand(CommandSourceStack source, Player player) { - ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); - if (stack.isEmpty()) { - source.sendFailure(Component.translatable("commands.toolkit.hand.handempty")); - return 0; - } - - String itemName = Objects.requireNonNull(Registry.ITEM.getKey(stack.getItem())).toString(); - List tags = new ArrayList<>(stack.getTags().collect(Collectors.toList())); - - String withNBT = ""; - CompoundTag nbt = stack.save(new CompoundTag()); - if (nbt.contains("tag")) { - withNBT += nbt.get("tag"); - } - - String combinedItemNBT = itemName + withNBT; - - - source.sendSuccess(Component.literal(combinedItemNBT).withStyle(ChatFormatting.YELLOW), true); - Handler.CHANNEL.sendToPlayer((ServerPlayer) player, new SetCopy(combinedItemNBT)); - - if (!tags.isEmpty()) { - MutableComponent tagText = Component.literal("Tags: "); - MutableComponent tagsText = Component.literal(tags.stream().map(TagKey::toString).collect(Collectors.joining(", "))); - tagsText.withStyle(ChatFormatting.RED); - source.sendSuccess(tagText.append(tagsText), true); - } - return 1; - - } -} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandHotbar.java b/common/src/main/java/com/sunekaer/toolkit/commands/CommandHotbar.java deleted file mode 100644 index ad45aa7..0000000 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandHotbar.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.sunekaer.toolkit.commands; - -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.sunekaer.toolkit.network.Handler; -import com.sunekaer.toolkit.network.SetCopy; -import com.sunekaer.toolkit.utils.CommandUtils; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.core.Registry; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; - -import java.util.Objects; - -public class CommandHotbar { - public static ArgumentBuilder register() { - return Commands.literal("hotbar") - .requires(cs -> cs.hasPermission(0)) //permission - .executes(ctx -> getHotbar( - ctx.getSource(), - ctx.getSource().getPlayerOrException() - ) - ); - } - - private static int getHotbar(CommandSourceStack source, Player player) { - StringBuilder clipboard = new StringBuilder(); - for (int slot = 0; slot < 9; slot++) { - ItemStack stack = player.getInventory().getItem(slot); //.inventory.mainInventory.get(slot) - - if (stack.isEmpty()) { - continue; - } - - String itemName = Objects.requireNonNull(Registry.ITEM.getKey(stack.getItem())).toString(); - - String withNBT = ""; - CompoundTag nbt = stack.save(new CompoundTag()); - if (nbt.contains("tag")) { - withNBT += nbt.get("tag"); - } - - clipboard.append(itemName).append(withNBT).append(CommandUtils.NEW_LINE); - } - - source.sendSuccess(Component.translatable("commands.toolkit.clipboard.copied"), true); - Handler.CHANNEL.sendToPlayer((ServerPlayer) player, new SetCopy(clipboard.toString())); - - return 1; - } -} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandInventory.java b/common/src/main/java/com/sunekaer/toolkit/commands/CommandInventory.java deleted file mode 100644 index b2cc919..0000000 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandInventory.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.sunekaer.toolkit.commands; - -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.sunekaer.toolkit.network.Handler; -import com.sunekaer.toolkit.network.SetCopy; -import com.sunekaer.toolkit.utils.CommandUtils; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.core.Registry; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; - -import java.util.Objects; - -public class CommandInventory { - - public static ArgumentBuilder register() { - return Commands.literal("inventory") - .requires(cs -> cs.hasPermission(0)) //permission - .executes(ctx -> getHotbar( - ctx.getSource(), - ctx.getSource().getPlayerOrException()) - ); - } - - private static int getHotbar(CommandSourceStack source, Player player) { - StringBuilder clipboard = new StringBuilder(); - for (int slot = 0; slot < player.getInventory().getContainerSize(); slot++) { - ItemStack stack = player.getInventory().getItem(slot); - - if (stack.isEmpty()) { - continue; - } - - String itemName = Objects.requireNonNull(Registry.ITEM.getKey(stack.getItem())).toString(); - - String withNBT = ""; - CompoundTag nbt = stack.save(new CompoundTag()); - if (nbt.contains("tag")) { - withNBT += nbt.get("tag"); - } - - clipboard.append(itemName).append(withNBT).append(CommandUtils.NEW_LINE); - } - - source.sendSuccess(Component.translatable("commands.toolkit.clipboard.copied"), true); - Handler.CHANNEL.sendToPlayer((ServerPlayer) player, new SetCopy(clipboard.toString())); - - return 1; - } -} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandOreDist.java b/common/src/main/java/com/sunekaer/toolkit/commands/CommandOreDist.java deleted file mode 100644 index cf268a5..0000000 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandOreDist.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.sunekaer.toolkit.commands; - -import com.mojang.brigadier.arguments.IntegerArgumentType; -import com.mojang.brigadier.builder.ArgumentBuilder; -import com.sunekaer.toolkit.ToolkitPlatform; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.commands.Commands; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; - -import java.text.DecimalFormat; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -public class CommandOreDist { - private static final DecimalFormat FORMATTER = new DecimalFormat("########0.00"); - - public static ArgumentBuilder register() { - return Commands.literal("oredist") - .requires(cs -> cs.hasPermission(0)) - .executes(ctx -> { - ctx.getSource().sendFailure(Component.translatable("commands.toolkit.oredist.missing")); - return 1; - }) - .then(Commands.argument("AreaSize", IntegerArgumentType.integer()) - .executes(ctx -> getOreDist( - ctx.getSource(), - ctx.getSource().getPlayerOrException(), - IntegerArgumentType.getInteger(ctx, "AreaSize") - )) - ); - } - - private static int getOreDist(CommandSourceStack source, Player player, int size) { - Map map = new HashMap<>(); - - double searchSize = ((16 * size) >> 1); - double startX = player.position().x - searchSize; - double startZ = player.position().z - searchSize; - double endX = player.position().x + searchSize; - double endZ = player.position().z + searchSize; - Level world = player.getLevel(); - - for (int y = world.getMinBuildHeight(); y < world.getMaxBuildHeight(); ++y) { - for (double x = startX; x < endX; x++) { - for (double z = startZ; z < endZ; z++) { - BlockPos tBlockPos = new BlockPos(x, y, z); - BlockState tBlockState = world.getBlockState(tBlockPos); - Block tBlock = tBlockState.getBlock(); - if (!tBlock.equals(Blocks.AIR) && !tBlock.equals(Blocks.BEDROCK) && !tBlock.equals(Blocks.STONE) && !tBlock.equals(Blocks.DIRT) && !tBlock.equals(Blocks.WATER)) { - if (tBlock.builtInRegistryHolder().is(ToolkitPlatform.getOresTag())) { - ResourceLocation key1 = Registry.BLOCK.getKey(tBlock); - String key = Objects.requireNonNull(key1).toString(); - Object value = map.get(key1.toString()); - if (value != null) { - map.put(key, map.get(key) + 1); - } else { - map.put(key, 1); - } - } - } - } - } - } - - double sum = map.values().stream().reduce(0, Integer::sum); - if (sum == 0) { - source.sendSuccess(Component.translatable("\u00A7c No ores found"), true); - return 1; - } - map.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())).forEachOrdered(x -> - source.sendSuccess(Component.translatable("\u00A7c" + x.getKey() + " \u00A7rCount: " + x.getValue() + " (" + FORMATTER.format(x.getValue() * 100 / sum) + "%%)"), true) - ); - return 1; - } -} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/FilterCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/FilterCommand.java new file mode 100644 index 0000000..53e9d4b --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/FilterCommand.java @@ -0,0 +1,17 @@ +package com.sunekaer.toolkit.commands; + +import com.mojang.brigadier.builder.ArgumentBuilder; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; + +public class FilterCommand { + + public static ArgumentBuilder register() { + return Commands.literal("filter") + .requires(cs -> cs.hasPermission(2)); +// .then(Commands.literal("create").executes(context -> createFilter(context))) +// .then(Commands.literal("edit").executes(context -> addFilter(context))) +// .then(Commands.literal("delete").executes(context -> addFilter(context))) +// .then(Commands.literal("list").executes(context -> addFilter(context))); + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java index 1b87351..debc061 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java @@ -1,6 +1,18 @@ package com.sunekaer.toolkit.commands; import com.mojang.brigadier.CommandDispatcher; +import com.sunekaer.toolkit.commands.dev.DevEnvCommand; +import com.sunekaer.toolkit.commands.dev.NightVisionCommand; +import com.sunekaer.toolkit.commands.inventory.CopyCommand; +import com.sunekaer.toolkit.commands.inventory.PrintCommand; +import com.sunekaer.toolkit.commands.items.EnchantCommand; +import com.sunekaer.toolkit.commands.items.RepairItemCommand; +import com.sunekaer.toolkit.commands.items.SlayerCommand; +import com.sunekaer.toolkit.commands.level.*; +import com.sunekaer.toolkit.commands.player.FeedCommand; +import com.sunekaer.toolkit.commands.player.GodCommand; +import com.sunekaer.toolkit.commands.player.HealCommand; +import com.sunekaer.toolkit.commands.player.TeleportDimensionSpawnCommand; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -27,20 +39,24 @@ public static void register(CommandDispatcher dispatcher, Co dispatcher.register( Commands.literal("tk") - .then(CommandDevEnv.register()) - .then(CommandHand.register()) - .then(CommandHotbar.register()) - .then(CommandInventory.register()) - .then(CommandSlayer.register()) - .then(CommandEnchant.register()) - .then(CommandOreDist.register()) - .then(CommandClear.register()) - .then(CommandKill.register()) - .then(CommandHeal.register()) - .then(CommandRepair.register()) - .then(CommandNightVision.register()) + .then(DevEnvCommand.register()) + .then(SlayerCommand.register()) + .then(EnchantCommand.register()) + .then(BlockDistributionCommand.register()) + .then(ClearCommand.register()) + .then(KillEntitiesCommand.register()) + .then(HealCommand.register()) + .then(RepairItemCommand.register()) + .then(NightVisionCommand.register()) + .then(GodCommand.register()) + .then(PrintCommand.register()) + .then(CopyCommand.register()) + .then(PrintCommand.registerHandCommand()) + .then(TeleportDimensionSpawnCommand.register()) + .then(DrainFluidCommand.register()) + .then(FeedCommand.register()) + .then(MineAreaCommand.register()) - //TODO Add drain command (Removes all fluids in given area) //TODO kill all by entity id ); } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandDevEnv.java b/common/src/main/java/com/sunekaer/toolkit/commands/dev/DevEnvCommand.java similarity index 80% rename from common/src/main/java/com/sunekaer/toolkit/commands/CommandDevEnv.java rename to common/src/main/java/com/sunekaer/toolkit/commands/dev/DevEnvCommand.java index 548b985..e187f71 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandDevEnv.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/dev/DevEnvCommand.java @@ -1,4 +1,4 @@ -package com.sunekaer.toolkit.commands; +package com.sunekaer.toolkit.commands.dev; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; @@ -7,17 +7,12 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.GameRules; -public class CommandDevEnv { - +public class DevEnvCommand { public static ArgumentBuilder register() { return Commands.literal("devenv") .requires(cs -> cs.hasPermission(2)) //permission .then(Commands.argument("True/False", BoolArgumentType.bool()) - .executes(ctx -> setDevEnv( - ctx.getSource(), - BoolArgumentType.getBool(ctx, "True/False") - ) - ) + .executes(ctx -> setDevEnv(ctx.getSource(), BoolArgumentType.getBool(ctx, "True/False"))) ); } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandNightVision.java b/common/src/main/java/com/sunekaer/toolkit/commands/dev/NightVisionCommand.java similarity index 65% rename from common/src/main/java/com/sunekaer/toolkit/commands/CommandNightVision.java rename to common/src/main/java/com/sunekaer/toolkit/commands/dev/NightVisionCommand.java index d40506f..b06f08d 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandNightVision.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/dev/NightVisionCommand.java @@ -1,4 +1,4 @@ -package com.sunekaer.toolkit.commands; +package com.sunekaer.toolkit.commands.dev; import com.mojang.brigadier.builder.ArgumentBuilder; import net.minecraft.commands.CommandSourceStack; @@ -8,19 +8,22 @@ import static net.minecraft.world.effect.MobEffects.NIGHT_VISION; -public class CommandNightVision { +public class NightVisionCommand { public static ArgumentBuilder register() { return Commands.literal("nightvision") .requires(cs -> cs.hasPermission(2)) - .executes(ctx -> addEffect( - ctx.getSource().getPlayerOrException() - ) - ); + .executes(ctx -> addEffect(ctx.getSource().getPlayerOrException())); } private static int addEffect(ServerPlayer player) { MobEffectInstance mobeffectinstance = new MobEffectInstance(NIGHT_VISION, 9999999, 3, false, false); - player.addEffect(mobeffectinstance); - return 1; + + if (player.hasEffect(NIGHT_VISION)) { + player.removeEffect(NIGHT_VISION); + } else { + player.addEffect(mobeffectinstance); + } + + return 1; } } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java new file mode 100644 index 0000000..3be46f6 --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java @@ -0,0 +1,73 @@ +package com.sunekaer.toolkit.commands.inventory; + +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import com.sunekaer.toolkit.network.Handler; +import com.sunekaer.toolkit.network.SetCopy; +import com.sunekaer.toolkit.utils.CommandUtils; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.Registry; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +public class CopyCommand { + public static ArgumentBuilder register() { + return Commands.literal("copy") + .then(Commands.argument("type", StringArgumentType.word()).suggests(InventoryCollector::suggestions).executes(CopyCommand::copy)); + } + + private static int copy(CommandContext context) throws CommandSyntaxException { + var source = context.getSource(); + var type = InventoryCollector.fromString(StringArgumentType.getString(context, "type")); + + if (type == null) { + // TODO: Move to correct exception + source.sendFailure(Component.literal("Invalid type")); + return 0; + } + + var player = source.getPlayerOrException(); + var itemCollection = type.itemCollector.apply(player); + + StringBuilder clipboard = new StringBuilder(); + for (ItemStack stack : itemCollection) { + if (stack.isEmpty()) { + continue; + } + + String itemName = Objects.requireNonNull(Registry.ITEM.getKey(stack.getItem())).toString(); + + String withNBT = ""; + CompoundTag nbt = stack.save(new CompoundTag()); + if (nbt.contains("tag")) { + withNBT += nbt.get("tag"); + } + + clipboard.append(itemName).append(withNBT).append(CommandUtils.NEW_LINE); + } + + source.sendSuccess(Component.translatable("commands.toolkit.clipboard.copied"), true); + Handler.CHANNEL.sendToPlayer(player, new SetCopy(clipboard.toString())); + + return 1; + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/InventoryCollector.java b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/InventoryCollector.java new file mode 100644 index 0000000..cb7e4f1 --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/InventoryCollector.java @@ -0,0 +1,108 @@ +package com.sunekaer.toolkit.commands.inventory; + +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import com.sunekaer.toolkit.ToolkitPlatform; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public enum InventoryCollector { + HAND("hand", (player) -> { + ItemStack stack = player.getMainHandItem(); + + return stack.isEmpty() ? List.of() : List.of(stack); + }), + OFFHAND("offhand", (player) -> { + ItemStack stack = player.getOffhandItem(); + + return stack.isEmpty() ? List.of() : List.of(stack); + }), + HOTBAR("hotbar", (player) -> { + List items = new ArrayList<>(); + for (int i = 0; i < 9; i++) { + ItemStack stack = player.getInventory().getItem(i); + if (!stack.isEmpty()) { + items.add(stack); + } + } + return items; + }), + INVENTORY("inventory", (player) -> { + List items = new ArrayList<>(); + Inventory inventory = player.getInventory(); + for (int i = 9; i < inventory.getContainerSize(); i++) { + ItemStack stack = player.getInventory().getItem(i); + if (!stack.isEmpty()) { + items.add(stack); + } + } + return items; + }), + INVENTORY_AND_HOTBAR("inventory_and_hotbar", (player) -> { + List items = new ArrayList<>(); + items.addAll(HOTBAR.itemCollector.apply(player)); + items.addAll(INVENTORY.itemCollector.apply(player)); + return items; + }), + ARMOR("armor", (player) -> { + List items = new ArrayList<>(); + for (ItemStack slot : player.getArmorSlots()) { + if (!slot.isEmpty()) { + items.add(slot); + } + } + return items; + }), + TARGET_INVENTORY("target_inventory", (player) -> { + List items = new ArrayList<>(); + + HitResult pick = player.pick(20, 0, true); + if (!(pick instanceof BlockHitResult blockHit)) { + return items; + } + + var level = player.level; + return ToolkitPlatform.getInventoryFromBlockEntity(level, blockHit.getBlockPos(), blockHit.getDirection()); + }); + + String name; + ItemCollector itemCollector; + + InventoryCollector(String name, ItemCollector itemCollector) { + this.name = name; + this.itemCollector = itemCollector; + } + + public String getName() { + return name; + } + + public static InventoryCollector fromString(String name) { + for (InventoryCollector type : InventoryCollector.values()) { + if (type.name.equalsIgnoreCase(name)) { + return type; + } + } + return null; + } + + public static CompletableFuture suggestions(CommandContext context, SuggestionsBuilder suggestionsBuilder) { + Arrays.stream(InventoryCollector.values()).toList().forEach(type -> suggestionsBuilder.suggest(type.getName())); + return CompletableFuture.completedFuture(suggestionsBuilder.build()); + } + + @FunctionalInterface + interface ItemCollector { + List apply(Player player); + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/PrintCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/PrintCommand.java new file mode 100644 index 0000000..b64eaa3 --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/PrintCommand.java @@ -0,0 +1,81 @@ +package com.sunekaer.toolkit.commands.inventory; + +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.sunekaer.toolkit.network.Handler; +import com.sunekaer.toolkit.network.SetCopy; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.Style; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public class PrintCommand { + public static ArgumentBuilder register() { + return Commands.literal("print") + .then(Commands.argument("type", StringArgumentType.word()).suggests(InventoryCollector::suggestions).executes(context -> print(context, StringArgumentType.getString(context, "type"), false))); + } + + private static int print(CommandContext context, String typeInput, boolean copyOnReply) throws CommandSyntaxException { + var source = context.getSource(); + var type = InventoryCollector.fromString(typeInput); + + if (type == null) { + // TODO: Move to correct exception + source.sendFailure(Component.literal("Invalid type")); + return 0; + } + + var player = source.getPlayerOrException(); + var itemCollection = type.itemCollector.apply(player); + + for (ItemStack stack : itemCollection) { + String itemName = Objects.requireNonNull(stack.getItem().arch$registryName()).toString(); + List> tags = stack.getTags().collect(Collectors.toList()); + + String withNBT = ""; + if (stack.hasTag()) { + withNBT = stack.getOrCreateTag().toString(); + } + + String combinedItemNBT = itemName + withNBT; + + source.sendSuccess(Component.literal(combinedItemNBT).withStyle(Style.EMPTY + .withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, combinedItemNBT)) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("Copy tag"))) + .withColor(ChatFormatting.YELLOW)), false); + + if (copyOnReply) { + Handler.CHANNEL.sendToPlayer(player, new SetCopy(combinedItemNBT)); + } + + if (tags.isEmpty()) { + continue; + } + + for (TagKey tag : tags) { + var tagString = String.format("#%s", tag.location()); + source.sendSuccess(Component.literal("- ").append(Component.literal(tagString).withStyle(Style.EMPTY.withColor(ChatFormatting.RED) + .withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, tagString)) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("Copy tag"))) + )), false); + } + } + + return 1; + } + + public static ArgumentBuilder registerHandCommand() { + return Commands.literal("hand").executes(context -> print(context, "hand", true)); + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandEnchant.java b/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java similarity index 97% rename from common/src/main/java/com/sunekaer/toolkit/commands/CommandEnchant.java rename to common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java index 16261a7..682d076 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandEnchant.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java @@ -1,4 +1,4 @@ -package com.sunekaer.toolkit.commands; +package com.sunekaer.toolkit.commands.items; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; @@ -15,7 +15,7 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper; import org.jetbrains.annotations.Nullable; -public class CommandEnchant { +public class EnchantCommand { public static final SimpleCommandExceptionType ERROR_MISSING_PLAYER = new SimpleCommandExceptionType(Component.translatable("commands.toolkit.failed.missing_player")); private static final Dynamic2CommandExceptionType ERROR_MISSING_ENCHANTMENT = new Dynamic2CommandExceptionType((a, b) -> Component.translatable("commands.toolkit.enchant.failed.missing_enchant", a, b)); private static final DynamicCommandExceptionType ERROR_INCOMPATIBLE = new DynamicCommandExceptionType(object -> Component.translatable("commands.enchant.failed.incompatible", object)); @@ -26,7 +26,7 @@ public class CommandEnchant { .requires(cs -> cs.hasPermission(2)) .then(Commands.literal("add") .then(Commands.argument("enchantment", ItemEnchantmentArgument.enchantment()) - .then(Commands.argument("level", IntegerArgumentType.integer(0)) + .then(Commands.argument("level", IntegerArgumentType.integer(0, 255)) .executes(context -> enchant( context, ItemEnchantmentArgument.getEnchantment(context, "enchantment"), diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandRepair.java b/common/src/main/java/com/sunekaer/toolkit/commands/items/RepairItemCommand.java similarity index 51% rename from common/src/main/java/com/sunekaer/toolkit/commands/CommandRepair.java rename to common/src/main/java/com/sunekaer/toolkit/commands/items/RepairItemCommand.java index fd1498e..40f94ea 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandRepair.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/items/RepairItemCommand.java @@ -1,27 +1,28 @@ -package com.sunekaer.toolkit.commands; +package com.sunekaer.toolkit.commands.items; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; -public class CommandRepair { +public class RepairItemCommand { public static ArgumentBuilder register() { return Commands.literal("repair") - .requires(cs -> cs.hasPermission(2)) - .executes(CommandRepair::repair); + .requires(cs -> cs.hasPermission(2)).executes(context -> repair(context, context.getSource().getPlayerOrException())) + .then(Commands.argument("player", EntityArgument.player()).executes(context -> repair(context, EntityArgument.getPlayer(context, "player")))); } - // TODO: Maybe support being run from command blocks and server ops? - private static int repair(CommandContext context) throws CommandSyntaxException { + private static int repair(CommandContext context, ServerPlayer player) throws CommandSyntaxException { var source = context.getSource(); - var player = source.getPlayer(); - var item = CommandEnchant.getItemInHand(player); + var item = EnchantCommand.getItemInHand(player); if (item == null) { - throw CommandEnchant.ERROR_MISSING_PLAYER.create(); + throw EnchantCommand.ERROR_MISSING_PLAYER.create(); } item.setDamageValue(0); diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandSlayer.java b/common/src/main/java/com/sunekaer/toolkit/commands/items/SlayerCommand.java similarity index 96% rename from common/src/main/java/com/sunekaer/toolkit/commands/CommandSlayer.java rename to common/src/main/java/com/sunekaer/toolkit/commands/items/SlayerCommand.java index 540ac67..f797496 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandSlayer.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/items/SlayerCommand.java @@ -1,4 +1,4 @@ -package com.sunekaer.toolkit.commands; +package com.sunekaer.toolkit.commands.items; import com.mojang.brigadier.builder.ArgumentBuilder; import net.minecraft.commands.CommandSourceStack; @@ -17,7 +17,7 @@ import static net.minecraft.world.item.ItemStack.TAG_ENCH; -public class CommandSlayer { +public class SlayerCommand { public static ArgumentBuilder register() { return Commands.literal("slayer") .requires(cs -> cs.hasPermission(2)) //permission diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java new file mode 100644 index 0000000..e5ee0d0 --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java @@ -0,0 +1,98 @@ +package com.sunekaer.toolkit.commands.level; + +import com.google.common.collect.LinkedHashMultiset; +import com.google.common.collect.Multiset; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.sunekaer.toolkit.ToolkitPlatform; +import com.sunekaer.toolkit.utils.ChunkRangeIterator; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +import java.text.DecimalFormat; +import java.util.Objects; + +public class BlockDistributionCommand { + private static final DecimalFormat FORMATTER = new DecimalFormat("########0.00"); + + // Formatter for adding commas to large numbers + private static final DecimalFormat COMMA_FORMATTER = new DecimalFormat("#,###"); + + public static ArgumentBuilder register() { + return Commands.literal("oredist") + .requires(cs -> cs.hasPermission(2)) + .then(Commands.argument("area-size", IntegerArgumentType.integer(1, 1_000)) + .executes(ctx -> getOreDist( + ctx.getSource(), + ctx.getSource().getPlayerOrException(), + IntegerArgumentType.getInteger(ctx, "area-size") + )) + ); + } + + private static int getOreDist(CommandSourceStack source, Player player, int size) { + ServerLevel level = source.getLevel(); + ChunkRangeIterator iterator = new ChunkRangeIterator(level, player.chunkPosition(), size); + + // Get the region files from the server stuffs + + Multiset blockOccurrences = LinkedHashMultiset.create(); + + while (iterator.hasNext()) { + BlockPos pos = iterator.next(); + BlockState state = level.getBlockState(pos); + + if (state.isAir() || state.is(Blocks.BEDROCK) || state.is(Blocks.STONE) || state.is(Blocks.DIRT) || state.is(Blocks.WATER)) { + continue; + } + + if (state.is(ToolkitPlatform.getOresTag())) { + ResourceLocation key = Registry.BLOCK.getKey(state.getBlock()); + blockOccurrences.add(key.toString()); + } + } + + double sum = blockOccurrences.size(); + if (sum == 0) { + source.sendSuccess(Component.literal("No ores found").withStyle(ChatFormatting.RED), true); + return 1; + } + + // Sort the multiset by count + var sortedSet = LinkedHashMultiset.create(blockOccurrences.entrySet().stream().sorted((a, b) -> Integer.compare(b.getCount(), a.getCount())).toList()); + + source.sendSuccess(Component.literal("Block distribution for " + size + "x" + size + " chunks (total: " + COMMA_FORMATTER.format(sum) + ")").withStyle(ChatFormatting.GREEN), false); + source.sendSuccess(Component.literal(""), false); + + int i = 0; + for (Multiset.Entry entry : sortedSet) { + int white = (i % 2 == 0) ? Objects.requireNonNull(ChatFormatting.WHITE.getColor()) : 12895171; + int yellow = (i % 2 == 0) ? Objects.requireNonNull(ChatFormatting.YELLOW.getColor()) : 14013728; + + var component = Component.literal(""); + + component.append(Component.literal("[")).withStyle(Style.EMPTY.withColor(yellow)); + component.append(Component.literal(COMMA_FORMATTER.format(entry.getCount())).withStyle(Style.EMPTY.withColor(yellow).withHoverEvent( + new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal(FORMATTER.format(entry.getCount() * 100 / sum) + "%")) + ))); + component.append(Component.literal("]").withStyle(Style.EMPTY.withColor(yellow))); + component.append(Component.literal(" " + entry.getElement()).withStyle(Style.EMPTY.withColor(white))); + + source.sendSuccess(component, false); + i ++; + } + + return 1; + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandClear.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java similarity index 69% rename from common/src/main/java/com/sunekaer/toolkit/commands/CommandClear.java rename to common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java index 7cedb1e..85512b5 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandClear.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java @@ -1,10 +1,12 @@ -package com.sunekaer.toolkit.commands; +package com.sunekaer.toolkit.commands.level; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.sunekaer.toolkit.ToolkitPlatform; +import com.sunekaer.toolkit.jobs.ServerTickJobRunner; +import com.sunekaer.toolkit.utils.ChunkRangeIterator; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.SharedSuggestionProvider; @@ -18,18 +20,14 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.LevelChunkSection; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Predicate; -public class CommandClear { +public class ClearCommand { private static final AtomicBoolean COMPLETED = new AtomicBoolean(true); public static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor(); @@ -70,21 +68,26 @@ private static int remove(CommandSourceStack source, int size, String filter) th // Compute the max height for the wall and queue the chunk removal Predicate finalCustomCheck = customCheck; - level.getServer().submit(() -> removeArea(level, range, chunkPos, finalCustomCheck, removalCheck)); COMPLETED.set(false); - return 1; - } - - private static void removeArea(ServerLevel level, int range, ChunkPos chunkPos, Predicate check, RemovalPredicate removalCheck) { for (int x = chunkPos.x - range; x <= chunkPos.x + range; x++) { for (int z = chunkPos.z- range; z <= chunkPos.z + range; z++) { var currentChunkPos = new ChunkPos(x, z); - removeChunk(level, currentChunkPos, check != null ? check : removalCheck.stateCheck); + + final boolean shouldComplete = x == chunkPos.x + range && z == chunkPos.z + range; + + ServerTickJobRunner.get().add(() -> { + removeChunk(level, currentChunkPos, finalCustomCheck != null ? finalCustomCheck : removalCheck.stateCheck); + + // If this is the last chunk, then we're done + if (shouldComplete) { + COMPLETED.set(true); + } + }); } } - COMPLETED.set(true); + return 1; } /** @@ -95,30 +98,37 @@ private static void removeArea(ServerLevel level, int range, ChunkPos chunkPos, * @param blockCheck the predicate that defines what blocks are removed */ private static void removeChunk(ServerLevel level, ChunkPos chunkPos, Predicate blockCheck) { - LevelChunk chunk = level.getChunk(chunkPos.x, chunkPos.z); - List sections = Arrays.stream(chunk.getSections()).filter(e -> !e.hasOnlyAir()).toList(); - - for (LevelChunkSection section : sections) { - for (int y = section.bottomBlockY(); y < section.bottomBlockY() + 16; y ++) { - // For people that don't know what bit shifting is, google it... - for (int x = chunkPos.x << 4; x < (chunkPos.x << 4) + (1 << 4); x ++) { - for (int z = chunkPos.z << 4; z < (chunkPos.z << 4) + (1 << 4); z ++) { - final BlockPos pos = new BlockPos(x, y, z); - final BlockState state = level.getBlockState(pos); - - // Don't remove bedrock and skip air, it's a waste of computation - if (state.isAir() || state.getBlock() == Blocks.BEDROCK) { - continue; - } - - if (blockCheck.test(state)) { - continue; - } - - level.setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_ALL); - } + BlockState airState = Blocks.AIR.defaultBlockState(); + + ChunkRangeIterator iterator = new ChunkRangeIterator(level, chunkPos, 1, true); + List updatedBlocks = new ArrayList<>(); + + int maxHeight = level.dimension() == ServerLevel.NETHER ? 127 : level.getMaxBuildHeight(); + + while (iterator.hasNext()) { + BlockPos pos = iterator.next(); + final BlockState state = level.getBlockState(pos); + + // Don't remove bedrock and skip air, it's a waste of computation + if (state.isAir() || state.getBlock() == Blocks.BEDROCK) { + if (!state.isAir() && pos.getY() > level.getMinBuildHeight() && pos.getY() < maxHeight) { + level.setBlock(pos, airState, Block.UPDATE_CLIENTS); + updatedBlocks.add(pos); } + + continue; + } + + if (blockCheck.test(state)) { + continue; } + + level.setBlock(pos, airState, Block.UPDATE_CLIENTS); + updatedBlocks.add(pos); + } + + for (BlockPos pos : updatedBlocks) { + level.blockUpdated(pos, airState.getBlock()); } } @@ -138,21 +148,5 @@ public static Optional getFromName(String name) { return VALUES.stream().filter(e -> e.toString().toLowerCase().equals(name)).findFirst(); } } - - private record RangeBounds( - int minX, - int maxX, - int minZ, - int maxZ - ) { - public static RangeBounds from(ChunkPos pos, int range) { - return new RangeBounds( - ((pos.x - range) << 4), - ((pos.x + range) << 4) + (1 << 4), - ((pos.z - range) << 4), - ((pos.z + range) << 4) + (1 << 4) - ); - } - } } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/DrainFluidCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/DrainFluidCommand.java new file mode 100644 index 0000000..ab84410 --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/DrainFluidCommand.java @@ -0,0 +1,124 @@ +package com.sunekaer.toolkit.commands.level; + +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.sunekaer.toolkit.jobs.ServerTickJobRunner; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.material.FluidState; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.HashSet; +import java.util.Set; + +public class DrainFluidCommand { + public static ArgumentBuilder register() { + return Commands.literal("drain") + .requires(cs -> cs.hasPermission(2)) + .then(Commands.argument("area-size", IntegerArgumentType.integer(1, 300)) + .executes(ctx -> drainFluids( + ctx.getSource(), + ctx.getSource().getPlayerOrException().blockPosition(), + IntegerArgumentType.getInteger(ctx, "area-size"), + false + ))) + .then(Commands.argument("location", BlockPosArgument.blockPos()) + .then(Commands.argument("area-size", IntegerArgumentType.integer(1, 300)) + .executes(ctx -> drainFluids( + ctx.getSource(), + BlockPosArgument.getLoadedBlockPos(ctx, "location"), + IntegerArgumentType.getInteger(ctx, "area-size"), + true + )) + )); + } + + private static int drainFluids(CommandSourceStack source, BlockPos location, int areaSize, boolean shift) { + // Get the fluid below the player + ServerLevel level = source.getLevel(); + BlockPos pos = location; + + if (shift) { + // Look all around the block for a fluid + for (Direction dir : Direction.values()) { + BlockPos offset = pos.relative(dir); + FluidState currentState = level.getFluidState(offset); + + if (currentState.isEmpty()) { + continue; + } + + pos = offset; + break; + } + } + + BlockState state = level.getBlockState(pos); + + if (state.isAir()) { + source.sendFailure(Component.literal("Go away")); + return 1; + } + + if (state.getFluidState().isEmpty()) { + source.sendFailure(Component.literal("No fluid found")); + return 1; + } + + FluidState fluidState = state.getFluidState(); + + Deque scanQueue = new ArrayDeque<>(); + scanQueue.add(pos); + + int maxSize = Math.min(areaSize, 300); + var box = new BoundingBox(pos).inflatedBy(maxSize); + + Set locationsToRemove = new HashSet<>(); + + while (!scanQueue.isEmpty()) { + BlockPos currentPos = scanQueue.pop(); + + locationsToRemove.add(currentPos); + for (Direction dir : Direction.values()) { + BlockPos offset = currentPos.relative(dir); + FluidState currentState = level.getFluidState(offset); + + if (currentState.isEmpty()) { + continue; + } + + if (!fluidState.getType().isSame(currentState.getType())) { + continue; + } + + if (!locationsToRemove.contains(offset)) { + if (!box.isInside(offset)) { + continue; + } + + scanQueue.add(offset); + locationsToRemove.add(offset); + } + } + } + + ServerTickJobRunner.get().add(() -> { + for (BlockPos blockPos : locationsToRemove) { + level.setBlock(blockPos, Blocks.AIR.defaultBlockState(), Block.UPDATE_CLIENTS); + level.blockUpdated(blockPos, Blocks.AIR); + } + }); + + return 0; + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandKill.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java similarity index 97% rename from common/src/main/java/com/sunekaer/toolkit/commands/CommandKill.java rename to common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java index 114e55f..4e240f0 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandKill.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java @@ -1,10 +1,9 @@ -package com.sunekaer.toolkit.commands; +package com.sunekaer.toolkit.commands.level; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; -import dev.architectury.registry.registries.Registries; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.EntitySummonArgument; @@ -29,7 +28,7 @@ import java.util.List; import java.util.function.BiPredicate; -public class CommandKill { +public class KillEntitiesCommand { enum KillType implements StringRepresentable { all((p, entity) -> !(entity instanceof AbstractMinecart) && !entity.getUUID().equals(p.getUUID())), animals((p, entity) -> entity instanceof Animal), diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/MineAreaCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/MineAreaCommand.java new file mode 100644 index 0000000..e8ea790 --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/MineAreaCommand.java @@ -0,0 +1,179 @@ +package com.sunekaer.toolkit.commands.level; + +import com.google.common.collect.HashMultiset; +import com.google.common.collect.Multiset; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.sunekaer.toolkit.ToolkitPlatform; +import com.sunekaer.toolkit.utils.ChunkRangeIterator; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.core.BlockPos; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.AbstractCookingRecipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BarrelBlockEntity; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; + +import java.util.*; + +/** + * Relatively simple but useful command to simulate or actually mine an area based on an item tag + *

+ * Optionally you can use a tool to mine the area which will use the items enchantments + */ +public class MineAreaCommand { + public static ArgumentBuilder register() { + return (Commands.literal("minearea") + .requires(cs -> cs.hasPermission(2)) + .executes(context -> mine(context.getSource(), 1, "")) + .then(Commands.argument("range", IntegerArgumentType.integer()).executes(ctx -> mine(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "range"), "")))); +// .then(Commands.argument("filter", StringArgumentType.string()).suggests((commandContext, suggestionsBuilder) -> SharedSuggestionProvider.suggest(ClearCommand.RemovalPredicate.NAMES, suggestionsBuilder)).executes(ctx -> remove(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "range"), StringArgumentType.getString(ctx, "filter")))))); + } + + private static int mine(CommandSourceStack source, int size, String filter) throws CommandSyntaxException { + try { + ItemStack breaker = new ItemStack(Items.NETHERITE_PICKAXE); +// breaker.enchant(Enchantments.BLOCK_FORTUNE, 3); + breaker.enchant(Enchantments.SILK_TOUCH, 1); + + MinecraftServer server = source.getServer(); + ServerLevel level = source.getLevel(); + ServerPlayer player = source.getPlayerOrException(); + + int range = Math.max(0, size / 2); + ChunkRangeIterator iterator = new ChunkRangeIterator(level, player.chunkPosition(), range); + + // Use a multiset to back the drops list as we don't care for the order nor do we care for duplicates + Multiset drops = HashMultiset.create(); + + while (iterator.hasNext()) { + var blockPos = iterator.next(); + + BlockState state = level.getBlockState(blockPos); + if (state.isAir() || state.is(Blocks.BEDROCK)) { + continue; + } + + if (!state.is(ToolkitPlatform.getOresTag())) { + continue; + } + + // Now for the fun bit, let's simulate the block being mined + // Drops + List blockDrops = Block.getDrops(state, level, blockPos, level.getBlockEntity(blockPos), player, breaker); + for (ItemStack drop : blockDrops) { + drops.add(drop.getItem(), drop.getCount()); + } + } + +// boolean smeltDrops = true; + +// HashMap cookingLookupCache = new HashMap<>(); +// Multiset smeltingMultiSet = HashMultiset.create(); +// if (smeltDrops) { +// for (Item item : drops.elementSet()) { +// int itemCount = drops.count(item); +// // Split into stacks of 64 +// int itemsToProcess = (int) Math.round(Math.ceil(itemCount / 64.0)); +// +// for (int i = 0; i < itemsToProcess; i++) { +// // Get the item stack +// ItemStack stack = new ItemStack(item, 64); +// if (i == itemsToProcess - 1) { +// stack = new ItemStack(item, itemCount % 64); +// } +// +// // Get the recipe +// final ItemStack finalStack = stack; +// ItemStack smeltingResult = cookingLookupCache.computeIfAbsent(item, (key) -> { +// Optional recipeFor = level.getRecipeManager().getRecipeFor(RecipeType.SMELTING, new SimpleContainer(finalStack), level); +// return recipeFor.map(r -> r.getResultItem().copy()).orElse(ItemStack.EMPTY); +// }); +// +// if (smeltingResult.isEmpty()) { +// // If it can't be smelted then just add it to the multiset +// smeltingMultiSet.add(item, stack.getCount()); +// continue; +// } +// +// // Add the result to the multiset +// smeltingMultiSet.add(smeltingResult.getItem(), smeltingResult.getCount()); +// } +// } +// } + +// drops = smeltDrops ? smeltingMultiSet : drops; + System.out.println(drops); + + int chests = drops.size() / 27; + BlockPos playerPos = player.blockPosition(); + + boolean finished = false; + int rows = 0; + int cols = 0; + for (int i = 0; i < chests; i++) { + if (finished) { + break; + } + + if (rows > 4) { + rows = 0; + cols++; + } + + // Create a chest + BlockPos chestPos = playerPos.offset(cols, 0, rows); + level.setBlockAndUpdate(chestPos, Blocks.BARREL.defaultBlockState()); + + // Get the chest entity + BarrelBlockEntity chest = (BarrelBlockEntity) level.getBlockEntity(chestPos); + if (chest == null) { + continue; + } + + // Now fill the chest with as many items as we can + Iterator iterator1 = drops.iterator(); + for (int j = 0; j < 27; j++) { + if (!iterator1.hasNext()) { + finished = true; + break; + } + + // Get the next item + Item item = iterator1.next(); + + int count = drops.count(item); + int taken = Math.min(count, 64); + + // Add the item to the chest + chest.setItem(j, new ItemStack(item, taken)); + + // Remove the item from the multiset + drops.remove(item, taken); + } + + rows++; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return 0; + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/player/FeedCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/player/FeedCommand.java new file mode 100644 index 0000000..392b09a --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/player/FeedCommand.java @@ -0,0 +1,21 @@ +package com.sunekaer.toolkit.commands.player; + +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.server.level.ServerPlayer; + +public class FeedCommand { + public static ArgumentBuilder register() { + return Commands.literal("feed").requires(cs -> cs.hasPermission(2)) + .executes(ctx -> feed(ctx, ctx.getSource().getPlayerOrException())) + .then(Commands.argument("player", EntityArgument.player()).executes(ctx -> feed(ctx, EntityArgument.getPlayer(ctx, "player")))); + } + + private static int feed(CommandContext source, ServerPlayer playerOrException) { + playerOrException.getFoodData().eat(20, 20); + return 1; + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/player/GodCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/player/GodCommand.java new file mode 100644 index 0000000..18dd12a --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/player/GodCommand.java @@ -0,0 +1,24 @@ +package com.sunekaer.toolkit.commands.player; + +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; + +public class GodCommand { + public static ArgumentBuilder register() { + return Commands.literal("god").requires(cs -> cs.hasPermission(2)) + .executes(context -> god(context, context.getSource().getPlayerOrException())) + .then(Commands.argument("player", EntityArgument.player()).executes(ctx -> god(ctx, EntityArgument.getPlayer(ctx, "player")))); + } + + private static int god(CommandContext context, ServerPlayer player) { + player.setInvulnerable(!player.isInvulnerable()); + context.getSource().sendSuccess(Component.literal(player.isInvulnerable() ? "God mode enabled" : "God mode disabled"), false); + + return 1; + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/CommandHeal.java b/common/src/main/java/com/sunekaer/toolkit/commands/player/HealCommand.java similarity index 67% rename from common/src/main/java/com/sunekaer/toolkit/commands/CommandHeal.java rename to common/src/main/java/com/sunekaer/toolkit/commands/player/HealCommand.java index 748b20a..2e1e16d 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/CommandHeal.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/player/HealCommand.java @@ -1,15 +1,17 @@ -package com.sunekaer.toolkit.commands; +package com.sunekaer.toolkit.commands.player; import com.mojang.brigadier.builder.ArgumentBuilder; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.EntityArgument; import net.minecraft.server.level.ServerPlayer; -public class CommandHeal { +public class HealCommand { public static ArgumentBuilder register() { return Commands.literal("heal") .requires(cs -> cs.hasPermission(2)) - .executes(ctx -> heal(ctx.getSource().getPlayerOrException())); + .executes(ctx -> heal(ctx.getSource().getPlayerOrException())) + .then(Commands.argument("player", EntityArgument.player()).executes(ctx -> heal(EntityArgument.getPlayer(ctx, "player")))); } private static int heal(ServerPlayer player) { diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/player/TeleportDimensionSpawnCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/player/TeleportDimensionSpawnCommand.java new file mode 100644 index 0000000..f442671 --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/commands/player/TeleportDimensionSpawnCommand.java @@ -0,0 +1,78 @@ +package com.sunekaer.toolkit.commands.player; + +import com.mojang.brigadier.builder.ArgumentBuilder; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.arguments.DimensionArgument; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.structure.BoundingBox; + +import java.util.Collection; +import java.util.List; + +public class TeleportDimensionSpawnCommand { + public static ArgumentBuilder register() { + return Commands.literal("tpdim") + .requires(cs -> cs.hasPermission(2)) + .then(Commands.argument("dimension", DimensionArgument.dimension()) + .executes(ctx -> teleport(ctx.getSource(), ctx.getSource().getServer(), List.of(ctx.getSource().getPlayerOrException()), DimensionArgument.getDimension(ctx, "dimension"))) + .then(Commands.argument("target", EntityArgument.entities()).executes(ctx -> teleport(ctx.getSource(), ctx.getSource().getServer(), EntityArgument.getEntities(ctx, "target"), DimensionArgument.getDimension(ctx, "dimension"))))); } + + private static int teleport(CommandSourceStack source, MinecraftServer server, Collection entities, ServerLevel dimension) { + // Find the spawn point of the dimension + ServerLevel level = server.getLevel(dimension.dimension()); + if (level == null) { + source.sendFailure(Component.literal("Dimension not found")); + return 0; + } + + for (Entity entity : entities) { + BlockPos pos = entity.blockPosition(); + if (!level.getWorldBorder().isWithinBounds(pos)) { + pos = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, new BlockPos(level.getWorldBorder().getCenterX(), 0.0, level.getWorldBorder().getCenterZ())); + } + + int playerXp = 0; + + if (entity instanceof ServerPlayer serverPlayer) { + playerXp = serverPlayer.experienceLevel; + serverPlayer.teleportTo(level, pos.getX(), pos.getY(), pos.getZ(), entity.getYRot(), entity.getXRot()); + serverPlayer.setExperienceLevels(playerXp); + } else { + entity.teleportTo(pos.getX(), pos.getY(), pos.getZ()); + } + + // Force load the chunk + if (!level.isLoaded(pos)) { + level.getChunk(pos); + } + + // Check if the blocks where the player will spawn are not air + if (entity instanceof ServerPlayer) { + BlockState playerFeetBlock = level.getBlockState(pos); + BlockState playerHeadBlock = level.getBlockState(pos.above()); + + if (!playerHeadBlock.isAir() || !playerFeetBlock.isAir()) { + BoundingBox box = new BoundingBox(pos).inflatedBy(1); + BlockPos.betweenClosedStream(box).forEach(blockPos -> { + BlockState state = level.getBlockState(blockPos); + if (!state.isAir()) { + level.setBlockAndUpdate(blockPos, Blocks.AIR.defaultBlockState()); + } + }); + } + } + } + + return 1; + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/jobs/ServerTickJobRunner.java b/common/src/main/java/com/sunekaer/toolkit/jobs/ServerTickJobRunner.java new file mode 100644 index 0000000..a5ccd33 --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/jobs/ServerTickJobRunner.java @@ -0,0 +1,58 @@ +package com.sunekaer.toolkit.jobs; + +import net.minecraft.server.MinecraftServer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayDeque; +import java.util.Queue; + +public enum ServerTickJobRunner { + INSTANCE; + + private static final Logger LOGGER = LoggerFactory.getLogger(ServerTickJobRunner.class); + + public static ServerTickJobRunner get() { + return INSTANCE; + } + + private final Queue queue = new ArrayDeque<>(); + private int tickCount = 0; + + /** + * Add a job to the queue + */ + public void add(Runnable job) { + queue.add(job); + } + + public void onTick(MinecraftServer server) { + if (queue.isEmpty()) { + // This is overkill as the int would just underflow, but it's here for clarity + if (tickCount > 0) { + LOGGER.debug("Finished running jobs"); + tickCount = 0; + } + return; + } + + tickCount++; + // Wait 5 ticks before running each job + if (tickCount % 5 != 0) { + return; + } + + Runnable job = queue.poll(); + if (job == null) { + return; + } + + server.execute(() -> { + try { + job.run(); + } catch (Exception e) { + LOGGER.error("Failed to run job", e); + } + }); + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/utils/ChunkRangeIterator.java b/common/src/main/java/com/sunekaer/toolkit/utils/ChunkRangeIterator.java new file mode 100644 index 0000000..b4519eb --- /dev/null +++ b/common/src/main/java/com/sunekaer/toolkit/utils/ChunkRangeIterator.java @@ -0,0 +1,75 @@ +package com.sunekaer.toolkit.utils; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; + +import java.util.Iterator; + +/** + * ChunkRangeIterator takes in a starting chunkpos and expands the chunk selection by a give size. We'll then iterate + * over all of the chunks in the range and return every blockpos in each chunk in the range. + */ +public class ChunkRangeIterator implements Iterator { + private final Level level; + + private final int minX; + private final int minZ; + + private final int maxX; + private final int maxZ; + + private int currentX; + private int currentY; + private int currentZ; + + private final boolean reverseY; + + public ChunkRangeIterator(Level level, ChunkPos startPos, int size) { + this(level, startPos, size, false); + } + + public ChunkRangeIterator(Level level, ChunkPos startPos, int size, boolean reverseY) { + this.level = level; + int rangeSize = Math.max(0, size / 2); + + this.minX = (startPos.x - rangeSize) << 4; + this.minZ = (startPos.z - rangeSize) << 4; + + this.maxX = ((startPos.x + rangeSize) << 4) + (1 << 4); + this.maxZ = ((startPos.z + rangeSize) << 4) + (1 << 4); + + this.currentX = minX; + this.currentZ = minZ; + this.reverseY = reverseY; + this.currentY = reverseY ? level.getMaxBuildHeight() : level.getMinBuildHeight(); + } + + @Override + public boolean hasNext() { + return (this.reverseY ? currentY > level.getMinBuildHeight() : currentY < level.getMaxBuildHeight()) + && currentZ < maxZ + && currentX < maxX; + } + + @Override + public BlockPos next() { + BlockPos pos = new BlockPos(currentX, currentY, currentZ); + + currentX++; + if (currentX >= maxX) { + currentX = minX; + currentZ++; + if (currentZ >= maxZ) { + currentZ = minZ; + if (reverseY) { + currentY--; + } else { + currentY++; + } + } + } + + return pos; + } +} diff --git a/common/src/main/java/com/sunekaer/toolkit/utils/CommandUtils.java b/common/src/main/java/com/sunekaer/toolkit/utils/CommandUtils.java index e43867f..fb088d8 100644 --- a/common/src/main/java/com/sunekaer/toolkit/utils/CommandUtils.java +++ b/common/src/main/java/com/sunekaer/toolkit/utils/CommandUtils.java @@ -1,10 +1,5 @@ package com.sunekaer.toolkit.utils; public class CommandUtils { - public static final String NEW_LINE; - - static - { - NEW_LINE = System.lineSeparator(); - } + public static final String NEW_LINE = System.lineSeparator(); } diff --git a/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitFabric.java b/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitFabric.java index 030a81b..6404410 100644 --- a/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitFabric.java +++ b/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitFabric.java @@ -1,7 +1,7 @@ package com.sunekaer.toolkit.fabric; import com.sunekaer.toolkit.Toolkit; -import com.sunekaer.toolkit.commands.CommandKill; +import com.sunekaer.toolkit.commands.level.KillEntitiesCommand; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.ArgumentTypeRegistry; import net.minecraft.commands.synchronization.SingletonArgumentInfo; @@ -13,8 +13,8 @@ public void onInitialize() { Toolkit.init(); ArgumentTypeRegistry.registerArgumentType( new ResourceLocation(Toolkit.MODID, "kill_type"), - CommandKill.KillTypeArgument.class, - SingletonArgumentInfo.contextFree(CommandKill.KillTypeArgument::killType) + KillEntitiesCommand.KillTypeArgument.class, + SingletonArgumentInfo.contextFree(KillEntitiesCommand.KillTypeArgument::killType) ); } } diff --git a/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitPlatformImpl.java b/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitPlatformImpl.java index 9b1c3f4..9b80d62 100644 --- a/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitPlatformImpl.java +++ b/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitPlatformImpl.java @@ -1,11 +1,24 @@ package com.sunekaer.toolkit.fabric; import net.fabricmc.fabric.api.tag.convention.v1.ConventionalBlockTags; +import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage; +import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; +import net.fabricmc.fabric.api.transfer.v1.storage.Storage; +import net.fabricmc.fabric.api.transfer.v1.storage.StorageView; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import org.jetbrains.annotations.Nullable; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; public class ToolkitPlatformImpl { public static Path getConfigDirectory() { @@ -19,4 +32,25 @@ public static TagKey getOresTag() { public static Path getGamePath() { return FabricLoader.getInstance().getGameDir(); } + + public static List getInventoryFromBlockEntity(Level level, BlockPos pos, @Nullable Direction direction) { + List items = new ArrayList<>(); + + Storage storage = ItemStorage.SIDED.find(level, pos, direction); + + if (storage == null) { + return items; + } + + for (StorageView view : storage) { + ItemStack stack = view.getResource().toStack(); + if (stack.isEmpty()) { + continue; + } + + items.add(stack); + } + + return items; + } } diff --git a/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitForge.java b/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitForge.java index 6630f83..1a85d99 100644 --- a/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitForge.java +++ b/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitForge.java @@ -1,6 +1,6 @@ package com.sunekaer.toolkit.forge; -import com.sunekaer.toolkit.commands.CommandKill; +import com.sunekaer.toolkit.commands.level.KillEntitiesCommand; import dev.architectury.platform.forge.EventBuses; import com.sunekaer.toolkit.Toolkit; import net.minecraft.commands.synchronization.ArgumentTypeInfo; @@ -16,8 +16,8 @@ @Mod(Toolkit.MODID) public class ToolkitForge { private static final DeferredRegister> ARGUMENT_REGISTRY = DeferredRegister.create(ForgeRegistries.COMMAND_ARGUMENT_TYPES, Toolkit.MODID); - private static final RegistryObject> KILL_TYPE_ARG = ARGUMENT_REGISTRY.register("kill_type", - () -> ArgumentTypeInfos.registerByClass(CommandKill.KillTypeArgument.class, SingletonArgumentInfo.contextFree(CommandKill.KillTypeArgument::killType))); + private static final RegistryObject> KILL_TYPE_ARG = ARGUMENT_REGISTRY.register("kill_type", + () -> ArgumentTypeInfos.registerByClass(KillEntitiesCommand.KillTypeArgument.class, SingletonArgumentInfo.contextFree(KillEntitiesCommand.KillTypeArgument::killType))); public ToolkitForge() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); EventBuses.registerModEventBus(Toolkit.MODID, modEventBus); diff --git a/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitPlatformImpl.java b/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitPlatformImpl.java index 2167deb..3393eba 100644 --- a/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitPlatformImpl.java +++ b/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitPlatformImpl.java @@ -1,11 +1,20 @@ package com.sunekaer.toolkit.forge; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.Tags; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.fml.loading.FMLPaths; +import org.jetbrains.annotations.Nullable; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; public class ToolkitPlatformImpl { public static Path getConfigDirectory() { @@ -19,4 +28,25 @@ public static TagKey getOresTag() { public static Path getGamePath() { return FMLPaths.GAMEDIR.get(); } + + public static List getInventoryFromBlockEntity(Level level, BlockPos pos, @Nullable Direction direction) { + List items = new ArrayList<>(); + + BlockEntity entity = level.getBlockEntity(pos); + if (entity == null) { + return items; + } + + entity.getCapability(ForgeCapabilities.ITEM_HANDLER).ifPresent(handler -> { + for (int i = 0; i < handler.getSlots(); i++) { + var stack = handler.getStackInSlot(i); + if (stack.isEmpty()) { + continue; + } + items.add(stack); + } + }); + + return items; + } } diff --git a/settings.gradle b/settings.gradle index 6dd451f..71707c4 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,4 @@ include("common") include("fabric") include("forge") -rootProject.name = "toolkit" +//rootProject.name = "toolkit" From c7b2216e4d039eb1ecad0745cc3e0984ce90a3d1 Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Sun, 14 Jan 2024 13:27:59 +0100 Subject: [PATCH 03/13] updated CI --- .github/workflows/build-release.yml | 9 ++- CHANGELOG.md | 6 +- build.gradle | 79 +++++++++++++++++++++--- common/build.gradle | 14 +---- fabric/build.gradle | 41 +----------- forge/build.gradle | 45 ++------------ gradle.properties | 10 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- 8 files changed, 96 insertions(+), 110 deletions(-) diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 6efc226..6c38950 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -3,13 +3,18 @@ name: Build & Release on: push: tags: - - 'v*' + - "v*" jobs: build: if: | !contains(github.event.head_commit.message, '[ciskip]') - uses: nanite/workflows/.github/workflows/standard-arch-release.yml@v1 + uses: nanite/workflows/.github/workflows/standard-modmuss.yml@v1.1 + with: + java-version: 17 + changelog-file: "./CHANGELOG.md" + release-to-github: false secrets: nanite-token: ${{ secrets.NANITE_DEPLOY }} curse-token: ${{ secrets.CURSE_DEPLOY }} + modrinth-token: ${{ secrets.MODRINTH_TOKEN }} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f47b94..2060427 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,3 @@ -## 2.3.9 +## 77.0.0 -### Fixed - -- An issue causing the kill commands to not always kill all the entities and throw an error message instead. +- Mod has been rewritten and new commands had been added \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4fb6a41..ec39c12 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,7 @@ plugins { id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.1-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.4-SNAPSHOT" apply false + id "me.modmuss50.mod-publish-plugin" version "0.4.5" } architectury { @@ -9,6 +10,7 @@ architectury { subprojects { apply plugin: "dev.architectury.loom" + apply plugin: "maven-publish" loom { silentMojangMappingsLicense() @@ -16,10 +18,21 @@ subprojects { dependencies { minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - // The following line declares the mojmap mappings, you may use other mappings as well mappings loom.officialMojangMappings() - // The following line declares the yarn mappings you may select this one as well. - // mappings "net.fabricmc:yarn:1.19.2+build.28:v2" + } + + publishing { + repositories { + if (providers.environmentVariable("NANITE_TOKEN").isPresent()) { + maven { + url "https://maven.nanite.dev/releases" + credentials { + username = "nanite" + password = providers.environmentVariable("NANITE_TOKEN").get() + } + } + } + } } } @@ -28,10 +41,9 @@ allprojects { apply plugin: "architectury-plugin" apply plugin: "maven-publish" - ext.ENV = System.getenv() archivesBaseName = rootProject.archives_base_name - version = "${rootProject.mod_version}-build.${ENV.GITHUB_RUN_NUMBER ?: 9999}+mc${rootProject.minecraft_version}" + version = rootProject.mod_version group = rootProject.maven_group repositories { @@ -48,4 +60,57 @@ allprojects { } } -task curseforgePublish +publishMods { + dryRun = providers.environmentVariable("CURSE_TOKEN").getOrNull() == null + changelog = file("./CHANGELOG.md").text + version = "${mod_version}" + type = STABLE + + def fabricOptions = publishOptions { + file = project.provider { project(":fabric").tasks.remapJar }.flatMap { it.archiveFile } + displayName = "[FABRIC][${minecraft_version}] ${project.name} ${mod_version}" + modLoaders.add("fabric") + } + + def forgeOptions = publishOptions { + file = project.provider { project(":forge").tasks.remapJar }.flatMap { it.archiveFile } + displayName = "[FORGE][${minecraft_version}] ${project.name} ${mod_version}" + modLoaders.add("forge") + } + + def curseForgeOptions = curseforgeOptions { + accessToken = providers.environmentVariable("CURSE_TOKEN") + projectId = "${curseforge_id}" + minecraftVersions.add("${minecraft_version}") + } + + def modrinthOptions = modrinthOptions { + accessToken = providers.environmentVariable("MODRINTH_TOKEN") + projectId = "${modrinth_id}" + minecraftVersions.add("${minecraft_version}") + } + + curseforge("curseforgeFabric") { + from(curseForgeOptions, fabricOptions) + requires { + slug = "fabric-api" + } + } + + curseforge("curseforgeForge") { + from(curseForgeOptions, forgeOptions) + } + + if (providers.environmentVariable("MODRINTH_TOKEN").getOrNull() != null) { + modrinth("modrinthFabric") { + from(modrinthOptions, fabricOptions) + requires { + slug = "fabric-api" + } + } + + modrinth("modrinthForge") { + from(modrinthOptions, forgeOptions) + } + } +} diff --git a/common/build.gradle b/common/build.gradle index 8c4bc57..43122b5 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -17,20 +17,8 @@ dependencies { publishing { publications { mavenCommon(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name + artifactId = "${rootProject.archivesBaseName}-${project.name}" from components.java } } - - repositories { - if (ENV.NANITE_TOKEN) { - maven { - url "https://maven.nanite.dev/releases" - credentials { - username = "nanite" - password = "${ENV.NANITE_TOKEN}" - } - } - } - } } diff --git a/fabric/build.gradle b/fabric/build.gradle index c10b72a..fef2cba 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,6 +1,5 @@ plugins { id "com.github.johnrengelman.shadow" version "7.1.2" - id "com.matthewprenger.cursegradle" version "1.4.0" } architectury { @@ -63,7 +62,7 @@ remapJar { input.set shadowJar.archiveFile dependsOn shadowJar setArchiveClassifier(null) - setArchivesBaseName("${rootProject.archivesBaseName}-${project.name}") + setArchivesBaseName("${rootProject.archives_base_name}-${project.name}") } jar { @@ -85,42 +84,8 @@ components.java { publishing { publications { mavenFabric(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name + artifactId = "${rootProject.archivesBaseName}-${project.name}" from components.java } } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - if (ENV.NANITE_TOKEN) { - maven { - url "https://maven.nanite.dev/releases" - credentials { - username = "nanite" - password = "${ENV.NANITE_TOKEN}" - } - } - } - } -} - -if (ENV.CURSE_TOKEN) { - curseforge { - apiKey = ENV.CURSE_TOKEN - project { - id = project.curseforge_id - releaseType = "beta" - addGameVersion "Fabric" - addGameVersion "${minecraft_version}" - mainArtifact(remapJar.archiveFile) - relations { - requiredDependency("architectury-api") - } - changelog = file("../CHANGELOG.md") - changelogType = 'markdown' - } - } -} - - -rootProject.tasks.curseforgePublish.dependsOn tasks.curseforge +} \ No newline at end of file diff --git a/forge/build.gradle b/forge/build.gradle index 4c471e0..6e379fd 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,6 +1,5 @@ plugins { id "com.github.johnrengelman.shadow" version "7.1.2" - id "com.matthewprenger.cursegradle" version "1.4.0" } architectury { @@ -37,7 +36,7 @@ configurations { } dependencies { - forge "net.minecraftforge:forge:${rootProject.forge_version}" + forge "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}" modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}" common(project(path: ":common", configuration: "namedElements")) { transitive false } @@ -47,8 +46,7 @@ dependencies { processResources { inputs.property "version", project.version - def forgeVersion = ((String) rootProject.forge_version).split("-").last() - def forgeBase = forgeVersion.split("\\.").first() + def forgeVersion = rootProject.forge_version filesMatching("META-INF/mods.toml") { expand "version": project.version, @@ -71,7 +69,7 @@ remapJar { input.set shadowJar.archiveFile dependsOn shadowJar setArchiveClassifier(null) - setArchivesBaseName("${rootProject.archivesBaseName}-${project.name}") + setArchivesBaseName("${rootProject.archives_base_name}-${project.name}") } jar { @@ -93,41 +91,8 @@ components.java { publishing { publications { mavenForge(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name + artifactId = "${rootProject.archivesBaseName}-${project.name}" from components.java } } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - if (ENV.NANITE_TOKEN) { - maven { - url "https://maven.nanite.dev/releases" - credentials { - username = "nanite" - password = "${ENV.NANITE_TOKEN}" - } - } - } - } -} - -if (ENV.CURSE_TOKEN) { - curseforge { - apiKey = ENV.CURSE_TOKEN - project { - id = project.curseforge_id - releaseType = "release" - addGameVersion "Forge" - addGameVersion "${minecraft_version}" - mainArtifact(remapJar.archiveFile) - relations { - requiredDependency("architectury-api") - } - changelog = file("../CHANGELOG.md") - changelogType = 'markdown' - } - } -} - -rootProject.tasks.curseforgePublish.dependsOn tasks.curseforge +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 27f9bee..95678cf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,13 +4,13 @@ minecraft_version=1.19.2 enabled_platforms=fabric,forge archives_base_name=ToolKit -mod_version=2.3.9 +mod_version=77.0.0 maven_group=com.sunekaer.mods -architectury_version=6.5.77 +architectury_version=6.5.85 -fabric_loader_version=0.14.21 -fabric_api_version=0.76.0+1.19.2 +fabric_loader_version=0.15.3 +fabric_api_version=0.77.0+1.19.2 -forge_version=1.19.2-43.2.8 +forge_version=43.3.7 curseforge_id=324888 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 59bc51a..db9a6b8 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.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 3739de855836bd76def6f0f6e07ce465ecb95eba Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Sun, 14 Jan 2024 13:36:26 +0100 Subject: [PATCH 04/13] modrinth_id --- gradle.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gradle.properties b/gradle.properties index 95678cf..8146e08 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,4 +13,6 @@ fabric_loader_version=0.15.3 fabric_api_version=0.77.0+1.19.2 forge_version=43.3.7 + curseforge_id=324888 +modrinth_id=fWj0tJp5 From b03ad58b5d20b168de0ca62d62f8747921150a59 Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Sun, 14 Jan 2024 13:39:01 +0100 Subject: [PATCH 05/13] changelog --- CHANGELOG.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2060427..acface7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ ## 77.0.0 -- Mod has been rewritten and new commands had been added \ No newline at end of file +- Improved performance on the clear chunk and scan chunk commands +- Added a teleport to dimension command +- Added drain command which can drain an area of itโ€™s fluid. Currently takes the location the player is looking at +- Improved the output of /oredist +- Fixed some permission issues +- Added repair item command +- Added print command +- Added copy command \ No newline at end of file From 56f24b392335b7555e74b4101109ec8638d26aff Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Sun, 14 Jan 2024 13:48:06 +0100 Subject: [PATCH 06/13] forge meta --- forge/src/main/resources/META-INF/mods.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 4510f72..cb5a898 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion="[${forgebase},)" #mandatory +loaderVersion="[43,)" #mandatory license = "All Rights Reserved" [[mods]] @@ -14,20 +14,20 @@ This mod adds bunch of useful commands [[dependencies.toolkit]] modId = "forge" mandatory = true -versionRange = "[${forgebase},)" +versionRange = "[43,)" ordering = "NONE" side = "BOTH" [[dependencies.toolkit]] modId = "minecraft" mandatory = true -versionRange = "[${mcversion},)" +versionRange = "[1.19.2,)" ordering = "NONE" side = "BOTH" [[dependencies.toolkit]] modId = "architectury" mandatory = true -versionRange = "[${archversion},)" +versionRange = "[6.5.85,)" ordering = "AFTER" side = "BOTH" From 81c829fd5f4a5d83faf46f6fddecb036725fc6c9 Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Sun, 14 Jan 2024 13:58:26 +0100 Subject: [PATCH 07/13] maybe? --- forge/build.gradle | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/forge/build.gradle b/forge/build.gradle index 6e379fd..b0acfd8 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -46,14 +46,8 @@ dependencies { processResources { inputs.property "version", project.version - def forgeVersion = rootProject.forge_version - filesMatching("META-INF/mods.toml") { - expand "version": project.version, - "forgeversion": forgeVersion, - "forgebase": forgeBase, - "mcversion": rootProject.minecraft_version, - "archversion": rootProject.architectury_version + expand "version": project.version } } From d5541b3130ab679624ec6114e595cbfbaa04dbe2 Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Sun, 14 Jan 2024 14:08:50 +0100 Subject: [PATCH 08/13] 1.19.4 --- CHANGELOG.md | 2 +- forge/src/main/resources/META-INF/mods.toml | 8 ++++---- gradle.properties | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index acface7..ad6deff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## 77.0.0 +## 79.0.0 - Improved performance on the clear chunk and scan chunk commands - Added a teleport to dimension command diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index cb5a898..52b5d19 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion="[43,)" #mandatory +loaderVersion="[45,)" #mandatory license = "All Rights Reserved" [[mods]] @@ -14,20 +14,20 @@ This mod adds bunch of useful commands [[dependencies.toolkit]] modId = "forge" mandatory = true -versionRange = "[43,)" +versionRange = "[45,)" ordering = "NONE" side = "BOTH" [[dependencies.toolkit]] modId = "minecraft" mandatory = true -versionRange = "[1.19.2,)" +versionRange = "[1.19.5,)" ordering = "NONE" side = "BOTH" [[dependencies.toolkit]] modId = "architectury" mandatory = true -versionRange = "[6.5.85,)" +versionRange = "[8.2.89,)" ordering = "AFTER" side = "BOTH" diff --git a/gradle.properties b/gradle.properties index 8146e08..a3e3f24 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,18 +1,18 @@ org.gradle.jvmargs=-Xmx2048M -minecraft_version=1.19.2 +minecraft_version=1.19.4 enabled_platforms=fabric,forge archives_base_name=ToolKit -mod_version=77.0.0 +mod_version=79.0.0 maven_group=com.sunekaer.mods -architectury_version=6.5.85 +architectury_version=8.2.89 fabric_loader_version=0.15.3 -fabric_api_version=0.77.0+1.19.2 +fabric_api_version=0.87.2+1.19.4 -forge_version=43.3.7 +forge_version=45.2.8 curseforge_id=324888 modrinth_id=fWj0tJp5 From 64c8152fe3092abf962ed07fcc002acc9967feb1 Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Sun, 14 Jan 2024 21:00:08 +0100 Subject: [PATCH 09/13] fix enchantment command --- .../sunekaer/toolkit/commands/TKCommand.java | 2 +- .../commands/items/EnchantCommand.java | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java index debc061..f2b0f9b 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java @@ -41,7 +41,7 @@ public static void register(CommandDispatcher dispatcher, Co Commands.literal("tk") .then(DevEnvCommand.register()) .then(SlayerCommand.register()) - .then(EnchantCommand.register()) + .then(EnchantCommand.register(context)) .then(BlockDistributionCommand.register()) .then(ClearCommand.register()) .then(KillEntitiesCommand.register()) diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java index 682d076..dd1dd49 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java @@ -5,9 +5,12 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.*; import com.sunekaer.toolkit.utils.EnchantmentHacks; +import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; -import net.minecraft.commands.arguments.ItemEnchantmentArgument; +import net.minecraft.commands.arguments.ResourceArgument; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; @@ -21,28 +24,29 @@ public class EnchantCommand { private static final DynamicCommandExceptionType ERROR_INCOMPATIBLE = new DynamicCommandExceptionType(object -> Component.translatable("commands.enchant.failed.incompatible", object)); private static final DynamicCommandExceptionType ERROR_NO_ITEM = new DynamicCommandExceptionType(object -> Component.translatable("commands.enchant.failed.itemless", object)); - public static ArgumentBuilder register() { + public static ArgumentBuilder register(CommandBuildContext arg) { return Commands.literal("enchant") .requires(cs -> cs.hasPermission(2)) .then(Commands.literal("add") - .then(Commands.argument("enchantment", ItemEnchantmentArgument.enchantment()) + .then(Commands.argument("enchantment", ResourceArgument.resource(arg, Registries.ENCHANTMENT)) .then(Commands.argument("level", IntegerArgumentType.integer(0, 255)) .executes(context -> enchant( context, - ItemEnchantmentArgument.getEnchantment(context, "enchantment"), + ResourceArgument.getEnchantment(context, "enchantment"), IntegerArgumentType.getInteger(context, "level") )) ) ) ) .then(Commands.literal("remove") - .then(Commands.argument("enchantment", ItemEnchantmentArgument.enchantment()) - .executes(context -> removeEnchantment(context, ItemEnchantmentArgument.getEnchantment(context, "enchantment")))) + .then(Commands.argument("enchantment", ResourceArgument.resource(arg, Registries.ENCHANTMENT)) + .executes(context -> removeEnchantment(context, ResourceArgument.getEnchantment(context, "enchantment")))) ); } - private static int enchant(CommandContext context, Enchantment enchantment, int level) throws CommandSyntaxException { + private static int enchant(CommandContext context, Holder.Reference arg2, int level) throws CommandSyntaxException { CommandSourceStack source = context.getSource(); + Enchantment enchantment = (Enchantment)arg2.value(); var player = source.getPlayer(); var mainHandItem = getItemInHand(player); @@ -59,7 +63,7 @@ private static int enchant(CommandContext context, Enchantme return 1; } - private static int removeEnchantment(CommandContext context, Enchantment enchantment) throws CommandSyntaxException { + private static int removeEnchantment(CommandContext context, Holder.Reference arg2) throws CommandSyntaxException { var source = context.getSource(); var player = source.getPlayer(); var mainHandItem = getItemInHand(player); @@ -67,6 +71,8 @@ private static int removeEnchantment(CommandContext context, throw ERROR_MISSING_PLAYER.create(); } + Enchantment enchantment = (Enchantment)arg2.value(); + if (!EnchantmentHelper.getEnchantments(mainHandItem).containsKey(enchantment)) { throw ERROR_MISSING_ENCHANTMENT.create(mainHandItem.getItem().getName(mainHandItem).getString(), enchantment.getFullname(1)); } From 284b67ef41dbc3e42cf5050fbb29990b12b69e89 Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Mon, 15 Jan 2024 11:37:32 +0100 Subject: [PATCH 10/13] fix other commands --- .../sunekaer/toolkit/commands/TKCommand.java | 2 +- .../commands/inventory/CopyCommand.java | 3 ++- .../toolkit/commands/items/SlayerCommand.java | 2 +- .../level/BlockDistributionCommand.java | 3 ++- .../toolkit/commands/level/ClearCommand.java | 8 ++++--- .../commands/level/KillEntitiesCommand.java | 23 +++++++++---------- .../player/TeleportDimensionSpawnCommand.java | 2 +- forge/src/main/resources/META-INF/mods.toml | 2 +- 8 files changed, 24 insertions(+), 21 deletions(-) diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java index f2b0f9b..bdd0eec 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java @@ -44,7 +44,7 @@ public static void register(CommandDispatcher dispatcher, Co .then(EnchantCommand.register(context)) .then(BlockDistributionCommand.register()) .then(ClearCommand.register()) - .then(KillEntitiesCommand.register()) + .then(KillEntitiesCommand.register(context)) .then(HealCommand.register()) .then(RepairItemCommand.register()) .then(NightVisionCommand.register()) diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java index 3be46f6..5cf6e7f 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java @@ -13,6 +13,7 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; @@ -54,7 +55,7 @@ private static int copy(CommandContext context) throws Comma continue; } - String itemName = Objects.requireNonNull(Registry.ITEM.getKey(stack.getItem())).toString(); + String itemName = Objects.requireNonNull(BuiltInRegistries.ITEM.getKey(stack.getItem())).toString(); String withNBT = ""; CompoundTag nbt = stack.save(new CompoundTag()); diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/items/SlayerCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/items/SlayerCommand.java index f797496..fa1969d 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/items/SlayerCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/items/SlayerCommand.java @@ -43,7 +43,7 @@ private static int giveItem(ServerPlayer player) { ItemEntity drop = player.drop(itemstack.copy(), false); if (drop != null) { drop.setNoPickUpDelay(); - drop.setOwner(player.getUUID()); + drop.setTarget(player.getUUID()); } } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java index e5ee0d0..3f12a44 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java @@ -11,6 +11,7 @@ import net.minecraft.commands.Commands; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.Style; @@ -58,7 +59,7 @@ private static int getOreDist(CommandSourceStack source, Player player, int size } if (state.is(ToolkitPlatform.getOresTag())) { - ResourceLocation key = Registry.BLOCK.getKey(state.getBlock()); + ResourceLocation key = BuiltInRegistries.BLOCK.getKey(state.getBlock()); blockOccurrences.add(key.toString()); } } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java index 85512b5..277bda2 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java @@ -12,6 +12,8 @@ import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -54,9 +56,9 @@ private static int remove(CommandSourceStack source, int size, String filter) th var removalCheck = RemovalPredicate.getFromName(filter).orElse(RemovalPredicate.JUST_ORES); Predicate customCheck = null; if (filter.startsWith("#")) { - customCheck = state -> state.is(TagKey.create(Registry.BLOCK_REGISTRY, new ResourceLocation(filter.replace("#", "")))); + customCheck = state -> state.is(TagKey.create(Registries.BLOCK, new ResourceLocation(filter.replace("#", "")))); } else if(filter.contains(":")) { - customCheck = state -> Registry.BLOCK.getKey(state.getBlock()).toString().equalsIgnoreCase(filter); + customCheck = state -> BuiltInRegistries.BLOCK.getKey(state.getBlock()).toString().equalsIgnoreCase(filter); } ServerLevel level = source.getLevel(); @@ -134,7 +136,7 @@ private static void removeChunk(ServerLevel level, ChunkPos chunkPos, Predicate< private enum RemovalPredicate { JUST_ORES(state -> state.is(ToolkitPlatform.getOresTag())), - ORES_AND_MODDED(state -> state.is(ToolkitPlatform.getOresTag()) && Registry.BLOCK.getKey(state.getBlock()).getNamespace().equals("minecraft")); + ORES_AND_MODDED(state -> state.is(ToolkitPlatform.getOresTag()) && BuiltInRegistries.BLOCK.getKey(state.getBlock()).getNamespace().equals("minecraft")); public static final List VALUES = Arrays.asList(values()); public static final String[] NAMES = VALUES.stream().map(e -> e.toString().toLowerCase()).toArray(String[]::new); diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java index 4e240f0..bd2dee1 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java @@ -4,14 +4,15 @@ import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.serialization.Codec; +import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; -import net.minecraft.commands.arguments.EntitySummonArgument; +import net.minecraft.commands.arguments.ResourceArgument; import net.minecraft.commands.arguments.StringRepresentableArgument; import net.minecraft.commands.synchronization.SuggestionProviders; -import net.minecraft.core.Registry; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.StringRepresentable; import net.minecraft.world.entity.Entity; @@ -66,26 +67,24 @@ public static KillType getKillType(CommandContext source, St } } - public static ArgumentBuilder register() { + public static ArgumentBuilder register(CommandBuildContext arg) { return Commands.literal("kill") .requires(cs -> cs.hasPermission(2)) .then(Commands.argument("type", KillTypeArgument.killType()) .executes(context -> kill(KillTypeArgument.getKillType(context, "type"), context.getSource()))) - .then(Commands.literal("by").then(Commands.argument("entity", EntitySummonArgument.id()).suggests(SuggestionProviders.SUMMONABLE_ENTITIES).executes(context -> killByEntity(context, EntitySummonArgument.getSummonableEntity(context, "entity"))))); + .then(Commands.literal("by").then( + Commands.argument("entity", ResourceArgument.resource(arg, Registries.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES).executes(context -> killByEntity(context, ResourceArgument.getSummonableEntityType(context, "entity"))))); } - private static int killByEntity(CommandContext context, ResourceLocation entityId) throws CommandSyntaxException { + private static int killByEntity(CommandContext context, Holder.Reference> reference) throws CommandSyntaxException { CommandSourceStack source = context.getSource(); var level = source.getLevel(); - EntityType entityType = Registry.ENTITY_TYPE.get(entityId); - if (entityType == null) { - return -1; - } + EntityType entityType = reference.value(); - source.sendSuccess(Component.translatable("commands.toolkit.kill.start", entityId), true); + source.sendSuccess(Component.translatable("commands.toolkit.kill.start", entityType), true); var entitiesKilled = yeetEntities((player, entity) -> entity.getType().equals(entityType), level, source.getPlayerOrException()); - yeetedEntitiesMessage(source, entitiesKilled, entityId.toString()); + yeetedEntitiesMessage(source, entitiesKilled, entityType.toShortString()); return 0; } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/player/TeleportDimensionSpawnCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/player/TeleportDimensionSpawnCommand.java index f442671..ffc0d09 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/player/TeleportDimensionSpawnCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/player/TeleportDimensionSpawnCommand.java @@ -38,7 +38,7 @@ private static int teleport(CommandSourceStack source, MinecraftServer server, C for (Entity entity : entities) { BlockPos pos = entity.blockPosition(); if (!level.getWorldBorder().isWithinBounds(pos)) { - pos = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, new BlockPos(level.getWorldBorder().getCenterX(), 0.0, level.getWorldBorder().getCenterZ())); + pos = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, new BlockPos((int) level.getWorldBorder().getCenterX(), 0, (int) level.getWorldBorder().getCenterZ())); } int playerXp = 0; diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 52b5d19..85d2812 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -21,7 +21,7 @@ side = "BOTH" [[dependencies.toolkit]] modId = "minecraft" mandatory = true -versionRange = "[1.19.5,)" +versionRange = "[1.19.4,)" ordering = "NONE" side = "BOTH" From 07f61a96bb08ce039ccb4ecbbab91bf056db258c Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Mon, 15 Jan 2024 11:48:56 +0100 Subject: [PATCH 11/13] fix datagen --- .../java/com/sunekaer/toolkit/fabric/DataGeneration.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fabric/src/main/java/com/sunekaer/toolkit/fabric/DataGeneration.java b/fabric/src/main/java/com/sunekaer/toolkit/fabric/DataGeneration.java index faddcc7..fa0b320 100644 --- a/fabric/src/main/java/com/sunekaer/toolkit/fabric/DataGeneration.java +++ b/fabric/src/main/java/com/sunekaer/toolkit/fabric/DataGeneration.java @@ -2,6 +2,7 @@ import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricLanguageProvider; import java.util.stream.IntStream; @@ -9,11 +10,12 @@ public class DataGeneration implements DataGeneratorEntrypoint { @Override public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) { - fabricDataGenerator.addProvider(new LanguageGenerator(fabricDataGenerator)); + FabricDataGenerator.Pack pack = fabricDataGenerator.createPack(); + pack.addProvider(LanguageGenerator::new); } private static class LanguageGenerator extends FabricLanguageProvider { - public LanguageGenerator(FabricDataGenerator gen) { + public LanguageGenerator(FabricDataOutput gen) { super(gen, "en_us"); } From c0076ed5522c9603442a1fabdafa88cd205034aa Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Mon, 15 Jan 2024 12:30:38 +0100 Subject: [PATCH 12/13] 1.20.2 & neo --- .../sunekaer/toolkit/commands/TKCommand.java | 2 +- .../commands/inventory/CopyCommand.java | 2 +- .../inventory/InventoryCollector.java | 2 +- .../commands/inventory/PrintCommand.java | 4 +- .../commands/items/EnchantCommand.java | 4 +- .../commands/items/RepairItemCommand.java | 2 +- .../level/BlockDistributionCommand.java | 8 +- .../toolkit/commands/level/ClearCommand.java | 2 +- .../commands/level/KillEntitiesCommand.java | 8 +- .../toolkit/commands/player/GodCommand.java | 2 +- .../sunekaer/toolkit/event/PlayerEvents.java | 2 +- forge/src/main/resources/META-INF/mods.toml | 8 +- gradle.properties | 18 ++-- neoforge/build.gradle | 85 +++++++++++++++++++ neoforge/gradle.properties | 1 + .../com/sunekaer/toolkit/neo/ToolkitNeo.java | 27 ++++++ .../toolkit/neo/ToolkitPlatformImpl.java | 52 ++++++++++++ .../src/main/resources/META-INF/mods.toml | 33 +++++++ neoforge/src/main/resources/pack.mcmeta | 6 ++ .../src/main/resources/toolkit.mixins.json | 13 +++ settings.gradle | 1 + 21 files changed, 252 insertions(+), 30 deletions(-) create mode 100644 neoforge/build.gradle create mode 100644 neoforge/gradle.properties create mode 100644 neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitNeo.java create mode 100644 neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitPlatformImpl.java create mode 100644 neoforge/src/main/resources/META-INF/mods.toml create mode 100644 neoforge/src/main/resources/pack.mcmeta create mode 100644 neoforge/src/main/resources/toolkit.mixins.json diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java index bdd0eec..8705179 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/TKCommand.java @@ -25,7 +25,7 @@ public static void register(CommandDispatcher dispatcher, Co .executes(c -> { ServerLevel level = c.getSource() .getPlayerOrException() - .getLevel(); + .serverLevel(); if (level.isRaining() || level.isThundering()) { level.setWeatherParameters(6000, 0, false, false); diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java index 5cf6e7f..725b959 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/CopyCommand.java @@ -66,7 +66,7 @@ private static int copy(CommandContext context) throws Comma clipboard.append(itemName).append(withNBT).append(CommandUtils.NEW_LINE); } - source.sendSuccess(Component.translatable("commands.toolkit.clipboard.copied"), true); + source.sendSuccess(() -> Component.translatable("commands.toolkit.clipboard.copied"), true); Handler.CHANNEL.sendToPlayer(player, new SetCopy(clipboard.toString())); return 1; diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/InventoryCollector.java b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/InventoryCollector.java index cb7e4f1..82ef399 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/InventoryCollector.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/InventoryCollector.java @@ -71,7 +71,7 @@ public enum InventoryCollector { return items; } - var level = player.level; + var level = player.level(); return ToolkitPlatform.getInventoryFromBlockEntity(level, blockHit.getBlockPos(), blockHit.getDirection()); }); diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/PrintCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/PrintCommand.java index b64eaa3..2ad4366 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/inventory/PrintCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/inventory/PrintCommand.java @@ -50,7 +50,7 @@ private static int print(CommandContext context, String type String combinedItemNBT = itemName + withNBT; - source.sendSuccess(Component.literal(combinedItemNBT).withStyle(Style.EMPTY + source.sendSuccess(() -> Component.literal(combinedItemNBT).withStyle(Style.EMPTY .withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, combinedItemNBT)) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("Copy tag"))) .withColor(ChatFormatting.YELLOW)), false); @@ -65,7 +65,7 @@ private static int print(CommandContext context, String type for (TagKey tag : tags) { var tagString = String.format("#%s", tag.location()); - source.sendSuccess(Component.literal("- ").append(Component.literal(tagString).withStyle(Style.EMPTY.withColor(ChatFormatting.RED) + source.sendSuccess(() -> Component.literal("- ").append(Component.literal(tagString).withStyle(Style.EMPTY.withColor(ChatFormatting.RED) .withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, tagString)) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("Copy tag"))) )), false); diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java index dd1dd49..96c9b3a 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/items/EnchantCommand.java @@ -59,7 +59,7 @@ private static int enchant(CommandContext context, Holder.Re } EnchantmentHacks.enchantItem(mainHandItem, enchantment, (short) level); - source.sendSuccess(Component.translatable("commands.toolkit.enchant.success", mainHandItem.getItem().getName(mainHandItem).getString(), enchantment.getFullname(level).getString()), false); + source.sendSuccess(() -> Component.translatable("commands.toolkit.enchant.success", mainHandItem.getItem().getName(mainHandItem).getString(), enchantment.getFullname(level).getString()), false); return 1; } @@ -79,7 +79,7 @@ private static int removeEnchantment(CommandContext context, boolean success = EnchantmentHacks.removeEnchantment(mainHandItem, enchantment); if (success) { - source.sendSuccess(Component.translatable("commands.toolkit.remove_enchant.success", mainHandItem.getItem().getName(mainHandItem).getString(), enchantment.getFullname(1).getString()), false); + source.sendSuccess(() -> Component.translatable("commands.toolkit.remove_enchant.success", mainHandItem.getItem().getName(mainHandItem).getString(), enchantment.getFullname(1).getString()), false); } else { source.sendFailure(Component.translatable("commands.toolkit.remove_enchant.failed", mainHandItem.getItem().getName(mainHandItem).getString(), enchantment.getFullname(1).getString())); } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/items/RepairItemCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/items/RepairItemCommand.java index 40f94ea..25ad3a0 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/items/RepairItemCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/items/RepairItemCommand.java @@ -26,7 +26,7 @@ private static int repair(CommandContext context, ServerPlay } item.setDamageValue(0); - source.sendSuccess(Component.translatable("commands.toolkit.repair.success", item.getItem().getName(item).getString()), false); + source.sendSuccess(() -> Component.translatable("commands.toolkit.repair.success", item.getItem().getName(item).getString()), false); return 1; } } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java index 3f12a44..cccace0 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/BlockDistributionCommand.java @@ -66,15 +66,15 @@ private static int getOreDist(CommandSourceStack source, Player player, int size double sum = blockOccurrences.size(); if (sum == 0) { - source.sendSuccess(Component.literal("No ores found").withStyle(ChatFormatting.RED), true); + source.sendSuccess(() -> Component.literal("No ores found").withStyle(ChatFormatting.RED), true); return 1; } // Sort the multiset by count var sortedSet = LinkedHashMultiset.create(blockOccurrences.entrySet().stream().sorted((a, b) -> Integer.compare(b.getCount(), a.getCount())).toList()); - source.sendSuccess(Component.literal("Block distribution for " + size + "x" + size + " chunks (total: " + COMMA_FORMATTER.format(sum) + ")").withStyle(ChatFormatting.GREEN), false); - source.sendSuccess(Component.literal(""), false); + source.sendSuccess(() -> Component.literal("Block distribution for " + size + "x" + size + " chunks (total: " + COMMA_FORMATTER.format(sum) + ")").withStyle(ChatFormatting.GREEN), false); + source.sendSuccess(() -> Component.literal(""), false); int i = 0; for (Multiset.Entry entry : sortedSet) { @@ -90,7 +90,7 @@ private static int getOreDist(CommandSourceStack source, Player player, int size component.append(Component.literal("]").withStyle(Style.EMPTY.withColor(yellow))); component.append(Component.literal(" " + entry.getElement()).withStyle(Style.EMPTY.withColor(white))); - source.sendSuccess(component, false); + source.sendSuccess(() -> component, false); i ++; } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java index 277bda2..06601e2 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/ClearCommand.java @@ -62,7 +62,7 @@ private static int remove(CommandSourceStack source, int size, String filter) th } ServerLevel level = source.getLevel(); - source.sendSuccess(Component.translatable("commands.toolkit.remove.lagwarring"), true); + source.sendSuccess(() -> Component.translatable("commands.toolkit.remove.lagwarring"), true); // We're removing 1 to make it so 1 = 0, 2 - 1, etc, this means we'll have correct radius 0 = 1x1, 1 = 3x3, 2 = 5x5 var range = size - 1; diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java index bd2dee1..a29815f 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/KillEntitiesCommand.java @@ -82,7 +82,7 @@ private static int killByEntity(CommandContext context, Hold EntityType entityType = reference.value(); - source.sendSuccess(Component.translatable("commands.toolkit.kill.start", entityType), true); + source.sendSuccess(() -> Component.translatable("commands.toolkit.kill.start", entityType), true); var entitiesKilled = yeetEntities((player, entity) -> entity.getType().equals(entityType), level, source.getPlayerOrException()); yeetedEntitiesMessage(source, entitiesKilled, entityType.toShortString()); @@ -94,7 +94,7 @@ private static int kill(KillType type, CommandSourceStack source) throws Command int entitiesKilled = 0; String typeName = Component.translatable("commands.toolkit.kill.type." + type.name()).getString(); - source.sendSuccess(Component.translatable("commands.toolkit.kill.start", typeName), true); + source.sendSuccess(() -> Component.translatable("commands.toolkit.kill.start", typeName), true); if (type == KillType.me || type == KillType.players) { for (Player player : level.getPlayers(e -> type.checker.test(e, e))) { @@ -112,9 +112,9 @@ private static int kill(KillType type, CommandSourceStack source) throws Command private static void yeetedEntitiesMessage(CommandSourceStack source, int yeetedAmount, String typeName) { if (yeetedAmount > 0) { - source.sendSuccess(Component.translatable("commands.toolkit.kill.done", yeetedAmount), true); + source.sendSuccess(() -> Component.translatable("commands.toolkit.kill.done", yeetedAmount), true); } else { - source.sendSuccess(Component.translatable("commands.toolkit.kill.no", typeName), true); + source.sendSuccess(() -> Component.translatable("commands.toolkit.kill.no", typeName), true); } } diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/player/GodCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/player/GodCommand.java index 18dd12a..a98b6df 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/player/GodCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/player/GodCommand.java @@ -17,7 +17,7 @@ public class GodCommand { private static int god(CommandContext context, ServerPlayer player) { player.setInvulnerable(!player.isInvulnerable()); - context.getSource().sendSuccess(Component.literal(player.isInvulnerable() ? "God mode enabled" : "God mode disabled"), false); + context.getSource().sendSuccess(() -> Component.literal(player.isInvulnerable() ? "God mode enabled" : "God mode disabled"), false); return 1; } diff --git a/common/src/main/java/com/sunekaer/toolkit/event/PlayerEvents.java b/common/src/main/java/com/sunekaer/toolkit/event/PlayerEvents.java index aa2318a..368042f 100644 --- a/common/src/main/java/com/sunekaer/toolkit/event/PlayerEvents.java +++ b/common/src/main/java/com/sunekaer/toolkit/event/PlayerEvents.java @@ -8,7 +8,7 @@ public class PlayerEvents { public static void playerJoined(ServerPlayer player) { if (player != null && Toolkit.SHOW_ON_JOIN_MESSAGE.get()) { - if (!player.getLevel().isClientSide) { + if (!player.level().isClientSide) { player.displayClientMessage(Component.literal(Toolkit.JOIN_MESSAGE.get()), false); } } diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 85d2812..73cfcdf 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion="[45,)" #mandatory +loaderVersion="[48,)" #mandatory license = "All Rights Reserved" [[mods]] @@ -14,20 +14,20 @@ This mod adds bunch of useful commands [[dependencies.toolkit]] modId = "forge" mandatory = true -versionRange = "[45,)" +versionRange = "[48,)" ordering = "NONE" side = "BOTH" [[dependencies.toolkit]] modId = "minecraft" mandatory = true -versionRange = "[1.19.4,)" +versionRange = "[1.20.2,)" ordering = "NONE" side = "BOTH" [[dependencies.toolkit]] modId = "architectury" mandatory = true -versionRange = "[8.2.89,)" +versionRange = "[10.0.17,)" ordering = "AFTER" side = "BOTH" diff --git a/gradle.properties b/gradle.properties index a3e3f24..c3bd034 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,18 +1,22 @@ org.gradle.jvmargs=-Xmx2048M -minecraft_version=1.19.4 -enabled_platforms=fabric,forge +minecraft_version=1.20.2 +enabled_platforms=fabric,forge,neoforge archives_base_name=ToolKit -mod_version=79.0.0 +mod_version=82.0.0 maven_group=com.sunekaer.mods -architectury_version=8.2.89 +architectury_version=10.0.17 -fabric_loader_version=0.15.3 -fabric_api_version=0.87.2+1.19.4 +fabric_loader_version=0.15.4 +fabric_api_version=0.91.3+1.20.2 -forge_version=45.2.8 +forge_version=48.1.0 +forge_gradle_version=6.0.20 + +neoforge_version=20.2.88 +neoforge_gradle_version=7.0.83 curseforge_id=324888 modrinth_id=fWj0tJp5 diff --git a/neoforge/build.gradle b/neoforge/build.gradle new file mode 100644 index 0000000..5c78617 --- /dev/null +++ b/neoforge/build.gradle @@ -0,0 +1,85 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +repositories { + maven { + url "https://maven.saps.dev/mirror" + } +} + +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath + + // neoForge {} +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentNeoForge.extendsFrom common +} + +dependencies { + neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" + modApi "dev.architectury:architectury-neoforge:${rootProject.architectury_version}" + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } +} + +processResources { + duplicatesStrategy(DuplicatesStrategy.EXCLUDE) + inputs.property "version", project.version + + filesMatching("META-INF/mods.toml") { + expand "version": project.version + } +} + +shadowJar { + exclude "fabric.mod.json" + exclude "architectury.common.json" + + configurations = [project.configurations.shadowCommon] + setArchiveClassifier "dev-shadow" +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar + archiveBaseName.set "${rootProject.archives_base_name}-${project.name}" + setArchiveClassifier(null) +} + +jar { + setArchiveClassifier("dev") +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenNeoForge(MavenPublication) { + artifactId = "${rootProject.archivesBaseName}-${project.name}" + from components.java + } + } +} \ No newline at end of file diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties new file mode 100644 index 0000000..2914393 --- /dev/null +++ b/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge \ No newline at end of file diff --git a/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitNeo.java b/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitNeo.java new file mode 100644 index 0000000..1d15a58 --- /dev/null +++ b/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitNeo.java @@ -0,0 +1,27 @@ +package com.sunekaer.toolkit.neo; + +import com.sunekaer.toolkit.commands.level.KillEntitiesCommand; +import com.sunekaer.toolkit.Toolkit; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.commands.synchronization.SingletonArgumentInfo; +import net.minecraft.core.registries.BuiltInRegistries; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.javafmlmod.FMLJavaModLoadingContext; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; + + +@Mod(Toolkit.MODID) +public class ToolkitNeo { + private static final DeferredRegister> ARGUMENT_REGISTRY = DeferredRegister.create(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, Toolkit.MODID); + private static final DeferredHolder, SingletonArgumentInfo> KILL_TYPE_ARG = ARGUMENT_REGISTRY.register("kill_type", + () -> ArgumentTypeInfos.registerByClass(KillEntitiesCommand.KillTypeArgument.class, SingletonArgumentInfo.contextFree(KillEntitiesCommand.KillTypeArgument::killType))); + public ToolkitNeo() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + Toolkit.init(); + + ARGUMENT_REGISTRY.register(modEventBus); + } +} diff --git a/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitPlatformImpl.java b/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitPlatformImpl.java new file mode 100644 index 0000000..2a79f17 --- /dev/null +++ b/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitPlatformImpl.java @@ -0,0 +1,52 @@ +package com.sunekaer.toolkit.neo; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.capabilities.Capabilities; +import org.jetbrains.annotations.Nullable; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +public class ToolkitPlatformImpl { + public static Path getConfigDirectory() { + return FMLPaths.CONFIGDIR.get(); + } + + public static TagKey getOresTag() { + return Tags.Blocks.ORES; + } + + public static Path getGamePath() { + return FMLPaths.GAMEDIR.get(); + } + + public static List getInventoryFromBlockEntity(Level level, BlockPos pos, @Nullable Direction direction) { + List items = new ArrayList<>(); + + BlockEntity entity = level.getBlockEntity(pos); + if (entity == null) { + return items; + } + + entity.getCapability(Capabilities.ITEM_HANDLER).ifPresent(handler -> { + for (int i = 0; i < handler.getSlots(); i++) { + var stack = handler.getStackInSlot(i); + if (stack.isEmpty()) { + continue; + } + items.add(stack); + } + }); + + return items; + } +} diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..c6a48c9 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,33 @@ +modLoader = "javafml" +loaderVersion="[1,)" #mandatory +license = "All Rights Reserved" + +[[mods]] +modId = "toolkit" +version = "${version}" +displayName = "Toolkit" +authors="Sunekaer" +description=''' +This mod adds bunch of useful commands +''' + +[[dependencies.toolkit]] +modId = "neoforge" +mandatory = true +versionRange = "[20.2,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.toolkit]] +modId = "minecraft" +mandatory = true +versionRange = "[1.20.2,)" +ordering = "NONE" +side = "BOTH" + +[[dependencies.toolkit]] +modId = "architectury" +mandatory = true +versionRange = "[10.0.17,)" +ordering = "AFTER" +side = "BOTH" diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..00c81ec --- /dev/null +++ b/neoforge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "Toolkit mod Mod", + "pack_format": 9 + } +} diff --git a/neoforge/src/main/resources/toolkit.mixins.json b/neoforge/src/main/resources/toolkit.mixins.json new file mode 100644 index 0000000..dc803a5 --- /dev/null +++ b/neoforge/src/main/resources/toolkit.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "com.sunekaer.toolkit.mixin.neo", + "compatibilityLevel": "JAVA_17", + "minVersion": "0.8", + "client": [ + ], + "mixins": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/settings.gradle b/settings.gradle index 71707c4..6e323d7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,5 +10,6 @@ pluginManagement { include("common") include("fabric") include("forge") +include("neoforge") //rootProject.name = "toolkit" From ff18431ef6d320a0c91eabdf16db76814ba3769a Mon Sep 17 00:00:00 2001 From: Sunekaer - MAC Date: Mon, 15 Jan 2024 12:47:42 +0100 Subject: [PATCH 13/13] fix platform impl. --- common/src/main/java/com/sunekaer/toolkit/Toolkit.java | 2 +- .../sunekaer/toolkit/commands/level/DrainFluidCommand.java | 2 +- .../src/main/java/com/sunekaer/toolkit/network/Handler.java | 2 +- .../java/com/sunekaer/toolkit/fabric/ToolkitFabric.java | 2 +- .../main/java/com/sunekaer/toolkit/forge/ToolkitForge.java | 6 +++--- .../com/sunekaer/toolkit/{neo => neoforge}/ToolkitNeo.java | 6 +++--- .../toolkit/{neo => neoforge}/ToolkitPlatformImpl.java | 2 +- settings.gradle | 2 ++ 8 files changed, 13 insertions(+), 11 deletions(-) rename neoforge/src/main/java/com/sunekaer/toolkit/{neo => neoforge}/ToolkitNeo.java (92%) rename neoforge/src/main/java/com/sunekaer/toolkit/{neo => neoforge}/ToolkitPlatformImpl.java (97%) diff --git a/common/src/main/java/com/sunekaer/toolkit/Toolkit.java b/common/src/main/java/com/sunekaer/toolkit/Toolkit.java index fa994bf..cfb3e29 100644 --- a/common/src/main/java/com/sunekaer/toolkit/Toolkit.java +++ b/common/src/main/java/com/sunekaer/toolkit/Toolkit.java @@ -20,7 +20,7 @@ public class Toolkit { private static final Logger LOGGER = LoggerFactory.getLogger(Toolkit.class); - public static final String MODID = "toolkit"; + public static final String MOD_ID = "toolkit"; public static final DefaultedValue SHOW_ON_JOIN_MESSAGE = new DefaultedValue<>(true); public static final DefaultedValue JOIN_MESSAGE = new DefaultedValue<>("Hello from ToolKit, this message can be change or disabled in config."); diff --git a/common/src/main/java/com/sunekaer/toolkit/commands/level/DrainFluidCommand.java b/common/src/main/java/com/sunekaer/toolkit/commands/level/DrainFluidCommand.java index ab84410..c9588d2 100644 --- a/common/src/main/java/com/sunekaer/toolkit/commands/level/DrainFluidCommand.java +++ b/common/src/main/java/com/sunekaer/toolkit/commands/level/DrainFluidCommand.java @@ -66,7 +66,7 @@ private static int drainFluids(CommandSourceStack source, BlockPos location, int BlockState state = level.getBlockState(pos); if (state.isAir()) { - source.sendFailure(Component.literal("Go away")); + source.sendFailure(Component.literal("Go closer to the fluid source")); return 1; } diff --git a/common/src/main/java/com/sunekaer/toolkit/network/Handler.java b/common/src/main/java/com/sunekaer/toolkit/network/Handler.java index 78d9aa2..f322a2b 100644 --- a/common/src/main/java/com/sunekaer/toolkit/network/Handler.java +++ b/common/src/main/java/com/sunekaer/toolkit/network/Handler.java @@ -5,7 +5,7 @@ import net.minecraft.resources.ResourceLocation; public class Handler { - public static final NetworkChannel CHANNEL = NetworkChannel.create(new ResourceLocation(Toolkit.MODID, "networking_channel")); + public static final NetworkChannel CHANNEL = NetworkChannel.create(new ResourceLocation(Toolkit.MOD_ID, "networking_channel")); public static void init() { CHANNEL.register(SetCopy.class, SetCopy::encode, SetCopy::new, SetCopy::apply); diff --git a/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitFabric.java b/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitFabric.java index 6404410..b4eadc1 100644 --- a/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitFabric.java +++ b/fabric/src/main/java/com/sunekaer/toolkit/fabric/ToolkitFabric.java @@ -12,7 +12,7 @@ public class ToolkitFabric implements ModInitializer { public void onInitialize() { Toolkit.init(); ArgumentTypeRegistry.registerArgumentType( - new ResourceLocation(Toolkit.MODID, "kill_type"), + new ResourceLocation(Toolkit.MOD_ID, "kill_type"), KillEntitiesCommand.KillTypeArgument.class, SingletonArgumentInfo.contextFree(KillEntitiesCommand.KillTypeArgument::killType) ); diff --git a/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitForge.java b/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitForge.java index 1a85d99..dba8000 100644 --- a/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitForge.java +++ b/forge/src/main/java/com/sunekaer/toolkit/forge/ToolkitForge.java @@ -13,14 +13,14 @@ import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; -@Mod(Toolkit.MODID) +@Mod(Toolkit.MOD_ID) public class ToolkitForge { - private static final DeferredRegister> ARGUMENT_REGISTRY = DeferredRegister.create(ForgeRegistries.COMMAND_ARGUMENT_TYPES, Toolkit.MODID); + private static final DeferredRegister> ARGUMENT_REGISTRY = DeferredRegister.create(ForgeRegistries.COMMAND_ARGUMENT_TYPES, Toolkit.MOD_ID); private static final RegistryObject> KILL_TYPE_ARG = ARGUMENT_REGISTRY.register("kill_type", () -> ArgumentTypeInfos.registerByClass(KillEntitiesCommand.KillTypeArgument.class, SingletonArgumentInfo.contextFree(KillEntitiesCommand.KillTypeArgument::killType))); public ToolkitForge() { IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - EventBuses.registerModEventBus(Toolkit.MODID, modEventBus); + EventBuses.registerModEventBus(Toolkit.MOD_ID, modEventBus); Toolkit.init(); ARGUMENT_REGISTRY.register(modEventBus); diff --git a/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitNeo.java b/neoforge/src/main/java/com/sunekaer/toolkit/neoforge/ToolkitNeo.java similarity index 92% rename from neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitNeo.java rename to neoforge/src/main/java/com/sunekaer/toolkit/neoforge/ToolkitNeo.java index 1d15a58..9eb2972 100644 --- a/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitNeo.java +++ b/neoforge/src/main/java/com/sunekaer/toolkit/neoforge/ToolkitNeo.java @@ -1,4 +1,4 @@ -package com.sunekaer.toolkit.neo; +package com.sunekaer.toolkit.neoforge; import com.sunekaer.toolkit.commands.level.KillEntitiesCommand; import com.sunekaer.toolkit.Toolkit; @@ -13,9 +13,9 @@ import net.neoforged.neoforge.registries.DeferredRegister; -@Mod(Toolkit.MODID) +@Mod(Toolkit.MOD_ID) public class ToolkitNeo { - private static final DeferredRegister> ARGUMENT_REGISTRY = DeferredRegister.create(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, Toolkit.MODID); + private static final DeferredRegister> ARGUMENT_REGISTRY = DeferredRegister.create(BuiltInRegistries.COMMAND_ARGUMENT_TYPE, Toolkit.MOD_ID); private static final DeferredHolder, SingletonArgumentInfo> KILL_TYPE_ARG = ARGUMENT_REGISTRY.register("kill_type", () -> ArgumentTypeInfos.registerByClass(KillEntitiesCommand.KillTypeArgument.class, SingletonArgumentInfo.contextFree(KillEntitiesCommand.KillTypeArgument::killType))); public ToolkitNeo() { diff --git a/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitPlatformImpl.java b/neoforge/src/main/java/com/sunekaer/toolkit/neoforge/ToolkitPlatformImpl.java similarity index 97% rename from neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitPlatformImpl.java rename to neoforge/src/main/java/com/sunekaer/toolkit/neoforge/ToolkitPlatformImpl.java index 2a79f17..75b0df8 100644 --- a/neoforge/src/main/java/com/sunekaer/toolkit/neo/ToolkitPlatformImpl.java +++ b/neoforge/src/main/java/com/sunekaer/toolkit/neoforge/ToolkitPlatformImpl.java @@ -1,4 +1,4 @@ -package com.sunekaer.toolkit.neo; +package com.sunekaer.toolkit.neoforge; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/settings.gradle b/settings.gradle index 6e323d7..40338ec 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,5 +1,7 @@ pluginManagement { repositories { + maven { url "https://maven.neoforged.net/releases" } + maven { url "https://maven.creeperhost.net/" } maven { url "https://maven.fabricmc.net/" } maven { url "https://maven.architectury.dev/" } maven { url "https://maven.minecraftforge.net/" }