From 3a9b38dc83ec951ab0629bf37bd2824a42ac5afe Mon Sep 17 00:00:00 2001 From: DAQEM Date: Tue, 14 Jan 2025 19:27:03 +0100 Subject: [PATCH 01/52] Fixed version name --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 53d2dbd..ab1641a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.20.6 enabled_platforms=fabric,neoforge archives_base_name=grieflogger -mod_version=1.2 +mod_version=1.2-1.20.6 maven_group=com.daqem.grieflogger architectury_version=12.1.4 From dabe9e402fd56a2e68da976866cd968e31feeec7 Mon Sep 17 00:00:00 2001 From: steve6472 <20379161+steve6472@users.noreply.github.com> Date: Tue, 14 Jan 2025 23:25:37 +0100 Subject: [PATCH 02/52] Initial update to 1.21.4 - Known issues: - Dropping item does not log - NeoForge does not seem to work --- build.gradle | 2 +- .../java/com/daqem/grieflogger/GriefLogger.java | 3 +-- .../daqem/grieflogger/block/BlockHandler.java | 3 +++ .../database/service/ContainerService.java | 2 -- .../event/block/InspectBlockEvent.java | 5 +++-- .../event/block/InspectContainerEvent.java | 9 +++++---- .../event/block/InspectDoorEvent.java | 7 ++++--- .../event/block/LeftClickBlockEvent.java | 5 +++-- .../event/block/RightClickBlockEvent.java | 10 +++++++--- .../grieflogger/event/item/DropItemEvent.java | 2 ++ .../daqem/grieflogger/event/item/ItemEvents.java | 1 + .../com/daqem/grieflogger/mixin/ItemMixin.java | 3 --- .../daqem/grieflogger/mixin/MixinItemStack.java | 15 ++++++++++----- .../grieflogger/mixin/MixinServerPlayer.java | 3 ++- .../daqem/grieflogger/mixin/ProjectileMixin.java | 4 ---- .../daqem/grieflogger/model/SimpleItemStack.java | 6 +----- .../grieflogger/model/history/BlockHistory.java | 4 ++-- .../grieflogger/model/history/ItemHistory.java | 2 +- fabric/build.gradle | 6 +++--- gradle.properties | 16 ++++++++-------- gradle/wrapper/gradle-wrapper.properties | 2 +- neoforge/build.gradle | 4 ++-- .../main/resources/META-INF/neoforge.mods.toml | 2 +- 23 files changed, 61 insertions(+), 55 deletions(-) diff --git a/build.gradle b/build.gradle index d61dc25..d931f00 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.9-SNAPSHOT" apply false id "architectury-plugin" version "3.4-SNAPSHOT" id 'com.github.johnrengelman.shadow' version '8.1.1' apply false } diff --git a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java index 106a364..6f0b4f8 100644 --- a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java +++ b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java @@ -6,7 +6,6 @@ import com.daqem.grieflogger.event.*; import com.daqem.grieflogger.event.block.BlockEvents; import com.daqem.grieflogger.event.item.ItemEvents; -import com.daqem.grieflogger.thread.ThreadManager; import com.mojang.logging.LogUtils; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -150,6 +149,6 @@ public static Style getTheme() { } public static ResourceLocation getId(String id) { - return new ResourceLocation(MOD_ID, id); + return ResourceLocation.fromNamespaceAndPath(MOD_ID, id); } } diff --git a/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java b/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java index 9959015..f675166 100644 --- a/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java +++ b/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java @@ -34,6 +34,9 @@ public static boolean isBlockIntractable(Block block) { || block instanceof EnchantingTableBlock || block instanceof SmithingTableBlock || block instanceof StonecutterBlock + || block instanceof CrafterBlock + || block instanceof VaultBlock + ) { return true; } diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java b/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java index ea27175..74b5de1 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java @@ -6,8 +6,6 @@ import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.IHistory; -import com.daqem.grieflogger.thread.OnComplete; -import com.daqem.grieflogger.thread.ThreadManager; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/InspectBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/InspectBlockEvent.java index b4d2558..ff28e83 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/InspectBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/InspectBlockEvent.java @@ -5,14 +5,15 @@ import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import dev.architectury.event.EventResult; import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionResult; public class InspectBlockEvent extends AbstractEvent { - public static EventResult inspectBlock(GriefLoggerServerPlayer player, BlockPos pos) { + public static InteractionResult inspectBlock(GriefLoggerServerPlayer player, BlockPos pos) { Services.BLOCK.getBlockHistoryAsync( player.grieflogger$asServerPlayer().level(), pos, player::grieflogger$sendInspectMessage); - return interrupt(); + return InteractionResult.FAIL; } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/InspectContainerEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/InspectContainerEvent.java index 408bb6d..5859757 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/InspectContainerEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/InspectContainerEvent.java @@ -7,6 +7,7 @@ import com.daqem.grieflogger.thread.ThreadManager; import dev.architectury.event.EventResult; import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionResult; import net.minecraft.world.level.Level; import java.util.ArrayList; @@ -14,7 +15,7 @@ public class InspectContainerEvent extends AbstractEvent { - public static EventResult inspectContainer(GriefLoggerServerPlayer serverPlayer, Level level, BlockPos pos) { + public static InteractionResult inspectContainer(GriefLoggerServerPlayer serverPlayer, Level level, BlockPos pos) { ThreadManager.submit(() -> { List history = new ArrayList<>(); List containerHistory = Services.CONTAINER.getHistory( @@ -29,10 +30,10 @@ public static EventResult inspectContainer(GriefLoggerServerPlayer serverPlayer, history.sort((a, b) -> Long.compare(b.getTime().time(), a.getTime().time())); return history; }, serverPlayer::grieflogger$sendInspectMessage); - return interrupt(); + return InteractionResult.FAIL; } - public static EventResult inspectContainers(GriefLoggerServerPlayer serverPlayer, Level level, BlockPos pos, BlockPos connectionPos) { + public static InteractionResult inspectContainers(GriefLoggerServerPlayer serverPlayer, Level level, BlockPos pos, BlockPos connectionPos) { ThreadManager.submit(() -> { List history = new ArrayList<>(); List containerHistory = Services.CONTAINER.getHistory( @@ -48,6 +49,6 @@ public static EventResult inspectContainers(GriefLoggerServerPlayer serverPlayer history.sort((a, b) -> Long.compare(b.getTime().time(), a.getTime().time())); return history; }, serverPlayer::grieflogger$sendInspectMessage); - return interrupt(); + return InteractionResult.FAIL; } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/InspectDoorEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/InspectDoorEvent.java index e8db9bf..184fc05 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/InspectDoorEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/InspectDoorEvent.java @@ -8,6 +8,7 @@ import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import dev.architectury.event.EventResult; import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionResult; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; @@ -16,7 +17,7 @@ public class InspectDoorEvent extends AbstractEvent { - public static EventResult inspectDoor(GriefLoggerServerPlayer player, Level level, BlockPos pos, BlockState state, boolean isInteraction) { + public static InteractionResult inspectDoor(GriefLoggerServerPlayer player, Level level, BlockPos pos, BlockState state, boolean isInteraction) { List positions = new ArrayList<>(List.of(pos)); BlockHandler.getSecondDoorPosition(pos, state).ifPresent(positions::add); if (isInteraction) { @@ -24,13 +25,13 @@ public static EventResult inspectDoor(GriefLoggerServerPlayer player, Level leve level, positions, player::grieflogger$sendInspectMessage); - return interrupt(); + return InteractionResult.FAIL; } else { Services.BLOCK.getBlockHistoryAsync( level, positions, player::grieflogger$sendInspectMessage); } - return interrupt(); + return InteractionResult.FAIL; } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/LeftClickBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/LeftClickBlockEvent.java index ce1b413..efc0877 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/LeftClickBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/LeftClickBlockEvent.java @@ -6,6 +6,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -14,7 +15,7 @@ public class LeftClickBlockEvent extends AbstractEvent { - public static EventResult leftClickBlock(Player player, InteractionHand hand, BlockPos pos, Direction direction) { + public static InteractionResult leftClickBlock(Player player, InteractionHand hand, BlockPos pos, Direction direction) { if (player instanceof GriefLoggerServerPlayer serverPlayer) { if (hand == InteractionHand.MAIN_HAND) { if (serverPlayer.grieflogger$isInspecting()) { @@ -30,6 +31,6 @@ public static EventResult leftClickBlock(Player player, InteractionHand hand, Bl } } } - return pass(); + return InteractionResult.PASS; } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java index 5936496..51e1927 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java @@ -5,10 +5,10 @@ import com.daqem.grieflogger.event.AbstractEvent; import com.daqem.grieflogger.model.action.BlockAction; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; -import dev.architectury.event.EventResult; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -23,7 +23,7 @@ public class RightClickBlockEvent extends AbstractEvent { - public static EventResult rightClickBlock(Player player, InteractionHand hand, BlockPos pos, Direction direction) { + public static InteractionResult rightClickBlock(Player player, InteractionHand hand, BlockPos pos, Direction direction) { if (player instanceof GriefLoggerServerPlayer serverPlayer) { if (hand == InteractionHand.MAIN_HAND) { @@ -78,8 +78,12 @@ public static EventResult rightClickBlock(Player player, InteractionHand hand, B if (BlockHandler.isBlockIntractable(block)) { LogBlockEvent.logBlock(serverPlayer, level, state, pos, BlockAction.INTERACT_BLOCK); } + + // TODO: mixin to AxeItem to get STRIPPABLES (axe right click event) + // TODO: hoe event + // TODO: cauldron } } - return pass(); + return InteractionResult.PASS; } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java b/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java index eaedfa8..9d4de4d 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java @@ -11,6 +11,8 @@ public class DropItemEvent extends AbstractEvent { public static EventResult onDropItem(Player player, ItemEntity itemEntity) { + // TODO: fix drop item and remove this + System.out.println("Drop item : " + itemEntity); if (player instanceof GriefLoggerServerPlayer serverPlayer) { serverPlayer.griefLogger$addItemToQueue(ItemAction.DROP_ITEM, new SimpleItemStack(itemEntity.getItem())); } diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java b/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java index 6510986..c4428a7 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java @@ -6,6 +6,7 @@ public class ItemEvents { public static void registerEvents() { PlayerEvent.CRAFT_ITEM.register(CraftItemEvent::onCraftItem); + // TODO: drop item event does not work PlayerEvent.DROP_ITEM.register(DropItemEvent::onDropItem); PlayerEvent.PICKUP_ITEM_POST.register(PickupItemEvent::onPickupItem); PlayerEvent.SMELT_ITEM.register(SmeltItemEvent::onSmeltItem); diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/ItemMixin.java b/common/src/main/java/com/daqem/grieflogger/mixin/ItemMixin.java index 018e543..24815ff 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/ItemMixin.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/ItemMixin.java @@ -1,9 +1,6 @@ package com.daqem.grieflogger.mixin; import com.daqem.grieflogger.event.item.ConsumeItemEvent; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java index 72f068b..8f80089 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java @@ -4,21 +4,26 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.function.Consumer; + @Mixin(ItemStack.class) public class MixinItemStack { @Inject(at = @At( - value = "INVOKE", - target = "Ljava/lang/Runnable;run()V", - shift = At.Shift.BEFORE - ), method = "hurtAndBreak(ILnet/minecraft/util/RandomSource;Lnet/minecraft/server/level/ServerPlayer;Ljava/lang/Runnable;)V") - public void onHurtAndBreak(int i, RandomSource randomSource, ServerPlayer serverPlayer, Runnable runnable, CallbackInfo ci) { + value = "INVOKE", + target = "Lnet/minecraft/world/item/ItemStack;shrink(I)V", + shift = At.Shift.BEFORE + ), method = "applyDamage(ILnet/minecraft/server/level/ServerPlayer;Ljava/util/function/Consumer;)V") + private void applyDamage(int i, @Nullable ServerPlayer serverPlayer, Consumer consumer, CallbackInfo ci) + { BreakItemEvent.breakItem(serverPlayer, (ItemStack) (Object) this); } } diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java index 39b7429..e6e4c0e 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java @@ -59,7 +59,8 @@ public MixinServerPlayer(Level level, BlockPos blockPos, float f, GameProfile ga @Unique public void grieflogger$sendInspectMessage(List historyList) { if (historyList.isEmpty()) { - sendSystemMessage(GriefLogger.translate("lookup.no_history", GriefLogger.getName())); + if (((Player) this) instanceof ServerPlayer serverPlayer) + serverPlayer.sendSystemMessage(GriefLogger.translate("lookup.no_history", GriefLogger.getName())); } else { List pages = Page.convertToPages(historyList, true); grieflogger$setPages(pages); diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java b/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java index 059d287..22219b4 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java @@ -1,11 +1,7 @@ package com.daqem.grieflogger.mixin; -import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.database.service.ItemService; import com.daqem.grieflogger.event.item.ShootItemEvent; import com.daqem.grieflogger.event.item.ThrowItemEvent; -import com.daqem.grieflogger.model.SimpleItemStack; -import com.daqem.grieflogger.model.action.ItemAction; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.AbstractArrow; diff --git a/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java b/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java index 33f0e63..dddc2da 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java +++ b/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java @@ -1,11 +1,8 @@ package com.daqem.grieflogger.model; -import com.mojang.brigadier.exceptions.CommandSyntaxException; import io.netty.buffer.Unpooled; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.TagParser; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; @@ -13,7 +10,6 @@ import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -import java.nio.charset.StandardCharsets; import java.util.Objects; public class SimpleItemStack { @@ -27,7 +23,7 @@ public SimpleItemStack(ItemStack itemStack) { } public SimpleItemStack(ResourceLocation itemLocation, int count, DataComponentPatch tag) { - this.item = BuiltInRegistries.ITEM.get(itemLocation); + this.item = BuiltInRegistries.ITEM.getValue(itemLocation); this.count = count; this.tag = tag; } diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java index 03b9d87..51c785e 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java @@ -45,8 +45,8 @@ public Component getMaterialComponent() { new HoverEvent( HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo( - BuiltInRegistries.BLOCK.get( - new ResourceLocation(material) + BuiltInRegistries.BLOCK.getValue( + ResourceLocation.withDefaultNamespace(material) ).asItem() .getDefaultInstance())))); } diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java index c8a996f..dd9c9ae 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java @@ -20,7 +20,7 @@ public class ItemHistory extends History { protected final SimpleItemStack itemStack; public ItemHistory(long time, String name, String uuid, int x, int y, int z, String material, DataComponentPatch data, int amount, int action) { - this(new Time(time), new User(name, UUID.fromString(uuid)), new BlockPosition(x, y, z), new SimpleItemStack(new ResourceLocation(material), amount, data), ItemAction.fromId(action)); + this(new Time(time), new User(name, UUID.fromString(uuid)), new BlockPosition(x, y, z), new SimpleItemStack(ResourceLocation.withDefaultNamespace(material), amount, data), ItemAction.fromId(action)); } public ItemHistory(Time time, User user, BlockPosition position, SimpleItemStack itemStack, IAction action) { diff --git a/fabric/build.gradle b/fabric/build.gradle index c2d3f9b..e27405f 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -73,7 +73,7 @@ remapSourcesJar { archiveClassifier = "fabric-sources" } -curseforge { +/*curseforge { apiKey = System.getenv('CURSEFORGE_API_KEY') project { id = project.curse_forge_project_id @@ -81,7 +81,7 @@ curseforge { changelogType = "markdown" changelog = rootProject.file('changelog.md') addGameVersion project.minecraft_version - addGameVersion "Java 17" + addGameVersion "Java 21" addGameVersion "Fabric" relations { @@ -119,4 +119,4 @@ modrinth { required.project "architectury-api" required.project "supermartijn642s-config-lib" } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index ab1641a..f2f4d14 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,24 +1,24 @@ org.gradle.jvmargs=-Xmx4096M -minecraft_version=1.20.6 +minecraft_version=1.21.4 enabled_platforms=fabric,neoforge archives_base_name=grieflogger -mod_version=1.2-1.20.6 +mod_version=1.2-1.21.4 maven_group=com.daqem.grieflogger -architectury_version=12.1.4 +architectury_version=15.0.1 -fabric_loader_version=0.15.10 -fabric_api_version=0.97.8+1.20.6 +fabric_loader_version=0.16.10 +fabric_api_version=0.114.2+1.21.4 -neoforge_version=20.6.124 +neoforge_version=21.4.57-beta curse_forge_project_id=435029 curse_forge_release_type=release config_library_version=1.1.8 -config_library_file_fabric=5546986 -config_library_file_neoforge=5546991 +config_library_file_fabric=5546988 +config_library_file_neoforge=5546996 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 707e499..145c0ae 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-all.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/build.gradle b/neoforge/build.gradle index c9a90a8..56f14e3 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -79,7 +79,7 @@ remapSourcesJar { archiveClassifier = "neoforge-sources" } -curseforge { +/*curseforge { apiKey = System.getenv("CURSEFORGE_API_KEY") project { id = project.curse_forge_project_id @@ -118,4 +118,4 @@ modrinth { required.project "architectury-api" required.project "supermartijn642s-config-lib" } -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 99602a0..fce3cfb 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -23,7 +23,7 @@ side = "SERVER" [[dependencies.grieflogger]] modId = "minecraft" mandatory = true -versionRange = "[1.20.6,)" +versionRange = "[1.21.4,)" ordering = "NONE" side = "SERVER" From ce61753fc4ab0bb6f60813481cc9be5e21fcfe91 Mon Sep 17 00:00:00 2001 From: steve6472 <20379161+steve6472@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:25:15 +0100 Subject: [PATCH 03/52] Reverted block event changes, removed TODOs --- .../java/com/daqem/grieflogger/block/BlockHandler.java | 1 - .../com/daqem/grieflogger/event/block/BlockEvents.java | 4 ++-- .../grieflogger/event/block/InspectBlockEvent.java | 5 ++--- .../grieflogger/event/block/InspectContainerEvent.java | 9 ++++----- .../grieflogger/event/block/InspectDoorEvent.java | 9 +++------ .../grieflogger/event/block/LeftClickBlockEvent.java | 5 ++--- .../grieflogger/event/block/RightClickBlockEvent.java | 10 +++------- .../daqem/grieflogger/event/item/DropItemEvent.java | 2 -- .../com/daqem/grieflogger/event/item/ItemEvents.java | 1 - 9 files changed, 16 insertions(+), 30 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java b/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java index f675166..a227925 100644 --- a/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java +++ b/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java @@ -4,7 +4,6 @@ import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; -import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Optional; diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java b/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java index e4f6e1d..5591e40 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java @@ -8,7 +8,7 @@ public class BlockEvents { public static void registerEvents() { BlockEvent.BREAK.register(BreakBlockEvent::breakBlock); BlockEvent.PLACE.register(PlaceBlockEvent::placeBlock); - InteractionEvent.LEFT_CLICK_BLOCK.register(LeftClickBlockEvent::leftClickBlock); - InteractionEvent.RIGHT_CLICK_BLOCK.register(RightClickBlockEvent::rightClickBlock); + InteractionEvent.LEFT_CLICK_BLOCK.register((player, hand, pos, direction) -> LeftClickBlockEvent.leftClickBlock(player, hand, pos, direction).asMinecraft()); + InteractionEvent.RIGHT_CLICK_BLOCK.register((player, hand, pos, direction) -> RightClickBlockEvent.rightClickBlock(player, hand, pos, direction).asMinecraft()); } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/InspectBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/InspectBlockEvent.java index ff28e83..b4d2558 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/InspectBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/InspectBlockEvent.java @@ -5,15 +5,14 @@ import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import dev.architectury.event.EventResult; import net.minecraft.core.BlockPos; -import net.minecraft.world.InteractionResult; public class InspectBlockEvent extends AbstractEvent { - public static InteractionResult inspectBlock(GriefLoggerServerPlayer player, BlockPos pos) { + public static EventResult inspectBlock(GriefLoggerServerPlayer player, BlockPos pos) { Services.BLOCK.getBlockHistoryAsync( player.grieflogger$asServerPlayer().level(), pos, player::grieflogger$sendInspectMessage); - return InteractionResult.FAIL; + return interrupt(); } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/InspectContainerEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/InspectContainerEvent.java index 5859757..408bb6d 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/InspectContainerEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/InspectContainerEvent.java @@ -7,7 +7,6 @@ import com.daqem.grieflogger.thread.ThreadManager; import dev.architectury.event.EventResult; import net.minecraft.core.BlockPos; -import net.minecraft.world.InteractionResult; import net.minecraft.world.level.Level; import java.util.ArrayList; @@ -15,7 +14,7 @@ public class InspectContainerEvent extends AbstractEvent { - public static InteractionResult inspectContainer(GriefLoggerServerPlayer serverPlayer, Level level, BlockPos pos) { + public static EventResult inspectContainer(GriefLoggerServerPlayer serverPlayer, Level level, BlockPos pos) { ThreadManager.submit(() -> { List history = new ArrayList<>(); List containerHistory = Services.CONTAINER.getHistory( @@ -30,10 +29,10 @@ public static InteractionResult inspectContainer(GriefLoggerServerPlayer serverP history.sort((a, b) -> Long.compare(b.getTime().time(), a.getTime().time())); return history; }, serverPlayer::grieflogger$sendInspectMessage); - return InteractionResult.FAIL; + return interrupt(); } - public static InteractionResult inspectContainers(GriefLoggerServerPlayer serverPlayer, Level level, BlockPos pos, BlockPos connectionPos) { + public static EventResult inspectContainers(GriefLoggerServerPlayer serverPlayer, Level level, BlockPos pos, BlockPos connectionPos) { ThreadManager.submit(() -> { List history = new ArrayList<>(); List containerHistory = Services.CONTAINER.getHistory( @@ -49,6 +48,6 @@ public static InteractionResult inspectContainers(GriefLoggerServerPlayer server history.sort((a, b) -> Long.compare(b.getTime().time(), a.getTime().time())); return history; }, serverPlayer::grieflogger$sendInspectMessage); - return InteractionResult.FAIL; + return interrupt(); } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/InspectDoorEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/InspectDoorEvent.java index 184fc05..b041001 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/InspectDoorEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/InspectDoorEvent.java @@ -1,14 +1,11 @@ package com.daqem.grieflogger.event.block; -import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.block.BlockHandler; -import com.daqem.grieflogger.database.service.BlockService; import com.daqem.grieflogger.database.service.Services; import com.daqem.grieflogger.event.AbstractEvent; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import dev.architectury.event.EventResult; import net.minecraft.core.BlockPos; -import net.minecraft.world.InteractionResult; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; @@ -17,7 +14,7 @@ public class InspectDoorEvent extends AbstractEvent { - public static InteractionResult inspectDoor(GriefLoggerServerPlayer player, Level level, BlockPos pos, BlockState state, boolean isInteraction) { + public static EventResult inspectDoor(GriefLoggerServerPlayer player, Level level, BlockPos pos, BlockState state, boolean isInteraction) { List positions = new ArrayList<>(List.of(pos)); BlockHandler.getSecondDoorPosition(pos, state).ifPresent(positions::add); if (isInteraction) { @@ -25,13 +22,13 @@ public static InteractionResult inspectDoor(GriefLoggerServerPlayer player, Leve level, positions, player::grieflogger$sendInspectMessage); - return InteractionResult.FAIL; + return interrupt(); } else { Services.BLOCK.getBlockHistoryAsync( level, positions, player::grieflogger$sendInspectMessage); } - return InteractionResult.FAIL; + return interrupt(); } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/LeftClickBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/LeftClickBlockEvent.java index efc0877..ce1b413 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/LeftClickBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/LeftClickBlockEvent.java @@ -6,7 +6,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -15,7 +14,7 @@ public class LeftClickBlockEvent extends AbstractEvent { - public static InteractionResult leftClickBlock(Player player, InteractionHand hand, BlockPos pos, Direction direction) { + public static EventResult leftClickBlock(Player player, InteractionHand hand, BlockPos pos, Direction direction) { if (player instanceof GriefLoggerServerPlayer serverPlayer) { if (hand == InteractionHand.MAIN_HAND) { if (serverPlayer.grieflogger$isInspecting()) { @@ -31,6 +30,6 @@ public static InteractionResult leftClickBlock(Player player, InteractionHand ha } } } - return InteractionResult.PASS; + return pass(); } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java index 51e1927..5936496 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java @@ -5,10 +5,10 @@ import com.daqem.grieflogger.event.AbstractEvent; import com.daqem.grieflogger.model.action.BlockAction; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; +import dev.architectury.event.EventResult; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -23,7 +23,7 @@ public class RightClickBlockEvent extends AbstractEvent { - public static InteractionResult rightClickBlock(Player player, InteractionHand hand, BlockPos pos, Direction direction) { + public static EventResult rightClickBlock(Player player, InteractionHand hand, BlockPos pos, Direction direction) { if (player instanceof GriefLoggerServerPlayer serverPlayer) { if (hand == InteractionHand.MAIN_HAND) { @@ -78,12 +78,8 @@ public static InteractionResult rightClickBlock(Player player, InteractionHand h if (BlockHandler.isBlockIntractable(block)) { LogBlockEvent.logBlock(serverPlayer, level, state, pos, BlockAction.INTERACT_BLOCK); } - - // TODO: mixin to AxeItem to get STRIPPABLES (axe right click event) - // TODO: hoe event - // TODO: cauldron } } - return InteractionResult.PASS; + return pass(); } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java b/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java index 9d4de4d..eaedfa8 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java @@ -11,8 +11,6 @@ public class DropItemEvent extends AbstractEvent { public static EventResult onDropItem(Player player, ItemEntity itemEntity) { - // TODO: fix drop item and remove this - System.out.println("Drop item : " + itemEntity); if (player instanceof GriefLoggerServerPlayer serverPlayer) { serverPlayer.griefLogger$addItemToQueue(ItemAction.DROP_ITEM, new SimpleItemStack(itemEntity.getItem())); } diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java b/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java index c4428a7..6510986 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java @@ -6,7 +6,6 @@ public class ItemEvents { public static void registerEvents() { PlayerEvent.CRAFT_ITEM.register(CraftItemEvent::onCraftItem); - // TODO: drop item event does not work PlayerEvent.DROP_ITEM.register(DropItemEvent::onDropItem); PlayerEvent.PICKUP_ITEM_POST.register(PickupItemEvent::onPickupItem); PlayerEvent.SMELT_ITEM.register(SmeltItemEvent::onSmeltItem); From c334312af13214b56c19571a060136ca5ee95a5b Mon Sep 17 00:00:00 2001 From: steve6472 <20379161+steve6472@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:42:14 +0100 Subject: [PATCH 04/52] Updated more mentions of 1.20.6 --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- common/src/main/resources/grieflogger-common.mixins.json | 2 +- fabric/src/main/resources/fabric.mod.json | 4 ++-- fabric/src/main/resources/grieflogger.mixins.json | 2 +- neoforge/src/main/resources/META-INF/neoforge.mods.toml | 2 +- neoforge/src/main/resources/grieflogger.mixins.json | 2 +- settings.gradle | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8115243..0155668 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -2,7 +2,7 @@ name: Publish on: push: - branches: [ "1.20.6" ] + branches: [ "1.21.4" ] permissions: contents: write diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 734112e..7172285 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: Run Tests on: push: - branches: [ "1.20.6-dev" ] + branches: [ "1.21.4-dev" ] permissions: contents: read diff --git a/common/src/main/resources/grieflogger-common.mixins.json b/common/src/main/resources/grieflogger-common.mixins.json index 8cf6f45..dd8c68c 100644 --- a/common/src/main/resources/grieflogger-common.mixins.json +++ b/common/src/main/resources/grieflogger-common.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "com.daqem.grieflogger.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "client": [ ], diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 24e94bc..cecf99f 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -25,8 +25,8 @@ ], "depends": { "fabric": "*", - "minecraft": ">=1.20.6", - "architectury": ">=12.1.4", + "minecraft": ">=1.21.4", + "architectury": ">=15.0.1", "supermartijn642configlib": ">=${config_library_version}" } } \ No newline at end of file diff --git a/fabric/src/main/resources/grieflogger.mixins.json b/fabric/src/main/resources/grieflogger.mixins.json index 417c5a5..79b6f4d 100644 --- a/fabric/src/main/resources/grieflogger.mixins.json +++ b/fabric/src/main/resources/grieflogger.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "com.daqem.grieflogger.fabric.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "client": [ ], diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index fce3cfb..5a7f4a1 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -30,7 +30,7 @@ side = "SERVER" [[dependencies.grieflogger]] modId = "architectury" mandatory = true -versionRange = "[12.1.4,)" +versionRange = "[15.0.1,)" ordering = "AFTER" side = "SERVER" diff --git a/neoforge/src/main/resources/grieflogger.mixins.json b/neoforge/src/main/resources/grieflogger.mixins.json index 74d7f0c..fdec52a 100644 --- a/neoforge/src/main/resources/grieflogger.mixins.json +++ b/neoforge/src/main/resources/grieflogger.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "com.daqem.grieflogger.neoforge.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "client": [ ], diff --git a/settings.gradle b/settings.gradle index d86404a..3fa926e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,4 @@ include 'common' include 'fabric' include 'neoforge' -rootProject.name = "GriefLogger 1.20.6" +rootProject.name = "GriefLogger 1.21.4" From 74a2afe5fc52abbbcb911616cc27e42f625e5895 Mon Sep 17 00:00:00 2001 From: steve6472 <20379161+steve6472@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:49:30 +0100 Subject: [PATCH 05/52] Uncommented upload --- fabric/build.gradle | 4 ++-- neoforge/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index e27405f..bdcf459 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -73,7 +73,7 @@ remapSourcesJar { archiveClassifier = "fabric-sources" } -/*curseforge { +curseforge { apiKey = System.getenv('CURSEFORGE_API_KEY') project { id = project.curse_forge_project_id @@ -119,4 +119,4 @@ modrinth { required.project "architectury-api" required.project "supermartijn642s-config-lib" } -}*/ \ No newline at end of file +} \ No newline at end of file diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 56f14e3..c9a90a8 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -79,7 +79,7 @@ remapSourcesJar { archiveClassifier = "neoforge-sources" } -/*curseforge { +curseforge { apiKey = System.getenv("CURSEFORGE_API_KEY") project { id = project.curse_forge_project_id @@ -118,4 +118,4 @@ modrinth { required.project "architectury-api" required.project "supermartijn642s-config-lib" } -}*/ \ No newline at end of file +} \ No newline at end of file From 8803db15cb12b24d42364df06c45c8505631327c Mon Sep 17 00:00:00 2001 From: steve6472 <20379161+steve6472@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:53:27 +0100 Subject: [PATCH 06/52] Fixed item drop logging --- .../grieflogger/event/item/DropItemEvent.java | 19 ------------------- .../grieflogger/event/item/ItemEvents.java | 1 - .../grieflogger/mixin/MixinServerPlayer.java | 9 +++++++++ 3 files changed, 9 insertions(+), 20 deletions(-) delete mode 100644 common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java b/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java deleted file mode 100644 index eaedfa8..0000000 --- a/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.daqem.grieflogger.event.item; - -import com.daqem.grieflogger.event.AbstractEvent; -import com.daqem.grieflogger.model.SimpleItemStack; -import com.daqem.grieflogger.model.action.ItemAction; -import com.daqem.grieflogger.player.GriefLoggerServerPlayer; -import dev.architectury.event.EventResult; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Player; - -public class DropItemEvent extends AbstractEvent { - - public static EventResult onDropItem(Player player, ItemEntity itemEntity) { - if (player instanceof GriefLoggerServerPlayer serverPlayer) { - serverPlayer.griefLogger$addItemToQueue(ItemAction.DROP_ITEM, new SimpleItemStack(itemEntity.getItem())); - } - return pass(); - } -} diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java b/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java index 6510986..7a9569c 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/item/ItemEvents.java @@ -6,7 +6,6 @@ public class ItemEvents { public static void registerEvents() { PlayerEvent.CRAFT_ITEM.register(CraftItemEvent::onCraftItem); - PlayerEvent.DROP_ITEM.register(DropItemEvent::onDropItem); PlayerEvent.PICKUP_ITEM_POST.register(PickupItemEvent::onPickupItem); PlayerEvent.SMELT_ITEM.register(SmeltItemEvent::onSmeltItem); } diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java index e6e4c0e..34f33a4 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java @@ -16,7 +16,9 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; import org.spongepowered.asm.mixin.Mixin; @@ -113,6 +115,13 @@ public void openMenu(MenuProvider menuProvider, CallbackInfoReturnable cir) { + if (!itemStack.isEmpty()) { + this.griefLogger$addItemToQueue(ItemAction.DROP_ITEM, new SimpleItemStack(itemStack)); + } + } + public void griefLogger$addItemToQueue(ItemAction action, SimpleItemStack itemStack) { List itemStacks = grieflogger$itemQueue.get(action); if (itemStacks != null) { From ad2eb15bb72c053bb9c58cc5a89ccc9fd814f7d4 Mon Sep 17 00:00:00 2001 From: steve6472 <20379161+steve6472@users.noreply.github.com> Date: Wed, 15 Jan 2025 12:11:20 +0100 Subject: [PATCH 07/52] More interactable blocks --- .../main/java/com/daqem/grieflogger/block/BlockHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java b/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java index a227925..bb690db 100644 --- a/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java +++ b/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java @@ -35,7 +35,10 @@ public static boolean isBlockIntractable(Block block) { || block instanceof StonecutterBlock || block instanceof CrafterBlock || block instanceof VaultBlock - + || block instanceof DaylightDetectorBlock + || block instanceof SignBlock + || block instanceof LecternBlock + || block instanceof BeaconBlock ) { return true; } From e8956fa15134d665a520e19204d48e48aa26c73c Mon Sep 17 00:00:00 2001 From: steve6472 <20379161+steve6472@users.noreply.github.com> Date: Wed, 15 Jan 2025 16:31:24 +0100 Subject: [PATCH 08/52] Small change to break item event. --- .../grieflogger/event/item/DropItemEvent.java | 19 +++++++++++++++++++ .../grieflogger/mixin/MixinServerPlayer.java | 5 +++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java b/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java new file mode 100644 index 0000000..769ec88 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java @@ -0,0 +1,19 @@ +package com.daqem.grieflogger.event.item; + +import com.daqem.grieflogger.event.AbstractEvent; +import com.daqem.grieflogger.model.SimpleItemStack; +import com.daqem.grieflogger.model.action.ItemAction; +import com.daqem.grieflogger.player.GriefLoggerServerPlayer; +import dev.architectury.event.EventResult; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; + +public class DropItemEvent extends AbstractEvent { + + public static EventResult onDropItem(Player player, ItemEntity itemEntity) { + if (player instanceof GriefLoggerServerPlayer serverPlayer) { + serverPlayer.griefLogger$addItemToQueue(ItemAction.DROP_ITEM, new SimpleItemStack(itemEntity.getItem())); + } + return pass(); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java index 34f33a4..60b2bf3 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java @@ -7,6 +7,7 @@ import com.daqem.grieflogger.block.container.IContainerTransactionManager; import com.daqem.grieflogger.command.page.Page; import com.daqem.grieflogger.database.service.Services; +import com.daqem.grieflogger.event.item.DropItemEvent; import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.IHistory; @@ -117,8 +118,8 @@ public void openMenu(MenuProvider menuProvider, CallbackInfoReturnable cir) { - if (!itemStack.isEmpty()) { - this.griefLogger$addItemToQueue(ItemAction.DROP_ITEM, new SimpleItemStack(itemStack)); + if (cir.getReturnValue() != null) { + DropItemEvent.onDropItem(this, cir.getReturnValue()); } } From 779fe670bf96bedac59065af1434d8a4865fc05c Mon Sep 17 00:00:00 2001 From: DAQEM Date: Wed, 15 Jan 2025 18:52:27 +0100 Subject: [PATCH 09/52] Removed unused return value. --- .../java/com/daqem/grieflogger/event/item/DropItemEvent.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java b/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java index 769ec88..3df75cd 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/item/DropItemEvent.java @@ -10,10 +10,9 @@ public class DropItemEvent extends AbstractEvent { - public static EventResult onDropItem(Player player, ItemEntity itemEntity) { + public static void onDropItem(Player player, ItemEntity itemEntity) { if (player instanceof GriefLoggerServerPlayer serverPlayer) { serverPlayer.griefLogger$addItemToQueue(ItemAction.DROP_ITEM, new SimpleItemStack(itemEntity.getItem())); } - return pass(); } } \ No newline at end of file From 8e8b35ffb663843182c97fceaafdcc5e25337464 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Mon, 20 Jan 2025 12:25:27 +0100 Subject: [PATCH 10/52] Fix IllegalAccessException by making fields accessible before accessing --- .../grieflogger/block/container/ContainerHandler.java | 7 +++++-- gradle.properties | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/block/container/ContainerHandler.java b/common/src/main/java/com/daqem/grieflogger/block/container/ContainerHandler.java index f9d5d33..567af73 100644 --- a/common/src/main/java/com/daqem/grieflogger/block/container/ContainerHandler.java +++ b/common/src/main/java/com/daqem/grieflogger/block/container/ContainerHandler.java @@ -1,5 +1,6 @@ package com.daqem.grieflogger.block.container; +import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.model.SimpleItemStack; import net.minecraft.world.MenuProvider; import net.minecraft.world.item.ItemStack; @@ -32,15 +33,17 @@ public static Optional getContainer(MenuProvider menuP } public static Optional> getContainers(MenuProvider menuProvider) { - //get all properties of the menu provider that are instances of BaseContainerBlockEntity + // Get all properties of the menu provider that are instances of BaseContainerBlockEntity List containers = new ArrayList<>(); for (Field field : menuProvider.getClass().getDeclaredFields()) { if (BaseContainerBlockEntity.class.isAssignableFrom(field.getType())) { try { + // Make the field accessible if it's not already + field.setAccessible(true); containers.add((BaseContainerBlockEntity) field.get(menuProvider)); } catch (IllegalAccessException e) { - e.printStackTrace(); + GriefLogger.LOGGER.error("Failed to access field: {}", field.getName(), e); } } } diff --git a/gradle.properties b/gradle.properties index f2f4d14..491afc8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.21.4 enabled_platforms=fabric,neoforge archives_base_name=grieflogger -mod_version=1.2-1.21.4 +mod_version=1.2.2-1.21.4 maven_group=com.daqem.grieflogger architectury_version=15.0.1 From fe7a14ae627b0deb81df358b9ba20989b41082ec Mon Sep 17 00:00:00 2001 From: dirtTW Date: Thu, 6 Feb 2025 14:19:25 +0700 Subject: [PATCH 11/52] Add Traditional Chinese `zh_tw.json` Add Traditional Chinese localization --- .../assets/grieflogger/lang/zh_tw.json | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 common/src/main/resources/assets/grieflogger/lang/zh_tw.json diff --git a/common/src/main/resources/assets/grieflogger/lang/zh_tw.json b/common/src/main/resources/assets/grieflogger/lang/zh_tw.json new file mode 100644 index 0000000..384a996 --- /dev/null +++ b/common/src/main/resources/assets/grieflogger/lang/zh_tw.json @@ -0,0 +1,48 @@ +{ + "grieflogger.name": "破壞紀錄器", + "grieflogger.commands.inspect.enabled": "%s - 已啟用檢查。", + "grieflogger.commands.inspect.disabled": "%s - 已停用檢查。", + "grieflogger.action.prefix.remove": "-", + "grieflogger.action.prefix.add": "+", + "grieflogger.action.prefix.neutral": "-", + "grieflogger.action.break_block.past": "破壞了", + "grieflogger.action.place_block.past": "放置了", + "grieflogger.action.interact_block.past": "點擊了", + "grieflogger.action.kill_entity.past": "殺死了", + "grieflogger.action.add_item.past": "加入了", + "grieflogger.action.remove_item.past": "移除了", + "grieflogger.action.drop_item.past": "丟棄了", + "grieflogger.action.pickup_item.past": "撿起了", + "grieflogger.action.craft_item.past": "合成了", + "grieflogger.action.break_item.past": "弄壞了", + "grieflogger.action.consume_item.past": "使用了", + "grieflogger.action.throw_item.past": "投擲了", + "grieflogger.action.shoot_item.past": "射出了", + "grieflogger.action.add_item_ender.past": "加入了終界箱", + "grieflogger.action.remove_item_ender.past": "從終界箱移除了", + "grieflogger.action.join.past": "加入了", + "grieflogger.action.quit.past": "退出了", + "grieflogger.time.minutes": "分", + "grieflogger.time.hours": "時", + "grieflogger.time.days": "天", + "grieflogger.time.years": "年", + "grieflogger.time.divider": "/", + "grieflogger.lookup.position": "(x%s/y%s/z%s)", + "grieflogger.lookup.time.ago": "%s%s%s前", + "grieflogger.lookup.no_history": "%s - 此位置沒有找到任何紀錄。", + "grieflogger.lookup.block.history_entry": "%s %s %s %s %s。", + "grieflogger.lookup.container.history_entry": "%s %s %s %s x%s %s。", + "grieflogger.lookup.session.history_entry": "%s %s %s %s。", + "grieflogger.lookup.history_title": "破壞紀錄查詢", + "grieflogger.lookup.history_header": "----- %s ------", + "grieflogger.lookup.page": "頁數", + "grieflogger.lookup.pages": " %s/%s", + "grieflogger.lookup.invalid_page": "%s - 無效的頁碼。", + "grieflogger.lookup.no_results": "%s - 找不到任何結果。", + "grieflogger.filter.action": "動作", + "grieflogger.filter.exclude": "排除", + "grieflogger.filter.include": "包含", + "grieflogger.filter.radius": "範圍", + "grieflogger.filter.time": "時間", + "grieflogger.filter.user": "使用者" +} \ No newline at end of file From d7f8124e74900170e19bed82af06bfca02e4a27f Mon Sep 17 00:00:00 2001 From: DAQEM Date: Mon, 10 Feb 2025 18:55:10 +0100 Subject: [PATCH 12/52] Fixed NeoForge not working. --- .../grieflogger/mixin/MixinItemStack.java | 33 ++++++++++++++----- .../resources/META-INF/neoforge.mods.toml | 5 ++- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java index 8f80089..7e4d515 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java @@ -1,11 +1,14 @@ package com.daqem.grieflogger.mixin; import com.daqem.grieflogger.event.item.BreakItemEvent; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -17,13 +20,27 @@ @Mixin(ItemStack.class) public class MixinItemStack { - @Inject(at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/item/ItemStack;shrink(I)V", - shift = At.Shift.BEFORE - ), method = "applyDamage(ILnet/minecraft/server/level/ServerPlayer;Ljava/util/function/Consumer;)V") - private void applyDamage(int i, @Nullable ServerPlayer serverPlayer, Consumer consumer, CallbackInfo ci) - { - BreakItemEvent.breakItem(serverPlayer, (ItemStack) (Object) this); + @Inject(at = @At(value = "HEAD"), method = "hurtAndBreak(ILnet/minecraft/server/level/ServerLevel;Lnet/minecraft/server/level/ServerPlayer;Ljava/util/function/Consumer;)V") + private void hurtAndBreak(int i, ServerLevel serverLevel, ServerPlayer serverPlayer, Consumer consumer, CallbackInfo ci) { + ItemStack itemStack = (ItemStack) (Object) this; + if (itemStack.isDamageableItem()) { + if (serverPlayer == null || !serverPlayer.hasInfiniteMaterials()) { + if (i > 0) { + i = EnchantmentHelper.processDurabilityChange(serverLevel, itemStack, i); + if (i <= 0) { + return; + } + } + + if (serverPlayer != null && i != 0) { + CriteriaTriggers.ITEM_DURABILITY_CHANGED.trigger(serverPlayer, itemStack, itemStack.getDamageValue() + i); + } + + int j = itemStack.getDamageValue() + i; + if (j >= itemStack.getMaxDamage()) { + BreakItemEvent.breakItem(serverPlayer, itemStack.copyWithCount(1)); + } + } + } } } diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 5a7f4a1..e4d57be 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -39,4 +39,7 @@ modId = "supermartijn642configlib" mandatory = true versionRange = "[${config_library_version},)" ordering = "NONE" -side = "SERVER" \ No newline at end of file +side = "SERVER" + +[[mixins]] +config = "grieflogger-common.mixins.json" \ No newline at end of file From 3ba9d24dcb6a91a27d6b0865f6efd6cfd67abf20 Mon Sep 17 00:00:00 2001 From: Kevin <66999025+DAQEM@users.noreply.github.com> Date: Mon, 10 Feb 2025 19:05:08 +0100 Subject: [PATCH 13/52] Update gradle.properties --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 491afc8..f4ea6f5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.21.4 enabled_platforms=fabric,neoforge archives_base_name=grieflogger -mod_version=1.2.2-1.21.4 +mod_version=1.2.3-1.21.4 maven_group=com.daqem.grieflogger architectury_version=15.0.1 From 09760bb80a951de339cfd65f7b285abe869ad459 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Mon, 17 Feb 2025 18:41:56 +0100 Subject: [PATCH 14/52] Fixed single player crash when shooting arrow. --- .../grieflogger/mixin/MixinServerPlayer.java | 55 ++++++++++++------- gradle.properties | 2 +- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java index 60b2bf3..a28c7e9 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java @@ -13,6 +13,8 @@ import com.daqem.grieflogger.model.history.IHistory; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import com.mojang.authlib.GameProfile; +import dev.architectury.utils.EnvExecutor; +import net.fabricmc.api.EnvType; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; @@ -35,7 +37,6 @@ @Mixin(ServerPlayer.class) public abstract class MixinServerPlayer extends Player implements GriefLoggerServerPlayer { - @Shadow public ServerGamePacketListenerImpl connection; @Unique private boolean grieflogger$inspecting = false; @Unique @@ -67,7 +68,7 @@ public MixinServerPlayer(Level level, BlockPos blockPos, float f, GameProfile ga } else { List pages = Page.convertToPages(historyList, true); grieflogger$setPages(pages); - Page pageToDisplay = pages.get(0); + Page pageToDisplay = pages.getFirst(); pageToDisplay.sendToPlayer(grieflogger$asServerPlayer()); } } @@ -90,37 +91,49 @@ public MixinServerPlayer(Level level, BlockPos blockPos, float f, GameProfile ga @Inject(at = @At("HEAD"), method = "openMenu") public void openMenu(MenuProvider menuProvider, CallbackInfoReturnable cir) { - Optional container = ContainerHandler.getContainer(menuProvider); - if (container.isPresent()) { - this.grieflogger$containerTransactionManager = new ContainerTransactionManager(container.get()); - } else { - ContainerHandler.getContainers(menuProvider).ifPresent(containers -> { - this.grieflogger$containerTransactionManager = new ContainersTransactionManager(containers); - }); - } + EnvExecutor.getInEnv(EnvType.SERVER, () -> () -> { + Optional container = ContainerHandler.getContainer(menuProvider); + if (container.isPresent()) { + this.grieflogger$containerTransactionManager = new ContainerTransactionManager(container.get()); + } else { + ContainerHandler.getContainers(menuProvider).ifPresent(containers -> { + this.grieflogger$containerTransactionManager = new ContainersTransactionManager(containers); + }); + } + return null; + }); } @Inject(at = @At("HEAD"), method = "doCloseContainer()V") public void grieflogger$doCloseContainer(CallbackInfo ci) { - if (this.grieflogger$containerTransactionManager != null) { - this.grieflogger$containerTransactionManager.finalize(grieflogger$asServerPlayer()); - this.grieflogger$containerTransactionManager = null; - } + EnvExecutor.getInEnv(EnvType.SERVER, () -> () -> { + if (this.grieflogger$containerTransactionManager != null) { + this.grieflogger$containerTransactionManager.finalize(grieflogger$asServerPlayer()); + this.grieflogger$containerTransactionManager = null; + } + return null; + }); } @Inject(at = @At("HEAD"), method = "tick") public void grieflogger$tick(CallbackInfo ci) { - if (!grieflogger$itemQueue.isEmpty()) { - Services.ITEM.insertMap(getUUID(), level(), blockPosition(), new HashMap<>(grieflogger$itemQueue)); - grieflogger$itemQueue.clear(); - } + EnvExecutor.getInEnv(EnvType.SERVER, () -> () -> { + if (!grieflogger$itemQueue.isEmpty()) { + Services.ITEM.insertMap(getUUID(), level(), blockPosition(), new HashMap<>(grieflogger$itemQueue)); + grieflogger$itemQueue.clear(); + } + return null; + }); } @Inject(method = "drop(Lnet/minecraft/world/item/ItemStack;ZZ)Lnet/minecraft/world/entity/item/ItemEntity;", at = @At("RETURN")) private void drop(ItemStack itemStack, boolean bl, boolean bl2, CallbackInfoReturnable cir) { - if (cir.getReturnValue() != null) { - DropItemEvent.onDropItem(this, cir.getReturnValue()); - } + EnvExecutor.getInEnv(EnvType.SERVER, () -> () -> { + if (cir.getReturnValue() != null) { + DropItemEvent.onDropItem(this, cir.getReturnValue()); + } + return null; + }); } public void griefLogger$addItemToQueue(ItemAction action, SimpleItemStack itemStack) { diff --git a/gradle.properties b/gradle.properties index f4ea6f5..7b89b46 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.21.4 enabled_platforms=fabric,neoforge archives_base_name=grieflogger -mod_version=1.2.3-1.21.4 +mod_version=1.2.4-1.21.4 maven_group=com.daqem.grieflogger architectury_version=15.0.1 From 667d71e5b03fcaab6216ede420c1c8608bc2b893 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Tue, 18 Feb 2025 13:21:11 +0100 Subject: [PATCH 15/52] Fixed support for modded materials. --- .../java/com/daqem/grieflogger/model/history/BlockHistory.java | 2 +- .../java/com/daqem/grieflogger/model/history/ItemHistory.java | 2 +- gradle.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java index 51c785e..9ac0fed 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java @@ -46,7 +46,7 @@ public Component getMaterialComponent() { HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo( BuiltInRegistries.BLOCK.getValue( - ResourceLocation.withDefaultNamespace(material) + ResourceLocation.parse(material) ).asItem() .getDefaultInstance())))); } diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java index dd9c9ae..e84d293 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java @@ -20,7 +20,7 @@ public class ItemHistory extends History { protected final SimpleItemStack itemStack; public ItemHistory(long time, String name, String uuid, int x, int y, int z, String material, DataComponentPatch data, int amount, int action) { - this(new Time(time), new User(name, UUID.fromString(uuid)), new BlockPosition(x, y, z), new SimpleItemStack(ResourceLocation.withDefaultNamespace(material), amount, data), ItemAction.fromId(action)); + this(new Time(time), new User(name, UUID.fromString(uuid)), new BlockPosition(x, y, z), new SimpleItemStack(ResourceLocation.parse(material), amount, data), ItemAction.fromId(action)); } public ItemHistory(Time time, User user, BlockPosition position, SimpleItemStack itemStack, IAction action) { diff --git a/gradle.properties b/gradle.properties index 7b89b46..20c5a91 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.21.4 enabled_platforms=fabric,neoforge archives_base_name=grieflogger -mod_version=1.2.4-1.21.4 +mod_version=1.2.5-1.21.4 maven_group=com.daqem.grieflogger architectury_version=15.0.1 From d7a7cb697c27f3d43f373b7a941cc9795c413f61 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Wed, 26 Mar 2025 21:35:36 +0100 Subject: [PATCH 16/52] Ported to 1.21.5 --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- build.gradle | 2 +- common/build.gradle | 2 +- .../daqem/grieflogger/command/page/Page.java | 2 +- .../grieflogger/config/GriefLoggerConfig.java | 71 +++++++++++-------- .../grieflogger/model/BlockPosition.java | 4 +- .../com/daqem/grieflogger/model/Time.java | 5 +- .../model/history/BlockHistory.java | 10 ++- .../model/history/ItemHistory.java | 5 +- .../assets/grieflogger/lang/en_us.json | 21 +++++- fabric/build.gradle | 60 ++++++++++++++-- fabric/src/main/resources/fabric.mod.json | 5 +- .../main/resources/grieflogger.mixins.json | 13 ---- gradle.properties | 20 +++--- gradle/wrapper/gradle-wrapper.properties | 2 +- neoforge/build.gradle | 57 +++++++++++++-- .../resources/META-INF/neoforge.mods.toml | 14 ++-- .../main/resources/grieflogger.mixins.json | 13 ---- settings.gradle | 2 +- 20 files changed, 206 insertions(+), 106 deletions(-) delete mode 100644 fabric/src/main/resources/grieflogger.mixins.json delete mode 100644 neoforge/src/main/resources/grieflogger.mixins.json diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0155668..039c144 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -2,7 +2,7 @@ name: Publish on: push: - branches: [ "1.21.4" ] + branches: [ "1.21.5" ] permissions: contents: write diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7172285..a3bed55 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: Run Tests on: push: - branches: [ "1.21.4-dev" ] + branches: [ "1.21.5-dev" ] permissions: contents: read diff --git a/build.gradle b/build.gradle index d931f00..a078c5f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "dev.architectury.loom" version "1.9-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false id "architectury-plugin" version "3.4-SNAPSHOT" id 'com.github.johnrengelman.shadow' version '8.1.1' apply false } diff --git a/common/build.gradle b/common/build.gradle index cdeffea..9d047d9 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -13,7 +13,7 @@ dependencies { // Remove the next line if you don't want to depend on the API modApi "dev.architectury:architectury:${rootProject.architectury_version}" - compileOnlyApi "curse.maven:supermartijn642s-config-lib-438332:${project.config_library_file_fabric}" + compileOnlyApi "curse.maven:yaml-config-1128669:${project.config_library_file_fabric}-sources-${project.config_library_file_fabric_sources}" } publishing { diff --git a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java index 787ec60..44aa7a1 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java +++ b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java @@ -73,7 +73,7 @@ private MutableComponent getArrowRight() { } private ClickEvent getClickEvent(int page) { - return new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/grieflogger page " + page); + return new ClickEvent.RunCommand("/grieflogger page " + page); } private Style getStyle(int page, boolean enabled) { diff --git a/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java b/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java index ee504cc..d225090 100644 --- a/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java +++ b/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java @@ -1,60 +1,71 @@ package com.daqem.grieflogger.config; import com.daqem.grieflogger.GriefLogger; -import com.mojang.text2speech.OperatingSystem; -import com.supermartijn642.configlib.api.ConfigBuilders; -import com.supermartijn642.configlib.api.IConfigBuilder; - -import java.util.function.Supplier; +import com.daqem.yamlconfig.api.config.ConfigExtension; +import com.daqem.yamlconfig.api.config.ConfigType; +import com.daqem.yamlconfig.api.config.entry.IConfigEntry; +import com.daqem.yamlconfig.impl.config.ConfigBuilder; public class GriefLoggerConfig { public static void init() { } - public static final Supplier useMysql; - public static final Supplier mysqlHost; - public static final Supplier mysqlPort; - public static final Supplier mysqlDatabase; - public static final Supplier mysqlUsername; - public static final Supplier mysqlPassword; - public static final Supplier mysqlTimeout; - public static final Supplier useIndexes; + public static final IConfigEntry useMysql; + public static final IConfigEntry mysqlHost; + public static final IConfigEntry mysqlPort; + public static final IConfigEntry mysqlDatabase; + public static final IConfigEntry mysqlUsername; + public static final IConfigEntry mysqlPassword; + public static final IConfigEntry mysqlTimeout; + public static final IConfigEntry useIndexes; - public static final Supplier maxPageSize; + public static final IConfigEntry maxPageSize; - public static final Supplier serverSideOnlyMode; + public static final IConfigEntry serverSideOnlyMode; - public static final Supplier queueFrequency; - public static final Supplier helloFrequency; + public static final IConfigEntry queueFrequency; + public static final IConfigEntry helloFrequency; static { - IConfigBuilder config = ConfigBuilders.newTomlConfig(GriefLogger.MOD_ID, GriefLogger.MOD_ID, true); + ConfigBuilder config = new ConfigBuilder(GriefLogger.MOD_ID, "grieflogger-server", ConfigExtension.YAML, ConfigType.SERVER); config.push("database"); - useMysql = config.comment("Whether to use MySQL or SQLite").onlyOnServer().define("useMysql", false); - mysqlHost = config.comment("MySQL host").onlyOnServer().define("mysqlHost", "localhost", 1, 255); - mysqlPort = config.comment("MySQL port").onlyOnServer().define("mysqlPort", 3306, 1, 65535); - mysqlDatabase = config.comment("MySQL database").onlyOnServer().define("mysqlDatabase", "database", 1, 255); - mysqlUsername = config.comment("MySQL username").onlyOnServer().define("mysqlUsername", "username", 1, 255); - mysqlPassword = config.comment("MySQL password").onlyOnServer().define("mysqlPassword", "password", 1, 255); - mysqlTimeout = config.comment("MySQL timeout").onlyOnServer().define("mysqlTimeout", 5000, 1, 60000); - useIndexes = config.comment("Whether to use indexes (improves inspect/lookup speed)").onlyOnServer().define("useIndexes", true); + useMysql = config.defineBoolean("useMysql", false) + .withComments("Whether to use MySQL or SQLite"); + mysqlHost = config.defineString("mysqlHost", "localhost", 1, 255) + .withComments("MySQL host"); + mysqlPort = config.defineInteger("mysqlPort", 3306, 1, 65535) + .withComments("MySQL port"); + mysqlDatabase = config.defineString("mysqlDatabase", "database", 1, 255) + .withComments("MySQL database"); + mysqlUsername = config.defineString("mysqlUsername", "username", 1, 255) + .withComments("MySQL username"); + mysqlPassword = config.defineString("mysqlPassword", "password", 1, 255) + .withComments("MySQL password"); + mysqlTimeout = config.defineInteger("mysqlTimeout", 5000, 1, 60000) + .withComments("MySQL timeout"); + useIndexes = config.defineBoolean("useIndexes", true) + .withComments("Whether to use indexes (improves inspect/lookup speed)"); config.pop(); config.push("general"); - maxPageSize = config.comment("Maximum page size").onlyOnServer().define("maxPageSize", 10, 1, 100); + maxPageSize = config.defineInteger("maxPageSize", 10, 1, 100) + .withComments("Maximum page size"); config.pop(); config.push("server"); - serverSideOnlyMode = config.comment("Whether to run the mod in server side only mode").onlyOnServer().define("serverSideOnlyMode", true); + serverSideOnlyMode = config.defineBoolean("serverSideOnlyMode", true) + .withComments("Whether to run the mod in server side only mode"); config.pop(); config.push("queue"); - queueFrequency = config.comment("The frequency at which the database queue is executed (every 'x' ticks)").onlyOnServer().define("queueFrequency", 20, 1, 100); + queueFrequency = config.defineInteger("queueFrequency", 20, 1, 100) + .withComments("The frequency at which the database queue is executed (every 'x' ticks)"); config.pop(); config.push("hello"); - helloFrequency = config.comment("The frequency at which the hello packet is sent to the server (every 'x' ticks)").onlyOnServer().define("helloFrequency", 600, 1, 1000); + helloFrequency = config.defineInteger("helloFrequency", 600, 1, 1000) + .withComments("The frequency at which the hello packet is sent to the server (every 'x' ticks)"); config.pop(); config.build(); diff --git a/common/src/main/java/com/daqem/grieflogger/model/BlockPosition.java b/common/src/main/java/com/daqem/grieflogger/model/BlockPosition.java index 4cb1031..3de193f 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/BlockPosition.java +++ b/common/src/main/java/com/daqem/grieflogger/model/BlockPosition.java @@ -12,7 +12,7 @@ public record BlockPosition(int x, int y, int z) { public Component getComponent() { return GriefLogger.translate("lookup.position", x, y, z) .withStyle(Style.EMPTY.withColor(ChatFormatting.GRAY) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, GriefLogger.literal("Click to teleport to this position."))) - .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tp " + x + " " + y + " " + z))); + .withHoverEvent(new HoverEvent.ShowText(GriefLogger.literal("Click to teleport to this position."))) + .withClickEvent(new ClickEvent.RunCommand("/tp " + x + " " + y + " " + z))); } } diff --git a/common/src/main/java/com/daqem/grieflogger/model/Time.java b/common/src/main/java/com/daqem/grieflogger/model/Time.java index 84d4f73..f984eb2 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/Time.java +++ b/common/src/main/java/com/daqem/grieflogger/model/Time.java @@ -38,8 +38,7 @@ private MutableComponent getTimeAgoComponent(double timeAgo, Component unit) { return GriefLogger.translate("lookup.time.ago", String.format("%.2f", timeAgo), GriefLogger.translate("time.divider"), unit) .withStyle(Style.EMPTY .withColor(ChatFormatting.GRAY) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, - GriefLogger.literal(new Date(time).toString()) - .withStyle(ChatFormatting.GRAY)))); + .withHoverEvent(new HoverEvent.ShowText(GriefLogger.literal(new Date(time).toString()) + .withStyle(ChatFormatting.GRAY)))); } } diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java index 9ac0fed..1cd3454 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java @@ -42,12 +42,10 @@ public Component getMaterialComponent() { .withStyle(mutableComponent .getStyle() .withHoverEvent( - new HoverEvent( - HoverEvent.Action.SHOW_ITEM, - new HoverEvent.ItemStackInfo( - BuiltInRegistries.BLOCK.getValue( - ResourceLocation.parse(material) + new HoverEvent.ShowItem( + BuiltInRegistries.BLOCK.getValue( + ResourceLocation.parse(material) ).asItem() - .getDefaultInstance())))); + .getDefaultInstance()))); } } diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java index e84d293..8ac8104 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java @@ -48,10 +48,7 @@ public Component getMaterialComponent() { return mutableComponent .withStyle(mutableComponent .getStyle() - .withHoverEvent( - new HoverEvent( - HoverEvent.Action.SHOW_ITEM, - new HoverEvent.ItemStackInfo(itemStack.toItemStack())))); + .withHoverEvent(new HoverEvent.ShowItem(itemStack.toItemStack()))); } } diff --git a/common/src/main/resources/assets/grieflogger/lang/en_us.json b/common/src/main/resources/assets/grieflogger/lang/en_us.json index 473af8b..2b6d71b 100644 --- a/common/src/main/resources/assets/grieflogger/lang/en_us.json +++ b/common/src/main/resources/assets/grieflogger/lang/en_us.json @@ -44,5 +44,24 @@ "grieflogger.filter.include": "include", "grieflogger.filter.radius": "radius", "grieflogger.filter.time": "time", - "grieflogger.filter.user": "user" + "grieflogger.filter.user": "user", + "yamlconfig.grieflogger": "GriefLogger", + "yamlconfig.grieflogger.grieflogger-server": "Server Configuration", + "yamlconfig.grieflogger.grieflogger-server.general": "General", + "yamlconfig.grieflogger.grieflogger-server.general.maxPageSize": "Max Page Size", + "yamlconfig.grieflogger.grieflogger-server.server": "Server", + "yamlconfig.grieflogger.grieflogger-server.server.serverSideOnlyMode": "Server Side Only Mode", + "yamlconfig.grieflogger.grieflogger-server.database": "Database", + "yamlconfig.grieflogger.grieflogger-server.database.useMysql": "Use MySQL", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlHost": "MySQL Host", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlPort": "MySQL Port", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlDatabase": "MySQL Database", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlUsername": "MySQL Username", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlPassword": "MySQL Password", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlTimeout": "MySQL Timeout", + "yamlconfig.grieflogger.grieflogger-server.database.useIndexes": "Use Indexes", + "yamlconfig.grieflogger.grieflogger-server.hello": "Hello", + "yamlconfig.grieflogger.grieflogger-server.hello.helloFrequency": "Hello Frequency", + "yamlconfig.grieflogger.grieflogger-server.queue": "Queue", + "yamlconfig.grieflogger.grieflogger-server.queue.queueFrequency": "Queue Frequency" } \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index bdcf459..be1a081 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,3 +1,5 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + plugins { id "com.github.johnrengelman.shadow" id "com.matthewprenger.cursegradle" version "1.4.0" @@ -41,7 +43,9 @@ dependencies { modImplementation "com.mysql:mysql-connector-j:8.4.0" shadowBundle "com.mysql:mysql-connector-j:8.4.0" - modImplementation "curse.maven:supermartijn642s-config-lib-438332:${project.config_library_file_fabric}" + modImplementation "curse.maven:yaml-config-1128669:${project.config_library_file_fabric}" + modRuntimeOnly "curse.maven:ui-933200:${project.ui_library_file_fabric}" + } processResources { @@ -61,9 +65,42 @@ shadowJar { exclude "org/slf4j/**" configurations = [project.configurations.shadowBundle] - archiveClassifier = "dev-shadow" + archiveClassifier = "fabric-dev-shadow" +} + +// JAR without SQLite +tasks.register("shadowJarNoSQLite", ShadowJar) { + exclude "architectury.common.json" + exclude "org/slf4j/**" + exclude "org/sqlite/**" // Exclude SQLite driver + + configurations = [project.configurations.shadowBundle] + archiveClassifier = "fabric-no-sqlite" +} + +// JAR without MySQL +tasks.register("shadowJarNoMySQL", ShadowJar) { + exclude "architectury.common.json" + exclude "org/slf4j/**" + exclude "com/mysql/**" // Exclude MySQL driver + + configurations = [project.configurations.shadowBundle] + archiveClassifier = "fabric-no-mysql" } +// JAR without SQLite and MySQL +tasks.register("shadowJarNoSQLiteMySQL", ShadowJar) { + exclude "architectury.common.json" + exclude "org/slf4j/**" + exclude "org/sqlite/**" // Exclude SQLite driver + exclude "com/mysql/**" // Exclude MySQL driver + + configurations = [project.configurations.shadowBundle] + archiveClassifier = "fabric-no-sqlite-mysql" +} + +tasks.build.dependsOn shadowJarNoSQLite, shadowJarNoMySQL, shadowJarNoSQLiteMySQL + remapJar { input.set shadowJar.archiveFile archiveClassifier = "fabric" @@ -86,7 +123,7 @@ curseforge { relations { requiredDependency("architectury-api") - requiredDependency("supermartijn642s-config-lib") + requiredDependency("yaml-config") } mainArtifact(remapJar) { @@ -94,6 +131,19 @@ curseforge { } addArtifact(remapSourcesJar) { + displayName = "GriefLogger Fabric $project.minecraft_version - $project.mod_version (Sources)" + } + + addArtifact(shadowJarNoSQLite) { + displayName = "GriefLogger Fabric $project.minecraft_version - $project.mod_version (No SQLite)" + } + + addArtifact(shadowJarNoMySQL) { + displayName = "GriefLogger Fabric $project.minecraft_version - $project.mod_version (No MySQL)" + } + + addArtifact(shadowJarNoSQLiteMySQL) { + displayName = "GriefLogger Fabric $project.minecraft_version - $project.mod_version (No SQLite and MySQL)" } } options { @@ -112,11 +162,11 @@ modrinth { versionNumber = "$rootProject.mod_version" versionType = "$rootProject.curse_forge_release_type" uploadFile = remapJar - additionalFiles = [remapSourcesJar] + additionalFiles = [remapSourcesJar, shadowJarNoSQLite, shadowJarNoMySQL, shadowJarNoSQLiteMySQL] gameVersions = ["$rootProject.minecraft_version"] loaders = ["fabric"] dependencies { required.project "architectury-api" - required.project "supermartijn642s-config-lib" + required.project "yaml-config" } } \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index cecf99f..b1b6769 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -20,13 +20,12 @@ ] }, "mixins": [ - "grieflogger.mixins.json", "grieflogger-common.mixins.json" ], "depends": { "fabric": "*", - "minecraft": ">=1.21.4", + "minecraft": ">=1.21.5", "architectury": ">=15.0.1", - "supermartijn642configlib": ">=${config_library_version}" + "yamlconfig": ">=${config_library_version}" } } \ No newline at end of file diff --git a/fabric/src/main/resources/grieflogger.mixins.json b/fabric/src/main/resources/grieflogger.mixins.json deleted file mode 100644 index 79b6f4d..0000000 --- a/fabric/src/main/resources/grieflogger.mixins.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "required": true, - "package": "com.daqem.grieflogger.fabric.mixin", - "compatibilityLevel": "JAVA_21", - "minVersion": "0.8", - "client": [ - ], - "mixins": [ - ], - "injectors": { - "defaultRequire": 1 - } -} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 20c5a91..688e83a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,24 +1,28 @@ org.gradle.jvmargs=-Xmx4096M -minecraft_version=1.21.4 +minecraft_version=1.21.5 enabled_platforms=fabric,neoforge archives_base_name=grieflogger -mod_version=1.2.5-1.21.4 +mod_version=1.2.5-1.21.5 maven_group=com.daqem.grieflogger -architectury_version=15.0.1 +architectury_version=16.0.3 fabric_loader_version=0.16.10 -fabric_api_version=0.114.2+1.21.4 +fabric_api_version=0.119.5+1.21.5 -neoforge_version=21.4.57-beta +neoforge_version=21.5.2-beta curse_forge_project_id=435029 curse_forge_release_type=release -config_library_version=1.1.8 -config_library_file_fabric=5546988 -config_library_file_neoforge=5546996 +config_library_version=1.0-1.21.5 +config_library_file_fabric=6352661 +config_library_file_fabric_sources=6352661 +config_library_file_neoforge=6352663 + +ui_library_file_fabric=6352572 +ui_library_file_neoforge=6352574 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 145c0ae..0b2d9ab 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/neoforge/build.gradle b/neoforge/build.gradle index c9a90a8..cf7094a 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,3 +1,5 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + plugins { id "com.github.johnrengelman.shadow" id 'com.matthewprenger.cursegradle' version '1.4.0' @@ -47,7 +49,8 @@ dependencies { modImplementation "com.mysql:mysql-connector-j:8.4.0" shadowBundle "com.mysql:mysql-connector-j:8.4.0" - modImplementation "curse.maven:supermartijn642s-config-lib-438332:${project.config_library_file_neoforge}" + modImplementation "curse.maven:yaml-config-1128669:${project.config_library_file_neoforge}" + modRuntimeOnly "curse.maven:ui-933200:${project.ui_library_file_neoforge}" } processResources { @@ -70,6 +73,39 @@ shadowJar { archiveClassifier = "neoforge-dev-shadow" } +// JAR without SQLite +tasks.register("shadowJarNoSQLite", ShadowJar) { + exclude "architectury.common.json" + exclude "org/slf4j/**" + exclude "org/sqlite/**" // Exclude SQLite driver + + configurations = [project.configurations.shadowBundle] + archiveClassifier = "neoforge-no-sqlite" +} + +// JAR without MySQL +tasks.register("shadowJarNoMySQL", ShadowJar) { + exclude "architectury.common.json" + exclude "org/slf4j/**" + exclude "com/mysql/**" // Exclude MySQL driver + + configurations = [project.configurations.shadowBundle] + archiveClassifier = "neoforge-no-mysql" +} + +// JAR without SQLite and MySQL +tasks.register("shadowJarNoSQLiteMySQL", ShadowJar) { + exclude "architectury.common.json" + exclude "org/slf4j/**" + exclude "org/sqlite/**" // Exclude SQLite driver + exclude "com/mysql/**" // Exclude MySQL driver + + configurations = [project.configurations.shadowBundle] + archiveClassifier = "neoforge-no-sqlite-mysql" +} + +tasks.build.dependsOn shadowJarNoSQLite, shadowJarNoMySQL, shadowJarNoSQLiteMySQL + remapJar { inputFile.set shadowJar.archiveFile archiveClassifier = "neoforge" @@ -92,7 +128,7 @@ curseforge { relations { requiredDependency("architectury-api") - requiredDependency("supermartijn642s-config-lib") + requiredDependency("yaml-config") } mainArtifact(remapJar) { @@ -100,6 +136,19 @@ curseforge { } addArtifact(remapSourcesJar) { + displayName = "GriefLogger NeoForge $project.minecraft_version - $project.mod_version (Sources)" + } + + addArtifact(shadowJarNoSQLite) { + displayName = "GriefLogger NeoForge $project.minecraft_version - $project.mod_version (No SQLite)" + } + + addArtifact(shadowJarNoMySQL) { + displayName = "GriefLogger NeoForge $project.minecraft_version - $project.mod_version (No MySQL)" + } + + addArtifact(shadowJarNoSQLiteMySQL) { + displayName = "GriefLogger NeoForge $project.minecraft_version - $project.mod_version (No SQLite and MySQL)" } } } @@ -111,11 +160,11 @@ modrinth { versionNumber = "$rootProject.mod_version" versionType = "$rootProject.curse_forge_release_type" uploadFile = remapJar - additionalFiles = [remapSourcesJar] + additionalFiles = [remapSourcesJar, shadowJarNoSQLite, shadowJarNoMySQL, shadowJarNoSQLiteMySQL] gameVersions = ["$rootProject.minecraft_version"] loaders = ["neoforge"] dependencies { required.project "architectury-api" - required.project "supermartijn642s-config-lib" + required.project "yaml-config" } } \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index e4d57be..6593f18 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[3,)" +loaderVersion = "[7,)" #issueTrackerURL = "" license = "Apache-2.0" @@ -18,28 +18,28 @@ modId = "neoforge" mandatory = true versionRange = "[3,)" ordering = "NONE" -side = "SERVER" +side = "BOTH" [[dependencies.grieflogger]] modId = "minecraft" mandatory = true -versionRange = "[1.21.4,)" +versionRange = "[1.21.5,)" ordering = "NONE" -side = "SERVER" +side = "BOTH" [[dependencies.grieflogger]] modId = "architectury" mandatory = true versionRange = "[15.0.1,)" ordering = "AFTER" -side = "SERVER" +side = "BOTH" [[dependencies.grieflogger]] -modId = "supermartijn642configlib" +modId = "yamlconfig" mandatory = true versionRange = "[${config_library_version},)" ordering = "NONE" -side = "SERVER" +side = "BOTH" [[mixins]] config = "grieflogger-common.mixins.json" \ No newline at end of file diff --git a/neoforge/src/main/resources/grieflogger.mixins.json b/neoforge/src/main/resources/grieflogger.mixins.json deleted file mode 100644 index fdec52a..0000000 --- a/neoforge/src/main/resources/grieflogger.mixins.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "required": true, - "package": "com.daqem.grieflogger.neoforge.mixin", - "compatibilityLevel": "JAVA_21", - "minVersion": "0.8", - "client": [ - ], - "mixins": [ - ], - "injectors": { - "defaultRequire": 1 - } -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 3fa926e..b0a7399 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,4 @@ include 'common' include 'fabric' include 'neoforge' -rootProject.name = "GriefLogger 1.21.4" +rootProject.name = "GriefLogger 1.21.5" From ac2169dee0e0a33eabb69a4da0752a5251ccd987 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Wed, 26 Mar 2025 23:09:23 +0100 Subject: [PATCH 17/52] Not uploading additional files to Modrinth due to timeout. --- fabric/build.gradle | 2 +- neoforge/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index be1a081..507fc85 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -162,7 +162,7 @@ modrinth { versionNumber = "$rootProject.mod_version" versionType = "$rootProject.curse_forge_release_type" uploadFile = remapJar - additionalFiles = [remapSourcesJar, shadowJarNoSQLite, shadowJarNoMySQL, shadowJarNoSQLiteMySQL] + additionalFiles = [remapSourcesJar] gameVersions = ["$rootProject.minecraft_version"] loaders = ["fabric"] dependencies { diff --git a/neoforge/build.gradle b/neoforge/build.gradle index cf7094a..b2b4a5a 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -160,7 +160,7 @@ modrinth { versionNumber = "$rootProject.mod_version" versionType = "$rootProject.curse_forge_release_type" uploadFile = remapJar - additionalFiles = [remapSourcesJar, shadowJarNoSQLite, shadowJarNoMySQL, shadowJarNoSQLiteMySQL] + additionalFiles = [remapSourcesJar] gameVersions = ["$rootProject.minecraft_version"] loaders = ["neoforge"] dependencies { From 7e1971b6079155a817e018e6da753a994f130076 Mon Sep 17 00:00:00 2001 From: Kevin <66999025+DAQEM@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:19:45 +0200 Subject: [PATCH 18/52] Update gradle.properties --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 688e83a..02acc5b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ minecraft_version=1.21.5 enabled_platforms=fabric,neoforge archives_base_name=grieflogger -mod_version=1.2.5-1.21.5 +mod_version=1.2.6-1.21.5 maven_group=com.daqem.grieflogger architectury_version=16.0.3 From a68cca55cefb2fa8d43c3cce2d697eda10771e1c Mon Sep 17 00:00:00 2001 From: DAQEM Date: Mon, 8 Sep 2025 11:29:24 +0200 Subject: [PATCH 19/52] Ported to 1.21.6 --- .github/FUNDING.yml | 14 +--- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- .../grieflogger/config/GriefLoggerConfig.java | 10 ++- .../daqem/grieflogger/database/Database.java | 4 +- .../grieflogger/mixin/MixinServerPlayer.java | 4 +- fabric/build.gradle | 79 +++++++++---------- fabric/src/main/resources/fabric.mod.json | 18 ++--- gradle.properties | 54 +++++++++---- neoforge/build.gradle | 70 ++++++++-------- .../resources/META-INF/neoforge.mods.toml | 51 ++++++------ neoforge/src/main/resources/pack.mcmeta | 6 -- 12 files changed, 164 insertions(+), 150 deletions(-) delete mode 100644 neoforge/src/main/resources/pack.mcmeta diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 139b751..498502a 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,13 +1 @@ -# These are supported funding model platforms - -github: [DAQEM] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -patreon: daqem # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: daqem # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] +ko_fi: daqem \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 039c144..8e896e9 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -2,7 +2,7 @@ name: Publish on: push: - branches: [ "1.21.5" ] + branches: [ "1.21.6" ] permissions: contents: write diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a3bed55..7aeaf7c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: Run Tests on: push: - branches: [ "1.21.5-dev" ] + branches: [ "1.21.6-dev" ] permissions: contents: read diff --git a/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java b/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java index d225090..8bba2c1 100644 --- a/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java +++ b/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java @@ -1,6 +1,7 @@ package com.daqem.grieflogger.config; import com.daqem.grieflogger.GriefLogger; +import com.daqem.yamlconfig.YamlConfigExpectPlatform; import com.daqem.yamlconfig.api.config.ConfigExtension; import com.daqem.yamlconfig.api.config.ConfigType; import com.daqem.yamlconfig.api.config.entry.IConfigEntry; @@ -28,7 +29,14 @@ public static void init() { public static final IConfigEntry helloFrequency; static { - ConfigBuilder config = new ConfigBuilder(GriefLogger.MOD_ID, "grieflogger-server", ConfigExtension.YAML, ConfigType.SERVER); + ConfigBuilder config = new ConfigBuilder( + GriefLogger.MOD_ID, + "grieflogger-server", + ConfigExtension.YAML, + ConfigType.SERVER, + YamlConfigExpectPlatform.getConfigDirectory().resolve(GriefLogger.MOD_ID) + ); + config.push("database"); useMysql = config.defineBoolean("useMysql", false) .withComments("Whether to use MySQL or SQLite"); diff --git a/common/src/main/java/com/daqem/grieflogger/database/Database.java b/common/src/main/java/com/daqem/grieflogger/database/Database.java index a8552a7..309f99c 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/Database.java +++ b/common/src/main/java/com/daqem/grieflogger/database/Database.java @@ -86,7 +86,9 @@ public boolean createSqliteConnection() { path.toFile().mkdirs(); } try { - connection = DriverManager.getConnection("jdbc:sqlite:database.db"); + // Construct the JDBC URL with the full path to database.db + String dbPath = path.resolve("database.db").toString(); + connection = DriverManager.getConnection("jdbc:sqlite:" + dbPath); } catch (SQLException e) { GriefLogger.LOGGER.error("Failed to connect to SQLite database", e); return false; diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java index a28c7e9..75ed023 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java @@ -46,8 +46,8 @@ public abstract class MixinServerPlayer extends Player implements GriefLoggerSer @Unique private final List grieflogger$pages = new ArrayList<>(); - public MixinServerPlayer(Level level, BlockPos blockPos, float f, GameProfile gameProfile) { - super(level, blockPos, f, gameProfile); + public MixinServerPlayer(Level level, GameProfile gameProfile) { + super(level, gameProfile); } @Unique diff --git a/fabric/build.gradle b/fabric/build.gradle index 507fc85..ae3fc80 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -49,14 +49,24 @@ dependencies { } processResources { - inputs.property "version", project.version - inputs.property "config_library_version", config_library_version - - filesMatching("fabric.mod.json") { - expand([ - "version": project.version, - "config_library_version": config_library_version - ]) + var replaceProperties = [ + "version": project.version, + "mod_id": project.mod_id, + "mod_name": project.mod_name, + "mod_description": project.mod_description, + "mod_author": project.mod_author, + "mod_license": project.mod_license, + "mod_website": project.mod_website, + "mod_repository": project.mod_repository, + + "minecraft_version": project.minecraft_version, + "architectury_version": project.architectury_version, + "config_library_version": project.config_library_version + ] + inputs.properties replaceProperties + + filesMatching(['fabric.mod.json']) { + expand replaceProperties } } @@ -111,62 +121,49 @@ remapSourcesJar { } curseforge { - apiKey = System.getenv('CURSEFORGE_API_KEY') + apiKey = System.getenv("CURSEFORGE_API_KEY") project { id = project.curse_forge_project_id - releaseType = project.curse_forge_release_type + releaseType = project.release_type changelogType = "markdown" changelog = rootProject.file('changelog.md') - addGameVersion project.minecraft_version + + project.supported_minecraft_versions.split(',').each { version -> + addGameVersion version + } + addGameVersion "Java 21" addGameVersion "Fabric" relations { - requiredDependency("architectury-api") - requiredDependency("yaml-config") + project.curseforge_dependencies.split(',').each { dep -> + requiredDependency dep.trim() + } } mainArtifact(remapJar) { - displayName = "GriefLogger Fabric $project.minecraft_version - $project.mod_version" + displayName = "$project.mod_name Fabric $project.minecraft_version - $project.mod_version" } addArtifact(remapSourcesJar) { - displayName = "GriefLogger Fabric $project.minecraft_version - $project.mod_version (Sources)" - } - - addArtifact(shadowJarNoSQLite) { - displayName = "GriefLogger Fabric $project.minecraft_version - $project.mod_version (No SQLite)" - } - - addArtifact(shadowJarNoMySQL) { - displayName = "GriefLogger Fabric $project.minecraft_version - $project.mod_version (No MySQL)" } - - addArtifact(shadowJarNoSQLiteMySQL) { - displayName = "GriefLogger Fabric $project.minecraft_version - $project.mod_version (No SQLite and MySQL)" - } - } - options { - forgeGradleIntegration = false } } -afterEvaluate { - tasks.curseforge435029.dependsOn remapJar -} - modrinth { token = System.getenv("MODRINTH_API_KEY") - projectId = "8oGVUFuX" - versionName = "GriefLogger Fabric $rootProject.minecraft_version - $rootProject.mod_version" - versionNumber = "$rootProject.mod_version" - versionType = "$rootProject.curse_forge_release_type" + projectId = project.modrinth_project_id + versionName = "$project.mod_name Fabric $project.minecraft_version - $project.mod_version" + versionNumber = "$project.mod_version" + versionType = "$project.release_type" uploadFile = remapJar additionalFiles = [remapSourcesJar] - gameVersions = ["$rootProject.minecraft_version"] + gameVersions = project.supported_minecraft_versions.split(',').toList() loaders = ["fabric"] + changelog = rootProject.file('changelog.md').text dependencies { - required.project "architectury-api" - required.project "yaml-config" + project.modrinth_dependencies.split(',').each { dep -> + required.project dep + } } } \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index b1b6769..9f6e3fa 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -1,17 +1,17 @@ { "schemaVersion": 1, - "id": "grieflogger", + "id": "${mod_id}", "version": "${version}", - "name": "GriefLogger", - "description": "A mod that logs all player interactions with blocks and entities and stores them in a database.", + "name": "${mod_name}", + "description": "${mod_description}", "authors": [ - "DAQEM" + "${mod_author}" ], "contact": { - "homepage": "https://daqem.com/", - "sources": "https://github.com/DAQEM/GriefLogger" + "homepage": "${mod_website}", + "sources": "${mod_repository}" }, - "license": "Apache-2.0", + "license": "${mod_license}", "icon": "assets/grieflogger/icon.png", "environment": "*", "entrypoints": { @@ -24,8 +24,8 @@ ], "depends": { "fabric": "*", - "minecraft": ">=1.21.5", - "architectury": ">=15.0.1", + "minecraft": ">=${minecraft_version}", + "architectury": ">=${architectury_version}", "yamlconfig": ">=${config_library_version}" } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 02acc5b..51daf10 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,28 +1,50 @@ org.gradle.jvmargs=-Xmx4096M -minecraft_version=1.21.5 enabled_platforms=fabric,neoforge - +maven_group=com.daqem archives_base_name=grieflogger -mod_version=1.2.6-1.21.5 -maven_group=com.daqem.grieflogger - -architectury_version=16.0.3 -fabric_loader_version=0.16.10 -fabric_api_version=0.119.5+1.21.5 +# Project +mod_version=1.2.6-1.21.6 +mod_id=grieflogger +mod_name=GriefLogger +mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. +mod_author=DAQEM +mod_license=Apache-2.0 +mod_website=https://daqem.com +mod_repository=https://github.com/DAQEM/GriefLogger -neoforge_version=21.5.2-beta +# Publishing +supported_minecraft_versions=1.21.6,1.21.7,1.21.8 +release_type=release curse_forge_project_id=435029 -curse_forge_release_type=release +curseforge_dependencies=architectury-api,yaml-config + +modrinth_project_id=8oGVUFuX +modrinth_dependencies=architectury-api,yaml-config + +# Minecraft +minecraft_version=1.21.6 + +# Fabric +fabric_loader_version=0.17.2 +fabric_api_version=0.128.2+1.21.6 + +# NeoForge +neoforge_version=21.6.20-beta +neoforge_loader_version=1 + +# Dependencies +architectury_version=17.0.6 -config_library_version=1.0-1.21.5 -config_library_file_fabric=6352661 -config_library_file_fabric_sources=6352661 -config_library_file_neoforge=6352663 +config_library_version=1.3.0-1.21.6 +config_library_file_fabric=6972536 +config_library_file_fabric_sources=6972537 +config_library_file_neoforge=6972538 -ui_library_file_fabric=6352572 -ui_library_file_neoforge=6352574 +# Runtime Only +ui_library_file_fabric=6972453 +ui_library_file_neoforge=6972456 diff --git a/neoforge/build.gradle b/neoforge/build.gradle index b2b4a5a..8bf3068 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -54,14 +54,24 @@ dependencies { } processResources { - inputs.property "version", project.version - inputs.property "config_library_version", config_library_version - - filesMatching("META-INF/neoforge.mods.toml") { - expand([ - "version": project.version, - "config_library_version": config_library_version - ]) + var replaceProperties = [ + "version": project.version, + "mod_id": project.mod_id, + "mod_name": project.mod_name, + "mod_description": project.mod_description, + "mod_author": project.mod_author, + "mod_license": project.mod_license, + "mod_repository": project.mod_repository, + + "neoforge_loader_version": project.neoforge_loader_version, + "minecraft_version": project.minecraft_version, + "architectury_version": project.architectury_version, + "config_library_version": project.config_library_version, + ] + inputs.properties replaceProperties + + filesMatching(['META-INF/neoforge.mods.toml']) { + expand replaceProperties } } @@ -119,52 +129,46 @@ curseforge { apiKey = System.getenv("CURSEFORGE_API_KEY") project { id = project.curse_forge_project_id - releaseType = project.curse_forge_release_type + releaseType = project.release_type changelogType = "markdown" changelog = rootProject.file('changelog.md') - addGameVersion project.minecraft_version + + project.supported_minecraft_versions.split(',').each { version -> + addGameVersion version + } + addGameVersion "Java 21" addGameVersion "NeoForge" relations { - requiredDependency("architectury-api") - requiredDependency("yaml-config") + project.curseforge_dependencies.split(',').each { dep -> + requiredDependency dep.trim() + } } mainArtifact(remapJar) { - displayName = "GriefLogger NeoForge $project.minecraft_version - $project.mod_version" + displayName = "$project.mod_name NeoForge $project.minecraft_version - $project.mod_version" } addArtifact(remapSourcesJar) { - displayName = "GriefLogger NeoForge $project.minecraft_version - $project.mod_version (Sources)" - } - - addArtifact(shadowJarNoSQLite) { - displayName = "GriefLogger NeoForge $project.minecraft_version - $project.mod_version (No SQLite)" - } - - addArtifact(shadowJarNoMySQL) { - displayName = "GriefLogger NeoForge $project.minecraft_version - $project.mod_version (No MySQL)" - } - - addArtifact(shadowJarNoSQLiteMySQL) { - displayName = "GriefLogger NeoForge $project.minecraft_version - $project.mod_version (No SQLite and MySQL)" } } } modrinth { token = System.getenv("MODRINTH_API_KEY") - projectId = "8oGVUFuX" - versionName = "GriefLogger NeoForge $rootProject.minecraft_version - $rootProject.mod_version" - versionNumber = "$rootProject.mod_version" - versionType = "$rootProject.curse_forge_release_type" + projectId = project.modrinth_project_id + versionName = "$project.mod_name NeoForge $project.minecraft_version - $project.mod_version" + versionNumber = "$project.mod_version" + versionType = "$project.release_type" uploadFile = remapJar additionalFiles = [remapSourcesJar] - gameVersions = ["$rootProject.minecraft_version"] + gameVersions = project.supported_minecraft_versions.split(',').toList() loaders = ["neoforge"] + changelog = rootProject.file('changelog.md').text dependencies { - required.project "architectury-api" - required.project "yaml-config" + project.modrinth_dependencies.split(',').each { dep -> + required.project dep + } } } \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 6593f18..1224e00 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -1,45 +1,44 @@ modLoader = "javafml" -loaderVersion = "[7,)" -#issueTrackerURL = "" -license = "Apache-2.0" +loaderVersion = "[${neoforge_loader_version},)" +issueTrackerURL = "${mod_repository}/issues" +license = "${mod_license}" [[mods]] -modId = "grieflogger" +modId = "${mod_id}" version = "${version}" -displayName = "GriefLogger" -authors = "DAQEM" -description = ''' -A mod that logs all player interactions with blocks and entities and stores them in a database. -''' -#logoFile = "" +license = "${mod_license}" +displayName = "${mod_name}" +authors = "${mod_author}" +credits = "${mod_author}" +description = "${mod_description}" -[[dependencies.grieflogger]] +[[dependencies."${mod_id}"]] modId = "neoforge" -mandatory = true -versionRange = "[3,)" +type = "required" +versionRange = "[21,)" ordering = "NONE" -side = "BOTH" +side = "SERVER" -[[dependencies.grieflogger]] +[[dependencies."${mod_id}"]] modId = "minecraft" -mandatory = true -versionRange = "[1.21.5,)" +type = "required" +versionRange = "[${minecraft_version},)" ordering = "NONE" -side = "BOTH" +side = "SERVER" -[[dependencies.grieflogger]] +[[dependencies."${mod_id}"]] modId = "architectury" -mandatory = true -versionRange = "[15.0.1,)" +type = "required" +versionRange = "[${architectury_version},)" ordering = "AFTER" -side = "BOTH" +side = "SERVER" -[[dependencies.grieflogger]] +[[dependencies."${mod_id}"]] modId = "yamlconfig" -mandatory = true +type = "required" versionRange = "[${config_library_version},)" -ordering = "NONE" -side = "BOTH" +ordering = "AFTER" +side = "SERVER" [[mixins]] config = "grieflogger-common.mixins.json" \ No newline at end of file diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta deleted file mode 100644 index 408e65f..0000000 --- a/neoforge/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "GriefLogger", - "pack_format": 15 - } -} From 46472276a666e6cfff34139240f82028bac06707 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Thu, 25 Sep 2025 16:50:49 +0200 Subject: [PATCH 20/52] Added support for buckets and added #100 --- .../grieflogger/mixin/MixinBucketItem.java | 53 +++++++++++++++++++ .../model/history/BlockHistory.java | 31 +++++++---- .../model/history/ItemHistory.java | 5 +- .../resources/grieflogger-common.mixins.json | 1 + gradle.properties | 2 +- 5 files changed, 81 insertions(+), 11 deletions(-) create mode 100644 common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java new file mode 100644 index 0000000..333fb69 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java @@ -0,0 +1,53 @@ +package com.daqem.grieflogger.mixin; + +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.event.block.BreakBlockEvent; +import com.daqem.grieflogger.event.block.PlaceBlockEvent; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BucketItem.class) +public class MixinBucketItem { + + @Inject( + method = "emptyContents", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z", + shift = At.Shift.AFTER + ) + ) + private void onLiquidPlaced(LivingEntity livingEntity, Level level, BlockPos blockPos, BlockHitResult blockHitResult, CallbackInfoReturnable cir) { + if (livingEntity instanceof ServerPlayer serverPlayer) { + PlaceBlockEvent.placeBlock(level, blockPos, level.getBlockState(blockPos), serverPlayer); + } + } + + @Inject( + method = "use", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/entity/player/Player;awardStat(Lnet/minecraft/stats/Stat;)V", + ordinal = 0 + ) + ) + private void onBucketFilled(Level level, Player player, InteractionHand interactionHand, CallbackInfoReturnable cir, @Local(ordinal = 1) ItemStack itemStack2, @Local BlockHitResult blockHitResult) { + if (player instanceof ServerPlayer serverPlayer && itemStack2.getItem() instanceof BucketItem bucketItem) { + GriefLogger.LOGGER.info("Bucket filled event triggered"); + BreakBlockEvent.breakBlock(level, blockHitResult.getBlockPos(), bucketItem.arch$getFluid().defaultFluidState().createLegacyBlock(), serverPlayer, null); + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java index 1cd3454..fa81b9e 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java @@ -5,11 +5,15 @@ import com.daqem.grieflogger.model.Time; import com.daqem.grieflogger.model.User; import com.daqem.grieflogger.model.action.BlockAction; +import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; import java.util.UUID; @@ -37,15 +41,24 @@ public Component getComponent() { } public Component getMaterialComponent() { + Holder.Reference blockReference = BuiltInRegistries.BLOCK.get(ResourceLocation.parse(material)).orElse(null); + Item item = blockReference != null ? blockReference.value().asItem() : Items.AIR; MutableComponent mutableComponent = GriefLogger.themedLiteral(this.material.replace("minecraft:", "")); - return mutableComponent - .withStyle(mutableComponent - .getStyle() - .withHoverEvent( - new HoverEvent.ShowItem( - BuiltInRegistries.BLOCK.getValue( - ResourceLocation.parse(material) - ).asItem() - .getDefaultInstance()))); + if (item != Items.AIR) { + return mutableComponent + .withStyle(mutableComponent + .getStyle() + .withHoverEvent( + new HoverEvent.ShowItem( + item.getDefaultInstance() + ))); + } else { + return mutableComponent + .withStyle(mutableComponent + .getStyle() + .withHoverEvent(new HoverEvent.ShowText( + Component.literal(this.material) + ))); + } } } diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java index 8ac8104..eb25ff4 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java @@ -44,11 +44,14 @@ public Component getComponent() { @Override public Component getMaterialComponent() { + int cappedCount = Math.min(itemStack.getCount(), 64); // It appears that the HoverEven.ItemStackInfo does not display the count at all either way. + var cappedItemStack = itemStack.toItemStack().copyWithCount(cappedCount); + MutableComponent mutableComponent = GriefLogger.themedLiteral(this.itemStack.getItem().arch$registryName().toString().replace("minecraft:", "")); return mutableComponent .withStyle(mutableComponent .getStyle() - .withHoverEvent(new HoverEvent.ShowItem(itemStack.toItemStack()))); + .withHoverEvent(new HoverEvent.ShowItem(cappedItemStack))); } } diff --git a/common/src/main/resources/grieflogger-common.mixins.json b/common/src/main/resources/grieflogger-common.mixins.json index dd8c68c..61471d6 100644 --- a/common/src/main/resources/grieflogger-common.mixins.json +++ b/common/src/main/resources/grieflogger-common.mixins.json @@ -7,6 +7,7 @@ ], "mixins": [ "ItemMixin", + "MixinBucketItem", "MixinItemStack", "MixinServerPlayer", "ProjectileMixin" diff --git a/gradle.properties b/gradle.properties index 51daf10..bc8ccd2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem archives_base_name=grieflogger # Project -mod_version=1.2.6-1.21.6 +mod_version=1.2.7-1.21.6 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. From b1b6e6e746fd55e8f5f4705308333cac77103e33 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Fri, 3 Oct 2025 13:36:12 +0200 Subject: [PATCH 21/52] fix: NeoForge mixin error --- .../grieflogger/event/block/BlockEvents.java | 6 +++- .../event/block/PlaceBlockEvent.java | 4 +-- .../grieflogger/mixin/MixinBucketItem.java | 14 -------- .../fabric/mixin/MixinBucketItem.java | 31 ++++++++++++++++++ fabric/src/main/resources/fabric.mod.json | 3 +- .../resources/grieflogger-fabric.mixins.json | 14 ++++++++ gradle.properties | 2 +- .../neoforge/mixin/MixinBucketItem.java | 32 +++++++++++++++++++ .../resources/META-INF/neoforge.mods.toml | 5 ++- .../grieflogger-neoforge.mixins.json | 14 ++++++++ settings.gradle | 2 +- 11 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 fabric/src/main/java/com/daqem/grieflogger/fabric/mixin/MixinBucketItem.java create mode 100644 fabric/src/main/resources/grieflogger-fabric.mixins.json create mode 100644 neoforge/src/main/java/com/daqem/grieflogger/neoforge/mixin/MixinBucketItem.java create mode 100644 neoforge/src/main/resources/grieflogger-neoforge.mixins.json diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java b/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java index 5591e40..e654890 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java @@ -1,5 +1,6 @@ package com.daqem.grieflogger.event.block; +import dev.architectury.event.EventResult; import dev.architectury.event.events.common.BlockEvent; import dev.architectury.event.events.common.InteractionEvent; @@ -7,7 +8,10 @@ public class BlockEvents { public static void registerEvents() { BlockEvent.BREAK.register(BreakBlockEvent::breakBlock); - BlockEvent.PLACE.register(PlaceBlockEvent::placeBlock); + BlockEvent.PLACE.register(((level, blockPos, blockState, entity) -> { + PlaceBlockEvent.placeBlock(level, blockPos, blockState, entity); + return EventResult.pass(); + })); InteractionEvent.LEFT_CLICK_BLOCK.register((player, hand, pos, direction) -> LeftClickBlockEvent.leftClickBlock(player, hand, pos, direction).asMinecraft()); InteractionEvent.RIGHT_CLICK_BLOCK.register((player, hand, pos, direction) -> RightClickBlockEvent.rightClickBlock(player, hand, pos, direction).asMinecraft()); } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/PlaceBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/PlaceBlockEvent.java index 84ac5ba..4014c41 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/PlaceBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/PlaceBlockEvent.java @@ -2,7 +2,6 @@ import com.daqem.grieflogger.model.action.BlockAction; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; -import dev.architectury.event.EventResult; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -10,10 +9,9 @@ public class PlaceBlockEvent { - public static EventResult placeBlock(Level level, BlockPos pos, BlockState state, Entity placer) { + public static void placeBlock(Level level, BlockPos pos, BlockState state, Entity placer) { if (placer instanceof GriefLoggerServerPlayer serverPlayer) { LogBlockEvent.logBlock(serverPlayer, level, state, pos, BlockAction.PLACE_BLOCK); } - return EventResult.pass(); } } diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java index 333fb69..ec30004 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java @@ -22,20 +22,6 @@ @Mixin(BucketItem.class) public class MixinBucketItem { - @Inject( - method = "emptyContents", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z", - shift = At.Shift.AFTER - ) - ) - private void onLiquidPlaced(LivingEntity livingEntity, Level level, BlockPos blockPos, BlockHitResult blockHitResult, CallbackInfoReturnable cir) { - if (livingEntity instanceof ServerPlayer serverPlayer) { - PlaceBlockEvent.placeBlock(level, blockPos, level.getBlockState(blockPos), serverPlayer); - } - } - @Inject( method = "use", at = @At( diff --git a/fabric/src/main/java/com/daqem/grieflogger/fabric/mixin/MixinBucketItem.java b/fabric/src/main/java/com/daqem/grieflogger/fabric/mixin/MixinBucketItem.java new file mode 100644 index 0000000..a2f11f5 --- /dev/null +++ b/fabric/src/main/java/com/daqem/grieflogger/fabric/mixin/MixinBucketItem.java @@ -0,0 +1,31 @@ +package com.daqem.grieflogger.fabric.mixin; + +import com.daqem.grieflogger.event.block.PlaceBlockEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BucketItem.class) +public class MixinBucketItem { + + @Inject( + method = "emptyContents", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z", + shift = At.Shift.AFTER + ) + ) + private void onLiquidPlaced(LivingEntity livingEntity, Level level, BlockPos blockPos, BlockHitResult blockHitResult, CallbackInfoReturnable cir) { + if (livingEntity instanceof ServerPlayer serverPlayer) { + PlaceBlockEvent.placeBlock(level, blockPos, level.getBlockState(blockPos), serverPlayer); + } + } +} \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 9f6e3fa..62716b6 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -20,7 +20,8 @@ ] }, "mixins": [ - "grieflogger-common.mixins.json" + "grieflogger-common.mixins.json", + "grieflogger-fabric.mixins.json" ], "depends": { "fabric": "*", diff --git a/fabric/src/main/resources/grieflogger-fabric.mixins.json b/fabric/src/main/resources/grieflogger-fabric.mixins.json new file mode 100644 index 0000000..112d0a9 --- /dev/null +++ b/fabric/src/main/resources/grieflogger-fabric.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "com.daqem.grieflogger.fabric.mixin", + "compatibilityLevel": "JAVA_21", + "minVersion": "0.8", + "client": [ + ], + "mixins": [ + "MixinBucketItem" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index bc8ccd2..63b8182 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem archives_base_name=grieflogger # Project -mod_version=1.2.7-1.21.6 +mod_version=1.2.8-1.21.6 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. diff --git a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/mixin/MixinBucketItem.java b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/mixin/MixinBucketItem.java new file mode 100644 index 0000000..209ec0e --- /dev/null +++ b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/mixin/MixinBucketItem.java @@ -0,0 +1,32 @@ +package com.daqem.grieflogger.neoforge.mixin; + +import com.daqem.grieflogger.event.block.PlaceBlockEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BucketItem.class) +public class MixinBucketItem { + + @Inject( + method = "emptyContents(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;Lnet/minecraft/world/item/ItemStack;)Z", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z", + shift = At.Shift.AFTER + ) + ) + private void onLiquidPlaced(LivingEntity livingEntity, Level level, BlockPos blockPos, BlockHitResult blockHitResult, ItemStack itemStack, CallbackInfoReturnable cir) { + if (livingEntity instanceof ServerPlayer serverPlayer) { + PlaceBlockEvent.placeBlock(level, blockPos, level.getBlockState(blockPos), serverPlayer); + } + } +} \ No newline at end of file diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 1224e00..a159012 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -41,4 +41,7 @@ ordering = "AFTER" side = "SERVER" [[mixins]] -config = "grieflogger-common.mixins.json" \ No newline at end of file +config = "grieflogger-common.mixins.json" + +[[mixins]] +config = "grieflogger-neoforge.mixins.json" \ No newline at end of file diff --git a/neoforge/src/main/resources/grieflogger-neoforge.mixins.json b/neoforge/src/main/resources/grieflogger-neoforge.mixins.json new file mode 100644 index 0000000..26e3488 --- /dev/null +++ b/neoforge/src/main/resources/grieflogger-neoforge.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "com.daqem.grieflogger.neoforge.mixin", + "compatibilityLevel": "JAVA_21", + "minVersion": "0.8", + "client": [ + ], + "mixins": [ + "MixinBucketItem" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index b0a7399..7a594f9 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,4 @@ include 'common' include 'fabric' include 'neoforge' -rootProject.name = "GriefLogger 1.21.5" +rootProject.name = "GriefLogger 1.21.6" From 3baf80f5f006966575c4036af13e7ae3aa0a9a38 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Fri, 3 Oct 2025 16:42:38 +0200 Subject: [PATCH 22/52] feat: port to 1.21.9 --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- build.gradle | 2 +- .../daqem/grieflogger/command/page/Page.java | 12 ++++++---- .../grieflogger/event/PlayerJoinEvent.java | 4 ++-- gradle.properties | 24 +++++++++---------- settings.gradle | 2 +- 7 files changed, 26 insertions(+), 22 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8e896e9..35a6f83 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -2,7 +2,7 @@ name: Publish on: push: - branches: [ "1.21.6" ] + branches: [ "1.21.9" ] permissions: contents: write diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7aeaf7c..427860b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: Run Tests on: push: - branches: [ "1.21.6-dev" ] + branches: [ "1.21.9-dev" ] permissions: contents: read diff --git a/build.gradle b/build.gradle index a078c5f..451159d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.11-SNAPSHOT" apply false id "architectury-plugin" version "3.4-SNAPSHOT" id 'com.github.johnrengelman.shadow' version '8.1.1' apply false } diff --git a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java index 44aa7a1..637d0a9 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java +++ b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java @@ -57,10 +57,14 @@ private Component getHeader() { } private Component getFooter() { - return getArrowLeft().append(" ") - .append(GriefLogger.themedTranslate("lookup.page")).append(" ") - .append(GriefLogger.translate("lookup.pages", page, maxPage).withStyle(ChatFormatting.WHITE)).append(" ") - .append(getArrowRight()); + return Component.empty() + .append(getArrowLeft() + .append(" ") + .append(GriefLogger.themedTranslate("lookup.page")) + .append(" ")) + .append(GriefLogger.translate("lookup.pages", page, maxPage).withStyle(getStyle(page + 1, page < maxPage).withColor(ChatFormatting.WHITE)) + .append(" ") + .append(getArrowRight())); } private MutableComponent getArrowLeft() { diff --git a/common/src/main/java/com/daqem/grieflogger/event/PlayerJoinEvent.java b/common/src/main/java/com/daqem/grieflogger/event/PlayerJoinEvent.java index 9dd5ecd..c47c6e5 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/PlayerJoinEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/PlayerJoinEvent.java @@ -12,11 +12,11 @@ public class PlayerJoinEvent { public static void registerEvent() { PlayerEvent.PLAYER_JOIN.register(player -> { GameProfile gameProfile = player.getGameProfile(); - UUID uuid = gameProfile.getId(); + UUID uuid = gameProfile.id(); Services.USER.insertOrUpdateName( uuid, - gameProfile.getName() + gameProfile.name() ); Services.SESSION.insert( diff --git a/gradle.properties b/gradle.properties index 63b8182..fc8dbb4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem archives_base_name=grieflogger # Project -mod_version=1.2.8-1.21.6 +mod_version=1.2.8-1.21.9 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. @@ -15,7 +15,7 @@ mod_website=https://daqem.com mod_repository=https://github.com/DAQEM/GriefLogger # Publishing -supported_minecraft_versions=1.21.6,1.21.7,1.21.8 +supported_minecraft_versions=1.21.9 release_type=release curse_forge_project_id=435029 @@ -25,26 +25,26 @@ modrinth_project_id=8oGVUFuX modrinth_dependencies=architectury-api,yaml-config # Minecraft -minecraft_version=1.21.6 +minecraft_version=1.21.9 # Fabric fabric_loader_version=0.17.2 -fabric_api_version=0.128.2+1.21.6 +fabric_api_version=0.134.0+1.21.9 # NeoForge -neoforge_version=21.6.20-beta +neoforge_version=21.9.9-beta neoforge_loader_version=1 # Dependencies -architectury_version=17.0.6 +architectury_version=18.0.3 -config_library_version=1.3.0-1.21.6 -config_library_file_fabric=6972536 -config_library_file_fabric_sources=6972537 -config_library_file_neoforge=6972538 +config_library_version=1.3.2-1.21.9 +config_library_file_fabric=7061661 +config_library_file_fabric_sources=7061662 +config_library_file_neoforge=7061663 # Runtime Only -ui_library_file_fabric=6972453 -ui_library_file_neoforge=6972456 +ui_library_file_fabric=7061587 +ui_library_file_neoforge=7061589 diff --git a/settings.gradle b/settings.gradle index 7a594f9..0785829 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,4 @@ include 'common' include 'fabric' include 'neoforge' -rootProject.name = "GriefLogger 1.21.6" +rootProject.name = "GriefLogger 1.21.9" From d12cef5ab1592d4bd4792682d987e45810212085 Mon Sep 17 00:00:00 2001 From: Kevin <66999025+DAQEM@users.noreply.github.com> Date: Tue, 14 Oct 2025 17:16:11 +0200 Subject: [PATCH 23/52] chore: remove debug log line --- .../main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java | 1 - gradle.properties | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java index ec30004..f209301 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java @@ -32,7 +32,6 @@ public class MixinBucketItem { ) private void onBucketFilled(Level level, Player player, InteractionHand interactionHand, CallbackInfoReturnable cir, @Local(ordinal = 1) ItemStack itemStack2, @Local BlockHitResult blockHitResult) { if (player instanceof ServerPlayer serverPlayer && itemStack2.getItem() instanceof BucketItem bucketItem) { - GriefLogger.LOGGER.info("Bucket filled event triggered"); BreakBlockEvent.breakBlock(level, blockHitResult.getBlockPos(), bucketItem.arch$getFluid().defaultFluidState().createLegacyBlock(), serverPlayer, null); } } diff --git a/gradle.properties b/gradle.properties index fc8dbb4..99d1e79 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem archives_base_name=grieflogger # Project -mod_version=1.2.8-1.21.9 +mod_version=1.2.9-1.21.9 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. From f4ef752c6462821b4962990c3a9c18c7b0dfda1a Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 12:33:07 +0100 Subject: [PATCH 24/52] feat: relocate sqlite --- .gitignore | 7 +- build.gradle | 2 +- buildSrc/build.gradle | 23 ++ buildSrc/src/main/java/NativeRelocator.java | 214 ++++++++++++++++++ buildSrc/src/main/java/NativeTransformer.java | 91 ++++++++ fabric/build.gradle | 16 +- gradle.properties | 2 + neoforge/build.gradle | 16 +- relocate_natives/download_codesign.py | 110 +++++++++ relocate_natives/fix_modified_binary.py | 31 +++ relocate_natives/prepare.ps1 | 5 + relocate_natives/prepare.sh | 7 + relocate_natives/requirements.txt | Bin 0 -> 66 bytes 13 files changed, 514 insertions(+), 10 deletions(-) create mode 100644 buildSrc/build.gradle create mode 100644 buildSrc/src/main/java/NativeRelocator.java create mode 100644 buildSrc/src/main/java/NativeTransformer.java create mode 100644 relocate_natives/download_codesign.py create mode 100644 relocate_natives/fix_modified_binary.py create mode 100644 relocate_natives/prepare.ps1 create mode 100644 relocate_natives/prepare.sh create mode 100644 relocate_natives/requirements.txt diff --git a/.gitignore b/.gitignore index be2a7c2..a46a463 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ run/ out/ *.iml .gradle/ +.gradle-cache/ output/ bin/ libs/ @@ -17,4 +18,8 @@ classes/ .vscode .settings *.launch -.architectury-transformer \ No newline at end of file + +relocate_natives/.venv/ +relocate_natives/__pycache__/ +relocate_natives/apple-codesign/ +relocate_natives/cache/ \ No newline at end of file diff --git a/build.gradle b/build.gradle index 451159d..e58e7c8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id "dev.architectury.loom" version "1.11-SNAPSHOT" apply false id "architectury-plugin" version "3.4-SNAPSHOT" - id 'com.github.johnrengelman.shadow' version '8.1.1' apply false + id 'com.github.johnrengelman.shadow' apply false } architectury { diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 0000000..7d77eef --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'java-library' +} + +repositories { + mavenCentral() + gradlePluginPortal() +} + +dependencies { + // Shadow plugin + implementation 'com.github.johnrengelman.shadow:com.github.johnrengelman.shadow.gradle.plugin:8.1.1' + + // Ant (Required for Shadow) + implementation 'org.apache.ant:ant:1.10.14' + + // Force latest ASM (Fixes "Unsupported class file major version 65") + implementation 'org.ow2.asm:asm:9.7' + implementation 'org.ow2.asm:asm-commons:9.7' + implementation 'org.ow2.asm:asm-util:9.7' + implementation 'org.ow2.asm:asm-tree:9.7' + implementation 'org.ow2.asm:asm-analysis:9.7' +} \ No newline at end of file diff --git a/buildSrc/src/main/java/NativeRelocator.java b/buildSrc/src/main/java/NativeRelocator.java new file mode 100644 index 0000000..d406952 --- /dev/null +++ b/buildSrc/src/main/java/NativeRelocator.java @@ -0,0 +1,214 @@ +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +class NativeRelocator +{ + private final Path rootDirectory; + private final Path cacheRoot; + + /** + * Initializes the NativeRelocator by preparing the environment if necessary. + * Executes the appropriate preparation script based on the OS. + */ + NativeRelocator(Path rootDirectory) + { + this.rootDirectory = rootDirectory; + this.cacheRoot = this.rootDirectory.resolve("cache"); + } + + private void prepare() throws Exception + { + if (this.rootDirectory.resolve(".venv").toFile().exists()) + { + return; + } + + ProcessBuilder processBuilder = new ProcessBuilder(); + processBuilder.directory(this.rootDirectory.toFile()); + + String os = System.getProperty("os.name").toLowerCase(); + if (os.contains("win")) + { + processBuilder.command("powershell", "-ExecutionPolicy", "Bypass", "./prepare.ps1"); + } + else if (os.contains("nix") + || os.contains("nux") + || os.contains("mac") + || os.contains("freebsd")) + { + processBuilder.command("./prepare.sh"); + } + else + { + throw new IllegalStateException("Unsupported operating system: " + os); + } + + Process process = processBuilder.start(); + CompletableFuture outputFuture = readOutputStreams(process); + + int exitCode = process.waitFor(); + outputFuture.get(); + + if (exitCode != 0) + { + throw new Exception("Prepare failed: " + exitCode); + } + } + + /** + * Reads and prints the output and error streams of a process asynchronously. + * + * @param process The process whose streams should be read. + * @return A CompletableFuture that completes once all output has been processed. + */ + private static CompletableFuture readOutputStreams(Process process) + { + return CompletableFuture.runAsync(() -> { + try + { + while (process.isAlive() || process.getInputStream().available() > 0 || process.getErrorStream().available() > 0) + { + if (process.getInputStream().available() > 0) + { + byte[] data = new byte[process.getInputStream().available()]; + //noinspection ResultOfMethodCallIgnored + process.getInputStream().read(data); + System.out.write(data); + } + if (process.getErrorStream().available() > 0) + { + byte[] data = new byte[process.getErrorStream().available()]; + //noinspection ResultOfMethodCallIgnored + process.getErrorStream().read(data); + System.err.write(data); + } + + //noinspection BusyWait + Thread.sleep(100); + } + } + catch (Throwable ignored) + { + } + }); + } + + /** + * Replaces occurrences of a target string in a byte array, ensuring null termination. + * + * @param byteArray The byte array where replacements should occur. + * @param target The string to replace. + * @param replacement The replacement string (must not be longer than the target). + * @throws IllegalArgumentException if the replacement is longer than the target. + */ + private void replaceInNullTerminatedStrings(byte[] byteArray, String target, String replacement) + { + if (target.length() < replacement.length()) + { + throw new IllegalArgumentException("Replacement must be the same length or shorter than the target."); + } + + byte[] targetBytes = target.getBytes(StandardCharsets.US_ASCII); + byte[] replacementBytes = replacement.getBytes(StandardCharsets.US_ASCII); + + byte nullByte = 0; + + for (int endPos = 0; endPos < byteArray.length - targetBytes.length - 1; endPos++) + { + int startPos = endPos; + int targetPos = 0; + while (targetPos < targetBytes.length && byteArray[endPos] == targetBytes[targetPos]) + { + targetPos++; + endPos++; + } + + if (targetPos == targetBytes.length) + { + System.arraycopy(replacementBytes, 0, byteArray, startPos, replacementBytes.length); + + startPos = startPos + replacementBytes.length; + while (byteArray[endPos] != nullByte) + { + byteArray[startPos] = byteArray[endPos]; + endPos++; + startPos++; + } + byteArray[startPos] = nullByte; + } + } + } + + /** + * Runs an external script to fix a modified binary and returns the processed content. + * + * @param outputFilePath Path to store the processed binary. + * @param content The original binary content. + * @return The modified binary content. + * @throws Exception if the process execution fails. + */ + public byte[] fixModifiedBinary(Path outputFilePath, byte[] content) throws Exception + { + ProcessBuilder processBuilder = new ProcessBuilder(); + processBuilder.directory(this.rootDirectory.toFile()); + + processBuilder.command( + this.rootDirectory.resolve(".venv/Scripts").toFile().exists() + ? this.rootDirectory.resolve(".venv/Scripts/python.exe").toString() + : this.rootDirectory.resolve(".venv/bin/python").toString(), + "./fix_modified_binary.py", + outputFilePath.toString() + ); + + Process process = processBuilder.start(); + CompletableFuture outputFuture = readOutputStreams(process); + + process.getOutputStream().write(content); + process.getOutputStream().close(); + + int exitCode = process.waitFor(); + outputFuture.get(); + + if (exitCode != 0) + { + throw new Exception("Process failed: " + exitCode); + } + + return Files.readAllBytes(outputFilePath); + } + + /** + * Processes a binary file, applying string replacements and fixing modifications. + * + * @param outputPath The output file path relative to the cache directory. + * @param content The binary content to process. + * @param replacements A map of string replacements to apply. + * @return The modified binary content. + * @throws Exception if processing fails. + */ + public byte[] processBinary(String outputPath, byte[] content, Map replacements) throws Exception + { + Path outputFilePath = this.cacheRoot.resolve(outputPath); + //noinspection ResultOfMethodCallIgnored + outputFilePath.getParent().toFile().mkdirs(); + + if (outputFilePath.toFile().exists()) + { + return Files.readAllBytes(outputFilePath); + } + + System.out.println("Relocating to " + outputPath + "..."); + this.prepare(); + + for (Map.Entry replacement : replacements.entrySet()) + { + this.replaceInNullTerminatedStrings(content, replacement.getKey(), replacement.getValue()); + } + + return this.fixModifiedBinary(outputFilePath, content); + } + +} diff --git a/buildSrc/src/main/java/NativeTransformer.java b/buildSrc/src/main/java/NativeTransformer.java new file mode 100644 index 0000000..8f58e28 --- /dev/null +++ b/buildSrc/src/main/java/NativeTransformer.java @@ -0,0 +1,91 @@ +import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer; +import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext; +import org.apache.tools.zip.ZipEntry; +import org.apache.tools.zip.ZipOutputStream; +import org.gradle.api.GradleException; +import org.gradle.api.file.FileTreeElement; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nonnull; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; + +public class NativeTransformer implements Transformer { + private final Map relocations = new HashMap<>(); + private final HashMap rewrittenFiles = new HashMap<>(); + private NativeRelocator relocator; + private java.io.File rootDir; + + @Override + public @NotNull String getName() { + return "NativeTransformer"; + } + + @Override + public boolean canTransformResource(@Nonnull FileTreeElement element) { + return relocations.keySet().stream() + .anyMatch(key -> element.getName().startsWith(key)); + } + + @Override + public void transform(@Nonnull TransformerContext context) { + byte[] content; + try { + content = context.getIs().readAllBytes(); + } catch (IOException e) { + throw new GradleException("Failed to read resource content", e); + } + + // Lazy initialization of nativeRelocator + if (relocator == null) { + relocator = new NativeRelocator(rootDir.toPath().resolve("relocate_natives")); + } + + try { + // Find the first matching path prefix replacement + Map.Entry pathReplacement = relocations.entrySet().stream() + .filter(entry -> context.getPath().startsWith(entry.getKey())) + .findFirst() + .orElseThrow(() -> new NoSuchElementException("No matching replacement found for path: " + context.getPath())); + + // Apply the path replacement + String newPath = context.getPath().replace(pathReplacement.getKey(), pathReplacement.getValue()); + + // Process the binary with the relocator + content = relocator.processBinary(newPath, content, relocations); + + // Store the rewritten file + rewrittenFiles.put(newPath, content); + + } catch (Throwable e) { + throw new GradleException("Failed to relocate native library: " + context.getPath(), e); + } + } + + @Override + public boolean hasTransformedResource() { + return !rewrittenFiles.isEmpty(); + } + + @Override + public void modifyOutputStream(ZipOutputStream os, boolean preserveFileTimestamps) { + for (Map.Entry rewrittenFile : rewrittenFiles.entrySet()) { + try { + os.putNextEntry(new ZipEntry(rewrittenFile.getKey())); + os.write(rewrittenFile.getValue()); + } catch (IOException e) { + throw new GradleException("Failed to write relocated native library: " + rewrittenFile.getKey(), e); + } + } + } + + // Gradle DSL helper methods + public void relocateNative(String pattern, String replacement) { + this.relocations.put(pattern, replacement); + } + + public void setRootDir(java.io.File rootDir) { + this.rootDir = rootDir; + } +} \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index ae3fc80..5cd2ec0 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,4 +1,5 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import NativeTransformer plugins { id "com.github.johnrengelman.shadow" @@ -37,8 +38,8 @@ dependencies { common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowBundle project(path: ":common", configuration: "transformProductionFabric") - modImplementation "org.xerial:sqlite-jdbc:3.47.2.0" - shadowBundle "org.xerial:sqlite-jdbc:3.47.2.0" + modImplementation "org.xerial:sqlite-jdbc:${project.sqlite_version}" + shadowBundle "org.xerial:sqlite-jdbc:${project.sqlite_version}" modImplementation "com.mysql:mysql-connector-j:8.4.0" shadowBundle "com.mysql:mysql-connector-j:8.4.0" @@ -71,8 +72,15 @@ processResources { } shadowJar { - exclude "architectury.common.json" - exclude "org/slf4j/**" + relocate "org.sqlite", "gl_sqlite", { + exclude "org/sqlite/native/**" + } + + transform(NativeTransformer.class) { + rootDir = project.rootDir + relocateNative "org/sqlite", "gl/sqlite" + relocateNative "org_sqlite", "gl_sqlite" + } configurations = [project.configurations.shadowBundle] archiveClassifier = "fabric-dev-shadow" diff --git a/gradle.properties b/gradle.properties index 99d1e79..e9103a2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -43,6 +43,8 @@ config_library_file_fabric=7061661 config_library_file_fabric_sources=7061662 config_library_file_neoforge=7061663 +sqlite_version=3.47.2.0 + # Runtime Only ui_library_file_fabric=7061587 ui_library_file_neoforge=7061589 diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 8bf3068..bb31cf6 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,4 +1,5 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import NativeTransformer plugins { id "com.github.johnrengelman.shadow" @@ -43,8 +44,8 @@ dependencies { common(project(path: ':common', configuration: 'namedElements')) { transitive false } shadowBundle project(path: ':common', configuration: 'transformProductionNeoForge') - modImplementation "org.xerial:sqlite-jdbc:3.47.2.0" - shadowBundle "org.xerial:sqlite-jdbc:3.47.2.0" + modImplementation "org.xerial:sqlite-jdbc:${project.sqlite_version}" + shadowBundle "org.xerial:sqlite-jdbc:${project.sqlite_version}" modImplementation "com.mysql:mysql-connector-j:8.4.0" shadowBundle "com.mysql:mysql-connector-j:8.4.0" @@ -76,8 +77,15 @@ processResources { } shadowJar { - exclude "architectury.common.json" - exclude "org/slf4j/**" + relocate "org.sqlite", "gl_sqlite", { + exclude "org/sqlite/native/**" + } + + transform(NativeTransformer.class) { + rootDir = project.rootDir + relocateNative "org/sqlite", "gl/sqlite" + relocateNative "org_sqlite", "gl_sqlite" + } configurations = [project.configurations.shadowBundle] archiveClassifier = "neoforge-dev-shadow" diff --git a/relocate_natives/download_codesign.py b/relocate_natives/download_codesign.py new file mode 100644 index 0000000..b2d938c --- /dev/null +++ b/relocate_natives/download_codesign.py @@ -0,0 +1,110 @@ +import os +import platform +import requests +import tarfile +import zipfile +from pathlib import Path + + +def get_platform_specific_filename(): + system = platform.system() + machine = platform.machine() + + if system == "Darwin": + if machine == "arm64": + return "apple-codesign-*-aarch64-apple-darwin.tar.gz" + else: + return "apple-codesign-*-x86_64-apple-darwin.tar.gz" + elif system == "Linux": + if machine == "aarch64": + return "apple-codesign-*-aarch64-unknown-linux-musl.tar.gz" + else: + return "apple-codesign-*-x86_64-unknown-linux-musl.tar.gz" + elif system == "Windows": + if machine.endswith("64"): + return "apple-codesign-*-x86_64-pc-windows-msvc.zip" + else: + return "apple-codesign-*-i686-pc-windows-msvc.zip" + else: + raise Exception(f"Unsupported platform: {system} {machine}") + + +def download_and_unpack(): + dest_dir = Path("./apple-codesign") + + repo_url = "https://api.github.com/repos/indygreg/apple-platform-rs/releases/latest" + dest_dir.mkdir(exist_ok=True) + + # Fetch the latest release info from GitHub + print("Fetching latest release information...") + response = requests.get(repo_url) + response.raise_for_status() + release_data = response.json() + + # Ensure release data has assets + if "assets" not in release_data: + raise Exception("Release data does not contain assets.") + + # Determine the correct asset + platform_filename = get_platform_specific_filename() + asset = next((asset for asset in release_data["assets"] if asset["name"].startswith("apple-codesign-") and asset["name"].endswith(platform_filename.split("*")[-1])), None) + + if not asset: + raise Exception(f"No matching asset found for platform: {platform_filename}") + + # Download the archive + print(f"Downloading {asset['name']}...") + download_url = asset["browser_download_url"] + archive_path = dest_dir / asset["name"] + + with requests.get(download_url, stream=True) as r: + r.raise_for_status() + with open(archive_path, "wb") as f: + for chunk in r.iter_content(chunk_size=8192): + f.write(chunk) + + print(f"Downloaded to {archive_path}") + + # Extract the archive + print("Extracting archive...") + temp_extract_dir = dest_dir / "temp_extract" + temp_extract_dir.mkdir(parents=True, exist_ok=True) + + if archive_path.suffix == ".zip": + with zipfile.ZipFile(archive_path, "r") as zip_ref: + zip_ref.extractall(temp_extract_dir) + elif archive_path.suffixes[-2:] == [".tar", ".gz"]: + with tarfile.open(archive_path, "r:gz") as tar_ref: + tar_ref.extractall(temp_extract_dir) + else: + raise Exception(f"Unknown archive format: {archive_path}") + + # Move contents of the root directory inside the archive to dest_dir + root_dir = next(temp_extract_dir.iterdir()) # Assuming only one root directory + for item in root_dir.iterdir(): + target_path = dest_dir / item.name + if target_path.exists(): + if target_path.is_dir(): + os.rmdir(target_path) + else: + os.remove(target_path) + item.rename(target_path) + + # Clean up temporary directories + for item in temp_extract_dir.iterdir(): + if item.is_dir(): + os.rmdir(item) + temp_extract_dir.rmdir() + + print(f"Extracted to {dest_dir}") + + # Clean up the archive + os.remove(archive_path) + print(f"Removed archive {archive_path}") + + +if __name__ == "__main__": + try: + download_and_unpack() + except Exception as e: + print(f"Error: {e}") diff --git a/relocate_natives/fix_modified_binary.py b/relocate_natives/fix_modified_binary.py new file mode 100644 index 0000000..daa2a9c --- /dev/null +++ b/relocate_natives/fix_modified_binary.py @@ -0,0 +1,31 @@ +import sys +import lief +import subprocess +import download_codesign +from pathlib import Path + +# Parse the input binary & xit if binary is invalid +output_path = sys.argv[1] +binary = lief.parse(sys.stdin.buffer.read()) +if binary is None: + exit(1) + +# Remove signature from Mac binaries +if isinstance(binary, lief.MachO.Binary): + binary.remove_signature() + +# Write the modified binary to the output path +binary.write(output_path) + +# Sign Mac binaries (required to make them usable because apple) +if isinstance(binary, lief.MachO.Binary): + print(f"Signing {output_path}...") + + # Check if the Apple code-signing files are available, if not, download them + if not Path("./apple-codesign/COPYING").exists(): + download_codesign.download_and_unpack() + + # Run the code-signing process + sign_process = subprocess.Popen(["./apple-codesign/rcodesign", "sign", output_path], shell=False, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + sign_process.wait() diff --git a/relocate_natives/prepare.ps1 b/relocate_natives/prepare.ps1 new file mode 100644 index 0000000..218ba69 --- /dev/null +++ b/relocate_natives/prepare.ps1 @@ -0,0 +1,5 @@ +$ErrorActionPreference = "Stop" + +python -m venv .venv +.\.venv\Scripts\activate +pip install -r requirements.txt diff --git a/relocate_natives/prepare.sh b/relocate_natives/prepare.sh new file mode 100644 index 0000000..52f9b3a --- /dev/null +++ b/relocate_natives/prepare.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +python -m venv .venv +. ./.venv/bin/activate +pip install -r requirements.txt diff --git a/relocate_natives/requirements.txt b/relocate_natives/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..f8d132bea1bfb98e44401a5c2c7f6b11aebc1c9b GIT binary patch literal 66 zcmezWFNYzMA(bJG!4?P&81xtn8O(sB5d$v+7ef(HrjVf&NES1c05M375m43`N`lk? E0JHH5hX4Qo literal 0 HcmV?d00001 From 1a4d72bae82140db06572747ec5270b2d940f4a7 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 12:47:58 +0100 Subject: [PATCH 25/52] fix: relocating in one folder --- fabric/build.gradle | 4 ++-- neoforge/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index 5cd2ec0..6435173 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -78,8 +78,8 @@ shadowJar { transform(NativeTransformer.class) { rootDir = project.rootDir - relocateNative "org/sqlite", "gl/sqlite" - relocateNative "org_sqlite", "gl_sqlite" + relocateNative "org/sqlite", "gl_sqlite" + relocateNative "org_sqlite", "gl_1sqlite" } configurations = [project.configurations.shadowBundle] diff --git a/neoforge/build.gradle b/neoforge/build.gradle index bb31cf6..5a9e05f 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -83,8 +83,8 @@ shadowJar { transform(NativeTransformer.class) { rootDir = project.rootDir - relocateNative "org/sqlite", "gl/sqlite" - relocateNative "org_sqlite", "gl_sqlite" + relocateNative "org/sqlite", "gl_sqlite" + relocateNative "org_sqlite", "gl_1sqlite" } configurations = [project.configurations.shadowBundle] From 5612c37d931c3cecbc2e6a7042c5c0bf07ff7b32 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 14:28:01 +0100 Subject: [PATCH 26/52] feat: add mysql relocation --- fabric/build.gradle | 41 ++++++----------------------------------- gradle.properties | 1 + neoforge/build.gradle | 41 ++++++----------------------------------- 3 files changed, 13 insertions(+), 70 deletions(-) diff --git a/fabric/build.gradle b/fabric/build.gradle index 6435173..50a7ce7 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -41,8 +41,8 @@ dependencies { modImplementation "org.xerial:sqlite-jdbc:${project.sqlite_version}" shadowBundle "org.xerial:sqlite-jdbc:${project.sqlite_version}" - modImplementation "com.mysql:mysql-connector-j:8.4.0" - shadowBundle "com.mysql:mysql-connector-j:8.4.0" + modImplementation "com.mysql:mysql-connector-j:${project.mysql_version}" + shadowBundle "com.mysql:mysql-connector-j:${project.mysql_version}" modImplementation "curse.maven:yaml-config-1128669:${project.config_library_file_fabric}" modRuntimeOnly "curse.maven:ui-933200:${project.ui_library_file_fabric}" @@ -76,49 +76,20 @@ shadowJar { exclude "org/sqlite/native/**" } + relocate "jdbc:sqlite", "jdbc:gl_sqlite" + transform(NativeTransformer.class) { rootDir = project.rootDir relocateNative "org/sqlite", "gl_sqlite" relocateNative "org_sqlite", "gl_1sqlite" } - configurations = [project.configurations.shadowBundle] - archiveClassifier = "fabric-dev-shadow" -} - -// JAR without SQLite -tasks.register("shadowJarNoSQLite", ShadowJar) { - exclude "architectury.common.json" - exclude "org/slf4j/**" - exclude "org/sqlite/**" // Exclude SQLite driver + relocate "com.mysql", "gl_mysql" configurations = [project.configurations.shadowBundle] - archiveClassifier = "fabric-no-sqlite" -} - -// JAR without MySQL -tasks.register("shadowJarNoMySQL", ShadowJar) { - exclude "architectury.common.json" - exclude "org/slf4j/**" - exclude "com/mysql/**" // Exclude MySQL driver - - configurations = [project.configurations.shadowBundle] - archiveClassifier = "fabric-no-mysql" -} - -// JAR without SQLite and MySQL -tasks.register("shadowJarNoSQLiteMySQL", ShadowJar) { - exclude "architectury.common.json" - exclude "org/slf4j/**" - exclude "org/sqlite/**" // Exclude SQLite driver - exclude "com/mysql/**" // Exclude MySQL driver - - configurations = [project.configurations.shadowBundle] - archiveClassifier = "fabric-no-sqlite-mysql" + archiveClassifier = "fabric-dev-shadow" } -tasks.build.dependsOn shadowJarNoSQLite, shadowJarNoMySQL, shadowJarNoSQLiteMySQL - remapJar { input.set shadowJar.archiveFile archiveClassifier = "fabric" diff --git a/gradle.properties b/gradle.properties index e9103a2..360d096 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,6 +44,7 @@ config_library_file_fabric_sources=7061662 config_library_file_neoforge=7061663 sqlite_version=3.47.2.0 +mysql_version=8.4.0 # Runtime Only ui_library_file_fabric=7061587 diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 5a9e05f..92f3f63 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -47,8 +47,8 @@ dependencies { modImplementation "org.xerial:sqlite-jdbc:${project.sqlite_version}" shadowBundle "org.xerial:sqlite-jdbc:${project.sqlite_version}" - modImplementation "com.mysql:mysql-connector-j:8.4.0" - shadowBundle "com.mysql:mysql-connector-j:8.4.0" + modImplementation "com.mysql:mysql-connector-j:${project.mysql_version}" + shadowBundle "com.mysql:mysql-connector-j:${project.mysql_version}" modImplementation "curse.maven:yaml-config-1128669:${project.config_library_file_neoforge}" modRuntimeOnly "curse.maven:ui-933200:${project.ui_library_file_neoforge}" @@ -81,49 +81,20 @@ shadowJar { exclude "org/sqlite/native/**" } + relocate "jdbc:sqlite", "jdbc:gl_sqlite" + transform(NativeTransformer.class) { rootDir = project.rootDir relocateNative "org/sqlite", "gl_sqlite" relocateNative "org_sqlite", "gl_1sqlite" } - configurations = [project.configurations.shadowBundle] - archiveClassifier = "neoforge-dev-shadow" -} - -// JAR without SQLite -tasks.register("shadowJarNoSQLite", ShadowJar) { - exclude "architectury.common.json" - exclude "org/slf4j/**" - exclude "org/sqlite/**" // Exclude SQLite driver + relocate "com.mysql", "gl_mysql" configurations = [project.configurations.shadowBundle] - archiveClassifier = "neoforge-no-sqlite" -} - -// JAR without MySQL -tasks.register("shadowJarNoMySQL", ShadowJar) { - exclude "architectury.common.json" - exclude "org/slf4j/**" - exclude "com/mysql/**" // Exclude MySQL driver - - configurations = [project.configurations.shadowBundle] - archiveClassifier = "neoforge-no-mysql" -} - -// JAR without SQLite and MySQL -tasks.register("shadowJarNoSQLiteMySQL", ShadowJar) { - exclude "architectury.common.json" - exclude "org/slf4j/**" - exclude "org/sqlite/**" // Exclude SQLite driver - exclude "com/mysql/**" // Exclude MySQL driver - - configurations = [project.configurations.shadowBundle] - archiveClassifier = "neoforge-no-sqlite-mysql" + archiveClassifier = "neoforge-dev-shadow" } -tasks.build.dependsOn shadowJarNoSQLite, shadowJarNoMySQL, shadowJarNoSQLiteMySQL - remapJar { inputFile.set shadowJar.archiveFile archiveClassifier = "neoforge" From 5fb2a2b8ce71f86881dd8c43d24c0dacaebce3e7 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 15:20:27 +0100 Subject: [PATCH 27/52] feat: add db dialect to support sqlite and mysql easier. --- .../daqem/grieflogger/database/Database.java | 25 ++- .../database/dialect/IDatabaseDialect.java | 12 ++ .../database/dialect/MySQLDialect.java | 30 +++ .../database/dialect/SQLiteDialect.java | 30 +++ .../database/repository/BlockRepository.java | 164 +++++----------- .../database/repository/ChatRepository.java | 86 +++------ .../repository/CommandRepository.java | 86 +++------ .../repository/ContainerRepository.java | 181 +++++++----------- .../database/repository/EntityRepository.java | 40 ++-- .../database/repository/IRepository.java | 2 +- .../database/repository/ItemRepository.java | 149 ++++++-------- .../database/repository/LevelRepository.java | 40 ++-- .../repository/MaterialRepository.java | 40 ++-- .../database/repository/Repository.java | 7 +- .../repository/SessionRepository.java | 96 ++++------ .../database/repository/UserRepository.java | 66 ++----- .../repository/UsernameRepository.java | 49 ++--- 17 files changed, 424 insertions(+), 679 deletions(-) create mode 100644 common/src/main/java/com/daqem/grieflogger/database/dialect/IDatabaseDialect.java create mode 100644 common/src/main/java/com/daqem/grieflogger/database/dialect/MySQLDialect.java create mode 100644 common/src/main/java/com/daqem/grieflogger/database/dialect/SQLiteDialect.java diff --git a/common/src/main/java/com/daqem/grieflogger/database/Database.java b/common/src/main/java/com/daqem/grieflogger/database/Database.java index 309f99c..225f838 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/Database.java +++ b/common/src/main/java/com/daqem/grieflogger/database/Database.java @@ -1,15 +1,23 @@ package com.daqem.grieflogger.database; +import java.nio.file.Path; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; + +import org.jetbrains.annotations.Nullable; + import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.GriefLoggerExpectPlatform; import com.daqem.grieflogger.config.GriefLoggerConfig; +import com.daqem.grieflogger.database.dialect.IDatabaseDialect; +import com.daqem.grieflogger.database.dialect.MySQLDialect; +import com.daqem.grieflogger.database.dialect.SQLiteDialect; import com.daqem.grieflogger.database.queue.IQueue; import com.daqem.grieflogger.database.queue.Queue; -import org.jetbrains.annotations.Nullable; - -import java.nio.file.Path; -import java.sql.*; -import java.util.List; public class Database { @@ -19,6 +27,7 @@ public class Database { private Statement statement; public final IQueue queue; public final IQueue batchQueue; + private IDatabaseDialect dialect; public Database() { queue = new Queue(this, false); @@ -29,8 +38,10 @@ public boolean createConnection() { boolean connected; if (GriefLoggerConfig.useMysql.get()) { connected = createMysqlConnection(); + dialect = new MySQLDialect(); } else { connected = createSqliteConnection(); + dialect = new SQLiteDialect(); } if (connection != null) { GriefLogger.LOGGER.info("Connected to database"); @@ -156,4 +167,8 @@ public void executeStatements(List statements, boolean isBatc GriefLogger.LOGGER.error("Failed to execute statements", e); } } + + public IDatabaseDialect getDialect() { + return dialect; + } } diff --git a/common/src/main/java/com/daqem/grieflogger/database/dialect/IDatabaseDialect.java b/common/src/main/java/com/daqem/grieflogger/database/dialect/IDatabaseDialect.java new file mode 100644 index 0000000..8470bed --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/database/dialect/IDatabaseDialect.java @@ -0,0 +1,12 @@ +package com.daqem.grieflogger.database.dialect; + +public interface IDatabaseDialect { + + String getInsertIgnore(); + + String getOnConflictUpdate(String key, String update); + + String getOnConflictDoNothing(String key); + + String getDataType(String type); +} diff --git a/common/src/main/java/com/daqem/grieflogger/database/dialect/MySQLDialect.java b/common/src/main/java/com/daqem/grieflogger/database/dialect/MySQLDialect.java new file mode 100644 index 0000000..4a557cd --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/database/dialect/MySQLDialect.java @@ -0,0 +1,30 @@ +package com.daqem.grieflogger.database.dialect; + +public class MySQLDialect implements IDatabaseDialect { + + @Override + public String getInsertIgnore() { + return "INSERT IGNORE"; + } + + @Override + public String getOnConflictUpdate(String key, String update) { + return "ON DUPLICATE KEY UPDATE " + update; + } + + @Override + public String getOnConflictDoNothing(String key) { + return "ON DUPLICATE KEY UPDATE " + key + " = " + key; + } + + @Override + public String getDataType(String type) { + return switch (type) { + case "integer" -> "int"; + case "bigint" -> "bigint"; + case "text" -> "text"; + case "varchar" -> "varchar"; + default -> type; + }; + } +} diff --git a/common/src/main/java/com/daqem/grieflogger/database/dialect/SQLiteDialect.java b/common/src/main/java/com/daqem/grieflogger/database/dialect/SQLiteDialect.java new file mode 100644 index 0000000..af11162 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/database/dialect/SQLiteDialect.java @@ -0,0 +1,30 @@ +package com.daqem.grieflogger.database.dialect; + +public class SQLiteDialect implements IDatabaseDialect { + + @Override + public String getInsertIgnore() { + return "INSERT OR IGNORE"; + } + + @Override + public String getOnConflictUpdate(String key, String update) { + return "ON CONFLICT(" + key + ") DO UPDATE SET " + update; + } + + @Override + public String getOnConflictDoNothing(String key) { + return "ON CONFLICT(" + key + ") DO NOTHING"; + } + + @Override + public String getDataType(String type) { + return switch (type) { + case "integer" -> "integer"; + case "bigint" -> "integer"; + case "text" -> "text"; + case "varchar" -> "text"; + default -> type; + }; + } +} diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java index cfa6f13..59bc795 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java @@ -1,12 +1,5 @@ package com.daqem.grieflogger.database.repository; -import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.command.filter.FilterList; -import com.daqem.grieflogger.database.Database; -import com.daqem.grieflogger.model.history.BlockHistory; -import com.daqem.grieflogger.model.history.IHistory; -import org.jetbrains.annotations.Nullable; - import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -14,6 +7,14 @@ import java.util.ArrayList; import java.util.List; +import org.jetbrains.annotations.Nullable; + +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.command.filter.FilterList; +import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.model.history.BlockHistory; +import com.daqem.grieflogger.model.history.IHistory; + public class BlockRepository extends Repository { private final Database database; @@ -23,90 +24,48 @@ public BlockRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS blocks ( - time integer NOT NULL, - user integer NOT NULL, - level integer NOT NULL, - x integer NOT NULL, - y integer NOT NULL, - z integer NOT NULL, - type integer NOT NULL, - action integer NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id), - FOREIGN KEY(type) REFERENCES materials(id) - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS blocks ( - time bigint NOT NULL, - user int NOT NULL, - level int NOT NULL, - x int NOT NULL, - y int NOT NULL, - z int NOT NULL, - type int NOT NULL, - action int NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id), - FOREIGN KEY(type) REFERENCES materials(id) - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS blocks (" + + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + + "user " + database.getDialect().getDataType("integer") + " NOT NULL," + + "level " + database.getDialect().getDataType("integer") + " NOT NULL," + + "x " + database.getDialect().getDataType("integer") + " NOT NULL," + + "y " + database.getDialect().getDataType("integer") + " NOT NULL," + + "z " + database.getDialect().getDataType("integer") + " NOT NULL," + + "type " + database.getDialect().getDataType("integer") + " NOT NULL," + + "action " + database.getDialect().getDataType("integer") + " NOT NULL," + + "FOREIGN KEY(user) REFERENCES users(id)," + + "FOREIGN KEY(level) REFERENCES levels(id)," + + "FOREIGN KEY(type) REFERENCES materials(id)" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void createIndexes() { - String sql = """ - CREATE INDEX IF NOT EXISTS coordinates ON blocks (x, y, z); - """; - if (isMysql()) { - sql = """ - ALTER TABLE blocks ADD INDEX coordinates (x, y, z); - """; + String sql; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql = "ALTER TABLE blocks ADD INDEX coordinates (x, y, z);"; + } else { + sql = "CREATE INDEX IF NOT EXISTS coordinates ON blocks (x, y, z);"; } database.execute(sql, false); } public void insertMaterial(long time, String userUuid, String levelName, int x, int y, int z, String material, int blockAction) { - String materialQuery = """ - INSERT OR IGNORE INTO materials(name) - VALUES(?); - """; - - if (isMysql()) { - materialQuery = """ - INSERT IGNORE INTO materials(name) - VALUES(?); - """; - } + String materialQuery = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; - String blockQuery = """ - INSERT OR IGNORE INTO blocks(time, user, level, x, y, z, type, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ( - SELECT id FROM materials WHERE name = ? - ), ?); - """; - - if (isMysql()) { - blockQuery = """ - INSERT IGNORE INTO blocks(time, user, level, x, y, z, type, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ( - SELECT id FROM materials WHERE name = ? - ), ?); - """; - } + String blockQuery = database.getDialect().getInsertIgnore() + " INTO blocks(time, user, level, x, y, z, type, action) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, (" + + "SELECT id FROM materials WHERE name = ?" + + "), ?);"; try { PreparedStatement materialStatement = database.prepareStatement(materialQuery); @@ -129,41 +88,16 @@ INSERT IGNORE INTO blocks(time, user, level, x, y, z, type, action) } public void insertEntity(long time, String userUuid, String levelName, int x, int y, int z, String entity, int blockAction) { - String materialQuery = """ - INSERT OR IGNORE INTO entities(name) - VALUES(?); - """; - - if (isMysql()) { - materialQuery = """ - INSERT IGNORE INTO entities(name) - VALUES(?); - """; - } - - String blockQuery = """ - INSERT OR IGNORE INTO blocks(time, user, level, x, y, z, type, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ( - SELECT id FROM entities WHERE name = ? - ), ?); - """; - - if (isMysql()) { - blockQuery = """ - INSERT IGNORE INTO blocks(time, user, level, x, y, z, type, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ( - SELECT id FROM entities WHERE name = ? - ), ?); - """; - } + String materialQuery = database.getDialect().getInsertIgnore() + " INTO entities(name) VALUES(?);"; + + String blockQuery = database.getDialect().getInsertIgnore() + " INTO blocks(time, user, level, x, y, z, type, action) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, (" + + "SELECT id FROM entities WHERE name = ?" + + "), ?);"; try { diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ChatRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ChatRepository.java index 2915cd5..b54865a 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ChatRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ChatRepository.java @@ -1,11 +1,11 @@ package com.daqem.grieflogger.database.repository; -import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.database.Database; - import java.sql.PreparedStatement; import java.sql.SQLException; +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.database.Database; + public class ChatRepository extends Repository { private final Database database; @@ -15,70 +15,42 @@ public ChatRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS chats ( - time integer NOT NULL, - user integer NOT NULL, - level integer NOT NULL, - x integer NOT NULL, - y integer NOT NULL, - z integer NOT NULL, - message text NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id) - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS chats ( - time bigint NOT NULL, - user int NOT NULL, - level int NOT NULL, - x int NOT NULL, - y int NOT NULL, - z int NOT NULL, - message varchar(256) NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id) - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS chats (" + + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + + "user " + database.getDialect().getDataType("integer") + " NOT NULL," + + "level " + database.getDialect().getDataType("integer") + " NOT NULL," + + "x " + database.getDialect().getDataType("integer") + " NOT NULL," + + "y " + database.getDialect().getDataType("integer") + " NOT NULL," + + "z " + database.getDialect().getDataType("integer") + " NOT NULL," + + "message " + database.getDialect().getDataType("varchar") + "(256) NOT NULL," + + "FOREIGN KEY(user) REFERENCES users(id)," + + "FOREIGN KEY(level) REFERENCES levels(id)" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void createIndexes() { - String sql = """ - CREATE INDEX IF NOT EXISTS coordinates ON chats (x, y, z); - """; - if (isMysql()) { - sql = """ - ALTER TABLE chats ADD INDEX coordinates (x, y, z); - """; + String sql; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql = "ALTER TABLE chats ADD INDEX coordinates (x, y, z);"; + } else { + sql = "CREATE INDEX IF NOT EXISTS coordinates ON chats (x, y, z);"; } database.execute(sql, false); } public void insert(long time, String userUuid, String levelName, int x, int y, int z, String message) { - String query = """ - INSERT OR IGNORE INTO chats(time, user, level, x, y, z, message) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ?); - """; - - if (isMysql()) { - query = """ - INSERT IGNORE INTO chats(time, user, level, x, y, z, message) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ?); - """; - } + String query = database.getDialect().getInsertIgnore() + " INTO chats(time, user, level, x, y, z, message) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, ?);"; try { PreparedStatement preparedStatement = database.prepareStatement(query); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/CommandRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/CommandRepository.java index 1691ee1..faebdf9 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/CommandRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/CommandRepository.java @@ -1,11 +1,11 @@ package com.daqem.grieflogger.database.repository; -import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.database.Database; - import java.sql.PreparedStatement; import java.sql.SQLException; +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.database.Database; + public class CommandRepository extends Repository { private final Database database; @@ -15,70 +15,42 @@ public CommandRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS commands ( - time integer NOT NULL, - user integer NOT NULL, - level integer NOT NULL, - x integer NOT NULL, - y integer NOT NULL, - z integer NOT NULL, - command text NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id) - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS commands ( - time bigint NOT NULL, - user int NOT NULL, - level int NOT NULL, - x int NOT NULL, - y int NOT NULL, - z int NOT NULL, - command varchar(256) NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id) - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS commands (" + + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + + "user " + database.getDialect().getDataType("integer") + " NOT NULL," + + "level " + database.getDialect().getDataType("integer") + " NOT NULL," + + "x " + database.getDialect().getDataType("integer") + " NOT NULL," + + "y " + database.getDialect().getDataType("integer") + " NOT NULL," + + "z " + database.getDialect().getDataType("integer") + " NOT NULL," + + "command " + database.getDialect().getDataType("varchar") + "(256) NOT NULL," + + "FOREIGN KEY(user) REFERENCES users(id)," + + "FOREIGN KEY(level) REFERENCES levels(id)" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void createIndexes() { - String sql = """ - CREATE INDEX IF NOT EXISTS coordinates ON commands (x, y, z); - """; - if (isMysql()) { - sql = """ - ALTER TABLE commands ADD INDEX coordinates (x, y, z); - """; + String sql; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql = "ALTER TABLE commands ADD INDEX coordinates (x, y, z);"; + } else { + sql = "CREATE INDEX IF NOT EXISTS coordinates ON commands (x, y, z);"; } database.execute(sql, false); } public void insert(long time, String userUuid, String levelName, int x, int y, int z, String command) { - String query = """ - INSERT OR IGNORE INTO commands(time, user, level, x, y, z, command) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ?); - """; - - if (isMysql()) { - query = """ - INSERT IGNORE INTO commands(time, user, level, x, y, z, command) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ?); - """; - } + String query = database.getDialect().getInsertIgnore() + " INTO commands(time, user, level, x, y, z, command) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, ?);"; try { PreparedStatement preparedStatement = database.prepareStatement(query); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java index 47a6cfe..d5f1961 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java @@ -1,27 +1,29 @@ package com.daqem.grieflogger.database.repository; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.jetbrains.annotations.Nullable; + import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.command.filter.FilterList; -import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.ContainerHistory; import com.daqem.grieflogger.model.history.IHistory; + import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; public class ContainerRepository extends Repository { @@ -32,54 +34,35 @@ public ContainerRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS containers ( - time integer NOT NULL, - user integer NOT NULL, - level integer NOT NULL, - x integer NOT NULL, - y integer NOT NULL, - z integer NOT NULL, - type integer NOT NULL, - data blob DEFAULT NULL, - amount integer NOT NULL, - action integer NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id), - FOREIGN KEY(type) REFERENCES materials(id) - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS containers ( - time bigint NOT NULL, - user int NOT NULL, - level int NOT NULL, - x int NOT NULL, - y int NOT NULL, - z int NOT NULL, - type int NOT NULL, - data blob DEFAULT NULL, - amount int NOT NULL, - action int NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id), - FOREIGN KEY(type) REFERENCES materials(id) - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS containers (" + + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + + "user " + database.getDialect().getDataType("integer") + " NOT NULL," + + "level " + database.getDialect().getDataType("integer") + " NOT NULL," + + "x " + database.getDialect().getDataType("integer") + " NOT NULL," + + "y " + database.getDialect().getDataType("integer") + " NOT NULL," + + "z " + database.getDialect().getDataType("integer") + " NOT NULL," + + "type " + database.getDialect().getDataType("integer") + " NOT NULL," + + "data blob DEFAULT NULL," + + "amount " + database.getDialect().getDataType("integer") + " NOT NULL," + + "action " + database.getDialect().getDataType("integer") + " NOT NULL," + + "FOREIGN KEY(user) REFERENCES users(id)," + + "FOREIGN KEY(level) REFERENCES levels(id)," + + "FOREIGN KEY(type) REFERENCES materials(id)" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void createIndexes() { - String sql = """ - CREATE INDEX IF NOT EXISTS coordinates ON containers (x, y, z); - """; - if (isMysql()) { - sql = """ - ALTER TABLE containers ADD INDEX coordinates (x, y, z); - """; + String sql; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql = "ALTER TABLE containers ADD INDEX coordinates (x, y, z);"; + } else { + sql = "CREATE INDEX IF NOT EXISTS coordinates ON containers (x, y, z);"; } database.execute(sql, false); } @@ -89,28 +72,16 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, return; } - String insertMaterialQuery = """ - INSERT OR IGNORE INTO materials(name) - VALUES(?); - """; - - if (isMysql()) { - insertMaterialQuery = """ - INSERT IGNORE INTO materials(name) - VALUES(?); - """; - } + String insertMaterialQuery = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; - String insertItemQuery = """ - INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ( - SELECT id FROM materials WHERE name = ? - ), ?, ?, ?); - """; + String insertItemQuery = "INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, (" + + "SELECT id FROM materials WHERE name = ?" + + "), ?, ?, ?);"; ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { @@ -139,28 +110,16 @@ INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) } public void insertList(long time, String userUuid, Level level, int x, int y, int z, List items, int itemAction) { - String insertMaterialQuery = """ - INSERT OR IGNORE INTO materials(name) - VALUES(?); - """; + String insertMaterialQuery = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; - if (isMysql()) { - insertMaterialQuery = """ - INSERT IGNORE INTO materials(name) - VALUES(?); - """; - } - - String insertItemQuery = """ - INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ( - SELECT id FROM materials WHERE name = ? - ), ?, ?, ?); - """; + String insertItemQuery = "INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, (" + + "SELECT id FROM materials WHERE name = ?" + + "), ?, ?, ?);"; try { PreparedStatement itemStatement = database.prepareStatement(insertItemQuery); @@ -196,28 +155,16 @@ INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) } public void insertMap(long time, String userUuid, Level level, int x, int y, int z, Map> itemsMap) { - String insertMaterialQuery = """ - INSERT OR IGNORE INTO materials(name) - VALUES(?); - """; - - if (isMysql()) { - insertMaterialQuery = """ - INSERT IGNORE INTO materials(name) - VALUES(?); - """; - } - - String insertItemQuery = """ - INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ( - SELECT id FROM materials WHERE name = ? - ), ?, ?, ?); - """; + String insertMaterialQuery = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; + + String insertItemQuery = "INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, (" + + "SELECT id FROM materials WHERE name = ?" + + "), ?, ?, ?);"; try { PreparedStatement itemStatement = database.prepareStatement(insertItemQuery); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/EntityRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/EntityRepository.java index a66b31d..3833d5f 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/EntityRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/EntityRepository.java @@ -1,11 +1,11 @@ package com.daqem.grieflogger.database.repository; -import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.database.Database; - import java.sql.PreparedStatement; import java.sql.SQLException; +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.database.Database; + public class EntityRepository extends Repository { private final Database database; @@ -15,36 +15,20 @@ public EntityRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS entities ( - id integer PRIMARY KEY, - name text NOT NULL UNIQUE - ) - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS entities ( - id int PRIMARY KEY AUTO_INCREMENT, - name varchar(256) NOT NULL UNIQUE - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS entities (" + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "name " + database.getDialect().getDataType("text") + " NOT NULL UNIQUE" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void insert(String name) { - String query = """ - INSERT OR IGNORE INTO entities(name) - VALUES(?); - """; - - if (isMysql()) { - query = """ - INSERT IGNORE INTO entities(name) - VALUES(?); - """; - } + String query = database.getDialect().getInsertIgnore() + " INTO entities(name) VALUES(?);"; try { PreparedStatement preparedStatement = database.prepareStatement(query); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/IRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/IRepository.java index ed4460a..a071b76 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/IRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/IRepository.java @@ -4,5 +4,5 @@ public interface IRepository { void createTable(); - boolean isMysql(); + } diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java index 0e5864c..9700e49 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java @@ -1,26 +1,28 @@ package com.daqem.grieflogger.database.repository; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.jetbrains.annotations.Nullable; + import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.command.filter.FilterList; import com.daqem.grieflogger.database.Database; import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.ItemHistory; + import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; -import org.jetbrains.annotations.Nullable; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; public class ItemRepository extends Repository { @@ -31,54 +33,35 @@ public ItemRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS items ( - time integer NOT NULL, - user integer NOT NULL, - level integer NOT NULL, - x integer NOT NULL, - y integer NOT NULL, - z integer NOT NULL, - type integer NOT NULL, - data blob DEFAULT NULL, - amount integer NOT NULL, - action integer NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id), - FOREIGN KEY(type) REFERENCES materials(id) - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS items ( - time bigint NOT NULL, - user int NOT NULL, - level int NOT NULL, - x int NOT NULL, - y int NOT NULL, - z int NOT NULL, - type int NOT NULL, - data blob DEFAULT NULL, - amount int NOT NULL, - action int NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id), - FOREIGN KEY(type) REFERENCES materials(id) - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS items (" + + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + + "user " + database.getDialect().getDataType("integer") + " NOT NULL," + + "level " + database.getDialect().getDataType("integer") + " NOT NULL," + + "x " + database.getDialect().getDataType("integer") + " NOT NULL," + + "y " + database.getDialect().getDataType("integer") + " NOT NULL," + + "z " + database.getDialect().getDataType("integer") + " NOT NULL," + + "type " + database.getDialect().getDataType("integer") + " NOT NULL," + + "data blob DEFAULT NULL," + + "amount " + database.getDialect().getDataType("integer") + " NOT NULL," + + "action " + database.getDialect().getDataType("integer") + " NOT NULL," + + "FOREIGN KEY(user) REFERENCES users(id)," + + "FOREIGN KEY(level) REFERENCES levels(id)," + + "FOREIGN KEY(type) REFERENCES materials(id)" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void createIndexes() { - String sql = """ - CREATE INDEX IF NOT EXISTS coordinates ON items (x, y, z); - """; - if (isMysql()) { - sql = """ - ALTER TABLE items ADD INDEX coordinates (x, y, z); - """; + String sql; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql = "ALTER TABLE items ADD INDEX coordinates (x, y, z);"; + } else { + sql = "CREATE INDEX IF NOT EXISTS coordinates ON items (x, y, z);"; } database.execute(sql, false); } @@ -87,28 +70,16 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, if (item.isEmpty()) { return; } - String materialQuery = """ - INSERT OR IGNORE INTO materials(name) - VALUES(?); - """; - - if (isMysql()) { - materialQuery = """ - INSERT IGNORE INTO materials(name) - VALUES(?); - """; - } + String materialQuery = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; - String itemQuery = """ - INSERT INTO items(time, user, level, x, y, z, type, data, amount, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ( - SELECT id FROM materials WHERE name = ? - ), ?, ?, ?); - """; + String itemQuery = "INSERT INTO items(time, user, level, x, y, z, type, data, amount, action) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, (" + + "SELECT id FROM materials WHERE name = ?" + + "), ?, ?, ?);"; ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { @@ -137,28 +108,16 @@ INSERT INTO items(time, user, level, x, y, z, type, data, amount, action) } public void insertMap(long time, String userUuid, Level level, int x, int y, int z, Map> itemsMap) { - String insertMaterialQuery = """ - INSERT OR IGNORE INTO materials(name) - VALUES(?); - """; - - if (isMysql()) { - insertMaterialQuery = """ - INSERT IGNORE INTO materials(name) - VALUES(?); - """; - } - - String insertItemQuery = """ - INSERT INTO items(time, user, level, x, y, z, type, data, amount, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ( - SELECT id FROM materials WHERE name = ? - ), ?, ?, ?); - """; + String insertMaterialQuery = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; + + String insertItemQuery = "INSERT INTO items(time, user, level, x, y, z, type, data, amount, action) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, (" + + "SELECT id FROM materials WHERE name = ?" + + "), ?, ?, ?);"; try { PreparedStatement itemStatement = database.prepareStatement(insertItemQuery); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/LevelRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/LevelRepository.java index 9bfb1af..67c0293 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/LevelRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/LevelRepository.java @@ -1,11 +1,11 @@ package com.daqem.grieflogger.database.repository; -import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.database.Database; - import java.sql.PreparedStatement; import java.sql.SQLException; +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.database.Database; + public class LevelRepository extends Repository { private final Database database; @@ -15,36 +15,20 @@ public LevelRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS levels ( - id integer PRIMARY KEY, - name text NOT NULL UNIQUE - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS levels ( - id int PRIMARY KEY AUTO_INCREMENT, - name varchar(256) NOT NULL UNIQUE - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS levels (" + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "name " + database.getDialect().getDataType("text") + " NOT NULL UNIQUE" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void insert(String name) { - String query = """ - INSERT OR IGNORE INTO levels(name) - VALUES(?); - """; - - if (isMysql()) { - query = """ - INSERT IGNORE INTO levels(name) - VALUES(?); - """; - } + String query = database.getDialect().getInsertIgnore() + " INTO levels(name) VALUES(?);"; try { PreparedStatement preparedStatement = database.prepareStatement(query); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/MaterialRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/MaterialRepository.java index 6257a53..9ae4cc7 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/MaterialRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/MaterialRepository.java @@ -1,11 +1,11 @@ package com.daqem.grieflogger.database.repository; -import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.database.Database; - import java.sql.PreparedStatement; import java.sql.SQLException; +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.database.Database; + public class MaterialRepository extends Repository { private final Database database; @@ -15,36 +15,20 @@ public MaterialRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS materials ( - id integer PRIMARY KEY, - name text NOT NULL UNIQUE - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS materials ( - id int PRIMARY KEY AUTO_INCREMENT, - name varchar(256) NOT NULL UNIQUE - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS materials (" + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "name " + database.getDialect().getDataType("text") + " NOT NULL UNIQUE" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void insert(String material) { - String query = """ - INSERT OR IGNORE INTO materials(name) - VALUES(?); - """; - - if (isMysql()) { - query = """ - INSERT IGNORE INTO materials(name) - VALUES(?); - """; - } + String query = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; try { PreparedStatement preparedStatement = database.prepareStatement(query); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/Repository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/Repository.java index f794a06..45ea3eb 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/Repository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/Repository.java @@ -1,11 +1,6 @@ package com.daqem.grieflogger.database.repository; -import com.daqem.grieflogger.config.GriefLoggerConfig; - public abstract class Repository implements IRepository { - @Override - public boolean isMysql() { - return GriefLoggerConfig.useMysql.get(); - } + } diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java index ac07102..2527a20 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java @@ -1,14 +1,18 @@ package com.daqem.grieflogger.database.repository; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.ArrayList; +import java.util.List; + +import org.jetbrains.annotations.Nullable; + import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.command.filter.*; +import com.daqem.grieflogger.command.filter.FilterList; import com.daqem.grieflogger.database.Database; import com.daqem.grieflogger.model.history.SessionHistory; -import org.jetbrains.annotations.Nullable; - -import java.sql.*; -import java.util.ArrayList; -import java.util.List; public class SessionRepository extends Repository { @@ -19,70 +23,42 @@ public SessionRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS sessions ( - time integer NOT NULL, - user integer NOT NULL, - level integer NOT NULL, - x integer NOT NULL, - y integer NOT NULL, - z integer NOT NULL, - action integer NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id) - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS sessions ( - time bigint NOT NULL, - user int NOT NULL, - level int NOT NULL, - x int NOT NULL, - y int NOT NULL, - z int NOT NULL, - action int NOT NULL, - FOREIGN KEY(user) REFERENCES users(id), - FOREIGN KEY(level) REFERENCES levels(id) - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS sessions (" + + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + + "user " + database.getDialect().getDataType("integer") + " NOT NULL," + + "level " + database.getDialect().getDataType("integer") + " NOT NULL," + + "x " + database.getDialect().getDataType("integer") + " NOT NULL," + + "y " + database.getDialect().getDataType("integer") + " NOT NULL," + + "z " + database.getDialect().getDataType("integer") + " NOT NULL," + + "action " + database.getDialect().getDataType("integer") + " NOT NULL," + + "FOREIGN KEY(user) REFERENCES users(id)," + + "FOREIGN KEY(level) REFERENCES levels(id)" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void createIndexes() { - String sql = """ - CREATE INDEX IF NOT EXISTS coordinates ON sessions (x, y, z); - """; - if (isMysql()) { - sql = """ - ALTER TABLE sessions ADD INDEX coordinates (x, y, z); - """; + String sql; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql = "ALTER TABLE sessions ADD INDEX coordinates (x, y, z);"; + } else { + sql = "CREATE INDEX IF NOT EXISTS coordinates ON sessions (x, y, z);"; } database.execute(sql, false); } public void insert(long time, String userUuid, String levelName, int x, int y, int z, int sessionAction) { - String query = """ - INSERT OR IGNORE INTO sessions(time, user, level, x, y, z, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ?); - """; - - if (isMysql()) { - query = """ - INSERT IGNORE INTO sessions(time, user, level, x, y, z, action) - VALUES(?, ( - SELECT id FROM users WHERE uuid = ? - ), ( - SELECT id FROM levels WHERE name = ? - ), ?, ?, ?, ?); - """; - } + String query = database.getDialect().getInsertIgnore() + " INTO sessions(time, user, level, x, y, z, action) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, ?);"; try { PreparedStatement preparedStatement = database.prepareStatement(query); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java index b17992c..adf21d6 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java @@ -1,12 +1,13 @@ package com.daqem.grieflogger.database.repository; -import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.database.Database; - import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.*; +import java.util.HashMap; +import java.util.Map; + +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.database.Database; public class UserRepository extends Repository { @@ -17,41 +18,22 @@ public UserRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS users ( - id integer PRIMARY KEY, - name text NOT NULL, - uuid text DEFAULT NULL UNIQUE - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS users ( - id int PRIMARY KEY AUTO_INCREMENT, - name varchar(16) NOT NULL, - uuid varchar(36) DEFAULT NULL UNIQUE - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS users (" + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "name " + database.getDialect().getDataType("text") + " NOT NULL," + + "uuid " + database.getDialect().getDataType("text") + " DEFAULT NULL UNIQUE" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void insertOrUpdateName(String name, String uuid) { - String query = """ - INSERT INTO users(name, uuid) - VALUES(?, ?) - ON CONFLICT(uuid) - DO UPDATE SET name = ? - """; - - if (isMysql()) { - query = """ - INSERT INTO users(name, uuid) - VALUES(?, ?) - ON DUPLICATE KEY UPDATE name = ? - """; - } + String query = "INSERT INTO users(name, uuid) VALUES(?, ?) " + + database.getDialect().getOnConflictUpdate("uuid", "name = ?"); try { PreparedStatement preparedStatement = database.prepareStatement(query); @@ -65,20 +47,8 @@ INSERT INTO users(name, uuid) } public void insertNonPlayer(String name) { - String query = """ - INSERT INTO users(name) - VALUES('%s') - ON CONFLICT(name) - DO NOTHING - """; - - if (isMysql()) { - query = """ - INSERT INTO users(name) - VALUES('%s') - ON DUPLICATE KEY UPDATE name = name - """; - } + String query = "INSERT INTO users(name) VALUES('%s') " + + database.getDialect().getOnConflictDoNothing("name"); try { PreparedStatement preparedStatement = database.prepareStatement(query); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/UsernameRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/UsernameRepository.java index d86b72c..08119cd 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/UsernameRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/UsernameRepository.java @@ -1,11 +1,11 @@ package com.daqem.grieflogger.database.repository; -import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.database.Database; - import java.sql.PreparedStatement; import java.sql.SQLException; +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.database.Database; + public class UsernameRepository extends Repository { private final Database database; @@ -15,42 +15,23 @@ public UsernameRepository(Database database) { } public void createTable() { - String sql = """ - CREATE TABLE IF NOT EXISTS usernames ( - id integer PRIMARY KEY, - time integer NOT NULL, - uuid text NOT NULL, - name text NOT NULL, - UNIQUE(uuid, name) - ); - """; - if (isMysql()) { - sql = """ - CREATE TABLE IF NOT EXISTS usernames ( - id int PRIMARY KEY AUTO_INCREMENT, - time bigint NOT NULL, - uuid varchar(36) NOT NULL, - name varchar(16) NOT NULL, - UNIQUE(uuid, name) - ) - ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4; - """; + String sql = "CREATE TABLE IF NOT EXISTS usernames (" + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + + "uuid " + database.getDialect().getDataType("varchar") + "(36) NOT NULL," + + "name " + database.getDialect().getDataType("varchar") + "(16) NOT NULL," + + "UNIQUE(uuid, name)" + + ")"; + if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; + } else { + sql += ";"; } database.createTable(sql); } public void insert(long time, String uuid, String name) { - String query = """ - INSERT OR IGNORE INTO usernames(time, uuid, name) - VALUES(?, ?, ?); - """; - - if (isMysql()) { - query = """ - INSERT IGNORE INTO usernames(time, uuid, name) - VALUES(?, ?, ?); - """; - } + String query = database.getDialect().getInsertIgnore() + " INTO usernames(time, uuid, name) VALUES(?, ?, ?);"; try { PreparedStatement preparedStatement = database.prepareStatement(query); From 211a910bf0c9c0327bbd524f8186eedf3e2f7fe8 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 15:31:33 +0100 Subject: [PATCH 28/52] fix: lookup command action filtering --- .../grieflogger/command/LookupCommand.java | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java index 7555e7a..79cc9d4 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java @@ -5,6 +5,9 @@ import com.daqem.grieflogger.command.filter.*; import com.daqem.grieflogger.command.page.Page; import com.daqem.grieflogger.database.service.Services; +import com.daqem.grieflogger.model.action.BlockAction; +import com.daqem.grieflogger.model.action.ItemAction; +import com.daqem.grieflogger.model.action.SessionAction; import com.daqem.grieflogger.model.history.*; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import com.daqem.grieflogger.thread.ThreadManager; @@ -60,13 +63,25 @@ private static int lookup(CommandSourceStack source, FilterList filterList) { } private static List getHistory(Level level, FilterList filterList) { - List filteredSessionHistory = Services.SESSION.getFilteredSessionHistory(level, filterList); - List filteredBlockHistory = Services.BLOCK.getFilteredBlockHistory(level, filterList); - List filteredContainerHistory = Services.CONTAINER.getFilteredContainerHistory(level, filterList); - List filteredItemHistory = Services.ITEM.getFilteredItemHistory(level, filterList); - return new ArrayList<>(List.of(filteredSessionHistory, filteredBlockHistory, filteredContainerHistory, filteredItemHistory)) - .stream() - .flatMap(List::stream) + List history = new ArrayList<>(); + + if (filterList.getActionFilter().isPresent()) { + ActionFilter actionFilter = filterList.getActionFilter().orElseThrow(); + if (actionFilter.getActions().stream().anyMatch(action -> action instanceof BlockAction)) { + history.addAll(Services.BLOCK.getFilteredBlockHistory(level, filterList)); + } + if (actionFilter.getActions().stream().anyMatch(action -> action instanceof SessionAction)) { + history.addAll(Services.SESSION.getFilteredSessionHistory(level, filterList)); + } + if (actionFilter.getActions().stream().anyMatch(action -> action.equals(ItemAction.ADD_ITEM) || action.equals(ItemAction.REMOVE_ITEM))) { + history.addAll(Services.CONTAINER.getFilteredContainerHistory(level, filterList)); + } + if (actionFilter.getActions().stream().anyMatch(action -> action instanceof ItemAction && !action.equals(ItemAction.ADD_ITEM) && !action.equals(ItemAction.REMOVE_ITEM))) { + history.addAll(Services.ITEM.getFilteredItemHistory(level, filterList)); + } + } + + return history.stream() .sorted((x, y) -> Long.compare(y.getTime().time(), x.getTime().time())) .collect(Collectors.toList()); } From 885ab12786fd34d5230dfc092f20cc73fe83c511 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 16:41:45 +0100 Subject: [PATCH 29/52] feat: server side translation --- .../com/daqem/grieflogger/GriefLogger.java | 115 +++++++++++++----- .../grieflogger/command/LookupCommand.java | 7 +- .../command/filter/ActionFilter.java | 2 +- .../command/filter/ExcludeFilter.java | 2 +- .../command/filter/IncludeFilter.java | 2 +- .../command/filter/RadiusFilter.java | 2 +- .../command/filter/TimeFilter.java | 2 +- .../command/filter/UserFilter.java | 2 +- .../grieflogger/config/GriefLoggerConfig.java | 8 +- .../grieflogger/event/ServerStartedEvent.java | 12 ++ .../grieflogger/i18n/LanguageManager.java | 60 +++++++++ .../model/history/ItemHistory.java | 5 +- .../assets/grieflogger/lang/nl_nl.json | 67 ++++++++++ 13 files changed, 240 insertions(+), 46 deletions(-) create mode 100644 common/src/main/java/com/daqem/grieflogger/event/ServerStartedEvent.java create mode 100644 common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java create mode 100644 common/src/main/resources/assets/grieflogger/lang/nl_nl.json diff --git a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java index 6f0b4f8..b6d3fbf 100644 --- a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java +++ b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java @@ -1,18 +1,34 @@ package com.daqem.grieflogger; +import org.slf4j.Logger; + import com.daqem.grieflogger.config.GriefLoggerConfig; import com.daqem.grieflogger.database.Database; -import com.daqem.grieflogger.database.service.*; -import com.daqem.grieflogger.event.*; +import com.daqem.grieflogger.database.service.Services; +import com.daqem.grieflogger.event.ChatEvent; +import com.daqem.grieflogger.event.CommandEvent; +import com.daqem.grieflogger.event.EntityEvents; +import com.daqem.grieflogger.event.LevelLoadEvent; +import com.daqem.grieflogger.event.PlayerJoinEvent; +import com.daqem.grieflogger.event.PlayerQuitEvent; +import com.daqem.grieflogger.event.RegisterCommandEvent; +import com.daqem.grieflogger.event.ServerStartedEvent; +import com.daqem.grieflogger.event.TickEvents; import com.daqem.grieflogger.event.block.BlockEvents; import com.daqem.grieflogger.event.item.ItemEvents; +import com.daqem.grieflogger.i18n.LanguageManager; import com.mojang.logging.LogUtils; + import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.network.chat.contents.TranslatableContents; import net.minecraft.resources.ResourceLocation; -import org.slf4j.Logger; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class GriefLogger { public static final String MOD_ID = "grieflogger"; @@ -45,6 +61,7 @@ private static void registerEvents() { ChatEvent.registerEvent(); CommandEvent.registerEvent(); + ServerStartedEvent.registerEvent(); } private static boolean prepareDatabase() { @@ -93,19 +110,69 @@ public static Database getDatabase() { } public static MutableComponent translate(String str) { - MutableComponent component = translate(str, TranslatableContents.NO_ARGS); - if (GriefLoggerConfig.serverSideOnlyMode.get()) { - component = Component.literal(component.getString()).withStyle(component.getStyle()); - } - return component; + return translate(str, TranslatableContents.NO_ARGS); } public static MutableComponent translate(String str, Object... args) { - MutableComponent component = Component.translatable(MOD_ID + "." + str, args); - if (GriefLoggerConfig.serverSideOnlyMode.get()) { - component = Component.literal(component.getString()).withStyle(component.getStyle()); + String translated = LanguageManager.getString(MOD_ID + "." + str); + try { + if (args.length == 0) { + return Component.literal(translated); + } + + boolean hasComponentArg = false; + for (Object arg : args) { + if (arg instanceof Component) { + hasComponentArg = true; + break; + } + } + + if (!hasComponentArg) { + return Component.literal(String.format(translated, args)); + } + + Object[] newArgs = new Object[args.length]; + Map componentMap = new HashMap<>(); + + for (int i = 0; i < args.length; i++) { + if (args[i] instanceof Component component) { + String marker = "§_GL_COMP_" + i + "_§"; + componentMap.put(marker, component); + newArgs[i] = marker; + } else { + newArgs[i] = args[i]; + } + } + + String formatted = String.format(translated, newArgs); + MutableComponent root = Component.literal(""); + Matcher matcher = Pattern.compile("§_GL_COMP_(\\d+)_§").matcher(formatted); + int lastEnd = 0; + + while (matcher.find()) { + String textBefore = formatted.substring(lastEnd, matcher.start()); + if (!textBefore.isEmpty()) { + root.append(Component.literal(textBefore)); + } + String marker = matcher.group(); + Component component = componentMap.get(marker); + if (component != null) { + root.append(component); + } + lastEnd = matcher.end(); + } + + String textAfter = formatted.substring(lastEnd); + if (!textAfter.isEmpty()) { + root.append(Component.literal(textAfter)); + } + + return root; + + } catch (Exception e) { + return Component.literal(translated); } - return component; } public static MutableComponent literal(String str) { @@ -113,35 +180,19 @@ public static MutableComponent literal(String str) { } public static MutableComponent themedTranslate(String str) { - MutableComponent component = themedTranslate(str, TranslatableContents.NO_ARGS); - if (GriefLoggerConfig.serverSideOnlyMode.get()) { - component = Component.literal(component.getString()).withStyle(component.getStyle()); - } - return component; + return themedTranslate(str, TranslatableContents.NO_ARGS); } public static MutableComponent themedTranslate(String str, Object... args) { - MutableComponent component = Component.translatable(MOD_ID + "." + str, args).withStyle(getTheme()); - if (GriefLoggerConfig.serverSideOnlyMode.get()) { - component = Component.literal(component.getString()).withStyle(component.getStyle()); - } - return component; + return translate(str, args).withStyle(getTheme()); } public static MutableComponent themedLiteral(String str) { - MutableComponent component = Component.literal(str).withStyle(getTheme()); - if (GriefLoggerConfig.serverSideOnlyMode.get()) { - component = Component.literal(component.getString()).withStyle(component.getStyle()); - } - return component; + return Component.literal(str).withStyle(getTheme()); } public static Component getName() { - Component component = translate("name").withStyle(getTheme()); - if (GriefLoggerConfig.serverSideOnlyMode.get()) { - component = Component.literal(component.getString()).withStyle(component.getStyle()); - } - return component; + return translate("name").withStyle(getTheme()); } public static Style getTheme() { diff --git a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java index 79cc9d4..a36f0ec 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java @@ -55,7 +55,7 @@ private static int lookup(CommandSourceStack source, FilterList filterList) { } List pages = Page.convertToPages(filteredHistory, false); player.grieflogger$setPages(pages); - Page pageToDisplay = pages.get(0); + Page pageToDisplay = pages.getFirst(); pageToDisplay.sendToPlayer((ServerPlayer) player); }); } @@ -79,6 +79,11 @@ private static List getHistory(Level level, FilterList filterList) { if (actionFilter.getActions().stream().anyMatch(action -> action instanceof ItemAction && !action.equals(ItemAction.ADD_ITEM) && !action.equals(ItemAction.REMOVE_ITEM))) { history.addAll(Services.ITEM.getFilteredItemHistory(level, filterList)); } + } else { + history.addAll(Services.BLOCK.getFilteredBlockHistory(level, filterList)); + history.addAll(Services.SESSION.getFilteredSessionHistory(level, filterList)); + history.addAll(Services.CONTAINER.getFilteredContainerHistory(level, filterList)); + history.addAll(Services.ITEM.getFilteredItemHistory(level, filterList)); } return history.stream() diff --git a/common/src/main/java/com/daqem/grieflogger/command/filter/ActionFilter.java b/common/src/main/java/com/daqem/grieflogger/command/filter/ActionFilter.java index b854a47..6007cac 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/filter/ActionFilter.java +++ b/common/src/main/java/com/daqem/grieflogger/command/filter/ActionFilter.java @@ -24,7 +24,7 @@ public ActionFilter(List actions) { @Override public String getName() { - return GriefLogger.translate("filter.action").getString(); + return "action"; } @Override diff --git a/common/src/main/java/com/daqem/grieflogger/command/filter/ExcludeFilter.java b/common/src/main/java/com/daqem/grieflogger/command/filter/ExcludeFilter.java index 5650cdc..5237513 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/filter/ExcludeFilter.java +++ b/common/src/main/java/com/daqem/grieflogger/command/filter/ExcludeFilter.java @@ -21,7 +21,7 @@ public ExcludeFilter(List items) { @Override public String getName() { - return GriefLogger.translate("filter.exclude").getString(); + return "exclude"; } @Override diff --git a/common/src/main/java/com/daqem/grieflogger/command/filter/IncludeFilter.java b/common/src/main/java/com/daqem/grieflogger/command/filter/IncludeFilter.java index 578274e..f59a2d9 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/filter/IncludeFilter.java +++ b/common/src/main/java/com/daqem/grieflogger/command/filter/IncludeFilter.java @@ -24,7 +24,7 @@ public IncludeFilter(List items) { @Override public String getName() { - return GriefLogger.translate("filter.include").getString(); + return "include"; } @Override diff --git a/common/src/main/java/com/daqem/grieflogger/command/filter/RadiusFilter.java b/common/src/main/java/com/daqem/grieflogger/command/filter/RadiusFilter.java index 6c9503d..f8ea60f 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/filter/RadiusFilter.java +++ b/common/src/main/java/com/daqem/grieflogger/command/filter/RadiusFilter.java @@ -25,7 +25,7 @@ public RadiusFilter(int radius) { @Override public String getName() { - return GriefLogger.translate("filter.radius").getString(); + return "radius"; } @Override diff --git a/common/src/main/java/com/daqem/grieflogger/command/filter/TimeFilter.java b/common/src/main/java/com/daqem/grieflogger/command/filter/TimeFilter.java index cb3b127..73f039b 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/filter/TimeFilter.java +++ b/common/src/main/java/com/daqem/grieflogger/command/filter/TimeFilter.java @@ -23,7 +23,7 @@ public TimeFilter(long time, TimeUnit timeUnit) { @Override public String getName() { - return GriefLogger.translate("filter.time").getString(); + return "time"; } @Override diff --git a/common/src/main/java/com/daqem/grieflogger/command/filter/UserFilter.java b/common/src/main/java/com/daqem/grieflogger/command/filter/UserFilter.java index 4b18849..8db8a99 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/filter/UserFilter.java +++ b/common/src/main/java/com/daqem/grieflogger/command/filter/UserFilter.java @@ -26,7 +26,7 @@ public UserFilter(Map usernames) { @Override public String getName() { - return GriefLogger.translate("filter.user").getString(); + return "user"; } @Override diff --git a/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java b/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java index 8bba2c1..0f0aba4 100644 --- a/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java +++ b/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java @@ -7,6 +7,8 @@ import com.daqem.yamlconfig.api.config.entry.IConfigEntry; import com.daqem.yamlconfig.impl.config.ConfigBuilder; +import java.util.List; + public class GriefLoggerConfig { public static void init() { @@ -23,7 +25,7 @@ public static void init() { public static final IConfigEntry maxPageSize; - public static final IConfigEntry serverSideOnlyMode; + public static final IConfigEntry language; public static final IConfigEntry queueFrequency; public static final IConfigEntry helloFrequency; @@ -62,8 +64,8 @@ public static void init() { config.pop(); config.push("server"); - serverSideOnlyMode = config.defineBoolean("serverSideOnlyMode", true) - .withComments("Whether to run the mod in server side only mode"); + language = config.defineString("language", "en_us", 1, 10, List.of("en_us", "nl_nl", "zh_tw")) + .withComments("The language to use for translations (en_us, nl_nl, zh_tw)"); config.pop(); config.push("queue"); diff --git a/common/src/main/java/com/daqem/grieflogger/event/ServerStartedEvent.java b/common/src/main/java/com/daqem/grieflogger/event/ServerStartedEvent.java new file mode 100644 index 0000000..2d7a185 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/event/ServerStartedEvent.java @@ -0,0 +1,12 @@ +package com.daqem.grieflogger.event; + +import com.daqem.grieflogger.i18n.LanguageManager; + +import dev.architectury.event.events.common.LifecycleEvent; + +public class ServerStartedEvent { + + public static void registerEvent() { + LifecycleEvent.SERVER_STARTED.register(server -> LanguageManager.load()); + } +} diff --git a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java new file mode 100644 index 0000000..0b0e3cb --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java @@ -0,0 +1,60 @@ +package com.daqem.grieflogger.i18n; + +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.config.GriefLoggerConfig; +import com.google.gson.Gson; +import com.google.gson.JsonObject; + +import dev.architectury.platform.Mod; +import dev.architectury.platform.Platform; + +public class LanguageManager { + + private static final Map TRANSLATIONS = new HashMap<>(); + private static final Gson GSON = new Gson(); + + public static void load() { + TRANSLATIONS.clear(); + String language = GriefLoggerConfig.language.get(); + + for (Mod mod : Platform.getMods()) { + String modId = mod.getModId(); + loadFromMod(modId, language); + if (!language.equals("en_us")) { + loadFromMod(modId, "en_us"); + } + } + } + + private static void loadFromMod(String modId, String language) { + String pathStr = "assets/" + modId + "/lang/" + language + ".json"; + try (InputStream inputStream = GriefLogger.class.getClassLoader().getResourceAsStream(pathStr)) { + if (inputStream != null) { + try { + JsonObject jsonObject = GSON.fromJson(new InputStreamReader(inputStream, StandardCharsets.UTF_8), JsonObject.class); + jsonObject.entrySet().forEach(entry -> { + if (language.equals("en_us")) { + TRANSLATIONS.putIfAbsent(entry.getKey(), entry.getValue().getAsString()); + } else { + TRANSLATIONS.put(entry.getKey(), entry.getValue().getAsString()); + } + }); + } catch (Exception e) { + GriefLogger.LOGGER.error("Failed to parse language file: {}", pathStr, e); + } + } + } catch (Exception e) { + // Ignore if file not found, it's expected for many mods + } + } + + public static String getString(String key) { + return TRANSLATIONS.getOrDefault(key, key); + } +} diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java index eb25ff4..e307252 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java @@ -44,14 +44,11 @@ public Component getComponent() { @Override public Component getMaterialComponent() { - int cappedCount = Math.min(itemStack.getCount(), 64); // It appears that the HoverEven.ItemStackInfo does not display the count at all either way. - var cappedItemStack = itemStack.toItemStack().copyWithCount(cappedCount); - MutableComponent mutableComponent = GriefLogger.themedLiteral(this.itemStack.getItem().arch$registryName().toString().replace("minecraft:", "")); return mutableComponent .withStyle(mutableComponent .getStyle() - .withHoverEvent(new HoverEvent.ShowItem(cappedItemStack))); + .withHoverEvent(new HoverEvent.ShowItem(itemStack.toItemStack().copyWithCount(1)))); } } diff --git a/common/src/main/resources/assets/grieflogger/lang/nl_nl.json b/common/src/main/resources/assets/grieflogger/lang/nl_nl.json new file mode 100644 index 0000000..39dc4f8 --- /dev/null +++ b/common/src/main/resources/assets/grieflogger/lang/nl_nl.json @@ -0,0 +1,67 @@ +{ + "grieflogger.name": "GriefLogger", + "grieflogger.commands.inspect.enabled": "%s - Inspectie ingeschakeld.", + "grieflogger.commands.inspect.disabled": "%s - Inspectie uitgeschakeld.", + "grieflogger.action.prefix.remove": "-", + "grieflogger.action.prefix.add": "+", + "grieflogger.action.prefix.neutral": "-", + "grieflogger.action.break_block.past": "brak", + "grieflogger.action.place_block.past": "plaatste", + "grieflogger.action.interact_block.past": "klikte op", + "grieflogger.action.kill_entity.past": "doodde", + "grieflogger.action.add_item.past": "voegde toe", + "grieflogger.action.remove_item.past": "verwijderde", + "grieflogger.action.drop_item.past": "liet vallen", + "grieflogger.action.pickup_item.past": "raapte op", + "grieflogger.action.craft_item.past": "maakte", + "grieflogger.action.break_item.past": "brak", + "grieflogger.action.consume_item.past": "consumeerde", + "grieflogger.action.throw_item.past": "gooide", + "grieflogger.action.shoot_item.past": "schoot", + "grieflogger.action.add_item_ender.past": "stopte in enderkist", + "grieflogger.action.remove_item_ender.past": "haalde uit enderkist", + "grieflogger.action.join.past": "verbond", + "grieflogger.action.quit.past": "verliet", + "grieflogger.time.minutes": "m", + "grieflogger.time.hours": "u", + "grieflogger.time.days": "d", + "grieflogger.time.years": "j", + "grieflogger.time.divider": "/", + "grieflogger.lookup.position": "(x%s/y%s/z%s)", + "grieflogger.lookup.time.ago": "%s%s%s geleden", + "grieflogger.lookup.no_history": "%s - Geen geschiedenis gevonden voor deze locatie.", + "grieflogger.lookup.block.history_entry": "%s %s %s %s %s.", + "grieflogger.lookup.container.history_entry": "%s %s %s %s x%s %s.", + "grieflogger.lookup.session.history_entry": "%s %s %s %s.", + "grieflogger.lookup.history_title": "GriefLogger Inspectie", + "grieflogger.lookup.history_header": "----- %s ------", + "grieflogger.lookup.page": "Pagina", + "grieflogger.lookup.pages": " %s/%s", + "grieflogger.lookup.invalid_page": "%s - Ongeldig paginanummer.", + "grieflogger.lookup.no_results": "%s - Geen resultaten gevonden.", + "grieflogger.filter.action": "actie", + "grieflogger.filter.exclude": "uitsluiten", + "grieflogger.filter.include": "insluiten", + "grieflogger.filter.radius": "straal", + "grieflogger.filter.time": "tijd", + "grieflogger.filter.user": "gebruiker", + "yamlconfig.grieflogger": "GriefLogger", + "yamlconfig.grieflogger.grieflogger-server": "Serverconfiguratie", + "yamlconfig.grieflogger.grieflogger-server.general": "Algemeen", + "yamlconfig.grieflogger.grieflogger-server.general.maxPageSize": "Maximale Paginagrootte", + "yamlconfig.grieflogger.grieflogger-server.server": "Server", + "yamlconfig.grieflogger.grieflogger-server.server.serverSideOnlyMode": "Alleen Server-side Modus", + "yamlconfig.grieflogger.grieflogger-server.database": "Database", + "yamlconfig.grieflogger.grieflogger-server.database.useMysql": "Gebruik MySQL", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlHost": "MySQL Host", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlPort": "MySQL Poort", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlDatabase": "MySQL Database", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlUsername": "MySQL Gebruikersnaam", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlPassword": "MySQL Wachtwoord", + "yamlconfig.grieflogger.grieflogger-server.database.mysqlTimeout": "MySQL Time-out", + "yamlconfig.grieflogger.grieflogger-server.database.useIndexes": "Gebruik Indexen", + "yamlconfig.grieflogger.grieflogger-server.hello": "Hallo", + "yamlconfig.grieflogger.grieflogger-server.hello.helloFrequency": "Hallo Frequentie", + "yamlconfig.grieflogger.grieflogger-server.queue": "Wachtrij", + "yamlconfig.grieflogger.grieflogger-server.queue.queueFrequency": "Wachtrij Frequentie" +} \ No newline at end of file From 4dc6c7fd7ec51870a713913e2eec9373ae3d69bb Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 19:35:56 +0100 Subject: [PATCH 30/52] feat: fixed server side languages. --- .../grieflogger/event/ServerStartedEvent.java | 2 +- .../grieflogger/i18n/LanguageManager.java | 163 +++++++++++++++--- .../model/history/BlockHistory.java | 13 +- .../model/history/ItemHistory.java | 8 +- 4 files changed, 152 insertions(+), 34 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/event/ServerStartedEvent.java b/common/src/main/java/com/daqem/grieflogger/event/ServerStartedEvent.java index 2d7a185..98cb79d 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/ServerStartedEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/ServerStartedEvent.java @@ -7,6 +7,6 @@ public class ServerStartedEvent { public static void registerEvent() { - LifecycleEvent.SERVER_STARTED.register(server -> LanguageManager.load()); + LifecycleEvent.SERVER_STARTED.register(LanguageManager::load); } } diff --git a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java index 0b0e3cb..b9110ae 100644 --- a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java +++ b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java @@ -1,57 +1,166 @@ package com.daqem.grieflogger.i18n; +import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.nio.file.Files; +import java.nio.file.Path; +import java.security.MessageDigest; import java.util.HashMap; +import java.util.HexFormat; import java.util.Map; import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.config.GriefLoggerConfig; + +import com.daqem.yamlconfig.YamlConfigExpectPlatform; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; - -import dev.architectury.platform.Mod; import dev.architectury.platform.Platform; +import net.minecraft.locale.Language; +import net.minecraft.server.MinecraftServer; public class LanguageManager { private static final Map TRANSLATIONS = new HashMap<>(); - private static final Gson GSON = new Gson(); + public static final Gson GSON = new GsonBuilder().disableHtmlEscaping().create(); + private static final HttpClient HTTP_CLIENT = HttpClient.newBuilder() + .followRedirects(HttpClient.Redirect.NORMAL) + .build(); - public static void load() { + public static void load(MinecraftServer server) { TRANSLATIONS.clear(); String language = GriefLoggerConfig.language.get(); - for (Mod mod : Platform.getMods()) { - String modId = mod.getModId(); - loadFromMod(modId, language); + for (String modId : Platform.getModIds()) { if (!language.equals("en_us")) { - loadFromMod(modId, "en_us"); + if (modId.equals("minecraft")) { + loadLanguage(server, language); + } else { + loadLanguage(modId, language); + } } + loadLanguage(modId, "en_us"); } + + GriefLogger.LOGGER.info("Loaded {} translations for language: {}", TRANSLATIONS.size(), language); } - private static void loadFromMod(String modId, String language) { - String pathStr = "assets/" + modId + "/lang/" + language + ".json"; - try (InputStream inputStream = GriefLogger.class.getClassLoader().getResourceAsStream(pathStr)) { - if (inputStream != null) { - try { - JsonObject jsonObject = GSON.fromJson(new InputStreamReader(inputStream, StandardCharsets.UTF_8), JsonObject.class); - jsonObject.entrySet().forEach(entry -> { - if (language.equals("en_us")) { - TRANSLATIONS.putIfAbsent(entry.getKey(), entry.getValue().getAsString()); - } else { - TRANSLATIONS.put(entry.getKey(), entry.getValue().getAsString()); - } - }); - } catch (Exception e) { - GriefLogger.LOGGER.error("Failed to parse language file: {}", pathStr, e); - } + private static void loadLanguage(String modId, String language) { + try (InputStream stream = Language.class.getResourceAsStream("/assets/" + modId + "/lang/" + language + ".json")) { + if (stream == null) { + return; + } + Language.loadFromJson(stream, TRANSLATIONS::putIfAbsent); + } catch (Exception e) { + GriefLogger.LOGGER.error("Failed to load language file for mod: {}, language: {}", modId, language, e); + } + } + + private static void loadLanguage(MinecraftServer server, String languageCode) { + try { + String mcVersion = server.getServerVersion(); + + Path cacheDir = YamlConfigExpectPlatform.getConfigDirectory().resolve(GriefLogger.MOD_ID).resolve("lang_cache"); + Files.createDirectories(cacheDir); + + Path cacheFile = cacheDir.resolve(languageCode + ".json"); + + // 1. Get asset index URL for current version + String assetIndexUrl = getAssetIndexUrl(mcVersion); + + // 2. Get hash for the specific lang file + String hash = getLanguageHash(assetIndexUrl, "minecraft/lang/" + languageCode + ".json"); + String prefix = hash.substring(0, 2); + String assetUrl = "https://resources.download.minecraft.net/" + prefix + "/" + hash; + + // 3. Download if missing or hash mismatch + if (Files.notExists(cacheFile) || !fileHash(cacheFile).equalsIgnoreCase(hash)) { + downloadFile(assetUrl, cacheFile); } + + // 4. Parse and cache + String json = Files.readString(cacheFile); + Map translations = GSON.fromJson(json, + com.google.gson.reflect.TypeToken.getParameterized(Map.class, String.class, String.class).getType()); + + TRANSLATIONS.putAll(translations); } catch (Exception e) { - // Ignore if file not found, it's expected for many mods + GriefLogger.LOGGER.error("Failed to download Minecraft language file for language: {}", languageCode, e); + } + } + + private static String getAssetIndexUrl(String mcVersion) throws Exception { + String manifestJson = get("https://launchermeta.mojang.com/mc/game/version_manifest_v2.json"); + + JsonObject manifest = GSON.fromJson(manifestJson, JsonObject.class); + String versionUrl = manifest.getAsJsonArray("versions").asList().stream() + .map(JsonElement::getAsJsonObject) + .filter(v -> mcVersion.equals(v.get("id").getAsString())) + .findFirst() + .orElseThrow(() -> new IOException("Version " + mcVersion + " not found in manifest")) + .get("url").getAsString(); + + JsonObject versionJson = GSON.fromJson(get(versionUrl), JsonObject.class); + return versionJson.getAsJsonObject("assetIndex").get("url").getAsString(); + } + + private static String getLanguageHash(String assetIndexUrl, String assetPath) throws Exception { + JsonObject index = GSON.fromJson(get(assetIndexUrl), JsonObject.class); + JsonObject objects = index.getAsJsonObject("objects"); + + if (!objects.has(assetPath)) { + throw new IOException("Language file not found in asset index: " + assetPath); + } + + return objects.getAsJsonObject(assetPath) + .get("hash").getAsString(); + } + + private static String get(String url) throws IOException, InterruptedException { + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .header("User-Agent", "Minecraft-Server-Mod/1.0 (Java 21)") + .build(); + + HttpResponse response = HTTP_CLIENT.send(request, HttpResponse.BodyHandlers.ofString()); + + if (response.statusCode() >= 400) { + throw new IOException("HTTP " + response.statusCode() + " for " + url); + } + return response.body(); + } + + private static void downloadFile(String url, Path destination) throws IOException, InterruptedException { + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create(url)) + .header("User-Agent", "Minecraft-Server-Mod/1.0") + .build(); + + HttpResponse response = HTTP_CLIENT.send(request, + HttpResponse.BodyHandlers.ofFile(destination)); + + if (response.statusCode() >= 400) { + throw new IOException("Failed to download " + url + " (HTTP " + response.statusCode() + ")"); + } + } + + private static String fileHash(Path file) throws IOException { + byte[] data = Files.readAllBytes(file); + MessageDigest sha1; + try { + sha1 = MessageDigest.getInstance("SHA-1"); + } catch (java.security.NoSuchAlgorithmException e) { + throw new RuntimeException(e); } + return HexFormat.of().formatHex(sha1.digest(data)).toLowerCase(); } public static String getString(String key) { diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java index fa81b9e..b133811 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java @@ -1,10 +1,14 @@ package com.daqem.grieflogger.model.history; +import java.util.UUID; + import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.i18n.LanguageManager; import com.daqem.grieflogger.model.BlockPosition; import com.daqem.grieflogger.model.Time; import com.daqem.grieflogger.model.User; import com.daqem.grieflogger.model.action.BlockAction; + import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; @@ -15,8 +19,6 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; -import java.util.UUID; - public class BlockHistory extends History { @@ -43,7 +45,12 @@ public Component getComponent() { public Component getMaterialComponent() { Holder.Reference blockReference = BuiltInRegistries.BLOCK.get(ResourceLocation.parse(material)).orElse(null); Item item = blockReference != null ? blockReference.value().asItem() : Items.AIR; - MutableComponent mutableComponent = GriefLogger.themedLiteral(this.material.replace("minecraft:", "")); + MutableComponent mutableComponent; + if (blockReference != null) { + mutableComponent = GriefLogger.themedLiteral(LanguageManager.getString(blockReference.value().getDescriptionId())); + } else { + mutableComponent = GriefLogger.themedLiteral(this.material.replace("minecraft:", "")); + } if (item != Items.AIR) { return mutableComponent .withStyle(mutableComponent diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java index e307252..c492420 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java @@ -1,20 +1,22 @@ package com.daqem.grieflogger.model.history; +import java.util.UUID; + import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.i18n.LanguageManager; import com.daqem.grieflogger.model.BlockPosition; import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.model.Time; import com.daqem.grieflogger.model.User; import com.daqem.grieflogger.model.action.IAction; import com.daqem.grieflogger.model.action.ItemAction; + import net.minecraft.core.component.DataComponentPatch; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; -import java.util.UUID; - public class ItemHistory extends History { protected final SimpleItemStack itemStack; @@ -44,7 +46,7 @@ public Component getComponent() { @Override public Component getMaterialComponent() { - MutableComponent mutableComponent = GriefLogger.themedLiteral(this.itemStack.getItem().arch$registryName().toString().replace("minecraft:", "")); + MutableComponent mutableComponent = GriefLogger.themedLiteral(LanguageManager.getString(this.itemStack.getItem().getDescriptionId())); return mutableComponent .withStyle(mutableComponent .getStyle() From 0cef1b82adbe7b45256c343d627e3625955e9888 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 21:03:05 +0100 Subject: [PATCH 31/52] fix: a few bugs --- .../grieflogger/command/LookupCommand.java | 34 ++++------------- .../daqem/grieflogger/command/page/Page.java | 9 +++-- .../database/repository/BlockRepository.java | 38 ++++++++++++++----- .../repository/ContainerRepository.java | 38 ++++++++++++++----- .../database/repository/ItemRepository.java | 38 ++++++++++++++----- .../repository/SessionRepository.java | 38 ++++++++++++++----- .../database/service/BlockService.java | 6 +++ .../database/service/ContainerService.java | 11 ++++++ .../database/service/ItemService.java | 12 +++++- .../database/service/SessionService.java | 12 +++++- .../event/item/ShootItemEvent.java | 2 +- .../event/item/ThrowItemEvent.java | 2 +- .../grieflogger/i18n/LanguageManager.java | 7 ++-- 13 files changed, 174 insertions(+), 73 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java index a36f0ec..57fdeca 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java @@ -2,13 +2,10 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.command.argument.FilterArgument; -import com.daqem.grieflogger.command.filter.*; +import com.daqem.grieflogger.command.filter.FilterList; import com.daqem.grieflogger.command.page.Page; import com.daqem.grieflogger.database.service.Services; -import com.daqem.grieflogger.model.action.BlockAction; -import com.daqem.grieflogger.model.action.ItemAction; -import com.daqem.grieflogger.model.action.SessionAction; -import com.daqem.grieflogger.model.history.*; +import com.daqem.grieflogger.model.history.IHistory; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import com.daqem.grieflogger.thread.ThreadManager; import com.mojang.brigadier.arguments.StringArgumentType; @@ -42,7 +39,8 @@ public LiteralArgumentBuilder getCommand() { .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1"), FilterArgument.getFilter(context, "filter2"), FilterArgument.getFilter(context, "filter3"), FilterArgument.getFilter(context, "filter4")), context.getSource())))) .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1"), FilterArgument.getFilter(context, "filter2"), FilterArgument.getFilter(context, "filter3")), context.getSource())))) .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1"), FilterArgument.getFilter(context, "filter2")), context.getSource())))) - .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1")), context.getSource())))); + .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1")), context.getSource())))) + .executes(context -> lookup(context.getSource(), new FilterList(new ArrayList<>(), context.getSource()))); } @SuppressWarnings("SameReturnValue") @@ -65,26 +63,10 @@ private static int lookup(CommandSourceStack source, FilterList filterList) { private static List getHistory(Level level, FilterList filterList) { List history = new ArrayList<>(); - if (filterList.getActionFilter().isPresent()) { - ActionFilter actionFilter = filterList.getActionFilter().orElseThrow(); - if (actionFilter.getActions().stream().anyMatch(action -> action instanceof BlockAction)) { - history.addAll(Services.BLOCK.getFilteredBlockHistory(level, filterList)); - } - if (actionFilter.getActions().stream().anyMatch(action -> action instanceof SessionAction)) { - history.addAll(Services.SESSION.getFilteredSessionHistory(level, filterList)); - } - if (actionFilter.getActions().stream().anyMatch(action -> action.equals(ItemAction.ADD_ITEM) || action.equals(ItemAction.REMOVE_ITEM))) { - history.addAll(Services.CONTAINER.getFilteredContainerHistory(level, filterList)); - } - if (actionFilter.getActions().stream().anyMatch(action -> action instanceof ItemAction && !action.equals(ItemAction.ADD_ITEM) && !action.equals(ItemAction.REMOVE_ITEM))) { - history.addAll(Services.ITEM.getFilteredItemHistory(level, filterList)); - } - } else { - history.addAll(Services.BLOCK.getFilteredBlockHistory(level, filterList)); - history.addAll(Services.SESSION.getFilteredSessionHistory(level, filterList)); - history.addAll(Services.CONTAINER.getFilteredContainerHistory(level, filterList)); - history.addAll(Services.ITEM.getFilteredItemHistory(level, filterList)); - } + history.addAll(Services.BLOCK.getFilteredBlockHistory(level, filterList)); + history.addAll(Services.SESSION.getFilteredSessionHistory(level, filterList)); + history.addAll(Services.CONTAINER.getFilteredContainerHistory(level, filterList)); + history.addAll(Services.ITEM.getFilteredItemHistory(level, filterList)); return history.stream() .sorted((x, y) -> Long.compare(y.getTime().time(), x.getTime().time())) diff --git a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java index 637d0a9..1fa894f 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java +++ b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java @@ -1,6 +1,7 @@ package com.daqem.grieflogger.command.page; import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.config.GriefLoggerConfig; import com.daqem.grieflogger.model.history.IHistory; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.ClickEvent; @@ -15,7 +16,6 @@ public class Page { - public static final int MAX_PAGE_SIZE = 10; private final List history; private final int page; private final int maxPage; @@ -94,11 +94,12 @@ public void sendToPlayer(ServerPlayer serverPlayer) { public static List convertToPages(List history, boolean singleLocation) { List pages = new ArrayList<>(); - int maxPage = (int) Math.ceil((double) history.size() / (double) MAX_PAGE_SIZE); + Integer pageSize = GriefLoggerConfig.maxPageSize.get(); + int maxPage = (int) Math.ceil((double) history.size() / (double) pageSize); int page = 1; - for (int i = 0; i < history.size(); i += MAX_PAGE_SIZE) { + for (int i = 0; i < history.size(); i += pageSize) { int finalPage = page; - pages.add(history.subList(i, Math.min(i + MAX_PAGE_SIZE, history.size())) + pages.add(history.subList(i, Math.min(i + pageSize, history.size())) .stream() .collect(Collectors.collectingAndThen(Collectors.toList(), x -> new Page(x, finalPage, maxPage, singleLocation)))); page++; diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java index 59bc795..e251422 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java @@ -248,9 +248,9 @@ public List getFilteredBlockHistory(String levelName, FilterList filte AND (? IS NULL OR users.id IN (%s)) AND (? IS NULL OR materials.name IN ('%s')) AND (? IS NULL OR materials.name NOT IN ('%s')) - AND blocks.x BETWEEN ? AND ? - AND blocks.y BETWEEN ? AND ? - AND blocks.z BETWEEN ? AND ? + AND (? IS NULL OR blocks.x BETWEEN ? AND ?) + AND (? IS NULL OR blocks.y BETWEEN ? AND ?) + AND (? IS NULL OR blocks.z BETWEEN ? AND ?) ORDER BY blocks.time DESC LIMIT 1000; @@ -284,12 +284,32 @@ public List getFilteredBlockHistory(String levelName, FilterList filte preparedStatement.setString(6, "not null"); } - preparedStatement.setInt(7, filterList.getRadiusMinX()); - preparedStatement.setInt(8, filterList.getRadiusMaxX()); - preparedStatement.setInt(9, filterList.getRadiusMinY()); - preparedStatement.setInt(10, filterList.getRadiusMaxY()); - preparedStatement.setInt(11, filterList.getRadiusMinZ()); - preparedStatement.setInt(12, filterList.getRadiusMaxZ()); + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(7, Types.VARCHAR); + } else { + preparedStatement.setString(7, "not null"); + } + + preparedStatement.setInt(8, filterList.getRadiusMinX()); + preparedStatement.setInt(9, filterList.getRadiusMaxX()); + + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(10, Types.VARCHAR); + } else { + preparedStatement.setString(10, "not null"); + } + + preparedStatement.setInt(11, filterList.getRadiusMinY()); + preparedStatement.setInt(12, filterList.getRadiusMaxY()); + + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(13, Types.VARCHAR); + } else { + preparedStatement.setString(13, "not null"); + } + + preparedStatement.setInt(14, filterList.getRadiusMinZ()); + preparedStatement.setInt(15, filterList.getRadiusMaxZ()); List blockHistory = new ArrayList<>(); ResultSet resultSet = preparedStatement.executeQuery(); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java index d5f1961..1abdc08 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java @@ -310,9 +310,9 @@ public List getFilteredContainerHistory(Level level, FilterList filter AND (? IS NULL OR users.id IN (%s)) AND (? IS NULL OR materials.name IN ('%s')) AND (? IS NULL OR materials.name NOT IN ('%s')) - AND containers.x BETWEEN ? AND ? - AND containers.y BETWEEN ? AND ? - AND containers.z BETWEEN ? AND ? + AND (? IS NULL OR containers.x BETWEEN ? AND ?) + AND (? IS NULL OR containers.y BETWEEN ? AND ?) + AND (? IS NULL OR containers.z BETWEEN ? AND ?) ORDER BY containers.time DESC LIMIT 1000; """.formatted(actions, users, includeMaterials, excludeMaterials); @@ -345,12 +345,32 @@ public List getFilteredContainerHistory(Level level, FilterList filter preparedStatement.setString(6, "not null"); } - preparedStatement.setInt(7, filterList.getRadiusMinX()); - preparedStatement.setInt(8, filterList.getRadiusMaxX()); - preparedStatement.setInt(9, filterList.getRadiusMinY()); - preparedStatement.setInt(10, filterList.getRadiusMaxY()); - preparedStatement.setInt(11, filterList.getRadiusMinZ()); - preparedStatement.setInt(12, filterList.getRadiusMaxZ()); + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(7, Types.VARCHAR); + } else { + preparedStatement.setString(7, "not null"); + } + + preparedStatement.setInt(8, filterList.getRadiusMinX()); + preparedStatement.setInt(9, filterList.getRadiusMaxX()); + + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(10, Types.VARCHAR); + } else { + preparedStatement.setString(10, "not null"); + } + + preparedStatement.setInt(11, filterList.getRadiusMinY()); + preparedStatement.setInt(12, filterList.getRadiusMaxY()); + + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(13, Types.VARCHAR); + } else { + preparedStatement.setString(13, "not null"); + } + + preparedStatement.setInt(14, filterList.getRadiusMinZ()); + preparedStatement.setInt(15, filterList.getRadiusMaxZ()); List blockHistory = new ArrayList<>(); ResultSet resultSet = preparedStatement.executeQuery(); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java index 9700e49..eb2951f 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java @@ -172,9 +172,9 @@ public List getFilteredItemHistory(Level level, FilterList filterLi AND (? IS NULL OR users.id IN (%s)) AND (? IS NULL OR materials.name IN ('%s')) AND (? IS NULL OR materials.name NOT IN ('%s')) - AND items.x BETWEEN ? AND ? - AND items.y BETWEEN ? AND ? - AND items.z BETWEEN ? AND ? + AND (? IS NULL OR items.x BETWEEN ? AND ?) + AND (? IS NULL OR items.y BETWEEN ? AND ?) + AND (? IS NULL OR items.z BETWEEN ? AND ?) ORDER BY items.time DESC LIMIT 1000; """.formatted(actions, users, includeMaterials, excludeMaterials); @@ -207,12 +207,32 @@ public List getFilteredItemHistory(Level level, FilterList filterLi preparedStatement.setString(6, "not null"); } - preparedStatement.setInt(7, filterList.getRadiusMinX()); - preparedStatement.setInt(8, filterList.getRadiusMaxX()); - preparedStatement.setInt(9, filterList.getRadiusMinY()); - preparedStatement.setInt(10, filterList.getRadiusMaxY()); - preparedStatement.setInt(11, filterList.getRadiusMinZ()); - preparedStatement.setInt(12, filterList.getRadiusMaxZ()); + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(7, Types.VARCHAR); + } else { + preparedStatement.setString(7, "not null"); + } + + preparedStatement.setInt(8, filterList.getRadiusMinX()); + preparedStatement.setInt(9, filterList.getRadiusMaxX()); + + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(10, Types.VARCHAR); + } else { + preparedStatement.setString(10, "not null"); + } + + preparedStatement.setInt(11, filterList.getRadiusMinY()); + preparedStatement.setInt(12, filterList.getRadiusMaxY()); + + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(13, Types.VARCHAR); + } else { + preparedStatement.setString(13, "not null"); + } + + preparedStatement.setInt(14, filterList.getRadiusMinZ()); + preparedStatement.setInt(15, filterList.getRadiusMaxZ()); List itemHistory = new ArrayList<>(); ResultSet resultSet = preparedStatement.executeQuery(); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java index 2527a20..2ddca29 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java @@ -88,9 +88,9 @@ public List getFilteredSessionHistory(String levelName, FilterLi AND sessions.time > ? AND (? IS NULL OR sessions.action IN (%s)) AND (? IS NULL OR users.id IN (%s)) - AND sessions.x BETWEEN ? AND ? - AND sessions.y BETWEEN ? AND ? - AND sessions.z BETWEEN ? AND ? + AND (? IS NULL OR sessions.x BETWEEN ? AND ?) + AND (? IS NULL OR sessions.y BETWEEN ? AND ?) + AND (? IS NULL OR sessions.z BETWEEN ? AND ?) ORDER BY sessions.time DESC LIMIT 1000; """.formatted(actions, users); @@ -111,12 +111,32 @@ public List getFilteredSessionHistory(String levelName, FilterLi preparedStatement.setString(4, users); } - preparedStatement.setInt(5, filterList.getRadiusMinX()); - preparedStatement.setInt(6, filterList.getRadiusMaxX()); - preparedStatement.setInt(7, filterList.getRadiusMinY()); - preparedStatement.setInt(8, filterList.getRadiusMaxY()); - preparedStatement.setInt(9, filterList.getRadiusMinZ()); - preparedStatement.setInt(10, filterList.getRadiusMaxZ()); + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(5, Types.VARCHAR); + } else { + preparedStatement.setString(5, "not null"); + } + + preparedStatement.setInt(6, filterList.getRadiusMinX()); + preparedStatement.setInt(7, filterList.getRadiusMaxX()); + + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(8, Types.VARCHAR); + } else { + preparedStatement.setString(8, "not null"); + } + + preparedStatement.setInt(9, filterList.getRadiusMinY()); + preparedStatement.setInt(10, filterList.getRadiusMaxY()); + + if (filterList.getRadiusFilter().isEmpty()) { + preparedStatement.setNull(11, Types.VARCHAR); + } else { + preparedStatement.setString(11, "not null"); + } + + preparedStatement.setInt(12, filterList.getRadiusMinZ()); + preparedStatement.setInt(13, filterList.getRadiusMaxZ()); List sessionHistory = new ArrayList<>(); ResultSet resultSet = preparedStatement.executeQuery(); diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java b/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java index 69f1274..a9d84d8 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java @@ -1,5 +1,6 @@ package com.daqem.grieflogger.database.service; +import com.daqem.grieflogger.command.filter.ActionFilter; import com.daqem.grieflogger.command.filter.FilterList; import com.daqem.grieflogger.database.Database; import com.daqem.grieflogger.database.repository.BlockRepository; @@ -12,6 +13,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.UUID; public class BlockService { @@ -104,6 +106,10 @@ public void removeInteractionsForPosition(Level level, BlockPos secondPos) { } public List getFilteredBlockHistory(Level level, FilterList filterList) { + Optional actionFilter = filterList.getActionFilter(); + if (actionFilter.isPresent() && actionFilter.get().getActions().stream().noneMatch(action -> action instanceof BlockAction)) { + return List.of(); + } return blockRepository.getFilteredBlockHistory( level.dimension().location().toString(), filterList diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java b/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java index 74b5de1..16824b8 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java @@ -1,9 +1,11 @@ package com.daqem.grieflogger.database.service; +import com.daqem.grieflogger.command.filter.ActionFilter; import com.daqem.grieflogger.command.filter.FilterList; import com.daqem.grieflogger.database.Database; import com.daqem.grieflogger.database.repository.ContainerRepository; import com.daqem.grieflogger.model.SimpleItemStack; +import com.daqem.grieflogger.model.action.IAction; import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.IHistory; import net.minecraft.core.BlockPos; @@ -12,6 +14,7 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; public class ContainerService { @@ -87,9 +90,17 @@ public List getHistory(Level level, BlockPos pos, BlockPos connectionP } public List getFilteredContainerHistory(Level level, FilterList filterList) { + Optional actionFilter = filterList.getActionFilter(); + if ((actionFilter.isPresent() && actionFilter.get().getActions().stream().noneMatch(ContainerService::isValidItemAction))) { + return List.of(); + } return containerRepository.getFilteredContainerHistory( level, filterList ); } + + private static boolean isValidItemAction(IAction action) { + return action.equals(ItemAction.ADD_ITEM) || action.equals(ItemAction.REMOVE_ITEM); + } } diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java b/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java index 7e1a97b..cb7a739 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java @@ -1,18 +1,20 @@ package com.daqem.grieflogger.database.service; +import com.daqem.grieflogger.command.filter.ActionFilter; import com.daqem.grieflogger.command.filter.FilterList; import com.daqem.grieflogger.database.Database; import com.daqem.grieflogger.database.repository.ItemRepository; import com.daqem.grieflogger.model.SimpleItemStack; +import com.daqem.grieflogger.model.action.IAction; import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.ItemHistory; -import com.daqem.grieflogger.thread.ThreadManager; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; public class ItemService { @@ -56,9 +58,17 @@ public void insertMap(UUID userUuid, Level level, BlockPos pos, Map getFilteredItemHistory(Level level, FilterList filterList) { + Optional actionFilter = filterList.getActionFilter(); + if (actionFilter.isPresent() && actionFilter.get().getActions().stream().noneMatch(ItemService::isValidItemAction)) { + return List.of(); + } return itemRepository.getFilteredItemHistory( level, filterList ); } + + private static boolean isValidItemAction(IAction action) { + return action instanceof ItemAction && (!action.equals(ItemAction.ADD_ITEM) || !action.equals(ItemAction.REMOVE_ITEM)); + } } diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java b/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java index 68ca447..5a56d0e 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java @@ -1,15 +1,16 @@ package com.daqem.grieflogger.database.service; +import com.daqem.grieflogger.command.filter.ActionFilter; import com.daqem.grieflogger.command.filter.FilterList; import com.daqem.grieflogger.database.Database; import com.daqem.grieflogger.database.repository.SessionRepository; import com.daqem.grieflogger.model.action.SessionAction; import com.daqem.grieflogger.model.history.SessionHistory; -import com.daqem.grieflogger.thread.ThreadManager; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import java.util.List; +import java.util.Optional; import java.util.UUID; public class SessionService { @@ -39,6 +40,15 @@ public void insert(UUID userUuid, Level level, BlockPos pos, SessionAction sessi } public List getFilteredSessionHistory(Level level, FilterList filterList) { + Optional actionFilter = filterList.getActionFilter(); + if ((actionFilter.isPresent() && actionFilter.get().getActions().stream().noneMatch(action -> action instanceof SessionAction)) + || + (filterList.getIncludeFilter().isPresent()) + || + (filterList.getExcludeFilter().isPresent()) + ) { + return List.of(); + } return sessionRepository.getFilteredSessionHistory( level.dimension().location().toString(), filterList diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/ShootItemEvent.java b/common/src/main/java/com/daqem/grieflogger/event/item/ShootItemEvent.java index 8f10a51..0cb6227 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/item/ShootItemEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/item/ShootItemEvent.java @@ -8,7 +8,7 @@ public class ShootItemEvent { public static void shootItem(Player player, ItemStack itemStack) { - if (player instanceof GriefLoggerServerPlayer serverPlayer) { + if (player instanceof GriefLoggerServerPlayer serverPlayer && itemStack != null) { serverPlayer.griefLogger$addItemToQueue(ItemAction.SHOOT_ITEM, new SimpleItemStack(itemStack)); } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/item/ThrowItemEvent.java b/common/src/main/java/com/daqem/grieflogger/event/item/ThrowItemEvent.java index 0574f14..b828e24 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/item/ThrowItemEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/item/ThrowItemEvent.java @@ -8,7 +8,7 @@ public class ThrowItemEvent { public static void throwItem(Player player, ItemStack itemStack) { - if (player instanceof GriefLoggerServerPlayer serverPlayer) { + if (player instanceof GriefLoggerServerPlayer serverPlayer && itemStack != null) { serverPlayer.griefLogger$addItemToQueue(ItemAction.THROW_ITEM, new SimpleItemStack(itemStack)); } } diff --git a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java index b9110ae..92b2a67 100644 --- a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java +++ b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java @@ -9,6 +9,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.HexFormat; import java.util.Map; @@ -21,6 +22,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; import dev.architectury.platform.Platform; import net.minecraft.locale.Language; import net.minecraft.server.MinecraftServer; @@ -86,8 +88,7 @@ private static void loadLanguage(MinecraftServer server, String languageCode) { // 4. Parse and cache String json = Files.readString(cacheFile); - Map translations = GSON.fromJson(json, - com.google.gson.reflect.TypeToken.getParameterized(Map.class, String.class, String.class).getType()); + Map translations = GSON.fromJson(json, TypeToken.getParameterized(Map.class, String.class, String.class).getType()); TRANSLATIONS.putAll(translations); } catch (Exception e) { @@ -157,7 +158,7 @@ private static String fileHash(Path file) throws IOException { MessageDigest sha1; try { sha1 = MessageDigest.getInstance("SHA-1"); - } catch (java.security.NoSuchAlgorithmException e) { + } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } return HexFormat.of().formatHex(sha1.digest(data)).toLowerCase(); From 888d52fc37f15154fe485422886b192d5db6b8a1 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 21:23:37 +0100 Subject: [PATCH 32/52] chore: remove old code --- .../grieflogger/GriefLoggerExpectPlatform.java | 14 -------------- .../com/daqem/grieflogger/database/Database.java | 4 ++-- .../fabric/GriefLoggerExpectPlatformImpl.java | 15 --------------- .../neoforge/GriefLoggerExpectPlatformImpl.java | 15 --------------- 4 files changed, 2 insertions(+), 46 deletions(-) delete mode 100644 common/src/main/java/com/daqem/grieflogger/GriefLoggerExpectPlatform.java delete mode 100644 fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerExpectPlatformImpl.java delete mode 100644 neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerExpectPlatformImpl.java diff --git a/common/src/main/java/com/daqem/grieflogger/GriefLoggerExpectPlatform.java b/common/src/main/java/com/daqem/grieflogger/GriefLoggerExpectPlatform.java deleted file mode 100644 index 7acb4c3..0000000 --- a/common/src/main/java/com/daqem/grieflogger/GriefLoggerExpectPlatform.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.daqem.grieflogger; - -import dev.architectury.injectables.annotations.ExpectPlatform; -import dev.architectury.platform.Platform; - -import java.nio.file.Path; - -public class GriefLoggerExpectPlatform { - - @ExpectPlatform - public static Path getConfigDirectory() { - throw new AssertionError(); - } -} diff --git a/common/src/main/java/com/daqem/grieflogger/database/Database.java b/common/src/main/java/com/daqem/grieflogger/database/Database.java index 225f838..2c390ad 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/Database.java +++ b/common/src/main/java/com/daqem/grieflogger/database/Database.java @@ -8,10 +8,10 @@ import java.sql.Statement; import java.util.List; +import com.daqem.yamlconfig.YamlConfigExpectPlatform; import org.jetbrains.annotations.Nullable; import com.daqem.grieflogger.GriefLogger; -import com.daqem.grieflogger.GriefLoggerExpectPlatform; import com.daqem.grieflogger.config.GriefLoggerConfig; import com.daqem.grieflogger.database.dialect.IDatabaseDialect; import com.daqem.grieflogger.database.dialect.MySQLDialect; @@ -91,7 +91,7 @@ public boolean createSqliteConnection() { GriefLogger.LOGGER.error("Failed to load SQLite driver", e); return false; } - Path path = GriefLoggerExpectPlatform.getConfigDirectory().resolve(GriefLogger.MOD_ID); + Path path = YamlConfigExpectPlatform.getConfigDirectory().resolve(GriefLogger.MOD_ID); if (!path.toFile().exists()) { //noinspection ResultOfMethodCallIgnored path.toFile().mkdirs(); diff --git a/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerExpectPlatformImpl.java b/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerExpectPlatformImpl.java deleted file mode 100644 index bbdb532..0000000 --- a/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerExpectPlatformImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.daqem.grieflogger.fabric; - -import com.daqem.grieflogger.GriefLoggerExpectPlatform; -import net.fabricmc.loader.api.FabricLoader; - -import java.nio.file.Path; - -public class GriefLoggerExpectPlatformImpl { - /** - * This is our actual method to {@link GriefLoggerExpectPlatform#getConfigDirectory()}. - */ - public static Path getConfigDirectory() { - return FabricLoader.getInstance().getConfigDir(); - } -} diff --git a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerExpectPlatformImpl.java b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerExpectPlatformImpl.java deleted file mode 100644 index c2715e0..0000000 --- a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerExpectPlatformImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.daqem.grieflogger.neoforge; - -import com.daqem.grieflogger.GriefLoggerExpectPlatform; -import net.neoforged.fml.loading.FMLPaths; - -import java.nio.file.Path; - -public class GriefLoggerExpectPlatformImpl { - /** - * This is our actual method to {@link GriefLoggerExpectPlatform#getConfigDirectory()}. - */ - public static Path getConfigDirectory() { - return FMLPaths.CONFIGDIR.get(); - } -} From a1266dfe901a82e58e41d162fcf705bf7386ef7b Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 21:52:20 +0100 Subject: [PATCH 33/52] feat: improve lookup command filter parsing --- .../grieflogger/command/LookupCommand.java | 66 ++++++++++++++----- .../command/filter/ItemFilter.java | 2 +- .../assets/grieflogger/lang/en_us.json | 1 + .../assets/grieflogger/lang/nl_nl.json | 1 + .../assets/grieflogger/lang/zh_tw.json | 1 + 5 files changed, 53 insertions(+), 18 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java index 57fdeca..d38d684 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java @@ -3,20 +3,28 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.command.argument.FilterArgument; import com.daqem.grieflogger.command.filter.FilterList; +import com.daqem.grieflogger.command.filter.IFilter; import com.daqem.grieflogger.command.page.Page; import com.daqem.grieflogger.database.service.Services; import com.daqem.grieflogger.model.history.IHistory; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import com.daqem.grieflogger.thread.ThreadManager; +import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +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 net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; public class LookupCommand implements ICommand { @@ -25,22 +33,33 @@ public class LookupCommand implements ICommand { public LiteralArgumentBuilder getCommand() { return Commands.literal("lookup") .requires(source -> source.hasPermission(2)) - .then(Commands.argument("filter1", StringArgumentType.string()) - .suggests((context, builder) -> new FilterArgument().listSuggestions(context, builder)) - .then(Commands.argument("filter2", StringArgumentType.string()) - .suggests((context, builder) -> new FilterArgument().listSuggestions(context, builder)) - .then(Commands.argument("filter3", StringArgumentType.string()) - .suggests((context, builder) -> new FilterArgument().listSuggestions(context, builder)) - .then(Commands.argument("filter4", StringArgumentType.string()) - .suggests((context, builder) -> new FilterArgument().listSuggestions(context, builder)) - .then(Commands.argument("filter5", StringArgumentType.string()) - .suggests((context, builder) -> new FilterArgument().listSuggestions(context, builder)) - .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1"), FilterArgument.getFilter(context, "filter2"), FilterArgument.getFilter(context, "filter3"), FilterArgument.getFilter(context, "filter4"), FilterArgument.getFilter(context, "filter5")), context.getSource())))) - .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1"), FilterArgument.getFilter(context, "filter2"), FilterArgument.getFilter(context, "filter3"), FilterArgument.getFilter(context, "filter4")), context.getSource())))) - .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1"), FilterArgument.getFilter(context, "filter2"), FilterArgument.getFilter(context, "filter3")), context.getSource())))) - .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1"), FilterArgument.getFilter(context, "filter2")), context.getSource())))) - .executes(context -> lookup(context.getSource(), new FilterList(List.of(FilterArgument.getFilter(context, "filter1")), context.getSource())))) - .executes(context -> lookup(context.getSource(), new FilterList(new ArrayList<>(), context.getSource()))); + .then(Commands.argument("filters", StringArgumentType.greedyString()) + .suggests(LookupCommand::suggestFilters) + .executes(context -> lookup(context.getSource(), StringArgumentType.getString(context, "filters")))) + .executes(context -> lookup(context.getSource(), "")); + } + + private static int lookup(CommandSourceStack source, String filtersInput) { + List filters = new ArrayList<>(); + + if (!filtersInput.isBlank()) { + // Split by whitespace to get individual filters + String[] parts = filtersInput.split("\\s+"); + FilterArgument parser = new FilterArgument(); + + for (String part : parts) { + try { + // Manually parse each part using your existing logic + IFilter filter = parser.parse(new StringReader(part)); + filters.add(filter); + } catch (CommandSyntaxException e) { + source.sendFailure(GriefLogger.translate("lookup.invalid_filter", GriefLogger.getName(), part)); + return 0; + } + } + } + + return lookup(source, new FilterList(filters, source)); } @SuppressWarnings("SameReturnValue") @@ -60,6 +79,19 @@ private static int lookup(CommandSourceStack source, FilterList filterList) { return 1; } + private static CompletableFuture suggestFilters(CommandContext context, SuggestionsBuilder builder) { + String remaining = builder.getRemaining(); + // Find the last word (since greedyString gives us the whole line) + int lastSpace = remaining.lastIndexOf(' '); + + // Create a new builder starting at the last word so suggestions replace only that word + int start = builder.getStart() + lastSpace + 1; + SuggestionsBuilder offsetBuilder = builder.createOffset(start); + + // Reuse your existing FilterArgument suggestion logic + return new FilterArgument().listSuggestions(context, offsetBuilder); + } + private static List getHistory(Level level, FilterList filterList) { List history = new ArrayList<>(); @@ -72,4 +104,4 @@ private static List getHistory(Level level, FilterList filterList) { .sorted((x, y) -> Long.compare(y.getTime().time(), x.getTime().time())) .collect(Collectors.toList()); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/command/filter/ItemFilter.java b/common/src/main/java/com/daqem/grieflogger/command/filter/ItemFilter.java index 06ac8a1..be24d3a 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/filter/ItemFilter.java +++ b/common/src/main/java/com/daqem/grieflogger/command/filter/ItemFilter.java @@ -28,7 +28,7 @@ public List getOptions() { } protected List getItemsFromSuffix(StringReader reader, String suffix) throws CommandSyntaxException { - String[] split = suffix.split(","); + String[] split = Arrays.stream(suffix.split(",")).map(s -> s.replace("minecraft:", "").trim()).toArray(String[]::new); List items = BuiltInRegistries.ITEM.stream() .filter(item -> Arrays.asList(split).contains(item.arch$registryName().toString().replace("minecraft:", ""))) .toList(); diff --git a/common/src/main/resources/assets/grieflogger/lang/en_us.json b/common/src/main/resources/assets/grieflogger/lang/en_us.json index 2b6d71b..6466263 100644 --- a/common/src/main/resources/assets/grieflogger/lang/en_us.json +++ b/common/src/main/resources/assets/grieflogger/lang/en_us.json @@ -38,6 +38,7 @@ "grieflogger.lookup.page": "Page", "grieflogger.lookup.pages": " %s/%s", "grieflogger.lookup.invalid_page": "%s - Invalid page number.", + "grieflogger.lookup.invalid_filter": "%s - Invalid filter: %s.", "grieflogger.lookup.no_results": "%s - No results found.", "grieflogger.filter.action": "action", "grieflogger.filter.exclude": "exclude", diff --git a/common/src/main/resources/assets/grieflogger/lang/nl_nl.json b/common/src/main/resources/assets/grieflogger/lang/nl_nl.json index 39dc4f8..16e0f88 100644 --- a/common/src/main/resources/assets/grieflogger/lang/nl_nl.json +++ b/common/src/main/resources/assets/grieflogger/lang/nl_nl.json @@ -38,6 +38,7 @@ "grieflogger.lookup.page": "Pagina", "grieflogger.lookup.pages": " %s/%s", "grieflogger.lookup.invalid_page": "%s - Ongeldig paginanummer.", + "grieflogger.lookup.invalid_filter": "%s - Ongeldige filter: %s.", "grieflogger.lookup.no_results": "%s - Geen resultaten gevonden.", "grieflogger.filter.action": "actie", "grieflogger.filter.exclude": "uitsluiten", diff --git a/common/src/main/resources/assets/grieflogger/lang/zh_tw.json b/common/src/main/resources/assets/grieflogger/lang/zh_tw.json index 384a996..566b503 100644 --- a/common/src/main/resources/assets/grieflogger/lang/zh_tw.json +++ b/common/src/main/resources/assets/grieflogger/lang/zh_tw.json @@ -38,6 +38,7 @@ "grieflogger.lookup.page": "頁數", "grieflogger.lookup.pages": " %s/%s", "grieflogger.lookup.invalid_page": "%s - 無效的頁碼。", + "grieflogger.lookup.invalid_filter": "%s - 無效的篩選器:%s。", "grieflogger.lookup.no_results": "%s - 找不到任何結果。", "grieflogger.filter.action": "動作", "grieflogger.filter.exclude": "排除", From 3c3879c429727deb1bd0c70b77aa0ef580cb0cf8 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sat, 22 Nov 2025 22:51:49 +0100 Subject: [PATCH 34/52] fix: bulk creating prepared statement on main thread causing lag --- .../command/GriefLoggerCommand.java | 1 + .../grieflogger/command/InspectCommand.java | 1 - .../grieflogger/command/LookupCommand.java | 1 - .../grieflogger/command/PageCommand.java | 1 - .../daqem/grieflogger/database/Database.java | 40 +++-- .../grieflogger/database/queue/IQueue.java | 6 +- .../grieflogger/database/queue/Queue.java | 33 +++-- .../grieflogger/database/queue/SqlTask.java | 9 ++ .../database/repository/BlockRepository.java | 101 ++++++------- .../database/repository/ChatRepository.java | 32 ++-- .../repository/CommandRepository.java | 30 ++-- .../repository/ContainerRepository.java | 137 +++++++++--------- .../database/repository/EntityRepository.java | 20 +-- .../database/repository/ItemRepository.java | 106 +++++++------- .../database/repository/LevelRepository.java | 20 +-- .../repository/MaterialRepository.java | 20 +-- .../repository/SessionRepository.java | 32 ++-- .../database/repository/UserRepository.java | 37 +++-- .../repository/UsernameRepository.java | 24 +-- .../daqem/grieflogger/event/EntityEvents.java | 2 +- 20 files changed, 329 insertions(+), 324 deletions(-) create mode 100644 common/src/main/java/com/daqem/grieflogger/database/queue/SqlTask.java diff --git a/common/src/main/java/com/daqem/grieflogger/command/GriefLoggerCommand.java b/common/src/main/java/com/daqem/grieflogger/command/GriefLoggerCommand.java index dd2d1dc..0d30797 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/GriefLoggerCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/GriefLoggerCommand.java @@ -18,6 +18,7 @@ public static void registerCommand(CommandDispatcher dispatc private static LiteralArgumentBuilder commandWithPrefix(String prefix) { return Commands.literal(prefix) + .requires(source -> source.hasPermission(2)) .then(INSPECT.getCommand()) .then(LOOKUP.getCommand()) .then(PAGE.getCommand()); diff --git a/common/src/main/java/com/daqem/grieflogger/command/InspectCommand.java b/common/src/main/java/com/daqem/grieflogger/command/InspectCommand.java index 12469d1..df89424 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/InspectCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/InspectCommand.java @@ -12,7 +12,6 @@ public class InspectCommand implements ICommand { @Override public LiteralArgumentBuilder getCommand() { return Commands.literal("inspect") - .requires(source -> source.hasPermission(2)) .executes(context -> inspect(context.getSource())); } diff --git a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java index d38d684..151177f 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java @@ -32,7 +32,6 @@ public class LookupCommand implements ICommand { @Override public LiteralArgumentBuilder getCommand() { return Commands.literal("lookup") - .requires(source -> source.hasPermission(2)) .then(Commands.argument("filters", StringArgumentType.greedyString()) .suggests(LookupCommand::suggestFilters) .executes(context -> lookup(context.getSource(), StringArgumentType.getString(context, "filters")))) diff --git a/common/src/main/java/com/daqem/grieflogger/command/PageCommand.java b/common/src/main/java/com/daqem/grieflogger/command/PageCommand.java index be938dc..b9ca9aa 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/PageCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/PageCommand.java @@ -16,7 +16,6 @@ public class PageCommand implements ICommand { @Override public LiteralArgumentBuilder getCommand() { return Commands.literal("page") - .requires(source -> source.hasPermission(2)) .then(Commands.argument("page", IntegerArgumentType.integer()) .executes(context -> page(context.getSource(), IntegerArgumentType.getInteger(context, "page")))); } diff --git a/common/src/main/java/com/daqem/grieflogger/database/Database.java b/common/src/main/java/com/daqem/grieflogger/database/Database.java index 2c390ad..c412ffe 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/Database.java +++ b/common/src/main/java/com/daqem/grieflogger/database/Database.java @@ -8,16 +8,17 @@ import java.sql.Statement; import java.util.List; +import com.daqem.grieflogger.database.dialect.MySQLDialect; import com.daqem.yamlconfig.YamlConfigExpectPlatform; import org.jetbrains.annotations.Nullable; import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.config.GriefLoggerConfig; import com.daqem.grieflogger.database.dialect.IDatabaseDialect; -import com.daqem.grieflogger.database.dialect.MySQLDialect; import com.daqem.grieflogger.database.dialect.SQLiteDialect; import com.daqem.grieflogger.database.queue.IQueue; import com.daqem.grieflogger.database.queue.Queue; +import com.daqem.grieflogger.database.queue.SqlTask; public class Database { @@ -137,38 +138,35 @@ public PreparedStatement prepareStatement(String query) throws SQLException { } } - public void executeStatements(List statements, boolean isBatch) { + public void executeQueue(List items, boolean isBatch) { try { - for (PreparedStatement statement : statements) { - if (statement == null) { - GriefLogger.LOGGER.error("Statement is null"); - continue; - } - - if (statement.isClosed()) { - GriefLogger.LOGGER.error("Statement is closed"); - continue; - } - - try (statement) { - if (isBatch) { - statement.executeBatch(); // Execute as a batch - } else { - statement.executeUpdate(); // Execute individually + for (Object item : items) { + if (item instanceof PreparedStatement preparedStatement) { + if (preparedStatement.isClosed()) { + continue; + } + try (preparedStatement) { + if (isBatch) { + preparedStatement.executeBatch(); + } else { + preparedStatement.executeUpdate(); + } } + } else if (item instanceof SqlTask task) { + task.execute(connection); } } - if (!statements.isEmpty()) { + if (!items.isEmpty()) { if (connection != null) { connection.commit(); } } } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to execute statements", e); + GriefLogger.LOGGER.error("Failed to execute database queue", e); } } public IDatabaseDialect getDialect() { return dialect; } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/queue/IQueue.java b/common/src/main/java/com/daqem/grieflogger/database/queue/IQueue.java index ff88421..82afe2a 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/queue/IQueue.java +++ b/common/src/main/java/com/daqem/grieflogger/database/queue/IQueue.java @@ -1,10 +1,8 @@ package com.daqem.grieflogger.database.queue; -import java.sql.PreparedStatement; - public interface IQueue { - void add(PreparedStatement statement); + void add(SqlTask task); void execute(); void hello(); -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/queue/Queue.java b/common/src/main/java/com/daqem/grieflogger/database/queue/Queue.java index 2eb5525..c896672 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/queue/Queue.java +++ b/common/src/main/java/com/daqem/grieflogger/database/queue/Queue.java @@ -6,12 +6,13 @@ import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; public class Queue implements IQueue { private final Database database; private final boolean isBatch; - private final List statements = new ArrayList<>(); + private final ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); public Queue(Database database, boolean isBatch) { this.database = database; @@ -19,27 +20,31 @@ public Queue(Database database, boolean isBatch) { } @Override - public void add(PreparedStatement statement) { - this.statements.add(statement); + public void add(SqlTask task) { + this.queue.add(task); } @Override public void execute() { - if (this.statements.isEmpty()) { + if (this.queue.isEmpty()) { return; } - List statements = new ArrayList<>(this.statements); - this.statements.clear(); - this.database.executeStatements(statements, isBatch); + List items = new ArrayList<>(); + Object item; + while ((item = this.queue.poll()) != null) { + items.add(item); + } + this.database.executeQueue(items, isBatch); } @Override public void hello() { - try { - PreparedStatement statement = this.database.prepareStatement("SELECT 1"); - this.database.execute(statement.toString(), false); - } catch (Exception e) { - GriefLogger.LOGGER.error("Failed to send hello packet", e); - } + this.add(connection -> { + try (PreparedStatement statement = connection.prepareStatement("SELECT 1")) { + statement.execute(); + } catch (Exception e) { + GriefLogger.LOGGER.error("Failed to send hello packet", e); + } + }); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/queue/SqlTask.java b/common/src/main/java/com/daqem/grieflogger/database/queue/SqlTask.java new file mode 100644 index 0000000..3bbda3e --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/database/queue/SqlTask.java @@ -0,0 +1,9 @@ +package com.daqem.grieflogger.database.queue; + +import java.sql.Connection; +import java.sql.SQLException; + +@FunctionalInterface +public interface SqlTask { + void execute(Connection connection) throws SQLException; +} diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java index e251422..781819d 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; +import com.daqem.grieflogger.database.dialect.MySQLDialect; import org.jetbrains.annotations.Nullable; import com.daqem.grieflogger.GriefLogger; @@ -37,7 +38,7 @@ public void createTable() { "FOREIGN KEY(level) REFERENCES levels(id)," + "FOREIGN KEY(type) REFERENCES materials(id)" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -47,7 +48,7 @@ public void createTable() { public void createIndexes() { String sql; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql = "ALTER TABLE blocks ADD INDEX coordinates (x, y, z);"; } else { sql = "CREATE INDEX IF NOT EXISTS coordinates ON blocks (x, y, z);"; @@ -67,24 +68,23 @@ public void insertMaterial(long time, String userUuid, String levelName, int x, "SELECT id FROM materials WHERE name = ?" + "), ?);"; - try { - PreparedStatement materialStatement = database.prepareStatement(materialQuery); - materialStatement.setString(1, material); - database.queue.add(materialStatement); - - PreparedStatement blockStatement = database.prepareStatement(blockQuery); - blockStatement.setLong(1, time); - blockStatement.setString(2, userUuid); - blockStatement.setString(3, levelName); - blockStatement.setInt(4, x); - blockStatement.setInt(5, y); - blockStatement.setInt(6, z); - blockStatement.setString(7, material); - blockStatement.setInt(8, blockAction); - database.queue.add(blockStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert block into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement materialStatement = connection.prepareStatement(materialQuery)) { + materialStatement.setString(1, material); + materialStatement.executeUpdate(); + } + try (PreparedStatement blockStatement = connection.prepareStatement(blockQuery)) { + blockStatement.setLong(1, time); + blockStatement.setString(2, userUuid); + blockStatement.setString(3, levelName); + blockStatement.setInt(4, x); + blockStatement.setInt(5, y); + blockStatement.setInt(6, z); + blockStatement.setString(7, material); + blockStatement.setInt(8, blockAction); + blockStatement.executeUpdate(); + } + }); } public void insertEntity(long time, String userUuid, String levelName, int x, int y, int z, String entity, int blockAction) { @@ -99,27 +99,27 @@ public void insertEntity(long time, String userUuid, String levelName, int x, in "SELECT id FROM entities WHERE name = ?" + "), ?);"; - - try { - PreparedStatement materialStatement = database.prepareStatement(materialQuery); - PreparedStatement blockStatement = database.prepareStatement(blockQuery); - materialStatement.setString(1, entity); - database.queue.add(materialStatement); - - blockStatement.setLong(1, time); - blockStatement.setString(2, userUuid); - blockStatement.setString(3, levelName); - blockStatement.setInt(4, x); - blockStatement.setInt(5, y); - blockStatement.setInt(6, z); - blockStatement.setString(7, entity); - blockStatement.setInt(8, blockAction); - database.queue.add(blockStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert block into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement materialStatement = connection.prepareStatement(materialQuery)) { + materialStatement.setString(1, entity); + materialStatement.executeUpdate(); + } + try (PreparedStatement blockStatement = connection.prepareStatement(blockQuery)) { + blockStatement.setLong(1, time); + blockStatement.setString(2, userUuid); + blockStatement.setString(3, levelName); + blockStatement.setInt(4, x); + blockStatement.setInt(5, y); + blockStatement.setInt(6, z); + blockStatement.setString(7, entity); + blockStatement.setInt(8, blockAction); + blockStatement.executeUpdate(); + } + }); } + // ... getBlockHistory, getInteractionHistory, etc ... + public List getBlockHistory(String levelName, int x, int y, int z) { List blockHistory = new ArrayList<>(); String query = """ @@ -204,19 +204,20 @@ public void removeInteractionsForPosition(String levelName, int x, int y, int z) ) AND x = ? AND y = ? AND z = ? AND action = 2 """; - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setString(1, levelName); - preparedStatement.setInt(2, x); - preparedStatement.setInt(3, y); - preparedStatement.setInt(4, z); - database.queue.add(preparedStatement); - } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to remove interactions for position", e); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setString(1, levelName); + preparedStatement.setInt(2, x); + preparedStatement.setInt(3, y); + preparedStatement.setInt(4, z); + preparedStatement.executeUpdate(); + } + }); } public List getFilteredBlockHistory(String levelName, FilterList filterList) { + // ... implementation matches original but ensuring imports ... + // Original implementation omitted for brevity as it only reads @Nullable String actions = filterList.getActionString(); @Nullable String users = filterList.getUserString(); @Nullable String includeMaterials = filterList.getIncludeMaterialsString(); @@ -330,4 +331,4 @@ public List getFilteredBlockHistory(String levelName, FilterList filte return List.of(); } } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ChatRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ChatRepository.java index b54865a..bc89d6d 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ChatRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ChatRepository.java @@ -5,6 +5,7 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.database.dialect.MySQLDialect; public class ChatRepository extends Repository { @@ -26,7 +27,7 @@ public void createTable() { "FOREIGN KEY(user) REFERENCES users(id)," + "FOREIGN KEY(level) REFERENCES levels(id)" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -36,7 +37,7 @@ public void createTable() { public void createIndexes() { String sql; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql = "ALTER TABLE chats ADD INDEX coordinates (x, y, z);"; } else { sql = "CREATE INDEX IF NOT EXISTS coordinates ON chats (x, y, z);"; @@ -52,18 +53,17 @@ public void insert(long time, String userUuid, String levelName, int x, int y, i "SELECT id FROM levels WHERE name = ?" + "), ?, ?, ?, ?);"; - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setLong(1, time); - preparedStatement.setString(2, userUuid); - preparedStatement.setString(3, levelName); - preparedStatement.setInt(4, x); - preparedStatement.setInt(5, y); - preparedStatement.setInt(6, z); - preparedStatement.setString(7, message); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert chat into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setLong(1, time); + preparedStatement.setString(2, userUuid); + preparedStatement.setString(3, levelName); + preparedStatement.setInt(4, x); + preparedStatement.setInt(5, y); + preparedStatement.setInt(6, z); + preparedStatement.setString(7, message); + preparedStatement.executeUpdate(); + } + }); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/CommandRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/CommandRepository.java index faebdf9..154d447 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/CommandRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/CommandRepository.java @@ -5,6 +5,7 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.database.dialect.MySQLDialect; public class CommandRepository extends Repository { @@ -26,7 +27,7 @@ public void createTable() { "FOREIGN KEY(user) REFERENCES users(id)," + "FOREIGN KEY(level) REFERENCES levels(id)" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -36,7 +37,7 @@ public void createTable() { public void createIndexes() { String sql; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql = "ALTER TABLE commands ADD INDEX coordinates (x, y, z);"; } else { sql = "CREATE INDEX IF NOT EXISTS coordinates ON commands (x, y, z);"; @@ -52,18 +53,17 @@ public void insert(long time, String userUuid, String levelName, int x, int y, i "SELECT id FROM levels WHERE name = ?" + "), ?, ?, ?, ?);"; - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setLong(1, time); - preparedStatement.setString(2, userUuid); - preparedStatement.setString(3, levelName); - preparedStatement.setInt(4, x); - preparedStatement.setInt(5, y); - preparedStatement.setInt(6, z); - preparedStatement.setString(7, command); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert command into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setLong(1, time); + preparedStatement.setString(2, userUuid); + preparedStatement.setString(3, levelName); + preparedStatement.setInt(4, x); + preparedStatement.setInt(5, y); + preparedStatement.setInt(6, z); + preparedStatement.setString(7, command); + preparedStatement.executeUpdate(); + } + }); } } \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java index 1abdc08..324cfd9 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import com.daqem.grieflogger.database.dialect.MySQLDialect; import org.jetbrains.annotations.Nullable; import com.daqem.grieflogger.GriefLogger; @@ -33,6 +34,7 @@ public ContainerRepository(Database database) { this.database = database; } + // createTable / createIndexes omitted (same as original) public void createTable() { String sql = "CREATE TABLE IF NOT EXISTS containers (" + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + @@ -49,7 +51,7 @@ public void createTable() { "FOREIGN KEY(level) REFERENCES levels(id)," + "FOREIGN KEY(type) REFERENCES materials(id)" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -59,7 +61,7 @@ public void createTable() { public void createIndexes() { String sql; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql = "ALTER TABLE containers ADD INDEX coordinates (x, y, z);"; } else { sql = "CREATE INDEX IF NOT EXISTS coordinates ON containers (x, y, z);"; @@ -85,55 +87,12 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { - try { - PreparedStatement itemStatement = database.prepareStatement(insertItemQuery); - PreparedStatement materialStatement = database.prepareStatement(insertMaterialQuery); - - materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); - database.queue.add(materialStatement); - - itemStatement.setLong(1, time); - itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().location().toString()); - itemStatement.setInt(4, x); - itemStatement.setInt(5, y); - itemStatement.setInt(6, z); - itemStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); - itemStatement.setBytes(8, item.getTagBytes(level)); - itemStatement.setInt(9, item.getCount()); - itemStatement.setInt(10, itemAction); - database.queue.add(itemStatement); - } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to insert item", e); - } - } - } - - public void insertList(long time, String userUuid, Level level, int x, int y, int z, List items, int itemAction) { - String insertMaterialQuery = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; - - String insertItemQuery = "INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) " + - "VALUES(?, (" + - "SELECT id FROM users WHERE uuid = ?" + - "), (" + - "SELECT id FROM levels WHERE name = ?" + - "), ?, ?, ?, (" + - "SELECT id FROM materials WHERE name = ?" + - "), ?, ?, ?);"; - - try { - PreparedStatement itemStatement = database.prepareStatement(insertItemQuery); - PreparedStatement materialStatement = database.prepareStatement(insertMaterialQuery); - - for (SimpleItemStack item : items) { - if (item.isEmpty()) { - continue; - } - ResourceLocation itemLocation = item.getItem().arch$registryName(); - if (itemLocation != null) { + database.queue.add(connection -> { + try (PreparedStatement materialStatement = connection.prepareStatement(insertMaterialQuery)) { materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); - materialStatement.addBatch(); - + materialStatement.executeUpdate(); + } + try (PreparedStatement itemStatement = connection.prepareStatement(insertItemQuery)) { itemStatement.setLong(1, time); itemStatement.setString(2, userUuid); itemStatement.setString(3, level.dimension().location().toString()); @@ -144,17 +103,13 @@ public void insertList(long time, String userUuid, Level level, int x, int y, in itemStatement.setBytes(8, item.getTagBytes(level)); itemStatement.setInt(9, item.getCount()); itemStatement.setInt(10, itemAction); - itemStatement.addBatch(); + itemStatement.executeUpdate(); } - } - database.batchQueue.add(materialStatement); - database.batchQueue.add(itemStatement); - } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to insert item", e); + }); } } - public void insertMap(long time, String userUuid, Level level, int x, int y, int z, Map> itemsMap) { + public void insertList(long time, String userUuid, Level level, int x, int y, int z, List items, int itemAction) { String insertMaterialQuery = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; String insertItemQuery = "INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) " + @@ -166,12 +121,11 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int "SELECT id FROM materials WHERE name = ?" + "), ?, ?, ?);"; - try { - PreparedStatement itemStatement = database.prepareStatement(insertItemQuery); - PreparedStatement materialStatement = database.prepareStatement(insertMaterialQuery); + database.batchQueue.add(connection -> { + try (PreparedStatement itemStatement = connection.prepareStatement(insertItemQuery); + PreparedStatement materialStatement = connection.prepareStatement(insertMaterialQuery)) { - for (Map.Entry> entry : itemsMap.entrySet()) { - for (SimpleItemStack item : entry.getValue()) { + for (SimpleItemStack item : items) { if (item.isEmpty()) { continue; } @@ -189,18 +143,63 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int itemStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); itemStatement.setBytes(8, item.getTagBytes(level)); itemStatement.setInt(9, item.getCount()); - itemStatement.setInt(10, entry.getKey().getId()); + itemStatement.setInt(10, itemAction); itemStatement.addBatch(); } } + materialStatement.executeBatch(); + itemStatement.executeBatch(); } - database.batchQueue.add(materialStatement); - database.batchQueue.add(itemStatement); - } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to insert item", e); - } + }); + } + + public void insertMap(long time, String userUuid, Level level, int x, int y, int z, Map> itemsMap) { + String insertMaterialQuery = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; + + String insertItemQuery = "INSERT INTO containers(time, user, level, x, y, z, type, data, amount, action) " + + "VALUES(?, (" + + "SELECT id FROM users WHERE uuid = ?" + + "), (" + + "SELECT id FROM levels WHERE name = ?" + + "), ?, ?, ?, (" + + "SELECT id FROM materials WHERE name = ?" + + "), ?, ?, ?);"; + + database.batchQueue.add(connection -> { + try (PreparedStatement itemStatement = connection.prepareStatement(insertItemQuery); + PreparedStatement materialStatement = connection.prepareStatement(insertMaterialQuery)) { + + for (Map.Entry> entry : itemsMap.entrySet()) { + for (SimpleItemStack item : entry.getValue()) { + if (item.isEmpty()) { + continue; + } + ResourceLocation itemLocation = item.getItem().arch$registryName(); + if (itemLocation != null) { + materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); + materialStatement.addBatch(); + + itemStatement.setLong(1, time); + itemStatement.setString(2, userUuid); + itemStatement.setString(3, level.dimension().location().toString()); + itemStatement.setInt(4, x); + itemStatement.setInt(5, y); + itemStatement.setInt(6, z); + itemStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); + itemStatement.setBytes(8, item.getTagBytes(level)); + itemStatement.setInt(9, item.getCount()); + itemStatement.setInt(10, entry.getKey().getId()); + itemStatement.addBatch(); + } + } + } + materialStatement.executeBatch(); + itemStatement.executeBatch(); + } + }); } + // ... getHistory, getFilteredContainerHistory (read-only methods, same as original) ... public List getHistory(Level level, int x, int y, int z) { List containerHistory = new ArrayList<>(); String query = """ @@ -396,4 +395,4 @@ public List getFilteredContainerHistory(Level level, FilterList filter return List.of(); } } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/EntityRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/EntityRepository.java index 3833d5f..89b25e0 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/EntityRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/EntityRepository.java @@ -5,6 +5,7 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.database.dialect.MySQLDialect; public class EntityRepository extends Repository { @@ -16,10 +17,10 @@ public EntityRepository(Database database) { public void createTable() { String sql = "CREATE TABLE IF NOT EXISTS entities (" + - "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof MySQLDialect ? " AUTO_INCREMENT" : "") + "," + "name " + database.getDialect().getDataType("text") + " NOT NULL UNIQUE" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -30,12 +31,11 @@ public void createTable() { public void insert(String name) { String query = database.getDialect().getInsertIgnore() + " INTO entities(name) VALUES(?);"; - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setString(1, name); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert entity into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setString(1, name); + preparedStatement.executeUpdate(); + } + }); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java index eb2951f..16d61bd 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Map; +import com.daqem.grieflogger.database.dialect.MySQLDialect; import org.jetbrains.annotations.Nullable; import com.daqem.grieflogger.GriefLogger; @@ -48,7 +49,7 @@ public void createTable() { "FOREIGN KEY(level) REFERENCES levels(id)," + "FOREIGN KEY(type) REFERENCES materials(id)" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -58,7 +59,7 @@ public void createTable() { public void createIndexes() { String sql; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql = "ALTER TABLE items ADD INDEX coordinates (x, y, z);"; } else { sql = "CREATE INDEX IF NOT EXISTS coordinates ON items (x, y, z);"; @@ -83,27 +84,25 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { - try { - PreparedStatement preparedStatement = database.prepareStatement(itemQuery); - PreparedStatement materialStatement = database.prepareStatement(materialQuery); - - materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); - database.queue.add(materialStatement); - - preparedStatement.setLong(1, time); - preparedStatement.setString(2, userUuid); - preparedStatement.setString(3, level.dimension().location().toString()); - preparedStatement.setInt(4, x); - preparedStatement.setInt(5, y); - preparedStatement.setInt(6, z); - preparedStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); - preparedStatement.setBytes(8, item.getTagBytes(level)); - preparedStatement.setInt(9, item.getCount()); - preparedStatement.setInt(10, action); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert item into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement materialStatement = connection.prepareStatement(materialQuery)) { + materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); + materialStatement.executeUpdate(); + } + try (PreparedStatement preparedStatement = connection.prepareStatement(itemQuery)) { + preparedStatement.setLong(1, time); + preparedStatement.setString(2, userUuid); + preparedStatement.setString(3, level.dimension().location().toString()); + preparedStatement.setInt(4, x); + preparedStatement.setInt(5, y); + preparedStatement.setInt(6, z); + preparedStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); + preparedStatement.setBytes(8, item.getTagBytes(level)); + preparedStatement.setInt(9, item.getCount()); + preparedStatement.setInt(10, action); + preparedStatement.executeUpdate(); + } + }); } } @@ -119,39 +118,38 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int "SELECT id FROM materials WHERE name = ?" + "), ?, ?, ?);"; - try { - PreparedStatement itemStatement = database.prepareStatement(insertItemQuery); - PreparedStatement materialStatement = database.prepareStatement(insertMaterialQuery); - - for (Map.Entry> entry : itemsMap.entrySet()) { - for (SimpleItemStack item : entry.getValue()) { - if (item.isEmpty()) { - continue; - } - ResourceLocation itemLocation = item.getItem().arch$registryName(); - if (itemLocation != null) { - materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); - materialStatement.addBatch(); - - itemStatement.setLong(1, time); - itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().location().toString()); - itemStatement.setInt(4, x); - itemStatement.setInt(5, y); - itemStatement.setInt(6, z); - itemStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); - itemStatement.setBytes(8, item.getTagBytes(level)); - itemStatement.setInt(9, item.getCount()); - itemStatement.setInt(10, entry.getKey().getId()); - itemStatement.addBatch(); + database.batchQueue.add(connection -> { + try (PreparedStatement itemStatement = connection.prepareStatement(insertItemQuery); + PreparedStatement materialStatement = connection.prepareStatement(insertMaterialQuery)) { + + for (Map.Entry> entry : itemsMap.entrySet()) { + for (SimpleItemStack item : entry.getValue()) { + if (item.isEmpty()) { + continue; + } + ResourceLocation itemLocation = item.getItem().arch$registryName(); + if (itemLocation != null) { + materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); + materialStatement.addBatch(); + + itemStatement.setLong(1, time); + itemStatement.setString(2, userUuid); + itemStatement.setString(3, level.dimension().location().toString()); + itemStatement.setInt(4, x); + itemStatement.setInt(5, y); + itemStatement.setInt(6, z); + itemStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); + itemStatement.setBytes(8, item.getTagBytes(level)); + itemStatement.setInt(9, item.getCount()); + itemStatement.setInt(10, entry.getKey().getId()); + itemStatement.addBatch(); + } } } + materialStatement.executeBatch(); + itemStatement.executeBatch(); } - database.batchQueue.add(materialStatement); - database.batchQueue.add(itemStatement); - } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to insert item", e); - } + }); } public List getFilteredItemHistory(Level level, FilterList filterList) { @@ -258,4 +256,4 @@ public List getFilteredItemHistory(Level level, FilterList filterLi return List.of(); } } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/LevelRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/LevelRepository.java index 67c0293..77920fc 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/LevelRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/LevelRepository.java @@ -5,6 +5,7 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.database.dialect.MySQLDialect; public class LevelRepository extends Repository { @@ -16,10 +17,10 @@ public LevelRepository(Database database) { public void createTable() { String sql = "CREATE TABLE IF NOT EXISTS levels (" + - "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof MySQLDialect ? " AUTO_INCREMENT" : "") + "," + "name " + database.getDialect().getDataType("text") + " NOT NULL UNIQUE" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -30,12 +31,11 @@ public void createTable() { public void insert(String name) { String query = database.getDialect().getInsertIgnore() + " INTO levels(name) VALUES(?);"; - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setString(1, name); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert level into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setString(1, name); + preparedStatement.executeUpdate(); + } + }); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/MaterialRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/MaterialRepository.java index 9ae4cc7..6f8d7a5 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/MaterialRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/MaterialRepository.java @@ -5,6 +5,7 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.database.dialect.MySQLDialect; public class MaterialRepository extends Repository { @@ -16,10 +17,10 @@ public MaterialRepository(Database database) { public void createTable() { String sql = "CREATE TABLE IF NOT EXISTS materials (" + - "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof MySQLDialect ? " AUTO_INCREMENT" : "") + "," + "name " + database.getDialect().getDataType("text") + " NOT NULL UNIQUE" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -30,12 +31,11 @@ public void createTable() { public void insert(String material) { String query = database.getDialect().getInsertIgnore() + " INTO materials(name) VALUES(?);"; - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setString(1, material); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert material into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setString(1, material); + preparedStatement.executeUpdate(); + } + }); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java index 2ddca29..f3c2e2e 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/SessionRepository.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; +import com.daqem.grieflogger.database.dialect.MySQLDialect; import org.jetbrains.annotations.Nullable; import com.daqem.grieflogger.GriefLogger; @@ -34,7 +35,7 @@ public void createTable() { "FOREIGN KEY(user) REFERENCES users(id)," + "FOREIGN KEY(level) REFERENCES levels(id)" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -44,7 +45,7 @@ public void createTable() { public void createIndexes() { String sql; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql = "ALTER TABLE sessions ADD INDEX coordinates (x, y, z);"; } else { sql = "CREATE INDEX IF NOT EXISTS coordinates ON sessions (x, y, z);"; @@ -60,19 +61,18 @@ public void insert(long time, String userUuid, String levelName, int x, int y, i "SELECT id FROM levels WHERE name = ?" + "), ?, ?, ?, ?);"; - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setLong(1, time); - preparedStatement.setString(2, userUuid); - preparedStatement.setString(3, levelName); - preparedStatement.setInt(4, x); - preparedStatement.setInt(5, y); - preparedStatement.setInt(6, z); - preparedStatement.setInt(7, sessionAction); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert session into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setLong(1, time); + preparedStatement.setString(2, userUuid); + preparedStatement.setString(3, levelName); + preparedStatement.setInt(4, x); + preparedStatement.setInt(5, y); + preparedStatement.setInt(6, z); + preparedStatement.setInt(7, sessionAction); + preparedStatement.executeUpdate(); + } + }); } public List getFilteredSessionHistory(String levelName, FilterList filterList) { @@ -156,4 +156,4 @@ public List getFilteredSessionHistory(String levelName, FilterLi return List.of(); } } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java index adf21d6..71f2468 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java @@ -8,6 +8,7 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.database.dialect.MySQLDialect; public class UserRepository extends Repository { @@ -19,11 +20,11 @@ public UserRepository(Database database) { public void createTable() { String sql = "CREATE TABLE IF NOT EXISTS users (" + - "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof MySQLDialect ? " AUTO_INCREMENT" : "") + "," + "name " + database.getDialect().getDataType("text") + " NOT NULL," + "uuid " + database.getDialect().getDataType("text") + " DEFAULT NULL UNIQUE" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -35,28 +36,26 @@ public void insertOrUpdateName(String name, String uuid) { String query = "INSERT INTO users(name, uuid) VALUES(?, ?) " + database.getDialect().getOnConflictUpdate("uuid", "name = ?"); - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setString(1, name); - preparedStatement.setString(2, uuid); - preparedStatement.setString(3, name); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert username into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setString(1, name); + preparedStatement.setString(2, uuid); + preparedStatement.setString(3, name); + preparedStatement.executeUpdate(); + } + }); } public void insertNonPlayer(String name) { String query = "INSERT INTO users(name) VALUES('%s') " + database.getDialect().getOnConflictDoNothing("name"); - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setString(1, name); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert username into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setString(1, name); + preparedStatement.executeUpdate(); + } + }); } public Map getAllUsernames() { @@ -78,4 +77,4 @@ public Map getAllUsernames() { } return usernames; } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/UsernameRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/UsernameRepository.java index 08119cd..f0f2d95 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/UsernameRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/UsernameRepository.java @@ -5,6 +5,7 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.database.dialect.MySQLDialect; public class UsernameRepository extends Repository { @@ -16,13 +17,13 @@ public UsernameRepository(Database database) { public void createTable() { String sql = "CREATE TABLE IF NOT EXISTS usernames (" + - "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect ? " AUTO_INCREMENT" : "") + "," + + "id " + database.getDialect().getDataType("integer") + " PRIMARY KEY" + (database.getDialect() instanceof MySQLDialect ? " AUTO_INCREMENT" : "") + "," + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + "uuid " + database.getDialect().getDataType("varchar") + "(36) NOT NULL," + "name " + database.getDialect().getDataType("varchar") + "(16) NOT NULL," + "UNIQUE(uuid, name)" + ")"; - if (database.getDialect() instanceof com.daqem.grieflogger.database.dialect.MySQLDialect) { + if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; } else { sql += ";"; @@ -33,14 +34,13 @@ public void createTable() { public void insert(long time, String uuid, String name) { String query = database.getDialect().getInsertIgnore() + " INTO usernames(time, uuid, name) VALUES(?, ?, ?);"; - try { - PreparedStatement preparedStatement = database.prepareStatement(query); - preparedStatement.setLong(1, time); - preparedStatement.setString(2, uuid); - preparedStatement.setString(3, name); - database.queue.add(preparedStatement); - } catch (SQLException exception) { - GriefLogger.LOGGER.error("Failed to insert username into database", exception); - } + database.queue.add(connection -> { + try (PreparedStatement preparedStatement = connection.prepareStatement(query)) { + preparedStatement.setLong(1, time); + preparedStatement.setString(2, uuid); + preparedStatement.setString(3, name); + preparedStatement.executeUpdate(); + } + }); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java b/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java index e33f84b..afd2313 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java @@ -11,7 +11,7 @@ public class EntityEvents { public static void registerEvents() { EntityEvent.LIVING_DEATH.register((entity, source) -> { - if (source.getEntity() instanceof ServerPlayer serverPlayer) { + if (source != null && source.getEntity() instanceof ServerPlayer serverPlayer) { ResourceLocation entityLocation = entity.getType().arch$registryName(); if (entityLocation != null) { Services.BLOCK.insertEntity( From b3e814c32e8e6d1e0ea310cdf02e3866cb6758bb Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sun, 23 Nov 2025 00:00:19 +0100 Subject: [PATCH 35/52] feat: add permissions support --- .../grieflogger/GriefLoggerPermissions.java | 21 +++++++ .../command/GriefLoggerCommand.java | 5 +- .../grieflogger/command/InspectCommand.java | 5 +- .../grieflogger/command/LookupCommand.java | 14 +---- .../grieflogger/command/PageCommand.java | 4 +- .../event/block/BreakBlockEvent.java | 6 +- fabric/build.gradle | 1 + .../fabric/GriefLoggerPermissionsImpl.java | 21 +++++++ .../neoforge/GriefLoggerPermissionsImpl.java | 56 +++++++++++++++++++ 9 files changed, 116 insertions(+), 17 deletions(-) create mode 100644 common/src/main/java/com/daqem/grieflogger/GriefLoggerPermissions.java create mode 100644 fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java create mode 100644 neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerPermissionsImpl.java diff --git a/common/src/main/java/com/daqem/grieflogger/GriefLoggerPermissions.java b/common/src/main/java/com/daqem/grieflogger/GriefLoggerPermissions.java new file mode 100644 index 0000000..6147634 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/GriefLoggerPermissions.java @@ -0,0 +1,21 @@ +package com.daqem.grieflogger; + +import dev.architectury.injectables.annotations.ExpectPlatform; +import net.minecraft.commands.CommandSourceStack; + +public class GriefLoggerPermissions { + + /** + * Checks permissions using the platform's specific API (LuckPerms/PermissionsAPI) + * if available. Otherwise, falls back to the standard OP level check. + * + * @param source The command source. + * @param permissionNode The string permission node (e.g., "grieflogger.command.inspect"). + * @param fallbackLevel The OP level to require if the permission API is missing (usually 2). + * @return True if the source has permission. + */ + @ExpectPlatform + public static boolean check(CommandSourceStack source, String permissionNode, int fallbackLevel) { + throw new AssertionError(); + } +} diff --git a/common/src/main/java/com/daqem/grieflogger/command/GriefLoggerCommand.java b/common/src/main/java/com/daqem/grieflogger/command/GriefLoggerCommand.java index 0d30797..a98b795 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/GriefLoggerCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/GriefLoggerCommand.java @@ -1,5 +1,6 @@ package com.daqem.grieflogger.command; +import com.daqem.grieflogger.GriefLoggerPermissions; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import net.minecraft.commands.CommandSourceStack; @@ -18,9 +19,9 @@ public static void registerCommand(CommandDispatcher dispatc private static LiteralArgumentBuilder commandWithPrefix(String prefix) { return Commands.literal(prefix) - .requires(source -> source.hasPermission(2)) + .requires(source -> GriefLoggerPermissions.check(source, "grieflogger.command", 2)) .then(INSPECT.getCommand()) .then(LOOKUP.getCommand()) .then(PAGE.getCommand()); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/command/InspectCommand.java b/common/src/main/java/com/daqem/grieflogger/command/InspectCommand.java index df89424..89c0651 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/InspectCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/InspectCommand.java @@ -1,6 +1,7 @@ package com.daqem.grieflogger.command; import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.GriefLoggerPermissions; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import net.minecraft.commands.CommandSourceStack; @@ -8,10 +9,10 @@ public class InspectCommand implements ICommand { - @Override public LiteralArgumentBuilder getCommand() { return Commands.literal("inspect") + .requires(source -> GriefLoggerPermissions.check(source, "grieflogger.command.inspect", 2)) .executes(context -> inspect(context.getSource())); } @@ -22,4 +23,4 @@ private static int inspect(CommandSourceStack source) { } return 1; } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java index 151177f..5c397c3 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java @@ -1,6 +1,7 @@ package com.daqem.grieflogger.command; import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.GriefLoggerPermissions; import com.daqem.grieflogger.command.argument.FilterArgument; import com.daqem.grieflogger.command.filter.FilterList; import com.daqem.grieflogger.command.filter.IFilter; @@ -18,7 +19,6 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; -import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; @@ -32,23 +32,23 @@ public class LookupCommand implements ICommand { @Override public LiteralArgumentBuilder getCommand() { return Commands.literal("lookup") + .requires(source -> GriefLoggerPermissions.check(source, "grieflogger.command.lookup", 2)) .then(Commands.argument("filters", StringArgumentType.greedyString()) .suggests(LookupCommand::suggestFilters) .executes(context -> lookup(context.getSource(), StringArgumentType.getString(context, "filters")))) .executes(context -> lookup(context.getSource(), "")); } + // ... rest of the methods (lookup, suggestFilters, getHistory) remain exactly the same as original ... private static int lookup(CommandSourceStack source, String filtersInput) { List filters = new ArrayList<>(); if (!filtersInput.isBlank()) { - // Split by whitespace to get individual filters String[] parts = filtersInput.split("\\s+"); FilterArgument parser = new FilterArgument(); for (String part : parts) { try { - // Manually parse each part using your existing logic IFilter filter = parser.parse(new StringReader(part)); filters.add(filter); } catch (CommandSyntaxException e) { @@ -61,7 +61,6 @@ private static int lookup(CommandSourceStack source, String filtersInput) { return lookup(source, new FilterList(filters, source)); } - @SuppressWarnings("SameReturnValue") private static int lookup(CommandSourceStack source, FilterList filterList) { if (source.getPlayer() instanceof GriefLoggerServerPlayer player) { ThreadManager.submit(() -> getHistory(source.getLevel(), filterList), filteredHistory -> { @@ -80,25 +79,18 @@ private static int lookup(CommandSourceStack source, FilterList filterList) { private static CompletableFuture suggestFilters(CommandContext context, SuggestionsBuilder builder) { String remaining = builder.getRemaining(); - // Find the last word (since greedyString gives us the whole line) int lastSpace = remaining.lastIndexOf(' '); - - // Create a new builder starting at the last word so suggestions replace only that word int start = builder.getStart() + lastSpace + 1; SuggestionsBuilder offsetBuilder = builder.createOffset(start); - - // Reuse your existing FilterArgument suggestion logic return new FilterArgument().listSuggestions(context, offsetBuilder); } private static List getHistory(Level level, FilterList filterList) { List history = new ArrayList<>(); - history.addAll(Services.BLOCK.getFilteredBlockHistory(level, filterList)); history.addAll(Services.SESSION.getFilteredSessionHistory(level, filterList)); history.addAll(Services.CONTAINER.getFilteredContainerHistory(level, filterList)); history.addAll(Services.ITEM.getFilteredItemHistory(level, filterList)); - return history.stream() .sorted((x, y) -> Long.compare(y.getTime().time(), x.getTime().time())) .collect(Collectors.toList()); diff --git a/common/src/main/java/com/daqem/grieflogger/command/PageCommand.java b/common/src/main/java/com/daqem/grieflogger/command/PageCommand.java index b9ca9aa..1d20b09 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/PageCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/PageCommand.java @@ -1,6 +1,7 @@ package com.daqem.grieflogger.command; import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.GriefLoggerPermissions; import com.daqem.grieflogger.command.page.Page; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import com.mojang.brigadier.arguments.IntegerArgumentType; @@ -16,6 +17,7 @@ public class PageCommand implements ICommand { @Override public LiteralArgumentBuilder getCommand() { return Commands.literal("page") + .requires(source -> GriefLoggerPermissions.check(source, "grieflogger.command.page", 2)) .then(Commands.argument("page", IntegerArgumentType.integer()) .executes(context -> page(context.getSource(), IntegerArgumentType.getInteger(context, "page")))); } @@ -32,4 +34,4 @@ private static int page(CommandSourceStack source, int page) { } return 1; } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/BreakBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/BreakBlockEvent.java index 486c4f5..774487c 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/BreakBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/BreakBlockEvent.java @@ -16,6 +16,10 @@ import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; +// [ADD THESE IMPORTS] +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; + public class BreakBlockEvent extends AbstractEvent { public static EventResult breakBlock(Level level, BlockPos pos, BlockState state, ServerPlayer player, @Nullable IntValue xp) { @@ -42,4 +46,4 @@ public static EventResult breakBlock(Level level, BlockPos pos, BlockState state } return pass(); } -} +} \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index 50a7ce7..f51f29d 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -47,6 +47,7 @@ dependencies { modImplementation "curse.maven:yaml-config-1128669:${project.config_library_file_fabric}" modRuntimeOnly "curse.maven:ui-933200:${project.ui_library_file_fabric}" + modCompileOnly "me.lucko:fabric-permissions-api:0.3.1" } processResources { diff --git a/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java b/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java new file mode 100644 index 0000000..401554e --- /dev/null +++ b/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java @@ -0,0 +1,21 @@ +package com.daqem.grieflogger.fabric; + +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.commands.CommandSourceStack; + +public class GriefLoggerPermissionsImpl { + + private static final boolean PERMISSIONS_API_LOADED = FabricLoader.getInstance().isModLoaded("fabric-permissions-api-v0"); + + public static boolean check(CommandSourceStack source, String permissionNode, int fallbackLevel) { + if (PERMISSIONS_API_LOADED) { + try { + return me.lucko.fabric.api.permissions.v0.Permissions.check(source, permissionNode, fallbackLevel); + } catch (Throwable t) { + // Fallback if something goes wrong with the API + return source.hasPermission(fallbackLevel); + } + } + return source.hasPermission(fallbackLevel); + } +} \ No newline at end of file diff --git a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerPermissionsImpl.java b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerPermissionsImpl.java new file mode 100644 index 0000000..1c4baab --- /dev/null +++ b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerPermissionsImpl.java @@ -0,0 +1,56 @@ +package com.daqem.grieflogger.neoforge; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.server.permission.PermissionAPI; +import net.neoforged.neoforge.server.permission.nodes.PermissionNode; +import net.neoforged.neoforge.server.permission.nodes.PermissionTypes; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class GriefLoggerPermissionsImpl { + + // Cache dynamic nodes so we don't re-create them constantly, + // though ideally, nodes should be registered during startup event. + // For simple compatibility without heavy registration logic, checking string nodes + // often requires the permission manager (LuckPerms) to handle unregistered nodes gracefully. + private static final Map> NODES = new ConcurrentHashMap<>(); + + public static boolean check(CommandSourceStack source, String permissionNode, int fallbackLevel) { + if (source.getEntity() instanceof ServerPlayer player) { + // LuckPerms on NeoForge can usually intercept permission checks even if + // the node isn't strictly registered in the PermissionAPI registry, + // depending on how the PermissionHandler is implemented. + // However, the "Correct" way is to use PermissionAPI.getPermission. + + // If you want strict node registration, you'd need a registry event. + // For lightweight compat, we try to get the permission value. + + // Create a temporary node wrapper or lookup existing (Logic depends on if you want + // to pre-register specific nodes or allow dynamic strings). + + PermissionNode node = NODES.computeIfAbsent(permissionNode, id -> + new PermissionNode<>( + "grieflogger", + id.replace("grieflogger.", ""), + PermissionTypes.BOOLEAN, + (p, uuid, context) -> false + ) + ); + + // Note: Using PermissionAPI with unregistered nodes might warn or default to false + // depending on the implementation installed (e.g. Default vs LuckPerms). + // LuckPerms usually handles unregistered lookups fine. + try { + return PermissionAPI.getPermission(player, node); + } catch (Exception e) { + // Fallback to OP if PermissionAPI fails or node is unknown/unregistered context + return source.hasPermission(fallbackLevel); + } + } + + // Console / Command Blocks + return source.hasPermission(fallbackLevel); + } +} \ No newline at end of file From e92ad9a5b3c9ffd60430a38fa9571f4af615215f Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sun, 23 Nov 2025 00:34:42 +0100 Subject: [PATCH 36/52] fix: resolve classloader issues in worker threads and optimize database queue --- .../grieflogger/database/queue/IQueue.java | 1 + .../grieflogger/database/queue/Queue.java | 5 +++++ .../daqem/grieflogger/event/TickEvents.java | 21 ++++++++++++------- .../grieflogger/thread/ThreadManager.java | 5 ++++- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/database/queue/IQueue.java b/common/src/main/java/com/daqem/grieflogger/database/queue/IQueue.java index 82afe2a..460ccf1 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/queue/IQueue.java +++ b/common/src/main/java/com/daqem/grieflogger/database/queue/IQueue.java @@ -5,4 +5,5 @@ public interface IQueue { void add(SqlTask task); void execute(); void hello(); + boolean isEmpty(); } \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/database/queue/Queue.java b/common/src/main/java/com/daqem/grieflogger/database/queue/Queue.java index c896672..0dea191 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/queue/Queue.java +++ b/common/src/main/java/com/daqem/grieflogger/database/queue/Queue.java @@ -47,4 +47,9 @@ public void hello() { } }); } + + @Override + public boolean isEmpty() { + return this.queue.isEmpty(); + } } \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/event/TickEvents.java b/common/src/main/java/com/daqem/grieflogger/event/TickEvents.java index 1aedb5d..5fba7da 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/TickEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/TickEvents.java @@ -23,23 +23,28 @@ public static void registerEvents() { } } ); + if (lastTick % GriefLoggerConfig.queueFrequency.get() == 0) { - ThreadManager.execute(() -> { - Database database = GriefLogger.getDatabase(); - database.queue.execute(); - database.batchQueue.execute(); - }); + Database database = GriefLogger.getDatabase(); + if (database != null && (!database.queue.isEmpty() || !database.batchQueue.isEmpty())) { + ThreadManager.execute(() -> { + database.queue.execute(); + database.batchQueue.execute(); + }); + } } if (lastTick % GriefLoggerConfig.helloFrequency.get() == 0) { ThreadManager.execute(() -> { - //Send hello packet to server to keep connection alive + // Send hello packet to server to keep connection alive Database database = GriefLogger.getDatabase(); - database.queue.hello(); + if (database != null) { + database.queue.hello(); + } }); } lastTick++; }); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java b/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java index 17455dd..b93cb84 100644 --- a/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java +++ b/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java @@ -11,7 +11,10 @@ public class ThreadManager { - private static final ExecutorService executor = Executors.newWorkStealingPool(); + private static final ExecutorService executor = Executors.newFixedThreadPool( + Runtime.getRuntime().availableProcessors(), + new GriefLoggerThreadFactory() + ); private static final Map, OnComplete> onCompleteMap = new HashMap<>(); public static void execute(Runnable runnable) { From 85c5bcebeaa8d065232a6086e525ecfcdf149c52 Mon Sep 17 00:00:00 2001 From: DAQEM Date: Sun, 23 Nov 2025 01:37:31 +0100 Subject: [PATCH 37/52] feat: add armor stand support --- .../database/repository/BlockRepository.java | 22 +++++----- .../daqem/grieflogger/event/EntityEvents.java | 6 +++ .../grieflogger/mixin/MixinArmorStand.java | 42 +++++++++++++++++++ .../grieflogger/model/action/BlockAction.java | 5 ++- .../assets/grieflogger/lang/en_us.json | 1 + .../resources/grieflogger-common.mixins.json | 1 + 6 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java index 781819d..595a4a9 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/BlockRepository.java @@ -35,8 +35,7 @@ public void createTable() { "type " + database.getDialect().getDataType("integer") + " NOT NULL," + "action " + database.getDialect().getDataType("integer") + " NOT NULL," + "FOREIGN KEY(user) REFERENCES users(id)," + - "FOREIGN KEY(level) REFERENCES levels(id)," + - "FOREIGN KEY(type) REFERENCES materials(id)" + + "FOREIGN KEY(level) REFERENCES levels(id)" + ")"; if (database.getDialect() instanceof MySQLDialect) { sql += " ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4;"; @@ -118,8 +117,6 @@ public void insertEntity(long time, String userUuid, String levelName, int x, in }); } - // ... getBlockHistory, getInteractionHistory, etc ... - public List getBlockHistory(String levelName, int x, int y, int z) { List blockHistory = new ArrayList<>(); String query = """ @@ -161,14 +158,17 @@ public List getBlockHistory(String levelName, int x, int y, int z) { public List getInteractionHistory(String levelName, int x, int y, int z) { List blockHistory = new ArrayList<>(); String query = """ - SELECT blocks.time, users.name, users.uuid, blocks.x, blocks.y, blocks.z, materials.name, blocks.action + SELECT blocks.time, users.name, users.uuid, blocks.x, blocks.y, blocks.z, + CASE WHEN blocks.action = 4 THEN entities.name ELSE materials.name END, + blocks.action FROM blocks INNER JOIN users ON blocks.user = users.id INNER JOIN levels ON blocks.level = ( SELECT id FROM levels WHERE name = ? ) - INNER JOIN materials ON blocks.type = materials.id - WHERE blocks.level = levels.id AND blocks.x = ? AND blocks.y = ? AND blocks.z = ? AND blocks.action = 2 + LEFT JOIN materials ON blocks.type = materials.id AND blocks.action = 2 + LEFT JOIN entities ON blocks.type = entities.id AND blocks.action = 4 + WHERE blocks.level = levels.id AND blocks.x = ? AND blocks.y = ? AND blocks.z = ? AND (blocks.action = 2 OR blocks.action = 4) ORDER BY blocks.time DESC """; @@ -216,8 +216,6 @@ public void removeInteractionsForPosition(String levelName, int x, int y, int z) } public List getFilteredBlockHistory(String levelName, FilterList filterList) { - // ... implementation matches original but ensuring imports ... - // Original implementation omitted for brevity as it only reads @Nullable String actions = filterList.getActionString(); @Nullable String users = filterList.getUserString(); @Nullable String includeMaterials = filterList.getIncludeMaterialsString(); @@ -232,7 +230,7 @@ public List getFilteredBlockHistory(String levelName, FilterList filte blocks.y, blocks.z, CASE - WHEN blocks.action = 3 THEN entities.name + WHEN blocks.action = 3 OR blocks.action = 4 THEN entities.name ELSE materials.name END AS type_name, blocks.action @@ -240,8 +238,8 @@ public List getFilteredBlockHistory(String levelName, FilterList filte blocks INNER JOIN users ON blocks.user = users.id INNER JOIN levels ON blocks.level = levels.id - LEFT JOIN materials ON blocks.type = materials.id AND blocks.action != 3 - LEFT JOIN entities ON blocks.type = entities.id AND blocks.action = 3 + LEFT JOIN materials ON blocks.type = materials.id AND blocks.action != 3 AND blocks.action != 4 + LEFT JOIN entities ON blocks.type = entities.id AND (blocks.action = 3 OR blocks.action = 4) WHERE levels.name = ? AND blocks.time > ? diff --git a/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java b/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java index afd2313..f21af96 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java @@ -2,10 +2,16 @@ import com.daqem.grieflogger.database.service.Services; import com.daqem.grieflogger.model.action.BlockAction; +import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import dev.architectury.event.EventResult; import dev.architectury.event.events.common.EntityEvent; +import dev.architectury.event.events.common.InteractionEvent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.decoration.ArmorStand; + +import java.util.List; public class EntityEvents { diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java new file mode 100644 index 0000000..ddf0ac4 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java @@ -0,0 +1,42 @@ +package com.daqem.grieflogger.mixin; + +import com.daqem.grieflogger.database.service.Services; +import com.daqem.grieflogger.model.action.BlockAction; +import com.daqem.grieflogger.player.GriefLoggerServerPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ArmorStand.class) +public abstract class MixinArmorStand extends LivingEntity { + + protected MixinArmorStand(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject(method = "interactAt", at = @At("RETURN")) + private void onInteractAt(Player player, Vec3 vec3, InteractionHand interactionHand, CallbackInfoReturnable cir) { + if ((cir.getReturnValue() == InteractionResult.SUCCESS || cir.getReturnValue() == InteractionResult.SUCCESS_SERVER) && player instanceof GriefLoggerServerPlayer glPlayer) { + ResourceLocation entityLocation = this.getType().arch$registryName(); + if (entityLocation != null) { + Services.BLOCK.insertEntity( + glPlayer.grieflogger$asServerPlayer().getUUID(), + this.level().dimension().location().toString(), + this.blockPosition(), + entityLocation.toString(), + BlockAction.INTERACT_ENTITY + ); + } + } + } +} diff --git a/common/src/main/java/com/daqem/grieflogger/model/action/BlockAction.java b/common/src/main/java/com/daqem/grieflogger/model/action/BlockAction.java index 77eeba2..80bf945 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/action/BlockAction.java +++ b/common/src/main/java/com/daqem/grieflogger/model/action/BlockAction.java @@ -6,7 +6,8 @@ public enum BlockAction implements IAction { BREAK_BLOCK(0, Operation.REMOVE), PLACE_BLOCK(1, Operation.ADD), INTERACT_BLOCK(2, Operation.NEUTRAL), - KILL_ENTITY(3, Operation.REMOVE); + KILL_ENTITY(3, Operation.REMOVE), + INTERACT_ENTITY(4, Operation.NEUTRAL); private final int id; private final Operation operation; @@ -34,4 +35,4 @@ public static BlockAction fromId(int id) { } return null; } -} +} \ No newline at end of file diff --git a/common/src/main/resources/assets/grieflogger/lang/en_us.json b/common/src/main/resources/assets/grieflogger/lang/en_us.json index 6466263..ff59ec8 100644 --- a/common/src/main/resources/assets/grieflogger/lang/en_us.json +++ b/common/src/main/resources/assets/grieflogger/lang/en_us.json @@ -9,6 +9,7 @@ "grieflogger.action.place_block.past": "placed", "grieflogger.action.interact_block.past": "clicked", "grieflogger.action.kill_entity.past": "killed", + "grieflogger.action.interact_entity.past": "clicked", "grieflogger.action.add_item.past": "added", "grieflogger.action.remove_item.past": "removed", "grieflogger.action.drop_item.past": "dropped", diff --git a/common/src/main/resources/grieflogger-common.mixins.json b/common/src/main/resources/grieflogger-common.mixins.json index 61471d6..fab1c4f 100644 --- a/common/src/main/resources/grieflogger-common.mixins.json +++ b/common/src/main/resources/grieflogger-common.mixins.json @@ -7,6 +7,7 @@ ], "mixins": [ "ItemMixin", + "MixinArmorStand", "MixinBucketItem", "MixinItemStack", "MixinServerPlayer", From 365073a122636023d068f2b2ed21163143611fd0 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Sat, 20 Dec 2025 11:51:56 +0100 Subject: [PATCH 38/52] feat: update gradle setup to new format --- build.gradle | 4 +++ common/build.gradle | 18 ++++++++----- fabric/build.gradle | 59 ++++++++++++++++++++++++++++++++++++++----- gradle.properties | 16 ++++-------- neoforge/build.gradle | 56 +++++++++++++++++++++++++++++++++++----- 5 files changed, 124 insertions(+), 29 deletions(-) diff --git a/build.gradle b/build.gradle index e58e7c8..f87ca4b 100644 --- a/build.gradle +++ b/build.gradle @@ -37,6 +37,10 @@ subprojects { } } + repositories { + maven { url "https://maven.daqem.com/snapshots/" } + } + dependencies { minecraft "net.minecraft:minecraft:$rootProject.minecraft_version" mappings loom.officialMojangMappings() diff --git a/common/build.gradle b/common/build.gradle index 9d047d9..8d808e8 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -13,19 +13,25 @@ dependencies { // Remove the next line if you don't want to depend on the API modApi "dev.architectury:architectury:${rootProject.architectury_version}" - compileOnlyApi "curse.maven:yaml-config-1128669:${project.config_library_file_fabric}-sources-${project.config_library_file_fabric_sources}" + modImplementation "com.daqem.yamlconfig:yamlconfig-common:${project.config_library_version}" } publishing { publications { - mavenCommon(MavenPublication) { - artifactId = rootProject.archives_base_name + mavenFabric(MavenPublication) { + groupId = rootProject.maven_group + artifactId = rootProject.archives_base_name + "-common" from components.java } } - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. repositories { - // Add repositories to publish to here. + maven { + url = project.version.contains('-PR') ? 'https://maven.daqem.com/snapshots' : 'https://maven.daqem.com/releases' + credentials { + username = System.getenv("MAVEN_USER") + password = System.getenv("MAVEN_PASS") + } + } } -} +} \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index f51f29d..a0d01d9 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,6 +1,3 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import NativeTransformer - plugins { id "com.github.johnrengelman.shadow" id "com.matthewprenger.cursegradle" version "1.4.0" @@ -12,6 +9,11 @@ architectury { fabric() } +loom { + //noinspection GroovyAccessibility + accessWidenerPath = project(":common").loom.accessWidenerPath +} + configurations { common { canBeResolved = true @@ -44,8 +46,8 @@ dependencies { modImplementation "com.mysql:mysql-connector-j:${project.mysql_version}" shadowBundle "com.mysql:mysql-connector-j:${project.mysql_version}" - modImplementation "curse.maven:yaml-config-1128669:${project.config_library_file_fabric}" - modRuntimeOnly "curse.maven:ui-933200:${project.ui_library_file_fabric}" + modRuntimeOnly "com.daqem.uilib:uilib-neoforge:${project.ui_library_version}" + modImplementation "com.daqem.yamlconfig:yamlconfig-neoforge:${project.config_library_version}" modCompileOnly "me.lucko:fabric-permissions-api:0.3.1" } @@ -92,14 +94,59 @@ shadowJar { } remapJar { + injectAccessWidener = true input.set shadowJar.archiveFile - archiveClassifier = "fabric" + dependsOn shadowJar + archiveClassifier = null +} + +task renameJarForPublication(type: Zip, dependsOn: remapJar) { + from remapJar.archiveFile.map { zipTree(it) } + archiveExtension = "jar" + metadataCharset "UTF-8" + destinationDirectory = base.libsDirectory + archiveClassifier = project.name +} + + +assemble.dependsOn renameJarForPublication + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } } remapSourcesJar { archiveClassifier = "fabric-sources" } +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenFabric(MavenPublication) { + groupId = rootProject.maven_group + artifactId = rootProject.archives_base_name + "-fabric" + from components.java + } + } + + repositories { + maven { + url = project.version.contains('-PR') ? 'https://maven.daqem.com/snapshots' : 'https://maven.daqem.com/releases' + credentials { + username = System.getenv("MAVEN_USER") + password = System.getenv("MAVEN_PASS") + } + } + } +} + curseforge { apiKey = System.getenv("CURSEFORGE_API_KEY") project { diff --git a/gradle.properties b/gradle.properties index 360d096..bfe7afe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,11 +1,11 @@ org.gradle.jvmargs=-Xmx4096M enabled_platforms=fabric,neoforge -maven_group=com.daqem +maven_group=com.daqem.grieflogger archives_base_name=grieflogger # Project -mod_version=1.2.9-1.21.9 +mod_version=18.0.0-PR1 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. @@ -32,22 +32,16 @@ fabric_loader_version=0.17.2 fabric_api_version=0.134.0+1.21.9 # NeoForge -neoforge_version=21.9.9-beta +neoforge_version=21.9.16-beta neoforge_loader_version=1 # Dependencies architectury_version=18.0.3 - -config_library_version=1.3.2-1.21.9 -config_library_file_fabric=7061661 -config_library_file_fabric_sources=7061662 -config_library_file_neoforge=7061663 - +config_library_version=18.0.0-PR4 sqlite_version=3.47.2.0 mysql_version=8.4.0 # Runtime Only -ui_library_file_fabric=7061587 -ui_library_file_neoforge=7061589 +ui_library_version=18.0.0-PR2 diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 92f3f63..1818682 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,12 +1,13 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import NativeTransformer - plugins { id "com.github.johnrengelman.shadow" id 'com.matthewprenger.cursegradle' version '1.4.0' id "com.modrinth.minotaur" version "2.+" } +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath +} + architectury { platformSetupLoomIde() neoForge() @@ -50,8 +51,8 @@ dependencies { modImplementation "com.mysql:mysql-connector-j:${project.mysql_version}" shadowBundle "com.mysql:mysql-connector-j:${project.mysql_version}" - modImplementation "curse.maven:yaml-config-1128669:${project.config_library_file_neoforge}" - modRuntimeOnly "curse.maven:ui-933200:${project.ui_library_file_neoforge}" + modRuntimeOnly "com.daqem.uilib:uilib-neoforge:${project.ui_library_version}" + modImplementation "com.daqem.yamlconfig:yamlconfig-neoforge:${project.config_library_version}" } processResources { @@ -97,13 +98,56 @@ shadowJar { remapJar { inputFile.set shadowJar.archiveFile - archiveClassifier = "neoforge" + atAccessWideners.add loom.accessWidenerPath.get().asFile.name + archiveClassifier = null +} + +task renameJarForPublication(type: Zip, dependsOn: remapJar) { + from remapJar.archiveFile.map { zipTree(it) } + archiveExtension = "jar" + metadataCharset "UTF-8" + destinationDirectory = base.libsDirectory + archiveClassifier = project.name +} + +assemble.dependsOn renameJarForPublication + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } } remapSourcesJar { archiveClassifier = "neoforge-sources" } +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + +publishing { + publications { + mavenNeoForge(MavenPublication) { + groupId = rootProject.maven_group + artifactId = rootProject.archives_base_name + "-neoforge" + from components.java + } + } + + repositories { + maven { + url = project.version.contains('-PR') ? 'https://maven.daqem.com/snapshots' : 'https://maven.daqem.com/releases' + credentials { + username = System.getenv("MAVEN_USER") + password = System.getenv("MAVEN_PASS") + } + } + } +} + curseforge { apiKey = System.getenv("CURSEFORGE_API_KEY") project { From 146ea495460c37224f73360c3df5145d5217fb72 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Sat, 20 Dec 2025 16:21:12 +0100 Subject: [PATCH 39/52] feat: port to 1.21.11 --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 2 +- build.gradle | 2 +- .../com/daqem/grieflogger/GriefLogger.java | 6 +++--- .../grieflogger/command/LookupCommand.java | 1 - .../daqem/grieflogger/command/page/Page.java | 2 +- .../repository/ContainerRepository.java | 20 +++++++++--------- .../database/repository/ItemRepository.java | 12 +++++------ .../database/service/BlockService.java | 8 +++---- .../database/service/ChatService.java | 2 +- .../database/service/CommandService.java | 2 +- .../database/service/ContainerService.java | 4 ++-- .../database/service/ItemService.java | 4 ++-- .../database/service/SessionService.java | 4 ++-- .../daqem/grieflogger/event/EntityEvents.java | 6 +++--- .../grieflogger/event/LevelLoadEvent.java | 4 ++-- .../event/block/LogBlockEvent.java | 6 +++--- .../grieflogger/i18n/LanguageManager.java | 4 +++- .../grieflogger/mixin/MixinArmorStand.java | 6 +++--- .../grieflogger/mixin/MixinServerPlayer.java | 3 --- .../grieflogger/mixin/ProjectileMixin.java | 4 ++-- .../grieflogger/model/SimpleItemStack.java | 4 ++-- .../model/history/BlockHistory.java | 4 ++-- .../model/history/ContainerHistory.java | 2 +- .../model/history/ItemHistory.java | 4 ++-- .../main/resources/grieflogger.accesswidener | 2 +- fabric/build.gradle | 4 ++-- .../fabric/GriefLoggerPermissionsImpl.java | 7 +++++-- gradle.properties | 18 ++++++++-------- .../neoforge/GriefLoggerNeoForge.java | 9 +++----- .../neoforge/GriefLoggerPermissionsImpl.java | 6 ++++-- .../neoforge/SideProxyNeoForge.java | 21 ------------------- settings.gradle | 2 +- 33 files changed, 83 insertions(+), 104 deletions(-) delete mode 100644 neoforge/src/main/java/com/daqem/grieflogger/neoforge/SideProxyNeoForge.java diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 35a6f83..589b1c0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -2,7 +2,7 @@ name: Publish on: push: - branches: [ "1.21.9" ] + branches: [ "1.21.11" ] permissions: contents: write diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 427860b..70b492c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,7 +2,7 @@ name: Run Tests on: push: - branches: [ "1.21.9-dev" ] + branches: [ "1.21.11-dev" ] permissions: contents: read diff --git a/build.gradle b/build.gradle index f87ca4b..34aacb6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "dev.architectury.loom" version "1.11-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.13-SNAPSHOT" apply false id "architectury-plugin" version "3.4-SNAPSHOT" id 'com.github.johnrengelman.shadow' apply false } diff --git a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java index b6d3fbf..2b62b29 100644 --- a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java +++ b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java @@ -23,7 +23,7 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.network.chat.contents.TranslatableContents; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import java.util.HashMap; import java.util.Map; @@ -199,7 +199,7 @@ public static Style getTheme() { return Style.EMPTY.withColor(0xFCBA03); } - public static ResourceLocation getId(String id) { - return ResourceLocation.fromNamespaceAndPath(MOD_ID, id); + public static Identifier getId(String id) { + return Identifier.fromNamespaceAndPath(MOD_ID, id); } } diff --git a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java index 5c397c3..86ff11c 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java @@ -39,7 +39,6 @@ public LiteralArgumentBuilder getCommand() { .executes(context -> lookup(context.getSource(), "")); } - // ... rest of the methods (lookup, suggestFilters, getHistory) remain exactly the same as original ... private static int lookup(CommandSourceStack source, String filtersInput) { List filters = new ArrayList<>(); diff --git a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java index 1fa894f..744e6cc 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java +++ b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java @@ -51,7 +51,7 @@ public List getHistory() { private Component getHeader() { MutableComponent header = GriefLogger.translate("lookup.history_header", GriefLogger.themedTranslate("lookup.history_title")); if (singleLocation && !history.isEmpty()) { - header.append(" ").append(history.get(0).getPosition().getComponent()); + header.append(" ").append(history.getFirst().getPosition().getComponent()); } return header; } diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java index 324cfd9..3b040ae 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java @@ -23,7 +23,7 @@ import io.netty.buffer.Unpooled; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.Level; public class ContainerRepository extends Repository { @@ -85,7 +85,7 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, "SELECT id FROM materials WHERE name = ?" + "), ?, ?, ?);"; - ResourceLocation itemLocation = item.getItem().arch$registryName(); + Identifier itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { database.queue.add(connection -> { try (PreparedStatement materialStatement = connection.prepareStatement(insertMaterialQuery)) { @@ -95,7 +95,7 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, try (PreparedStatement itemStatement = connection.prepareStatement(insertItemQuery)) { itemStatement.setLong(1, time); itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().location().toString()); + itemStatement.setString(3, level.dimension().identifier().toString()); itemStatement.setInt(4, x); itemStatement.setInt(5, y); itemStatement.setInt(6, z); @@ -129,14 +129,14 @@ public void insertList(long time, String userUuid, Level level, int x, int y, in if (item.isEmpty()) { continue; } - ResourceLocation itemLocation = item.getItem().arch$registryName(); + Identifier itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); materialStatement.addBatch(); itemStatement.setLong(1, time); itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().location().toString()); + itemStatement.setString(3, level.dimension().identifier().toString()); itemStatement.setInt(4, x); itemStatement.setInt(5, y); itemStatement.setInt(6, z); @@ -174,14 +174,14 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int if (item.isEmpty()) { continue; } - ResourceLocation itemLocation = item.getItem().arch$registryName(); + Identifier itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); materialStatement.addBatch(); itemStatement.setLong(1, time); itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().location().toString()); + itemStatement.setString(3, level.dimension().identifier().toString()); itemStatement.setInt(4, x); itemStatement.setInt(5, y); itemStatement.setInt(6, z); @@ -215,7 +215,7 @@ public List getHistory(Level level, int x, int y, int z) { """; try (PreparedStatement preparedStatement = database.prepareStatement(query)) { - preparedStatement.setString(1, level.dimension().location().toString()); + preparedStatement.setString(1, level.dimension().identifier().toString()); preparedStatement.setInt(2, x); preparedStatement.setInt(3, y); preparedStatement.setInt(4, z); @@ -259,7 +259,7 @@ public List getHistory(Level level, int x, int y, int z, int x2, int y """; try (PreparedStatement preparedStatement = database.prepareStatement(query)) { - preparedStatement.setString(1, level.dimension().location().toString()); + preparedStatement.setString(1, level.dimension().identifier().toString()); preparedStatement.setInt(2, x); preparedStatement.setInt(3, x2); preparedStatement.setInt(4, y); @@ -317,7 +317,7 @@ public List getFilteredContainerHistory(Level level, FilterList filter """.formatted(actions, users, includeMaterials, excludeMaterials); try (PreparedStatement preparedStatement = database.prepareStatement(query)) { - preparedStatement.setString(1, level.dimension().location().toString()); + preparedStatement.setString(1, level.dimension().identifier().toString()); preparedStatement.setLong(2, filterList.getTime()); if (actions == null || actions.isEmpty()) { diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java index 16d61bd..9dc8b5c 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java @@ -22,7 +22,7 @@ import io.netty.buffer.Unpooled; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.Level; public class ItemRepository extends Repository { @@ -82,7 +82,7 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, "SELECT id FROM materials WHERE name = ?" + "), ?, ?, ?);"; - ResourceLocation itemLocation = item.getItem().arch$registryName(); + Identifier itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { database.queue.add(connection -> { try (PreparedStatement materialStatement = connection.prepareStatement(materialQuery)) { @@ -92,7 +92,7 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, try (PreparedStatement preparedStatement = connection.prepareStatement(itemQuery)) { preparedStatement.setLong(1, time); preparedStatement.setString(2, userUuid); - preparedStatement.setString(3, level.dimension().location().toString()); + preparedStatement.setString(3, level.dimension().identifier().toString()); preparedStatement.setInt(4, x); preparedStatement.setInt(5, y); preparedStatement.setInt(6, z); @@ -127,14 +127,14 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int if (item.isEmpty()) { continue; } - ResourceLocation itemLocation = item.getItem().arch$registryName(); + Identifier itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); materialStatement.addBatch(); itemStatement.setLong(1, time); itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().location().toString()); + itemStatement.setString(3, level.dimension().identifier().toString()); itemStatement.setInt(4, x); itemStatement.setInt(5, y); itemStatement.setInt(6, z); @@ -178,7 +178,7 @@ public List getFilteredItemHistory(Level level, FilterList filterLi """.formatted(actions, users, includeMaterials, excludeMaterials); try (PreparedStatement preparedStatement = database.prepareStatement(query)) { - preparedStatement.setString(1, level.dimension().location().toString()); + preparedStatement.setString(1, level.dimension().identifier().toString()); preparedStatement.setLong(2, filterList.getTime()); if (actions == null || actions.isEmpty()) { diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java b/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java index a9d84d8..7bb772c 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java @@ -44,7 +44,7 @@ public void insertEntity(UUID userUuid, String levelName, BlockPos pos, String e public List getBlockHistory(Level level, BlockPos pos) { return blockRepository.getBlockHistory( - level.dimension().location().toString(), + level.dimension().identifier().toString(), pos.getX(), pos.getY(), pos.getZ() @@ -73,7 +73,7 @@ public void getBlockHistoryAsync(Level level, List pos, OnComplete getInteractionHistory(Level level, BlockPos pos) { return blockRepository.getInteractionHistory( - level.dimension().location().toString(), + level.dimension().identifier().toString(), pos.getX(), pos.getY(), pos.getZ() @@ -98,7 +98,7 @@ public void getInteractionHistoryAsync(Level level, List pos, OnComple public void removeInteractionsForPosition(Level level, BlockPos secondPos) { blockRepository.removeInteractionsForPosition( - level.dimension().location().toString(), + level.dimension().identifier().toString(), secondPos.getX(), secondPos.getY(), secondPos.getZ() @@ -111,7 +111,7 @@ public List getFilteredBlockHistory(Level level, FilterList filterList return List.of(); } return blockRepository.getFilteredBlockHistory( - level.dimension().location().toString(), + level.dimension().identifier().toString(), filterList ); } diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/ChatService.java b/common/src/main/java/com/daqem/grieflogger/database/service/ChatService.java index 3cfb659..4f3a199 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/ChatService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/ChatService.java @@ -27,7 +27,7 @@ public void createIndexes() { public void insert(UUID userUuid, Level level, BlockPos pos, String message) { chatRepository.insert(System.currentTimeMillis(), userUuid.toString(), - level.dimension().location().toString(), + level.dimension().identifier().toString(), pos.getX(), pos.getY(), pos.getZ(), diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/CommandService.java b/common/src/main/java/com/daqem/grieflogger/database/service/CommandService.java index ed903f0..394e416 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/CommandService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/CommandService.java @@ -27,7 +27,7 @@ public void createIndexes() { public void insert(UUID userUuid, Level level, BlockPos pos, String command) { commandRepository.insert(System.currentTimeMillis(), userUuid.toString(), - level.dimension().location().toString(), + level.dimension().identifier().toString(), pos.getX(), pos.getY(), pos.getZ(), diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java b/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java index 16824b8..d8023d9 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java @@ -9,7 +9,7 @@ import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.IHistory; import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.Level; import java.util.List; @@ -34,7 +34,7 @@ public void createIndexes() { } public void insert(UUID userUuid, Level level, BlockPos pos, SimpleItemStack item, ItemAction itemAction) { - ResourceLocation itemLocation = item.getItem().arch$registryName(); + Identifier itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { containerRepository.insert(System.currentTimeMillis(), userUuid.toString(), diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java b/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java index cb7a739..a24d2b9 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java @@ -9,7 +9,7 @@ import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.ItemHistory; import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.Level; import java.util.List; @@ -34,7 +34,7 @@ public void createIndexes() { } public void insert(UUID userUuid, Level level, BlockPos pos, SimpleItemStack item, ItemAction itemAction) { - ResourceLocation itemLocation = item.getItem().arch$registryName(); + Identifier itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { itemRepository.insert(System.currentTimeMillis(), userUuid.toString(), diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java b/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java index 5a56d0e..842574b 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java @@ -33,7 +33,7 @@ public void insert(UUID userUuid, Level level, BlockPos pos, SessionAction sessi sessionRepository.insert( System.currentTimeMillis(), userUuid.toString(), - level.dimension().location().toString(), + level.dimension().identifier().toString(), pos.getX(), pos.getY(), pos.getZ(), sessionAction.getId() ); @@ -50,7 +50,7 @@ public List getFilteredSessionHistory(Level level, FilterList fi return List.of(); } return sessionRepository.getFilteredSessionHistory( - level.dimension().location().toString(), + level.dimension().identifier().toString(), filterList ); } diff --git a/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java b/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java index f21af96..de207f1 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java @@ -6,7 +6,7 @@ import dev.architectury.event.EventResult; import dev.architectury.event.events.common.EntityEvent; import dev.architectury.event.events.common.InteractionEvent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.decoration.ArmorStand; @@ -18,11 +18,11 @@ public class EntityEvents { public static void registerEvents() { EntityEvent.LIVING_DEATH.register((entity, source) -> { if (source != null && source.getEntity() instanceof ServerPlayer serverPlayer) { - ResourceLocation entityLocation = entity.getType().arch$registryName(); + Identifier entityLocation = entity.getType().arch$registryName(); if (entityLocation != null) { Services.BLOCK.insertEntity( serverPlayer.getUUID(), - entity.level().dimension().location().toString(), + entity.level().dimension().identifier().toString(), entity.blockPosition(), entityLocation.toString(), BlockAction.KILL_ENTITY diff --git a/common/src/main/java/com/daqem/grieflogger/event/LevelLoadEvent.java b/common/src/main/java/com/daqem/grieflogger/event/LevelLoadEvent.java index c2f2880..07d1833 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/LevelLoadEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/LevelLoadEvent.java @@ -12,10 +12,10 @@ public class LevelLoadEvent { public static void registerEvent() { LifecycleEvent.SERVER_LEVEL_LOAD.register(level -> { - String levelName = level.dimension().location().toString(); + String levelName = level.dimension().identifier().toString(); if (!registeredLevels.contains(levelName)) { registeredLevels.add(levelName); - Services.LEVEL.insert(level.dimension().location().toString()); + Services.LEVEL.insert(level.dimension().identifier().toString()); } }); } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/LogBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/LogBlockEvent.java index 3262555..3ade280 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/LogBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/LogBlockEvent.java @@ -5,18 +5,18 @@ import com.daqem.grieflogger.model.action.BlockAction; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; public class LogBlockEvent extends AbstractEvent { public static void logBlock(GriefLoggerServerPlayer player, Level level, BlockState state, BlockPos pos, BlockAction blockAction) { - ResourceLocation materialLocation = state.getBlock().arch$registryName(); + Identifier materialLocation = state.getBlock().arch$registryName(); if (materialLocation != null) { Services.BLOCK.insertMaterial( player.grieflogger$asServerPlayer().getUUID(), - level.dimension().location().toString(), + level.dimension().identifier().toString(), pos, materialLocation.toString(), blockAction); diff --git a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java index 92b2a67..1df89f6 100644 --- a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java +++ b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java @@ -54,7 +54,9 @@ public static void load(MinecraftServer server) { } private static void loadLanguage(String modId, String language) { - try (InputStream stream = Language.class.getResourceAsStream("/assets/" + modId + "/lang/" + language + ".json")) { + Class contextClassLoader = Thread.currentThread().getContextClassLoader().getClass(); + if (Platform.isFabric()) contextClassLoader = Language.class; + try (InputStream stream = contextClassLoader.getResourceAsStream("/assets/" + modId + "/lang/" + language + ".json")) { if (stream == null) { return; } diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java index ddf0ac4..1690a83 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java @@ -3,7 +3,7 @@ import com.daqem.grieflogger.database.service.Services; import com.daqem.grieflogger.model.action.BlockAction; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EntityType; @@ -27,11 +27,11 @@ protected MixinArmorStand(EntityType entityType, Level l @Inject(method = "interactAt", at = @At("RETURN")) private void onInteractAt(Player player, Vec3 vec3, InteractionHand interactionHand, CallbackInfoReturnable cir) { if ((cir.getReturnValue() == InteractionResult.SUCCESS || cir.getReturnValue() == InteractionResult.SUCCESS_SERVER) && player instanceof GriefLoggerServerPlayer glPlayer) { - ResourceLocation entityLocation = this.getType().arch$registryName(); + Identifier entityLocation = this.getType().arch$registryName(); if (entityLocation != null) { Services.BLOCK.insertEntity( glPlayer.grieflogger$asServerPlayer().getUUID(), - this.level().dimension().location().toString(), + this.level().dimension().identifier().toString(), this.blockPosition(), entityLocation.toString(), BlockAction.INTERACT_ENTITY diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java index 75ed023..c597b3a 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java @@ -15,9 +15,7 @@ import com.mojang.authlib.GameProfile; import dev.architectury.utils.EnvExecutor; import net.fabricmc.api.EnvType; -import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.MenuProvider; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -25,7 +23,6 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java b/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java index 22219b4..84bb7db 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java @@ -4,9 +4,9 @@ import com.daqem.grieflogger.event.item.ThrowItemEvent; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.entity.projectile.throwableitemprojectile.ThrowableItemProjectile; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java b/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java index dddc2da..e7c4424 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java +++ b/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java @@ -4,7 +4,7 @@ import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; @@ -22,7 +22,7 @@ public SimpleItemStack(ItemStack itemStack) { this(itemStack.getItem(), itemStack.getCount(), itemStack.getComponentsPatch()); } - public SimpleItemStack(ResourceLocation itemLocation, int count, DataComponentPatch tag) { + public SimpleItemStack(Identifier itemLocation, int count, DataComponentPatch tag) { this.item = BuiltInRegistries.ITEM.getValue(itemLocation); this.count = count; this.tag = tag; diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java index b133811..15ff8bf 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java @@ -14,7 +14,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; @@ -43,7 +43,7 @@ public Component getComponent() { } public Component getMaterialComponent() { - Holder.Reference blockReference = BuiltInRegistries.BLOCK.get(ResourceLocation.parse(material)).orElse(null); + Holder.Reference blockReference = BuiltInRegistries.BLOCK.get(Identifier.parse(material)).orElse(null); Item item = blockReference != null ? blockReference.value().asItem() : Items.AIR; MutableComponent mutableComponent; if (blockReference != null) { diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ContainerHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ContainerHistory.java index 2bbd623..d15dbc3 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ContainerHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ContainerHistory.java @@ -11,7 +11,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import java.util.UUID; diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java index c492420..5c9ceb9 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java @@ -15,14 +15,14 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class ItemHistory extends History { protected final SimpleItemStack itemStack; public ItemHistory(long time, String name, String uuid, int x, int y, int z, String material, DataComponentPatch data, int amount, int action) { - this(new Time(time), new User(name, UUID.fromString(uuid)), new BlockPosition(x, y, z), new SimpleItemStack(ResourceLocation.parse(material), amount, data), ItemAction.fromId(action)); + this(new Time(time), new User(name, UUID.fromString(uuid)), new BlockPosition(x, y, z), new SimpleItemStack(Identifier.parse(material), amount, data), ItemAction.fromId(action)); } public ItemHistory(Time time, User user, BlockPosition position, SimpleItemStack itemStack, IAction action) { diff --git a/common/src/main/resources/grieflogger.accesswidener b/common/src/main/resources/grieflogger.accesswidener index e739a13..5a0e4a3 100644 --- a/common/src/main/resources/grieflogger.accesswidener +++ b/common/src/main/resources/grieflogger.accesswidener @@ -1,3 +1,3 @@ accessWidener v2 named -accessible method net/minecraft/world/entity/projectile/AbstractArrow getPickupItem ()Lnet/minecraft/world/item/ItemStack; \ No newline at end of file +accessible method net/minecraft/world/entity/projectile/arrow/AbstractArrow getPickupItem ()Lnet/minecraft/world/item/ItemStack; \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index a0d01d9..711e372 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -46,8 +46,8 @@ dependencies { modImplementation "com.mysql:mysql-connector-j:${project.mysql_version}" shadowBundle "com.mysql:mysql-connector-j:${project.mysql_version}" - modRuntimeOnly "com.daqem.uilib:uilib-neoforge:${project.ui_library_version}" - modImplementation "com.daqem.yamlconfig:yamlconfig-neoforge:${project.config_library_version}" + modRuntimeOnly "com.daqem.uilib:uilib-fabric:${project.ui_library_version}" + modImplementation "com.daqem.yamlconfig:yamlconfig-fabric:${project.config_library_version}" modCompileOnly "me.lucko:fabric-permissions-api:0.3.1" } diff --git a/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java b/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java index 401554e..6154e94 100644 --- a/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java +++ b/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java @@ -2,6 +2,9 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.permissions.Permission; +import net.minecraft.server.permissions.PermissionLevel; +import net.minecraft.server.permissions.Permissions; public class GriefLoggerPermissionsImpl { @@ -13,9 +16,9 @@ public static boolean check(CommandSourceStack source, String permissionNode, in return me.lucko.fabric.api.permissions.v0.Permissions.check(source, permissionNode, fallbackLevel); } catch (Throwable t) { // Fallback if something goes wrong with the API - return source.hasPermission(fallbackLevel); + return source.permissions().hasPermission(new Permission.HasCommandLevel(PermissionLevel.byId(fallbackLevel))); } } - return source.hasPermission(fallbackLevel); + return source.permissions().hasPermission(new Permission.HasCommandLevel(PermissionLevel.byId(fallbackLevel))); } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index bfe7afe..b4fafe3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem.grieflogger archives_base_name=grieflogger # Project -mod_version=18.0.0-PR1 +mod_version=19.0.0-PR1 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. @@ -15,7 +15,7 @@ mod_website=https://daqem.com mod_repository=https://github.com/DAQEM/GriefLogger # Publishing -supported_minecraft_versions=1.21.9 +supported_minecraft_versions=1.21.11 release_type=release curse_forge_project_id=435029 @@ -25,23 +25,23 @@ modrinth_project_id=8oGVUFuX modrinth_dependencies=architectury-api,yaml-config # Minecraft -minecraft_version=1.21.9 +minecraft_version=1.21.11 # Fabric -fabric_loader_version=0.17.2 -fabric_api_version=0.134.0+1.21.9 +fabric_loader_version=0.18.3 +fabric_api_version=0.140.0+1.21.11 # NeoForge -neoforge_version=21.9.16-beta +neoforge_version=21.11.0-beta neoforge_loader_version=1 # Dependencies -architectury_version=18.0.3 -config_library_version=18.0.0-PR4 +architectury_version=19.0.1 +config_library_version=19.0.0-PR1 sqlite_version=3.47.2.0 mysql_version=8.4.0 # Runtime Only -ui_library_version=18.0.0-PR2 +ui_library_version=19.0.0-PR1 diff --git a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerNeoForge.java b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerNeoForge.java index 5f6a9ba..e80f179 100644 --- a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerNeoForge.java +++ b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerNeoForge.java @@ -1,16 +1,13 @@ package com.daqem.grieflogger.neoforge; import com.daqem.grieflogger.GriefLogger; -import dev.architectury.utils.EnvExecutor; +import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.common.Mod; -@Mod(GriefLogger.MOD_ID) +@Mod(value = GriefLogger.MOD_ID, dist = Dist.DEDICATED_SERVER) public class GriefLoggerNeoForge { public GriefLoggerNeoForge() { - EnvExecutor.getEnvSpecific( - () -> SideProxyNeoForge.Client::new, - () -> SideProxyNeoForge.Server::new - ); + GriefLogger.init(); } } diff --git a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerPermissionsImpl.java b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerPermissionsImpl.java index 1c4baab..8f55e85 100644 --- a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerPermissionsImpl.java +++ b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/GriefLoggerPermissionsImpl.java @@ -2,6 +2,8 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.permissions.Permission; +import net.minecraft.server.permissions.PermissionLevel; import net.neoforged.neoforge.server.permission.PermissionAPI; import net.neoforged.neoforge.server.permission.nodes.PermissionNode; import net.neoforged.neoforge.server.permission.nodes.PermissionTypes; @@ -46,11 +48,11 @@ public static boolean check(CommandSourceStack source, String permissionNode, in return PermissionAPI.getPermission(player, node); } catch (Exception e) { // Fallback to OP if PermissionAPI fails or node is unknown/unregistered context - return source.hasPermission(fallbackLevel); + return source.permissions().hasPermission(new Permission.HasCommandLevel(PermissionLevel.byId(fallbackLevel))); } } // Console / Command Blocks - return source.hasPermission(fallbackLevel); + return source.permissions().hasPermission(new Permission.HasCommandLevel(PermissionLevel.byId(fallbackLevel))); } } \ No newline at end of file diff --git a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/SideProxyNeoForge.java b/neoforge/src/main/java/com/daqem/grieflogger/neoforge/SideProxyNeoForge.java deleted file mode 100644 index 120c1fd..0000000 --- a/neoforge/src/main/java/com/daqem/grieflogger/neoforge/SideProxyNeoForge.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.daqem.grieflogger.neoforge; - -import com.daqem.grieflogger.GriefLogger; - -public class SideProxyNeoForge { - - SideProxyNeoForge() { - } - - public static class Server extends SideProxyNeoForge { - Server() { - GriefLogger.init(); - } - } - - public static class Client extends SideProxyNeoForge { - - Client() { - } - } -} diff --git a/settings.gradle b/settings.gradle index 0785829..dc4e09d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,4 @@ include 'common' include 'fabric' include 'neoforge' -rootProject.name = "GriefLogger 1.21.9" +rootProject.name = "GriefLogger 1.21.11" From 72369b0b06a6178ae3f7ddc8461e7f935d343558 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Sat, 20 Dec 2025 18:54:43 +0100 Subject: [PATCH 40/52] chore: bump version for release --- .github/workflows/publish.yml | 5 +++++ build.gradle | 1 + gradle.properties | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 589b1c0..b56ae13 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -15,6 +15,8 @@ jobs: env: CURSEFORGE_API_KEY: ${{ secrets.CURSEFORGE_API_KEY }} MODRINTH_API_KEY: ${{ secrets.MODRINTH_API_KEY }} + MAVEN_USER: ${{ secrets.MAVEN_USER }} + MAVEN_PASS: ${{ secrets.MAVEN_PASS }} steps: - name: Checkout @@ -47,6 +49,9 @@ jobs: if: steps.checkTag.outputs.exists == 'true' run: exit 1 + - name: Publish to DAQEM Maven + run: ./gradlew publish + - name: Publish to Modrinth run: ./gradlew modrinth diff --git a/build.gradle b/build.gradle index 34aacb6..4238339 100644 --- a/build.gradle +++ b/build.gradle @@ -39,6 +39,7 @@ subprojects { repositories { maven { url "https://maven.daqem.com/snapshots/" } + maven { url "https://maven.daqem.com/releases" } } dependencies { diff --git a/gradle.properties b/gradle.properties index b4fafe3..1c2b564 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem.grieflogger archives_base_name=grieflogger # Project -mod_version=19.0.0-PR1 +mod_version=19.0.0 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. @@ -37,11 +37,11 @@ neoforge_loader_version=1 # Dependencies architectury_version=19.0.1 -config_library_version=19.0.0-PR1 +config_library_version=19.0.0 sqlite_version=3.47.2.0 mysql_version=8.4.0 # Runtime Only -ui_library_version=19.0.0-PR1 +ui_library_version=19.0.0 From 3b4d3df4712592bba43949d60713bde06cb481e4 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Sat, 20 Dec 2025 19:14:07 +0100 Subject: [PATCH 41/52] chore: fix error in GitHub actions --- .github/workflows/publish.yml | 17 ++++++++++++----- .github/workflows/test.yml | 19 +++++++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b56ae13..c068d77 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -28,8 +28,15 @@ jobs: java-version: '21' distribution: 'temurin' - - name: Grant Permissions to gradlew - run: chmod +x gradlew + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Grant Permissions + run: | + chmod +x gradlew + chmod +x relocate_natives/prepare.sh - name: Build Jars run: ./gradlew build @@ -39,10 +46,10 @@ jobs: run: | echo "::set-output name=VERSION_NAME::$(./gradlew -q :common:printVersionName)" - - name: Check if tag exists + - name: Check if tag exists uses: mukunku/tag-exists-action@v1.5.0 id: checkTag - with: + with: tag: ${{ steps.gradle_version.outputs.VERSION_NAME }} - name: Fail if tag exists @@ -65,4 +72,4 @@ jobs: fabric/build/libs/*.jar neoforge/build/libs/*.jar name: ${{ steps.gradle_version.outputs.VERSION_NAME }} - tag: ${{ steps.gradle_version.outputs.VERSION_NAME }} + tag: ${{ steps.gradle_version.outputs.VERSION_NAME }} \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 70b492c..e9b7cf2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,16 +20,23 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 - + - name: Set up JDK 21 uses: actions/setup-java@v3 with: java-version: '21' distribution: 'temurin' - - - name: Grant Permissions to gradlew - run: chmod +x gradlew - + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Grant Permissions + run: | + chmod +x gradlew + chmod +x relocate_natives/prepare.sh + - name: Test run: ./gradlew :common:test @@ -38,4 +45,4 @@ jobs: if: always() with: files: | - common/build/test-results/**/*.xml + common/build/test-results/**/*.xml \ No newline at end of file From 5d51707ff62ee4c6d4dda862a726ec578e191d66 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Sat, 20 Dec 2025 19:30:10 +0100 Subject: [PATCH 42/52] chore: fix error in GitHub actions --- .github/workflows/publish.yml | 2 +- .github/workflows/test.yml | 13 +++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index c068d77..98a8a0c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -31,7 +31,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v4 with: - python-version: '3.x' + python-version: '3.8' - name: Grant Permissions run: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e9b7cf2..b436d00 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,15 +27,8 @@ jobs: java-version: '21' distribution: 'temurin' - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - - name: Grant Permissions - run: | - chmod +x gradlew - chmod +x relocate_natives/prepare.sh + - name: Grant Permissions to gradlew + run: chmod +x gradlew - name: Test run: ./gradlew :common:test @@ -45,4 +38,4 @@ jobs: if: always() with: files: | - common/build/test-results/**/*.xml \ No newline at end of file + common/build/test-results/**/*.xml From 9af1cf4778820fc42e435c2ea92cba59fe1a4626 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:23:26 +0100 Subject: [PATCH 43/52] fix: java.sql.Driver error --- fabric/build.gradle | 2 ++ neoforge/build.gradle | 2 ++ 2 files changed, 4 insertions(+) diff --git a/fabric/build.gradle b/fabric/build.gradle index 711e372..52cafde 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -91,6 +91,8 @@ shadowJar { configurations = [project.configurations.shadowBundle] archiveClassifier = "fabric-dev-shadow" + + mergeServiceFiles() } remapJar { diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 1818682..249210a 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -94,6 +94,8 @@ shadowJar { configurations = [project.configurations.shadowBundle] archiveClassifier = "neoforge-dev-shadow" + + mergeServiceFiles() } remapJar { From f141d4813853a56c958b00cb90b000dcc4fb9238 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Mon, 22 Dec 2025 21:24:44 +0100 Subject: [PATCH 44/52] chore: bump version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 1c2b564..a985ed3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem.grieflogger archives_base_name=grieflogger # Project -mod_version=19.0.0 +mod_version=19.0.1 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. From 25626ed4d4566d37b0d0bbda6183123a1bdc21e8 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Tue, 23 Dec 2025 00:19:29 +0100 Subject: [PATCH 45/52] fix: translations on NeoForge --- .../com/daqem/grieflogger/i18n/LanguageManager.java | 12 +++++++++--- gradle.properties | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java index 1df89f6..3d13b75 100644 --- a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java +++ b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java @@ -54,9 +54,8 @@ public static void load(MinecraftServer server) { } private static void loadLanguage(String modId, String language) { - Class contextClassLoader = Thread.currentThread().getContextClassLoader().getClass(); - if (Platform.isFabric()) contextClassLoader = Language.class; - try (InputStream stream = contextClassLoader.getResourceAsStream("/assets/" + modId + "/lang/" + language + ".json")) { + String location = "/assets/" + modId + "/lang/" + language + ".json"; + try (InputStream stream = getInputStream(location)) { if (stream == null) { return; } @@ -66,6 +65,13 @@ private static void loadLanguage(String modId, String language) { } } + private static InputStream getInputStream(String location) { + if (Platform.isFabric()) { + return Language.class.getResourceAsStream(location); + } + return Thread.currentThread().getContextClassLoader().getResourceAsStream(location); + } + private static void loadLanguage(MinecraftServer server, String languageCode) { try { String mcVersion = server.getServerVersion(); diff --git a/gradle.properties b/gradle.properties index a985ed3..0f77055 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem.grieflogger archives_base_name=grieflogger # Project -mod_version=19.0.1 +mod_version=19.0.2 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. From a60bf0fad1dc25234b9880e11280c3425dd6ea6f Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Sun, 28 Dec 2025 12:41:13 +0100 Subject: [PATCH 46/52] fix: JVM not stopping, ProcessRunner being flagged. --- .../com/daqem/grieflogger/GriefLogger.java | 11 ++------ .../grieflogger/event/ServerStoppedEvent.java | 28 +++++++++++++++++++ .../grieflogger/thread/ThreadManager.java | 15 ++++++++-- .../java/org/sqlite/util/ProcessRunner.java | 26 +++++++++++++++++ fabric/build.gradle | 1 + gradle.properties | 2 +- neoforge/build.gradle | 1 + 7 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 common/src/main/java/com/daqem/grieflogger/event/ServerStoppedEvent.java create mode 100644 common/src/main/java/org/sqlite/util/ProcessRunner.java diff --git a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java index 2b62b29..a907db0 100644 --- a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java +++ b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java @@ -1,19 +1,11 @@ package com.daqem.grieflogger; +import com.daqem.grieflogger.event.*; import org.slf4j.Logger; import com.daqem.grieflogger.config.GriefLoggerConfig; import com.daqem.grieflogger.database.Database; import com.daqem.grieflogger.database.service.Services; -import com.daqem.grieflogger.event.ChatEvent; -import com.daqem.grieflogger.event.CommandEvent; -import com.daqem.grieflogger.event.EntityEvents; -import com.daqem.grieflogger.event.LevelLoadEvent; -import com.daqem.grieflogger.event.PlayerJoinEvent; -import com.daqem.grieflogger.event.PlayerQuitEvent; -import com.daqem.grieflogger.event.RegisterCommandEvent; -import com.daqem.grieflogger.event.ServerStartedEvent; -import com.daqem.grieflogger.event.TickEvents; import com.daqem.grieflogger.event.block.BlockEvents; import com.daqem.grieflogger.event.item.ItemEvents; import com.daqem.grieflogger.i18n.LanguageManager; @@ -62,6 +54,7 @@ private static void registerEvents() { ChatEvent.registerEvent(); CommandEvent.registerEvent(); ServerStartedEvent.registerEvent(); + ServerStoppedEvent.registerEvent(); } private static boolean prepareDatabase() { diff --git a/common/src/main/java/com/daqem/grieflogger/event/ServerStoppedEvent.java b/common/src/main/java/com/daqem/grieflogger/event/ServerStoppedEvent.java new file mode 100644 index 0000000..5090a11 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/event/ServerStoppedEvent.java @@ -0,0 +1,28 @@ +package com.daqem.grieflogger.event; + +import com.daqem.grieflogger.GriefLogger; +import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.thread.ThreadManager; +import dev.architectury.event.events.common.LifecycleEvent; + +public class ServerStoppedEvent { + + public static void registerEvent() { + LifecycleEvent.SERVER_STOPPED.register(server -> { + GriefLogger.LOGGER.info("Stopping GriefLogger threads..."); + + Database database = GriefLogger.getDatabase(); + if (database != null) { + GriefLogger.LOGGER.info("Flushing final database queue..."); + try { + database.queue.execute(); + database.batchQueue.execute(); + } catch (Exception e) { + GriefLogger.LOGGER.error("Failed to flush database queue on shutdown", e); + } + } + + ThreadManager.shutdown(); + }); + } +} diff --git a/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java b/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java index b93cb84..6db852b 100644 --- a/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java +++ b/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java @@ -6,9 +6,9 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; - public class ThreadManager { private static final ExecutorService executor = Executors.newFixedThreadPool( @@ -37,4 +37,15 @@ public static Map, OnComplete> getAndRemoveCompleted() { completedFutures.forEach(onCompleteMap::remove); return completedFutures; } -} + + public static void shutdown() { + executor.shutdown(); + try { + if (!executor.awaitTermination(5, TimeUnit.SECONDS)) { + executor.shutdownNow(); + } + } catch (InterruptedException e) { + executor.shutdownNow(); + } + } +} \ No newline at end of file diff --git a/common/src/main/java/org/sqlite/util/ProcessRunner.java b/common/src/main/java/org/sqlite/util/ProcessRunner.java new file mode 100644 index 0000000..da5137c --- /dev/null +++ b/common/src/main/java/org/sqlite/util/ProcessRunner.java @@ -0,0 +1,26 @@ +package org.sqlite.util; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +/** + * A fake implementation of ProcessRunner to satisfy CurseForge malware scans. + * This removes OS interaction via Runtime.exec(), forcing SQLite to rely on + * System.getProperty("os.name") and ("os.arch"), which is enough for Minecraft. + */ +public class ProcessRunner { + + public ProcessRunner() { + } + + String runAndWaitFor(String command) throws IOException, InterruptedException { + // Return empty string to force OSInfo to fall back to System properties + return ""; + } + + String runAndWaitFor(String command, long timeout, TimeUnit unit) + throws IOException, InterruptedException { + // Return empty string to force OSInfo to fall back to System properties + return ""; + } +} \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index 52cafde..6915d34 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -77,6 +77,7 @@ processResources { shadowJar { relocate "org.sqlite", "gl_sqlite", { exclude "org/sqlite/native/**" + exclude "og/sqlite/util/ProcessRunner.class" } relocate "jdbc:sqlite", "jdbc:gl_sqlite" diff --git a/gradle.properties b/gradle.properties index 0f77055..a153dfa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem.grieflogger archives_base_name=grieflogger # Project -mod_version=19.0.2 +mod_version=19.0.3 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 249210a..f710ed2 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -80,6 +80,7 @@ processResources { shadowJar { relocate "org.sqlite", "gl_sqlite", { exclude "org/sqlite/native/**" + exclude "og/sqlite/util/ProcessRunner.class" } relocate "jdbc:sqlite", "jdbc:gl_sqlite" From 15096cca9c6e8986f62856e1d6804b7a3c27e8e6 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Sun, 1 Feb 2026 09:18:19 +0100 Subject: [PATCH 47/52] fix: item components serialized to NBT --- .../daqem/grieflogger/database/Database.java | 89 ++++++++++--------- .../grieflogger/database/cache/UserCache.java | 2 +- .../repository/ContainerRepository.java | 36 +++++--- .../database/repository/ItemRepository.java | 26 ++++-- .../database/repository/UserRepository.java | 2 +- .../grieflogger/model/SimpleItemStack.java | 28 ++++-- gradle.properties | 2 +- 7 files changed, 111 insertions(+), 74 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/database/Database.java b/common/src/main/java/com/daqem/grieflogger/database/Database.java index c412ffe..0f48cc2 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/Database.java +++ b/common/src/main/java/com/daqem/grieflogger/database/Database.java @@ -24,11 +24,10 @@ public class Database { @Nullable private Connection connection; - @Nullable - private Statement statement; public final IQueue queue; public final IQueue batchQueue; private IDatabaseDialect dialect; + private final Object lock = new Object(); public Database() { queue = new Queue(this, false); @@ -46,12 +45,6 @@ public boolean createConnection() { } if (connection != null) { GriefLogger.LOGGER.info("Connected to database"); - try { - statement = connection.createStatement(); - } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to create statement", e); - return false; - } try { connection.setAutoCommit(false); } catch (SQLException e) { @@ -59,7 +52,7 @@ public boolean createConnection() { return false; } } - return connected && connection != null && statement != null; + return connected && connection != null; } public boolean createMysqlConnection() { @@ -98,7 +91,6 @@ public boolean createSqliteConnection() { path.toFile().mkdirs(); } try { - // Construct the JDBC URL with the full path to database.db String dbPath = path.resolve("database.db").toString(); connection = DriverManager.getConnection("jdbc:sqlite:" + dbPath); } catch (SQLException e) { @@ -109,23 +101,25 @@ public boolean createSqliteConnection() { } public void createTable(String sql) { - try { - if (statement != null) { - statement.execute(sql); - } - } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to create table", e); - } + execute(sql, true); } public void execute(String sql, boolean logError) { - try { - if (statement != null) { + if (connection == null) return; + + synchronized (lock) { + try (Statement statement = connection.createStatement()) { statement.execute(sql); - } - } catch (SQLException e) { - if (logError) { - GriefLogger.LOGGER.error("Failed to execute statement", e); + connection.commit(); + } catch (SQLException e) { + if (logError) { + GriefLogger.LOGGER.error("Failed to execute statement", e); + } + try { + connection.rollback(); + } catch (SQLException ex) { + GriefLogger.LOGGER.error("Failed to rollback", ex); + } } } } @@ -139,30 +133,41 @@ public PreparedStatement prepareStatement(String query) throws SQLException { } public void executeQueue(List items, boolean isBatch) { - try { - for (Object item : items) { - if (item instanceof PreparedStatement preparedStatement) { - if (preparedStatement.isClosed()) { - continue; - } - try (preparedStatement) { - if (isBatch) { - preparedStatement.executeBatch(); - } else { - preparedStatement.executeUpdate(); + if (connection == null) return; + + synchronized (lock) { + try { + for (Object item : items) { + if (item instanceof PreparedStatement preparedStatement) { + if (preparedStatement.isClosed()) { + continue; } + try (preparedStatement) { + if (isBatch) { + preparedStatement.executeBatch(); + } else { + preparedStatement.executeUpdate(); + } + } + } else if (item instanceof SqlTask task) { + task.execute(connection); } - } else if (item instanceof SqlTask task) { - task.execute(connection); } - } - if (!items.isEmpty()) { - if (connection != null) { - connection.commit(); + if (!items.isEmpty()) { + if (connection != null && !connection.isClosed()) { + connection.commit(); + } + } + } catch (SQLException e) { + GriefLogger.LOGGER.error("Failed to execute database queue", e); + try { + if (connection != null && !connection.isClosed()) { + connection.rollback(); + } + } catch (SQLException ex) { + GriefLogger.LOGGER.error("Failed to rollback transaction", ex); } } - } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to execute database queue", e); } } diff --git a/common/src/main/java/com/daqem/grieflogger/database/cache/UserCache.java b/common/src/main/java/com/daqem/grieflogger/database/cache/UserCache.java index 5ed8e57..b54f8da 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/cache/UserCache.java +++ b/common/src/main/java/com/daqem/grieflogger/database/cache/UserCache.java @@ -15,7 +15,7 @@ public class UserCache implements ICache { private final Map usernames = new HashMap<>(); public Map getAllUsernames() { - if (usernameTime + 1000 < System.currentTimeMillis()) { + if (usernameTime + 300000 < System.currentTimeMillis()) { usernames.clear(); usernames.putAll(userService.getAllUsernames()); usernameTime = System.currentTimeMillis(); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java index 3b040ae..d33433e 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java @@ -1,5 +1,6 @@ package com.daqem.grieflogger.database.repository; +import java.io.ByteArrayInputStream; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -9,6 +10,10 @@ import java.util.Map; import com.daqem.grieflogger.database.dialect.MySQLDialect; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtAccounter; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.NbtOps; import org.jetbrains.annotations.Nullable; import com.daqem.grieflogger.GriefLogger; @@ -19,10 +24,7 @@ import com.daqem.grieflogger.model.history.ContainerHistory; import com.daqem.grieflogger.model.history.IHistory; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.minecraft.core.component.DataComponentPatch; -import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.Identifier; import net.minecraft.world.level.Level; @@ -34,7 +36,6 @@ public ContainerRepository(Database database) { this.database = database; } - // createTable / createIndexes omitted (same as original) public void createTable() { String sql = "CREATE TABLE IF NOT EXISTS containers (" + "time " + database.getDialect().getDataType("bigint") + " NOT NULL," + @@ -199,7 +200,20 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int }); } - // ... getHistory, getFilteredContainerHistory (read-only methods, same as original) ... + private DataComponentPatch readPatch(byte[] bytes, Level level) { + if (bytes == null || bytes.length == 0) { + return DataComponentPatch.EMPTY; + } + try { + ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); + CompoundTag compoundTag = NbtIo.readCompressed(inputStream, NbtAccounter.unlimitedHeap()); + return DataComponentPatch.CODEC.parse(level.registryAccess().createSerializationContext(NbtOps.INSTANCE), compoundTag) + .getOrThrow(IllegalStateException::new); + } catch (Exception e) { + return DataComponentPatch.EMPTY; + } + } + public List getHistory(Level level, int x, int y, int z) { List containerHistory = new ArrayList<>(); String query = """ @@ -222,9 +236,7 @@ public List getHistory(Level level, int x, int y, int z) { ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - ByteBuf buf1 = Unpooled.wrappedBuffer(resultSet.getBytes(8)); - RegistryFriendlyByteBuf buf = new RegistryFriendlyByteBuf(buf1, level.registryAccess()); - DataComponentPatch patch = DataComponentPatch.STREAM_CODEC.decode(buf); + DataComponentPatch patch = readPatch(resultSet.getBytes(8), level); containerHistory.add(new ContainerHistory( resultSet.getLong(1), resultSet.getString(2), @@ -269,9 +281,7 @@ public List getHistory(Level level, int x, int y, int z, int x2, int y ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - ByteBuf buf1 = Unpooled.wrappedBuffer(resultSet.getBytes(8)); - RegistryFriendlyByteBuf buf = new RegistryFriendlyByteBuf(buf1, level.registryAccess()); - DataComponentPatch patch = DataComponentPatch.STREAM_CODEC.decode(buf); + DataComponentPatch patch = readPatch(resultSet.getBytes(8), level); containerHistory.add(new ContainerHistory( resultSet.getLong(1), resultSet.getString(2), @@ -374,9 +384,7 @@ public List getFilteredContainerHistory(Level level, FilterList filter List blockHistory = new ArrayList<>(); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - ByteBuf buf1 = Unpooled.wrappedBuffer(resultSet.getBytes(8)); - RegistryFriendlyByteBuf buf = new RegistryFriendlyByteBuf(buf1, level.registryAccess()); - DataComponentPatch patch = DataComponentPatch.STREAM_CODEC.decode(buf); + DataComponentPatch patch = readPatch(resultSet.getBytes(8), level); blockHistory.add(new ContainerHistory( resultSet.getLong(1), resultSet.getString(2), diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java index 9dc8b5c..665dabb 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java @@ -1,5 +1,6 @@ package com.daqem.grieflogger.database.repository; +import java.io.ByteArrayInputStream; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; @@ -9,6 +10,10 @@ import java.util.Map; import com.daqem.grieflogger.database.dialect.MySQLDialect; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtAccounter; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.NbtOps; import org.jetbrains.annotations.Nullable; import com.daqem.grieflogger.GriefLogger; @@ -18,10 +23,7 @@ import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.ItemHistory; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; import net.minecraft.core.component.DataComponentPatch; -import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.Identifier; import net.minecraft.world.level.Level; @@ -152,6 +154,20 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int }); } + private DataComponentPatch readPatch(byte[] bytes, Level level) { + if (bytes == null || bytes.length == 0) { + return DataComponentPatch.EMPTY; + } + try { + ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); + CompoundTag compoundTag = NbtIo.readCompressed(inputStream, NbtAccounter.unlimitedHeap()); + return DataComponentPatch.CODEC.parse(level.registryAccess().createSerializationContext(NbtOps.INSTANCE), compoundTag) + .getOrThrow(IllegalStateException::new); + } catch (Exception e) { + return DataComponentPatch.EMPTY; + } + } + public List getFilteredItemHistory(Level level, FilterList filterList) { @Nullable String actions = filterList.getActionString(); @Nullable String users = filterList.getUserString(); @@ -235,9 +251,7 @@ public List getFilteredItemHistory(Level level, FilterList filterLi List itemHistory = new ArrayList<>(); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - ByteBuf buf1 = Unpooled.wrappedBuffer(resultSet.getBytes(8)); - RegistryFriendlyByteBuf buf = new RegistryFriendlyByteBuf(buf1, level.registryAccess()); - DataComponentPatch patch = DataComponentPatch.STREAM_CODEC.decode(buf); + DataComponentPatch patch = readPatch(resultSet.getBytes(8), level); itemHistory.add(new ItemHistory( resultSet.getLong(1), resultSet.getString(2), diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java index 71f2468..a9b3558 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/UserRepository.java @@ -47,7 +47,7 @@ public void insertOrUpdateName(String name, String uuid) { } public void insertNonPlayer(String name) { - String query = "INSERT INTO users(name) VALUES('%s') " + + String query = "INSERT INTO users(name) VALUES(?) " + database.getDialect().getOnConflictDoNothing("name"); database.queue.add(connection -> { diff --git a/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java b/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java index e7c4424..836ea19 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java +++ b/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java @@ -1,15 +1,19 @@ package com.daqem.grieflogger.model; -import io.netty.buffer.Unpooled; +import com.daqem.grieflogger.GriefLogger; import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; import net.minecraft.resources.Identifier; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; +import java.io.ByteArrayOutputStream; import java.util.Objects; public class SimpleItemStack { @@ -77,14 +81,20 @@ public void addCount(int count) { } public byte @Nullable [] getTagBytes(Level level) { - if (tag == null) { + if (tag == null || tag.isEmpty()) { + return null; + } + try { + Tag nbtTag = DataComponentPatch.CODEC.encodeStart(level.registryAccess().createSerializationContext(NbtOps.INSTANCE), tag) + .getOrThrow(IllegalStateException::new); + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + NbtIo.writeCompressed((CompoundTag) nbtTag, outputStream); + return outputStream.toByteArray(); + } catch (Exception e) { + GriefLogger.LOGGER.error("Failed to serialize item components", e); return null; } - RegistryFriendlyByteBuf buf = new RegistryFriendlyByteBuf(Unpooled.buffer(), level.registryAccess()); - DataComponentPatch.STREAM_CODEC.encode(buf, tag); - byte[] temp = new byte[buf.readableBytes()]; - buf.readBytes(temp); - return temp; } public ItemStack toItemStack() { @@ -96,4 +106,4 @@ public ItemStack toItemStack() { public boolean isEmpty() { return item.equals(ItemStack.EMPTY.getItem()) || count == 0; } -} +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a153dfa..6a29df5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem.grieflogger archives_base_name=grieflogger # Project -mod_version=19.0.3 +mod_version=19.0.4 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. From 199dafa081e4e9adb513463b633b221369b81ce5 Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Mon, 2 Feb 2026 12:26:27 +0100 Subject: [PATCH 48/52] fix: hello is still sent when the server is paused --- .../com/daqem/grieflogger/GriefLogger.java | 18 +++++++++++++ .../daqem/grieflogger/event/TickEvents.java | 10 -------- .../grieflogger/thread/ThreadManager.java | 25 +++++++++++++------ 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java index a907db0..eeecbf2 100644 --- a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java +++ b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java @@ -1,6 +1,7 @@ package com.daqem.grieflogger; import com.daqem.grieflogger.event.*; +import com.daqem.grieflogger.thread.ThreadManager; import org.slf4j.Logger; import com.daqem.grieflogger.config.GriefLoggerConfig; @@ -19,6 +20,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -34,6 +36,7 @@ public static void init() { return; } registerEvents(); + startHeartbeat(); } private static void initConfigs() { @@ -102,6 +105,21 @@ public static Database getDatabase() { return DATABASE; } + private static void startHeartbeat() { + int frequencyTicks = GriefLoggerConfig.helloFrequency.get(); + long seconds = frequencyTicks / 20; + if (seconds < 1) seconds = 1; + + ThreadManager.scheduleAtFixedRate(() -> { + Database database = getDatabase(); + if (database != null) { + database.queue.hello(); + database.queue.execute(); + database.batchQueue.execute(); + } + }, seconds, seconds, TimeUnit.SECONDS); + } + public static MutableComponent translate(String str) { return translate(str, TranslatableContents.NO_ARGS); } diff --git a/common/src/main/java/com/daqem/grieflogger/event/TickEvents.java b/common/src/main/java/com/daqem/grieflogger/event/TickEvents.java index 5fba7da..fc67abf 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/TickEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/TickEvents.java @@ -34,16 +34,6 @@ public static void registerEvents() { } } - if (lastTick % GriefLoggerConfig.helloFrequency.get() == 0) { - ThreadManager.execute(() -> { - // Send hello packet to server to keep connection alive - Database database = GriefLogger.getDatabase(); - if (database != null) { - database.queue.hello(); - } - }); - } - lastTick++; }); } diff --git a/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java b/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java index 6db852b..2e8c8d4 100644 --- a/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java +++ b/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java @@ -2,11 +2,7 @@ import java.util.HashMap; import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import java.util.stream.Collectors; public class ThreadManager { @@ -15,37 +11,50 @@ public class ThreadManager { Runtime.getRuntime().availableProcessors(), new GriefLoggerThreadFactory() ); - private static final Map, OnComplete> onCompleteMap = new HashMap<>(); + + private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( + new GriefLoggerThreadFactory() + ); + + private static final Map, OnComplete> onCompleteMap = new ConcurrentHashMap<>(); public static void execute(Runnable runnable) { executor.execute(runnable); } + public static ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { + return scheduler.scheduleAtFixedRate(command, initialDelay, period, unit); + } + public static void submit(Callable task, OnComplete onComplete) { Future future = executor.submit(task); onCompleteMap.put(future, onComplete); } public static Map, OnComplete> getAndRemoveCompleted() { - //noinspection unchecked Map, OnComplete> completedFutures = onCompleteMap.entrySet().stream() .filter(entry -> entry.getKey().isDone()) .collect(Collectors.toMap( entry -> (Future) entry.getKey(), entry -> (OnComplete) entry.getValue() )); - completedFutures.forEach(onCompleteMap::remove); + completedFutures.keySet().forEach(onCompleteMap::remove); return completedFutures; } public static void shutdown() { executor.shutdown(); + scheduler.shutdown(); try { if (!executor.awaitTermination(5, TimeUnit.SECONDS)) { executor.shutdownNow(); } + if (!scheduler.awaitTermination(5, TimeUnit.SECONDS)) { + scheduler.shutdownNow(); + } } catch (InterruptedException e) { executor.shutdownNow(); + scheduler.shutdownNow(); } } } \ No newline at end of file From 8ef44be9ef8d133d766124b1336b067ecb522dde Mon Sep 17 00:00:00 2001 From: DAQEM <66999025+DAQEM@users.noreply.github.com> Date: Mon, 2 Feb 2026 13:45:08 +0100 Subject: [PATCH 49/52] feat: add tnt, creeper and enderman support --- .../command/filter/TimeFilter.java | 13 ++- .../event/block/PlaceBlockEvent.java | 6 +- .../mixin/MixinEnderManLeaveBlockGoal.java | 38 +++++++++ .../mixin/MixinEnderManTakeBlockGoal.java | 38 +++++++++ .../mixin/MixinServerExplosion.java | 54 +++++++++++++ .../daqem/grieflogger/util/EntityUtils.java | 79 +++++++++++++++++++ .../resources/grieflogger-common.mixins.json | 3 + gradle.properties | 2 +- 8 files changed, 224 insertions(+), 9 deletions(-) create mode 100644 common/src/main/java/com/daqem/grieflogger/mixin/MixinEnderManLeaveBlockGoal.java create mode 100644 common/src/main/java/com/daqem/grieflogger/mixin/MixinEnderManTakeBlockGoal.java create mode 100644 common/src/main/java/com/daqem/grieflogger/mixin/MixinServerExplosion.java create mode 100644 common/src/main/java/com/daqem/grieflogger/util/EntityUtils.java diff --git a/common/src/main/java/com/daqem/grieflogger/command/filter/TimeFilter.java b/common/src/main/java/com/daqem/grieflogger/command/filter/TimeFilter.java index 73f039b..7d0a515 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/filter/TimeFilter.java +++ b/common/src/main/java/com/daqem/grieflogger/command/filter/TimeFilter.java @@ -3,6 +3,7 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.model.TimeUnit; import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.SuggestionsBuilder; import java.util.ArrayList; @@ -60,10 +61,14 @@ public String[] listSuggestions(SuggestionsBuilder builder, String prefix, Strin } @Override - public IFilter parse(StringReader reader, String suffix) { - TimeUnit timeUnit = TimeUnit.values()[TimeUnit.getAbbreviations().indexOf(suffix.substring(suffix.length() - 1))]; - int time = Integer.parseInt(suffix.substring(0, suffix.length() - timeUnit.getComponent().getString().length())); - return new TimeFilter(time, timeUnit); + public IFilter parse(StringReader reader, String suffix) throws CommandSyntaxException { + try { + TimeUnit timeUnit = TimeUnit.values()[TimeUnit.getAbbreviations().indexOf(suffix.substring(suffix.length() - 1))]; + int time = Integer.parseInt(suffix.substring(0, suffix.length() - timeUnit.getComponent().getString().length())); + return new TimeFilter(time, timeUnit); + } catch (ArrayIndexOutOfBoundsException e) { + throw new CommandSyntaxException(null, GriefLogger.literal("")); + } } @Override diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/PlaceBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/PlaceBlockEvent.java index 4014c41..fab2459 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/PlaceBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/PlaceBlockEvent.java @@ -1,7 +1,7 @@ package com.daqem.grieflogger.event.block; import com.daqem.grieflogger.model.action.BlockAction; -import com.daqem.grieflogger.player.GriefLoggerServerPlayer; +import com.daqem.grieflogger.util.EntityUtils; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -10,8 +10,6 @@ public class PlaceBlockEvent { public static void placeBlock(Level level, BlockPos pos, BlockState state, Entity placer) { - if (placer instanceof GriefLoggerServerPlayer serverPlayer) { - LogBlockEvent.logBlock(serverPlayer, level, state, pos, BlockAction.PLACE_BLOCK); - } + EntityUtils.logBlockAction(level, pos, state, placer, placer, BlockAction.PLACE_BLOCK); } } diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinEnderManLeaveBlockGoal.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinEnderManLeaveBlockGoal.java new file mode 100644 index 0000000..089ff9a --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinEnderManLeaveBlockGoal.java @@ -0,0 +1,38 @@ +package com.daqem.grieflogger.mixin; + + +import com.daqem.grieflogger.model.action.BlockAction; +import com.daqem.grieflogger.util.EntityUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(targets = "net.minecraft.world.entity.monster.EnderMan$EndermanLeaveBlockGoal") +public class MixinEnderManLeaveBlockGoal { + + @Shadow + @Final + private EnderMan enderman; + + @Inject( + method = "tick()V", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z", + shift = At.Shift.AFTER + ), + locals = LocalCapture.CAPTURE_FAILHARD + ) + private void onEndermanTakeBlock(CallbackInfo ci, RandomSource randomsource, Level level, int i, int j, int k, BlockPos blockpos, BlockState blockstate, BlockPos blockpos1, BlockState blockstate1, BlockState blockstate2) { + EntityUtils.logBlockAction(level, blockpos, blockstate2, this.enderman, this.enderman, BlockAction.PLACE_BLOCK); + } +} diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinEnderManTakeBlockGoal.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinEnderManTakeBlockGoal.java new file mode 100644 index 0000000..d1b9fd9 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinEnderManTakeBlockGoal.java @@ -0,0 +1,38 @@ +package com.daqem.grieflogger.mixin; + +import com.daqem.grieflogger.model.action.BlockAction; +import com.daqem.grieflogger.util.EntityUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.monster.EnderMan; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(targets = "net.minecraft.world.entity.monster.EnderMan$EndermanTakeBlockGoal") +public class MixinEnderManTakeBlockGoal { + + @Shadow + @Final + private EnderMan enderman; + + @Inject( + method = "tick()V", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;removeBlock(Lnet/minecraft/core/BlockPos;Z)Z" + ), + locals = LocalCapture.CAPTURE_FAILHARD + ) + private void onEndermanTakeBlock(CallbackInfo ci, RandomSource randomsource, Level level, int i, int j, int k, BlockPos blockpos, BlockState blockstate, Vec3 vec3, Vec3 vec31, BlockHitResult blockhitresult, boolean flag) { + EntityUtils.logBlockAction(level, blockpos, blockstate, this.enderman, this.enderman, BlockAction.BREAK_BLOCK); + } +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerExplosion.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerExplosion.java new file mode 100644 index 0000000..1a4c884 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerExplosion.java @@ -0,0 +1,54 @@ +package com.daqem.grieflogger.mixin; + +import com.daqem.grieflogger.model.action.BlockAction; +import com.daqem.grieflogger.util.EntityUtils; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.level.ServerExplosion; +import net.minecraft.world.level.block.state.BlockState; +import org.jspecify.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +@Mixin(ServerExplosion.class) +public abstract class MixinServerExplosion { + + @Shadow + @Final + private @Nullable Entity source; + + @Shadow + @Final + private ServerLevel level; + + @Shadow public abstract @Nullable LivingEntity getIndirectSourceEntity(); + + @Inject(method = "interactWithBlocks", at = @At("HEAD")) + private void onInteractWithBlocks(List list, CallbackInfo ci) { + // actor = Who to blame (Player or the Mob itself) + Entity actor = this.getIndirectSourceEntity(); + if (actor == null) actor = this.source; + + // original = The tool used (TNT, Creeper, etc.) + Entity original = this.source; + + if (actor == null || original == null) return; + + for (BlockPos pos : list) { + BlockState state = this.level.getBlockState(pos); + if (!state.isAir()) { + // Pass both to our new utility + EntityUtils.logBlockAction(this.level, pos, state, actor, original, BlockAction.BREAK_BLOCK); + } + } + } +} \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/util/EntityUtils.java b/common/src/main/java/com/daqem/grieflogger/util/EntityUtils.java new file mode 100644 index 0000000..701a239 --- /dev/null +++ b/common/src/main/java/com/daqem/grieflogger/util/EntityUtils.java @@ -0,0 +1,79 @@ +package com.daqem.grieflogger.util; + +import com.daqem.grieflogger.database.service.Services; +import com.daqem.grieflogger.model.action.BlockAction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.OwnableEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; + +import java.nio.charset.StandardCharsets; +import java.util.UUID; + +public class EntityUtils { + + public static void logBlockAction(Level level, BlockPos pos, BlockState state, Entity actor, Entity original, BlockAction action) { + if (actor == null || original == null || level.isClientSide()) return; + + // Resolve the "Responsible" actor (e.g. resolve TNT owner or Creeper target) + Entity logicalActor = resolveLogicalActor(actor); + + // Generate the combined Identity + UUID uuid = getCombinedUUID(logicalActor, original); + String name = getCombinedName(logicalActor, original); + + Services.USER.insertOrUpdateName(uuid, name); + + Identifier materialLocation = state.getBlock().arch$registryName(); + if (materialLocation != null) { + Services.BLOCK.insertMaterial( + uuid, + level.dimension().identifier().toString(), + pos, + materialLocation.toString(), + action + ); + } + } + + private static Entity resolveLogicalActor(Entity entity) { + if (entity instanceof Player) return entity; + if (entity instanceof OwnableEntity ownable && ownable.getOwner() != null) return ownable.getOwner(); + if (entity instanceof Projectile projectile && projectile.getOwner() != null) return projectile.getOwner(); + if (entity instanceof Mob mob && mob.getTarget() != null) return mob.getTarget(); + return entity; + } + + public static UUID getCombinedUUID(Entity actor, Entity original) { + // If it's just a player doing something directly + if (actor instanceof Player && original instanceof Player) { + return actor.getUUID(); + } + + // If it's a Player responsible for an Entity (TNT, Creeper target) + if (actor instanceof Player && !(original instanceof Player)) { + String typeId = BuiltInRegistries.ENTITY_TYPE.getKey(original.getType()).toString(); + String combinedId = "link:" + actor.getUUID().toString() + ":" + typeId; + return UUID.nameUUIDFromBytes(combinedId.getBytes(StandardCharsets.UTF_8)); + } + + // Standard Mob UUID (e.g. pure Enderman or Creeper with no target) + String id = BuiltInRegistries.ENTITY_TYPE.getKey(actor.getType()).toString(); + return UUID.nameUUIDFromBytes(("entity:" + id).getBytes(StandardCharsets.UTF_8)); + } + + public static String getCombinedName(Entity actor, Entity original) { + String actorName = actor.getName().getString(); + if (actor instanceof Player && !(original instanceof Player)) { + String entityName = original.getType().getDescription().getString(); + return actorName + " (" + entityName + ")"; + } + return actorName; + } +} \ No newline at end of file diff --git a/common/src/main/resources/grieflogger-common.mixins.json b/common/src/main/resources/grieflogger-common.mixins.json index fab1c4f..abdb242 100644 --- a/common/src/main/resources/grieflogger-common.mixins.json +++ b/common/src/main/resources/grieflogger-common.mixins.json @@ -9,7 +9,10 @@ "ItemMixin", "MixinArmorStand", "MixinBucketItem", + "MixinEnderManLeaveBlockGoal", + "MixinEnderManTakeBlockGoal", "MixinItemStack", + "MixinServerExplosion", "MixinServerPlayer", "ProjectileMixin" ], diff --git a/gradle.properties b/gradle.properties index 6a29df5..55e280c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ maven_group=com.daqem.grieflogger archives_base_name=grieflogger # Project -mod_version=19.0.4 +mod_version=19.0.5 mod_id=grieflogger mod_name=GriefLogger mod_description=A mod that logs all player interactions with blocks and entities and stores them in a database. From 9a52fb97becfe685cd22309a430bdaa15b2289a3 Mon Sep 17 00:00:00 2001 From: brickmasterhunt Date: Sat, 7 Feb 2026 22:49:45 -0500 Subject: [PATCH 50/52] Buildsystem changes to align with the new style (make merging a bit easier in the future hopefully) - PS, Please add a way to disable your publishing... I can't build with it enabled. (have to comment that out and not commit the change.) - PSS, After writing that, I've gone and implemented a different, modern, publishing plugin that isn't deprecated and doesn't have that problem anyways.. So, doesn't matter. --- build.gradle | 22 +++- common/build.gradle | 2 +- fabric/build.gradle | 4 +- forge/build.gradle | 114 ++++++++++++++------ forge/src/main/resources/META-INF/mods.toml | 2 +- gradle.properties | 4 +- 6 files changed, 106 insertions(+), 42 deletions(-) diff --git a/build.gradle b/build.gradle index b744942..2ca6834 100644 --- a/build.gradle +++ b/build.gradle @@ -29,12 +29,28 @@ subprojects { } repositories { - maven { - url "https://cursemaven.com" - content { + exclusiveContent { + forRepository { + maven { + name = "Curseforge" + url = "https://cursemaven.com" + } + } + filter { includeGroup "curse.maven" } } + exclusiveContent { + forRepository { + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + } + } + filter { + includeGroup "maven.modrinth" + } + } } repositories { diff --git a/common/build.gradle b/common/build.gradle index 8d808e8..1b0be96 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -13,7 +13,7 @@ dependencies { // Remove the next line if you don't want to depend on the API modApi "dev.architectury:architectury:${rootProject.architectury_version}" - modImplementation "com.daqem.yamlconfig:yamlconfig-common:${project.config_library_version}" + compileOnlyApi "maven.modrinth:supermartijn642s-config-lib:${rootProject.config_library_version_fabric}-fabric-mc${project.minecraft_version}" } publishing { diff --git a/fabric/build.gradle b/fabric/build.gradle index ecbaad5..f5b39a4 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -45,7 +45,7 @@ dependencies { modImplementation "com.mysql:mysql-connector-j:${project.mysql_version}" shadowBundle "com.mysql:mysql-connector-j:${project.mysql_version}" - modImplementation "curse.maven:supermartijn642s-config-lib-438332:${project.config_library_file_fabric}" + modImplementation "maven.modrinth:supermartijn642s-config-lib:${rootProject.config_library_version_fabric}-fabric-mc${project.minecraft_version}" } processResources { @@ -61,7 +61,7 @@ processResources { "minecraft_version": project.minecraft_version, "architectury_version": project.architectury_version, - "config_library_version": project.config_library_version + "config_library_version": project.config_library_version_fabric ] inputs.properties replaceProperties diff --git a/forge/build.gradle b/forge/build.gradle index 77964c4..9847d06 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -43,36 +43,70 @@ dependencies { modImplementation "com.mysql:mysql-connector-j:8.4.0" shadowCommon "com.mysql:mysql-connector-j:8.4.0" - modImplementation "curse.maven:supermartijn642s-config-lib-438332:${project.config_library_file_forge}" + modImplementation "curse.maven:supermartijn642s-config-lib-438332:${project.config_library_file_forge}-forge-mc${project.minecraft_version.split('\\\\.')[0..1].join('.')}" } processResources { - inputs.property "version", project.version - inputs.property "config_library_version", config_library_version - - filesMatching("META-INF/mods.toml") { - expand([ - "version": project.version, - "config_library_version": config_library_version - ]) + var replaceProperties = [ + "version": project.version, + "mod_id": project.mod_id, + "mod_name": project.mod_name, + "mod_description": project.mod_description, + "mod_author": project.mod_author, + "mod_license": project.mod_license, + "mod_website": project.mod_website, + "mod_repository": project.mod_repository, + + "supported_forge_modloader_version": project.supported_forge_modloader_version, + "minecraft_version": project.minecraft_version, + "architectury_version": project.architectury_version, + "config_library_version": project.config_library_version_forge + ] + inputs.properties replaceProperties + + filesMatching(['META-INF/mods.toml']) { + expand replaceProperties } } shadowJar { - exclude "fabric.mod.json" - exclude "architectury.common.json" - exclude "org/slf4j/**" + relocate "org.sqlite", "gl_sqlite", { + exclude "org/sqlite/native/**" + exclude "og/sqlite/util/ProcessRunner.class" + } + + relocate "jdbc:sqlite", "jdbc:gl_sqlite" + + transform(NativeTransformer.class) { + rootDir = project.rootDir + relocateNative "org/sqlite", "gl_sqlite" + relocateNative "org_sqlite", "gl_1sqlite" + } - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" + relocate "com.mysql", "gl_mysql" + + configurations = [project.configurations.shadowBundle] + archiveClassifier = "forge-dev-shadow" + + mergeServiceFiles() } remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar - archiveClassifier = "forge" + inputFile.set shadowJar.archiveFile + atAccessWideners.add loom.accessWidenerPath.get().asFile.name + archiveClassifier = null +} + +task renameJarForPublication(type: Zip, dependsOn: remapJar) { + from remapJar.archiveFile.map { zipTree(it) } + archiveExtension = "jar" + metadataCharset "UTF-8" + destinationDirectory = base.libsDirectory + archiveClassifier = project.name } +assemble.dependsOn renameJarForPublication + sourcesJar { def commonSources = project(":common").sourcesJar dependsOn commonSources @@ -80,7 +114,6 @@ sourcesJar { } remapSourcesJar { - //noinspection GroovyAccessibility archiveClassifier = "forge-sources" } @@ -93,14 +126,20 @@ components.java { publishing { publications { mavenForge(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name + groupId = rootProject.maven_group + artifactId = rootProject.archives_base_name + "-forge" from components.java } } - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. repositories { - // Add repositories to publish to here. + maven { + url = project.version.contains('-PR') ? 'https://maven.daqem.com/snapshots' : 'https://maven.daqem.com/releases' + credentials { + username = System.getenv("MAVEN_USER") + password = System.getenv("MAVEN_PASS") + } + } } } @@ -108,39 +147,46 @@ curseforge { apiKey = System.getenv("CURSEFORGE_API_KEY") project { id = project.curse_forge_project_id - releaseType = project.curse_forge_release_type + releaseType = project.release_type changelogType = "markdown" changelog = rootProject.file('changelog.md') - addGameVersion project.minecraft_version + + project.supported_minecraft_versions.split(',').each { version -> + addGameVersion version + } + addGameVersion "Java 17" addGameVersion "Forge" relations { - requiredDependency("architectury-api") - requiredDependency("supermartijn642s-config-lib") + project.curseforge_dependencies.split(',').each { dep -> + requiredDependency dep.trim() + } } mainArtifact(remapJar) { - displayName = "GriefLogger Forge $project.minecraft_version - $project.mod_version" + displayName = "$project.mod_name Forge $project.minecraft_version - $project.mod_version" } - addArtifact(sourcesJar) { + addArtifact(remapSourcesJar) { } } } modrinth { token = System.getenv("MODRINTH_API_KEY") - projectId = "8oGVUFuX" - versionName = "GriefLogger Forge $rootProject.minecraft_version - $rootProject.mod_version" - versionNumber = "$rootProject.mod_version" - versionType = "$rootProject.curse_forge_release_type" + projectId = project.modrinth_project_id + versionName = "$project.mod_name Forge $project.minecraft_version - $project.mod_version" + versionNumber = "$project.mod_version" + versionType = "$project.release_type" uploadFile = remapJar additionalFiles = [remapSourcesJar] - gameVersions = ["$rootProject.minecraft_version"] + gameVersions = project.supported_minecraft_versions.split(',').toList() loaders = ["forge"] + changelog = rootProject.file('changelog.md').text dependencies { - required.project "architectury-api" - required.project "supermartijn642s-config-lib" + project.modrinth_dependencies.split(',').each { dep -> + required.project dep + } } } \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index 5996641..6e0bb98 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -15,7 +15,7 @@ description = "${mod_description}" [[dependencies.grieflogger]] modId = "forge" mandatory = true -versionRange = "[47,)" +versionRange = "[${supported_forge_loader_version},)" ordering = "NONE" side = "SERVER" diff --git a/gradle.properties b/gradle.properties index aa51ce1..1c211da 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,6 +16,7 @@ mod_repository=https://github.com/DAQEM/GriefLogger # Publishing supported_minecraft_versions=1.20.1 +supported_forge_modloader_version=47 release_type=release curse_forge_project_id=435029 @@ -36,6 +37,7 @@ forge_version=47.4.10 # Dependencies architectury_version=9.2.14 -config_library_version=1.1.8 +config_library_version_forge=1.1.8 +config_library_version_fabric=1.1.8a sqlite_version=3.47.2.0 mysql_version=8.4.0 \ No newline at end of file From cf6f26e1e44991d0cfebbe06a1bb250a9f844b5d Mon Sep 17 00:00:00 2001 From: brickmasterhunt Date: Wed, 11 Feb 2026 14:43:38 -0500 Subject: [PATCH 51/52] Pretty much works, but I have no idea why the database refuses to load properly in Dev environment.. --- build.gradle | 13 +-- common/build.gradle | 4 +- .../com/daqem/grieflogger/GriefLogger.java | 6 +- .../daqem/grieflogger/block/BlockHandler.java | 68 ++++++------ .../grieflogger/command/LookupCommand.java | 2 +- .../daqem/grieflogger/command/page/Page.java | 4 +- .../grieflogger/config/GriefLoggerConfig.java | 80 +++++--------- .../daqem/grieflogger/database/Database.java | 4 +- .../repository/ContainerRepository.java | 52 +++------ .../database/repository/ItemRepository.java | 26 ++--- .../database/service/BlockService.java | 8 +- .../database/service/ChatService.java | 2 +- .../database/service/CommandService.java | 2 +- .../database/service/ContainerService.java | 16 +-- .../database/service/ItemService.java | 10 +- .../database/service/SessionService.java | 4 +- .../daqem/grieflogger/event/EntityEvents.java | 12 +- .../grieflogger/event/LevelLoadEvent.java | 4 +- .../grieflogger/event/PlayerJoinEvent.java | 4 +- .../grieflogger/event/block/BlockEvents.java | 4 +- .../event/block/BreakBlockEvent.java | 5 +- .../event/block/LogBlockEvent.java | 6 +- .../event/block/RightClickBlockEvent.java | 2 +- .../grieflogger/i18n/LanguageManager.java | 13 ++- .../grieflogger/mixin/MixinArmorStand.java | 8 +- .../grieflogger/mixin/MixinBucketItem.java | 14 +-- .../grieflogger/mixin/MixinItemStack.java | 34 ++---- .../mixin/MixinServerExplosion.java | 34 +++--- .../grieflogger/mixin/MixinServerPlayer.java | 7 +- .../grieflogger/mixin/ProjectileMixin.java | 6 +- .../grieflogger/model/BlockPosition.java | 4 +- .../grieflogger/model/SimpleItemStack.java | 6 +- .../com/daqem/grieflogger/model/Time.java | 3 +- .../model/history/BlockHistory.java | 32 +++--- .../model/history/ContainerHistory.java | 8 -- .../model/history/ItemHistory.java | 1 - .../grieflogger/thread/ThreadManager.java | 1 - .../daqem/grieflogger/util/EntityUtils.java | 6 +- .../resources/grieflogger-common.mixins.json | 2 +- .../main/resources/grieflogger.accesswidener | 2 +- fabric/build.gradle | 72 +++++------- .../fabric/GriefLoggerPermissionsImpl.java | 7 +- .../fabric/mixin/MixinBucketItem.java | 5 +- fabric/src/main/resources/fabric.mod.json | 2 +- .../resources/grieflogger-fabric.mixins.json | 2 +- forge/build.gradle | 103 +++++++++--------- .../forge/GriefLoggerExpectPlatformImpl.java | 15 --- .../forge/mixin/MixinBucketItem.java | 32 ++++++ .../main/resources/grieflogger.mixins.json | 5 - gradle.properties | 12 +- gradle/wrapper/gradle-wrapper.properties | 2 +- relocate_natives/prepare.sh | 0 relocate_natives/requirements.txt | Bin 66 -> 66 bytes settings.gradle | 1 + 54 files changed, 347 insertions(+), 430 deletions(-) delete mode 100644 forge/src/main/java/com/daqem/grieflogger/forge/GriefLoggerExpectPlatformImpl.java create mode 100644 forge/src/main/java/com/daqem/grieflogger/forge/mixin/MixinBucketItem.java mode change 100644 => 100755 relocate_natives/prepare.sh diff --git a/build.gradle b/build.gradle index 2ca6834..98e209d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { - id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false - id "architectury-plugin" version "3.4-SNAPSHOT" + id 'dev.architectury.loom' version '1.10-SNAPSHOT' apply false + id 'architectury-plugin' version '3.4-SNAPSHOT' id 'com.github.johnrengelman.shadow' apply false } @@ -51,9 +51,6 @@ subprojects { includeGroup "maven.modrinth" } } - } - - repositories { maven { url "https://maven.daqem.com/snapshots/" } maven { url "https://maven.daqem.com/releases" } } @@ -69,11 +66,11 @@ subprojects { // If you remove this line, sources will not be generated. withSourcesJar() - sourceCompatibility = JavaVersion.VERSION_21 - targetCompatibility = JavaVersion.VERSION_21 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } tasks.withType(JavaCompile).configureEach { - it.options.release = 21 + it.options.release = 17 } } diff --git a/common/build.gradle b/common/build.gradle index 1b0be96..ec654cf 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -13,7 +13,9 @@ dependencies { // Remove the next line if you don't want to depend on the API modApi "dev.architectury:architectury:${rootProject.architectury_version}" - compileOnlyApi "maven.modrinth:supermartijn642s-config-lib:${rootProject.config_library_version_fabric}-fabric-mc${project.minecraft_version}" + implementation(("io.github.llamalad7:mixinextras-common:${rootProject.mixin_extras_version}")) + + compileOnlyApi "maven.modrinth:supermartijn642s-config-lib:${rootProject.config_library_version_fabric}" } publishing { diff --git a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java index eeecbf2..a40553e 100644 --- a/common/src/main/java/com/daqem/grieflogger/GriefLogger.java +++ b/common/src/main/java/com/daqem/grieflogger/GriefLogger.java @@ -2,6 +2,7 @@ import com.daqem.grieflogger.event.*; import com.daqem.grieflogger.thread.ThreadManager; +import net.minecraft.resources.ResourceLocation; import org.slf4j.Logger; import com.daqem.grieflogger.config.GriefLoggerConfig; @@ -16,7 +17,6 @@ import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.network.chat.contents.TranslatableContents; -import net.minecraft.resources.Identifier; import java.util.HashMap; import java.util.Map; @@ -210,7 +210,7 @@ public static Style getTheme() { return Style.EMPTY.withColor(0xFCBA03); } - public static Identifier getId(String id) { - return Identifier.fromNamespaceAndPath(MOD_ID, id); + public static ResourceLocation getId(String id) { + return new ResourceLocation(MOD_ID, id); } } diff --git a/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java b/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java index 1921fec..abee0e4 100644 --- a/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java +++ b/common/src/main/java/com/daqem/grieflogger/block/BlockHandler.java @@ -1,6 +1,10 @@ package com.daqem.grieflogger.block; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; @@ -9,55 +13,51 @@ import java.util.Optional; public class BlockHandler { + private static final TagKey C_CHESTS = TagKey.create(Registries.BLOCK, new ResourceLocation("c", "chests")); + private static final TagKey C_WORKBENCHES = TagKey.create(Registries.BLOCK, new ResourceLocation("c", "workbenches")); - public static boolean isBlockIntractable(Block block) { - if (block instanceof FenceGateBlock - || block instanceof DispenserBlock + public static boolean isBlockInteractable(Block block) { + BlockState state = block.defaultBlockState(); + + if (state.is(BlockTags.DOORS) || + state.is(BlockTags.FENCE_GATES) || + state.is(BlockTags.TRAPDOORS) || + state.is(BlockTags.BUTTONS) || + state.is(BlockTags.SIGNS) || + state.is(BlockTags.BEDS)) { + return true; + } + + if (state.is(C_CHESTS) || state.is(C_WORKBENCHES)) { + return true; + } + + if (block instanceof EntityBlock) { + return !(block instanceof BannerBlock); + } + + if (block instanceof LeverBlock || block instanceof NoteBlock - || block instanceof AbstractChestBlock - || block instanceof AbstractFurnaceBlock - || block instanceof LeverBlock - || block instanceof TrapDoorBlock - || block instanceof DoorBlock - || block instanceof BrewingStandBlock || block instanceof DiodeBlock - || block instanceof HopperBlock - || block instanceof DropperBlock - || block instanceof ShulkerBoxBlock - || block instanceof BarrelBlock || block instanceof GrindstoneBlock - || block instanceof ButtonBlock || block instanceof LoomBlock - || block instanceof CraftingTableBlock - || block instanceof CartographyTableBlock - || block instanceof EnchantmentTableBlock - || block instanceof SmithingTableBlock || block instanceof StonecutterBlock - || block instanceof CrafterBlock - || block instanceof VaultBlock - || block instanceof DaylightDetectorBlock - || block instanceof SignBlock - || block instanceof LecternBlock - || block instanceof BeaconBlock - ) { + || block instanceof LecternBlock) { return true; } - return getIntractableBlocks().contains(block.arch$registryName().toString()); + + return getInteractableBlocks().contains(block.arch$registryName().toString()); } - public static List getIntractableBlocks() { + public static List getInteractableBlocks() { //TODO Add config option to add blocks to this list return List.of(); } public static Optional getSecondDoorPosition(BlockPos pos, BlockState state) { - if (state.getBlock() instanceof DoorBlock) { - if (state.getValue(DoorBlock.HALF) == DoubleBlockHalf.LOWER) { - return Optional.of(pos.above()); - } - else if (state.getValue(DoorBlock.HALF) == DoubleBlockHalf.UPPER) { - return Optional.of(pos.below()); - } + if (state.hasProperty(DoorBlock.HALF)) { + DoubleBlockHalf half = state.getValue(DoorBlock.HALF); + return Optional.of(half == DoubleBlockHalf.LOWER ? pos.above() : pos.below()); } return Optional.empty(); } diff --git a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java index 86ff11c..e91ed72 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java +++ b/common/src/main/java/com/daqem/grieflogger/command/LookupCommand.java @@ -69,7 +69,7 @@ private static int lookup(CommandSourceStack source, FilterList filterList) { } List pages = Page.convertToPages(filteredHistory, false); player.grieflogger$setPages(pages); - Page pageToDisplay = pages.getFirst(); + Page pageToDisplay = pages.get(0); pageToDisplay.sendToPlayer((ServerPlayer) player); }); } diff --git a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java index 744e6cc..fcbfdc0 100644 --- a/common/src/main/java/com/daqem/grieflogger/command/page/Page.java +++ b/common/src/main/java/com/daqem/grieflogger/command/page/Page.java @@ -51,7 +51,7 @@ public List getHistory() { private Component getHeader() { MutableComponent header = GriefLogger.translate("lookup.history_header", GriefLogger.themedTranslate("lookup.history_title")); if (singleLocation && !history.isEmpty()) { - header.append(" ").append(history.getFirst().getPosition().getComponent()); + header.append(" ").append(history.get(0).getPosition().getComponent()); } return header; } @@ -77,7 +77,7 @@ private MutableComponent getArrowRight() { } private ClickEvent getClickEvent(int page) { - return new ClickEvent.RunCommand("/grieflogger page " + page); + return new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/grieflogger page " + page); } private Style getStyle(int page, boolean enabled) { diff --git a/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java b/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java index 0f0aba4..08fb62c 100644 --- a/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java +++ b/common/src/main/java/com/daqem/grieflogger/config/GriefLoggerConfig.java @@ -1,81 +1,61 @@ package com.daqem.grieflogger.config; import com.daqem.grieflogger.GriefLogger; -import com.daqem.yamlconfig.YamlConfigExpectPlatform; -import com.daqem.yamlconfig.api.config.ConfigExtension; -import com.daqem.yamlconfig.api.config.ConfigType; -import com.daqem.yamlconfig.api.config.entry.IConfigEntry; -import com.daqem.yamlconfig.impl.config.ConfigBuilder; +import com.mojang.text2speech.OperatingSystem; +import com.supermartijn642.configlib.api.ConfigBuilders; +import com.supermartijn642.configlib.api.IConfigBuilder; -import java.util.List; +import java.util.function.Supplier; public class GriefLoggerConfig { public static void init() { } - public static final IConfigEntry useMysql; - public static final IConfigEntry mysqlHost; - public static final IConfigEntry mysqlPort; - public static final IConfigEntry mysqlDatabase; - public static final IConfigEntry mysqlUsername; - public static final IConfigEntry mysqlPassword; - public static final IConfigEntry mysqlTimeout; - public static final IConfigEntry useIndexes; + public static final Supplier useMysql; + public static final Supplier mysqlHost; + public static final Supplier mysqlPort; + public static final Supplier mysqlDatabase; + public static final Supplier mysqlUsername; + public static final Supplier mysqlPassword; + public static final Supplier mysqlTimeout; + public static final Supplier useIndexes; - public static final IConfigEntry maxPageSize; + public static final Supplier maxPageSize; - public static final IConfigEntry language; + public enum Language { en_us, nl_nl, zh_tw } + public static final Supplier language; - public static final IConfigEntry queueFrequency; - public static final IConfigEntry helloFrequency; + public static final Supplier queueFrequency; + public static final Supplier helloFrequency; static { - ConfigBuilder config = new ConfigBuilder( - GriefLogger.MOD_ID, - "grieflogger-server", - ConfigExtension.YAML, - ConfigType.SERVER, - YamlConfigExpectPlatform.getConfigDirectory().resolve(GriefLogger.MOD_ID) - ); - + IConfigBuilder config = ConfigBuilders.newTomlConfig(GriefLogger.MOD_ID, GriefLogger.MOD_ID, true); config.push("database"); - useMysql = config.defineBoolean("useMysql", false) - .withComments("Whether to use MySQL or SQLite"); - mysqlHost = config.defineString("mysqlHost", "localhost", 1, 255) - .withComments("MySQL host"); - mysqlPort = config.defineInteger("mysqlPort", 3306, 1, 65535) - .withComments("MySQL port"); - mysqlDatabase = config.defineString("mysqlDatabase", "database", 1, 255) - .withComments("MySQL database"); - mysqlUsername = config.defineString("mysqlUsername", "username", 1, 255) - .withComments("MySQL username"); - mysqlPassword = config.defineString("mysqlPassword", "password", 1, 255) - .withComments("MySQL password"); - mysqlTimeout = config.defineInteger("mysqlTimeout", 5000, 1, 60000) - .withComments("MySQL timeout"); - useIndexes = config.defineBoolean("useIndexes", true) - .withComments("Whether to use indexes (improves inspect/lookup speed)"); + useMysql = config.comment("Whether to use MySQL or SQLite").onlyOnServer().define("useMysql", false); + mysqlHost = config.comment("MySQL host").onlyOnServer().define("mysqlHost", "localhost", 1, 255); + mysqlPort = config.comment("MySQL port").onlyOnServer().define("mysqlPort", 3306, 1, 65535); + mysqlDatabase = config.comment("MySQL database").onlyOnServer().define("mysqlDatabase", "database", 1, 255); + mysqlUsername = config.comment("MySQL username").onlyOnServer().define("mysqlUsername", "username", 1, 255); + mysqlPassword = config.comment("MySQL password").onlyOnServer().define("mysqlPassword", "password", 1, 255); + mysqlTimeout = config.comment("MySQL timeout").onlyOnServer().define("mysqlTimeout", 5000, 1, 60000); + useIndexes = config.comment("Whether to use indexes (improves inspect/lookup speed)").onlyOnServer().define("useIndexes", true); config.pop(); config.push("general"); - maxPageSize = config.defineInteger("maxPageSize", 10, 1, 100) - .withComments("Maximum page size"); + maxPageSize = config.comment("Maximum page size").onlyOnServer().define("maxPageSize", 10, 1, 100); config.pop(); config.push("server"); - language = config.defineString("language", "en_us", 1, 10, List.of("en_us", "nl_nl", "zh_tw")) - .withComments("The language to use for translations (en_us, nl_nl, zh_tw)"); + language = config.comment("The language to use for translations (en_us, nl_nl, zh_tw)").onlyOnServer().define("language", Language.en_us); config.pop(); config.push("queue"); - queueFrequency = config.defineInteger("queueFrequency", 20, 1, 100) - .withComments("The frequency at which the database queue is executed (every 'x' ticks)"); + queueFrequency = config.comment("The frequency at which the database queue is executed (every 'x' ticks)").onlyOnServer().define("queueFrequency", 20, 1, 100); config.pop(); config.push("hello"); - helloFrequency = config.defineInteger("helloFrequency", 600, 1, 1000) - .withComments("The frequency at which the hello packet is sent to the server (every 'x' ticks)"); + helloFrequency = config.comment("The frequency at which the hello packet is sent to the server (every 'x' ticks)").onlyOnServer().define("helloFrequency", 600, 1, 1000); config.pop(); config.build(); diff --git a/common/src/main/java/com/daqem/grieflogger/database/Database.java b/common/src/main/java/com/daqem/grieflogger/database/Database.java index 0f48cc2..1590f74 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/Database.java +++ b/common/src/main/java/com/daqem/grieflogger/database/Database.java @@ -9,7 +9,7 @@ import java.util.List; import com.daqem.grieflogger.database.dialect.MySQLDialect; -import com.daqem.yamlconfig.YamlConfigExpectPlatform; +import com.supermartijn642.configlib.ConfigLib; import org.jetbrains.annotations.Nullable; import com.daqem.grieflogger.GriefLogger; @@ -85,7 +85,7 @@ public boolean createSqliteConnection() { GriefLogger.LOGGER.error("Failed to load SQLite driver", e); return false; } - Path path = YamlConfigExpectPlatform.getConfigDirectory().resolve(GriefLogger.MOD_ID); + Path path = ConfigLib.getConfigFolder().toPath().resolve(GriefLogger.MOD_ID); if (!path.toFile().exists()) { //noinspection ResultOfMethodCallIgnored path.toFile().mkdirs(); diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java index e567e97..f306cb6 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ContainerRepository.java @@ -2,15 +2,12 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.command.filter.FilterList; +import com.daqem.grieflogger.database.dialect.MySQLDialect; import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.database.Database; import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.ContainerHistory; import com.daqem.grieflogger.model.history.IHistory; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import net.minecraft.core.component.DataComponentPatch; -import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; @@ -81,7 +78,7 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, "SELECT id FROM materials WHERE name = ?" + "), ?, ?, ?);"; - Identifier itemLocation = item.getItem().arch$registryName(); + ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { database.queue.add(connection -> { try (PreparedStatement materialStatement = connection.prepareStatement(insertMaterialQuery)) { @@ -91,12 +88,12 @@ public void insert(long time, String userUuid, Level level, int x, int y, int z, try (PreparedStatement itemStatement = connection.prepareStatement(insertItemQuery)) { itemStatement.setLong(1, time); itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().identifier().toString()); + itemStatement.setString(3, level.dimension().location().toString()); itemStatement.setInt(4, x); itemStatement.setInt(5, y); itemStatement.setInt(6, z); itemStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); - itemStatement.setBytes(8, item.getTagBytes(level)); + itemStatement.setBytes(8, item.getTagBytes()); itemStatement.setInt(9, item.getCount()); itemStatement.setInt(10, itemAction); itemStatement.executeUpdate(); @@ -125,19 +122,19 @@ public void insertList(long time, String userUuid, Level level, int x, int y, in if (item.isEmpty()) { continue; } - Identifier itemLocation = item.getItem().arch$registryName(); + ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); materialStatement.addBatch(); itemStatement.setLong(1, time); itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().identifier().toString()); + itemStatement.setString(3, level.dimension().location().toString()); itemStatement.setInt(4, x); itemStatement.setInt(5, y); itemStatement.setInt(6, z); itemStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); - itemStatement.setBytes(8, item.getTagBytes(level)); + itemStatement.setBytes(8, item.getTagBytes()); itemStatement.setInt(9, item.getCount()); itemStatement.setInt(10, itemAction); itemStatement.addBatch(); @@ -170,19 +167,19 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int if (item.isEmpty()) { continue; } - Identifier itemLocation = item.getItem().arch$registryName(); + ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { materialStatement.setString(1, itemLocation.toString().replace("minecraft:", "")); materialStatement.addBatch(); itemStatement.setLong(1, time); itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().identifier().toString()); + itemStatement.setString(3, level.dimension().location().toString()); itemStatement.setInt(4, x); itemStatement.setInt(5, y); itemStatement.setInt(6, z); itemStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); - itemStatement.setBytes(8, item.getTagBytes(level)); + itemStatement.setBytes(8, item.getTagBytes()); itemStatement.setInt(9, item.getCount()); itemStatement.setInt(10, entry.getKey().getId()); itemStatement.addBatch(); @@ -195,20 +192,6 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int }); } - private DataComponentPatch readPatch(byte[] bytes, Level level) { - if (bytes == null || bytes.length == 0) { - return DataComponentPatch.EMPTY; - } - try { - ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); - CompoundTag compoundTag = NbtIo.readCompressed(inputStream, NbtAccounter.unlimitedHeap()); - return DataComponentPatch.CODEC.parse(level.registryAccess().createSerializationContext(NbtOps.INSTANCE), compoundTag) - .getOrThrow(IllegalStateException::new); - } catch (Exception e) { - return DataComponentPatch.EMPTY; - } - } - public List getHistory(Level level, int x, int y, int z) { List containerHistory = new ArrayList<>(); String query = """ @@ -224,14 +207,13 @@ public List getHistory(Level level, int x, int y, int z) { """; try (PreparedStatement preparedStatement = database.prepareStatement(query)) { - preparedStatement.setString(1, level.dimension().identifier().toString()); + preparedStatement.setString(1, level.dimension().location().toString()); preparedStatement.setInt(2, x); preparedStatement.setInt(3, y); preparedStatement.setInt(4, z); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - DataComponentPatch patch = readPatch(resultSet.getBytes(8), level); containerHistory.add(new ContainerHistory( resultSet.getLong(1), resultSet.getString(2), @@ -240,7 +222,7 @@ public List getHistory(Level level, int x, int y, int z) { resultSet.getInt(5), resultSet.getInt(6), resultSet.getString(7), - patch, + resultSet.getBytes(8), resultSet.getInt(9), resultSet.getInt(10) )); @@ -266,7 +248,7 @@ public List getHistory(Level level, int x, int y, int z, int x2, int y """; try (PreparedStatement preparedStatement = database.prepareStatement(query)) { - preparedStatement.setString(1, level.dimension().identifier().toString()); + preparedStatement.setString(1, level.dimension().location().toString()); preparedStatement.setInt(2, x); preparedStatement.setInt(3, x2); preparedStatement.setInt(4, y); @@ -276,7 +258,6 @@ public List getHistory(Level level, int x, int y, int z, int x2, int y ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - DataComponentPatch patch = readPatch(resultSet.getBytes(8), level); containerHistory.add(new ContainerHistory( resultSet.getLong(1), resultSet.getString(2), @@ -285,7 +266,7 @@ public List getHistory(Level level, int x, int y, int z, int x2, int y resultSet.getInt(5), resultSet.getInt(6), resultSet.getString(7), - patch, + resultSet.getBytes(8), resultSet.getInt(9), resultSet.getInt(10) )); @@ -322,7 +303,7 @@ public List getFilteredContainerHistory(Level level, FilterList filter """.formatted(actions, users, includeMaterials, excludeMaterials); try (PreparedStatement preparedStatement = database.prepareStatement(query)) { - preparedStatement.setString(1, level.dimension().identifier().toString()); + preparedStatement.setString(1, level.dimension().location().toString()); preparedStatement.setLong(2, filterList.getTime()); if (actions == null || actions.isEmpty()) { @@ -379,7 +360,6 @@ public List getFilteredContainerHistory(Level level, FilterList filter List blockHistory = new ArrayList<>(); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - DataComponentPatch patch = readPatch(resultSet.getBytes(8), level); blockHistory.add(new ContainerHistory( resultSet.getLong(1), resultSet.getString(2), @@ -388,7 +368,7 @@ public List getFilteredContainerHistory(Level level, FilterList filter resultSet.getInt(5), resultSet.getInt(6), resultSet.getString(7), - patch, + resultSet.getBytes(8), resultSet.getInt(9), resultSet.getInt(10))); } diff --git a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java index a96e5c9..2891856 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java +++ b/common/src/main/java/com/daqem/grieflogger/database/repository/ItemRepository.java @@ -3,13 +3,10 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.command.filter.FilterList; import com.daqem.grieflogger.database.Database; +import com.daqem.grieflogger.database.dialect.MySQLDialect; import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.ItemHistory; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.Unpooled; -import net.minecraft.core.component.DataComponentPatch; -import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; @@ -64,7 +61,7 @@ public void createIndexes() { database.execute(sql, false); } - public void insert(long time, String userUuid, String levelName, int x, int y, int z, SimpleItemStack item, int action) { + public void insert(long time, String userUuid, Level level, int x, int y, int z, SimpleItemStack item, int action) { if (item.isEmpty()) { return; } @@ -79,7 +76,7 @@ public void insert(long time, String userUuid, String levelName, int x, int y, i "SELECT id FROM materials WHERE name = ?" + "), ?, ?, ?);"; - Identifier itemLocation = item.getItem().arch$registryName(); + ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { database.queue.add(connection -> { try (PreparedStatement materialStatement = connection.prepareStatement(materialQuery)) { @@ -89,12 +86,12 @@ public void insert(long time, String userUuid, String levelName, int x, int y, i try (PreparedStatement preparedStatement = connection.prepareStatement(itemQuery)) { preparedStatement.setLong(1, time); preparedStatement.setString(2, userUuid); - preparedStatement.setString(3, level.dimension().identifier().toString()); + preparedStatement.setString(3, level.dimension().location().toString()); preparedStatement.setInt(4, x); preparedStatement.setInt(5, y); preparedStatement.setInt(6, z); preparedStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); - preparedStatement.setBytes(8, item.getTagBytes(level)); + preparedStatement.setBytes(8, item.getTagBytes()); preparedStatement.setInt(9, item.getCount()); preparedStatement.setInt(10, action); preparedStatement.executeUpdate(); @@ -131,12 +128,12 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int itemStatement.setLong(1, time); itemStatement.setString(2, userUuid); - itemStatement.setString(3, level.dimension().identifier().toString()); + itemStatement.setString(3, level.dimension().location().toString()); itemStatement.setInt(4, x); itemStatement.setInt(5, y); itemStatement.setInt(6, z); itemStatement.setString(7, itemLocation.toString().replace("minecraft:", "")); - itemStatement.setBytes(8, item.getTagBytes(level)); + itemStatement.setBytes(8, item.getTagBytes()); itemStatement.setInt(9, item.getCount()); itemStatement.setInt(10, entry.getKey().getId()); itemStatement.addBatch(); @@ -146,11 +143,7 @@ public void insertMap(long time, String userUuid, Level level, int x, int y, int materialStatement.executeBatch(); itemStatement.executeBatch(); } - database.batchQueue.add(materialStatement); - database.batchQueue.add(itemStatement); - } catch (SQLException e) { - GriefLogger.LOGGER.error("Failed to insert item", e); - } + }); } public List getFilteredItemHistory(Level level, FilterList filterList) { @@ -236,9 +229,6 @@ public List getFilteredItemHistory(Level level, FilterList filterLi List itemHistory = new ArrayList<>(); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { - ByteBuf buf1 = Unpooled.wrappedBuffer(resultSet.getBytes(8)); - RegistryFriendlyByteBuf buf = new RegistryFriendlyByteBuf(buf1, level.registryAccess()); - DataComponentPatch patch = DataComponentPatch.STREAM_CODEC.decode(buf); itemHistory.add(new ItemHistory( resultSet.getLong(1), resultSet.getString(2), diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java b/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java index 7bb772c..a9d84d8 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/BlockService.java @@ -44,7 +44,7 @@ public void insertEntity(UUID userUuid, String levelName, BlockPos pos, String e public List getBlockHistory(Level level, BlockPos pos) { return blockRepository.getBlockHistory( - level.dimension().identifier().toString(), + level.dimension().location().toString(), pos.getX(), pos.getY(), pos.getZ() @@ -73,7 +73,7 @@ public void getBlockHistoryAsync(Level level, List pos, OnComplete getInteractionHistory(Level level, BlockPos pos) { return blockRepository.getInteractionHistory( - level.dimension().identifier().toString(), + level.dimension().location().toString(), pos.getX(), pos.getY(), pos.getZ() @@ -98,7 +98,7 @@ public void getInteractionHistoryAsync(Level level, List pos, OnComple public void removeInteractionsForPosition(Level level, BlockPos secondPos) { blockRepository.removeInteractionsForPosition( - level.dimension().identifier().toString(), + level.dimension().location().toString(), secondPos.getX(), secondPos.getY(), secondPos.getZ() @@ -111,7 +111,7 @@ public List getFilteredBlockHistory(Level level, FilterList filterList return List.of(); } return blockRepository.getFilteredBlockHistory( - level.dimension().identifier().toString(), + level.dimension().location().toString(), filterList ); } diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/ChatService.java b/common/src/main/java/com/daqem/grieflogger/database/service/ChatService.java index 4f3a199..3cfb659 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/ChatService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/ChatService.java @@ -27,7 +27,7 @@ public void createIndexes() { public void insert(UUID userUuid, Level level, BlockPos pos, String message) { chatRepository.insert(System.currentTimeMillis(), userUuid.toString(), - level.dimension().identifier().toString(), + level.dimension().location().toString(), pos.getX(), pos.getY(), pos.getZ(), diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/CommandService.java b/common/src/main/java/com/daqem/grieflogger/database/service/CommandService.java index 394e416..ed903f0 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/CommandService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/CommandService.java @@ -27,7 +27,7 @@ public void createIndexes() { public void insert(UUID userUuid, Level level, BlockPos pos, String command) { commandRepository.insert(System.currentTimeMillis(), userUuid.toString(), - level.dimension().identifier().toString(), + level.dimension().location().toString(), pos.getX(), pos.getY(), pos.getZ(), diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java b/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java index 5129ea9..16824b8 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/ContainerService.java @@ -9,7 +9,7 @@ import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.IHistory; import net.minecraft.core.BlockPos; -import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import java.util.List; @@ -34,11 +34,11 @@ public void createIndexes() { } public void insert(UUID userUuid, Level level, BlockPos pos, SimpleItemStack item, ItemAction itemAction) { - Identifier itemLocation = item.getItem().arch$registryName(); + ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { containerRepository.insert(System.currentTimeMillis(), userUuid.toString(), - level.dimension().location().toString(), + level, pos.getX(), pos.getY(), pos.getZ(), @@ -50,7 +50,7 @@ public void insert(UUID userUuid, Level level, BlockPos pos, SimpleItemStack ite public void insertList(UUID userUuid, Level level, BlockPos pos, List items, ItemAction itemAction) { containerRepository.insertList(System.currentTimeMillis(), userUuid.toString(), - level.dimension().location().toString(), + level, pos.getX(), pos.getY(), pos.getZ(), @@ -61,7 +61,7 @@ public void insertList(UUID userUuid, Level level, BlockPos pos, List> itemsMap) { containerRepository.insertMap(System.currentTimeMillis(), userUuid.toString(), - level.dimension().location().toString(), + level, pos.getX(), pos.getY(), pos.getZ(), @@ -70,7 +70,7 @@ public void insertMap(UUID userUuid, Level level, BlockPos pos, Map getHistory(Level level, BlockPos pos) { return containerRepository.getHistory( - level.dimension().location().toString(), + level, pos.getX(), pos.getY(), pos.getZ() @@ -79,7 +79,7 @@ public List getHistory(Level level, BlockPos pos) { public List getHistory(Level level, BlockPos pos, BlockPos connectionPos) { return containerRepository.getHistory( - level.dimension().location().toString(), + level, pos.getX(), pos.getY(), pos.getZ(), @@ -95,7 +95,7 @@ public List getFilteredContainerHistory(Level level, FilterList filter return List.of(); } return containerRepository.getFilteredContainerHistory( - level.dimension().location().toString(), + level, filterList ); } diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java b/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java index 9dc5573..cb7a739 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/ItemService.java @@ -9,7 +9,7 @@ import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.ItemHistory; import net.minecraft.core.BlockPos; -import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import java.util.List; @@ -34,11 +34,11 @@ public void createIndexes() { } public void insert(UUID userUuid, Level level, BlockPos pos, SimpleItemStack item, ItemAction itemAction) { - Identifier itemLocation = item.getItem().arch$registryName(); + ResourceLocation itemLocation = item.getItem().arch$registryName(); if (itemLocation != null) { itemRepository.insert(System.currentTimeMillis(), userUuid.toString(), - level.dimension().location().toString(), + level, pos.getX(), pos.getY(), pos.getZ(), @@ -50,7 +50,7 @@ public void insert(UUID userUuid, Level level, BlockPos pos, SimpleItemStack ite public void insertMap(UUID userUuid, Level level, BlockPos pos, Map> itemsMap) { itemRepository.insertMap(System.currentTimeMillis(), userUuid.toString(), - level.dimension().location().toString(), + level, pos.getX(), pos.getY(), pos.getZ(), @@ -63,7 +63,7 @@ public List getFilteredItemHistory(Level level, FilterList filterLi return List.of(); } return itemRepository.getFilteredItemHistory( - level.dimension().location().toString(), + level, filterList ); } diff --git a/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java b/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java index 842574b..5a56d0e 100644 --- a/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java +++ b/common/src/main/java/com/daqem/grieflogger/database/service/SessionService.java @@ -33,7 +33,7 @@ public void insert(UUID userUuid, Level level, BlockPos pos, SessionAction sessi sessionRepository.insert( System.currentTimeMillis(), userUuid.toString(), - level.dimension().identifier().toString(), + level.dimension().location().toString(), pos.getX(), pos.getY(), pos.getZ(), sessionAction.getId() ); @@ -50,7 +50,7 @@ public List getFilteredSessionHistory(Level level, FilterList fi return List.of(); } return sessionRepository.getFilteredSessionHistory( - level.dimension().identifier().toString(), + level.dimension().location().toString(), filterList ); } diff --git a/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java b/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java index de207f1..afd2313 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/EntityEvents.java @@ -2,27 +2,21 @@ import com.daqem.grieflogger.database.service.Services; import com.daqem.grieflogger.model.action.BlockAction; -import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import dev.architectury.event.EventResult; import dev.architectury.event.events.common.EntityEvent; -import dev.architectury.event.events.common.InteractionEvent; -import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.decoration.ArmorStand; - -import java.util.List; public class EntityEvents { public static void registerEvents() { EntityEvent.LIVING_DEATH.register((entity, source) -> { if (source != null && source.getEntity() instanceof ServerPlayer serverPlayer) { - Identifier entityLocation = entity.getType().arch$registryName(); + ResourceLocation entityLocation = entity.getType().arch$registryName(); if (entityLocation != null) { Services.BLOCK.insertEntity( serverPlayer.getUUID(), - entity.level().dimension().identifier().toString(), + entity.level().dimension().location().toString(), entity.blockPosition(), entityLocation.toString(), BlockAction.KILL_ENTITY diff --git a/common/src/main/java/com/daqem/grieflogger/event/LevelLoadEvent.java b/common/src/main/java/com/daqem/grieflogger/event/LevelLoadEvent.java index 07d1833..c2f2880 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/LevelLoadEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/LevelLoadEvent.java @@ -12,10 +12,10 @@ public class LevelLoadEvent { public static void registerEvent() { LifecycleEvent.SERVER_LEVEL_LOAD.register(level -> { - String levelName = level.dimension().identifier().toString(); + String levelName = level.dimension().location().toString(); if (!registeredLevels.contains(levelName)) { registeredLevels.add(levelName); - Services.LEVEL.insert(level.dimension().identifier().toString()); + Services.LEVEL.insert(level.dimension().location().toString()); } }); } diff --git a/common/src/main/java/com/daqem/grieflogger/event/PlayerJoinEvent.java b/common/src/main/java/com/daqem/grieflogger/event/PlayerJoinEvent.java index c47c6e5..9dd5ecd 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/PlayerJoinEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/PlayerJoinEvent.java @@ -12,11 +12,11 @@ public class PlayerJoinEvent { public static void registerEvent() { PlayerEvent.PLAYER_JOIN.register(player -> { GameProfile gameProfile = player.getGameProfile(); - UUID uuid = gameProfile.id(); + UUID uuid = gameProfile.getId(); Services.USER.insertOrUpdateName( uuid, - gameProfile.name() + gameProfile.getName() ); Services.SESSION.insert( diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java b/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java index e654890..69e6349 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/BlockEvents.java @@ -12,7 +12,7 @@ public static void registerEvents() { PlaceBlockEvent.placeBlock(level, blockPos, blockState, entity); return EventResult.pass(); })); - InteractionEvent.LEFT_CLICK_BLOCK.register((player, hand, pos, direction) -> LeftClickBlockEvent.leftClickBlock(player, hand, pos, direction).asMinecraft()); - InteractionEvent.RIGHT_CLICK_BLOCK.register((player, hand, pos, direction) -> RightClickBlockEvent.rightClickBlock(player, hand, pos, direction).asMinecraft()); + InteractionEvent.LEFT_CLICK_BLOCK.register(LeftClickBlockEvent::leftClickBlock); + InteractionEvent.RIGHT_CLICK_BLOCK.register(RightClickBlockEvent::rightClickBlock); } } diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/BreakBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/BreakBlockEvent.java index 774487c..0340284 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/BreakBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/BreakBlockEvent.java @@ -17,8 +17,7 @@ import org.jetbrains.annotations.Nullable; // [ADD THESE IMPORTS] -import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.Blocks; + public class BreakBlockEvent extends AbstractEvent { @@ -29,7 +28,7 @@ public static EventResult breakBlock(Level level, BlockPos pos, BlockState state } Block block = state.getBlock(); - if (BlockHandler.isBlockIntractable(block)) { + if (BlockHandler.isBlockInteractable(block)) { if (block instanceof DoorBlock) { RemoveDoorInteractionsEvent.removeDoorInteractions(level, pos, state); } else { diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/LogBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/LogBlockEvent.java index 3ade280..3262555 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/LogBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/LogBlockEvent.java @@ -5,18 +5,18 @@ import com.daqem.grieflogger.model.action.BlockAction; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import net.minecraft.core.BlockPos; -import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; public class LogBlockEvent extends AbstractEvent { public static void logBlock(GriefLoggerServerPlayer player, Level level, BlockState state, BlockPos pos, BlockAction blockAction) { - Identifier materialLocation = state.getBlock().arch$registryName(); + ResourceLocation materialLocation = state.getBlock().arch$registryName(); if (materialLocation != null) { Services.BLOCK.insertMaterial( player.grieflogger$asServerPlayer().getUUID(), - level.dimension().identifier().toString(), + level.dimension().location().toString(), pos, materialLocation.toString(), blockAction); diff --git a/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java b/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java index 5936496..e0fc787 100644 --- a/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java +++ b/common/src/main/java/com/daqem/grieflogger/event/block/RightClickBlockEvent.java @@ -75,7 +75,7 @@ public static EventResult rightClickBlock(Player player, InteractionHand hand, B return InspectBlockEvent.inspectBlock(serverPlayer, pos.relative(direction)); } - if (BlockHandler.isBlockIntractable(block)) { + if (BlockHandler.isBlockInteractable(block)) { LogBlockEvent.logBlock(serverPlayer, level, state, pos, BlockAction.INTERACT_BLOCK); } } diff --git a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java index 3d13b75..5aa6de6 100644 --- a/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java +++ b/common/src/main/java/com/daqem/grieflogger/i18n/LanguageManager.java @@ -17,12 +17,13 @@ import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.config.GriefLoggerConfig; -import com.daqem.yamlconfig.YamlConfigExpectPlatform; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; +import com.supermartijn642.configlib.ConfigBuilder; +import com.supermartijn642.configlib.ConfigLib; import dev.architectury.platform.Platform; import net.minecraft.locale.Language; import net.minecraft.server.MinecraftServer; @@ -37,14 +38,14 @@ public class LanguageManager { public static void load(MinecraftServer server) { TRANSLATIONS.clear(); - String language = GriefLoggerConfig.language.get(); + GriefLoggerConfig.Language language = GriefLoggerConfig.language.get(); for (String modId : Platform.getModIds()) { - if (!language.equals("en_us")) { + if (!language.equals(GriefLoggerConfig.Language.en_us)) { if (modId.equals("minecraft")) { - loadLanguage(server, language); + loadLanguage(server, language.toString()); } else { - loadLanguage(modId, language); + loadLanguage(modId, language.toString()); } } loadLanguage(modId, "en_us"); @@ -76,7 +77,7 @@ private static void loadLanguage(MinecraftServer server, String languageCode) { try { String mcVersion = server.getServerVersion(); - Path cacheDir = YamlConfigExpectPlatform.getConfigDirectory().resolve(GriefLogger.MOD_ID).resolve("lang_cache"); + Path cacheDir = ConfigLib.getConfigFolder().toPath().resolve(GriefLogger.MOD_ID).resolve("lang_cache"); Files.createDirectories(cacheDir); Path cacheFile = cacheDir.resolve(languageCode + ".json"); diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java index 1690a83..c48e52e 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinArmorStand.java @@ -3,7 +3,7 @@ import com.daqem.grieflogger.database.service.Services; import com.daqem.grieflogger.model.action.BlockAction; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; -import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EntityType; @@ -26,12 +26,12 @@ protected MixinArmorStand(EntityType entityType, Level l @Inject(method = "interactAt", at = @At("RETURN")) private void onInteractAt(Player player, Vec3 vec3, InteractionHand interactionHand, CallbackInfoReturnable cir) { - if ((cir.getReturnValue() == InteractionResult.SUCCESS || cir.getReturnValue() == InteractionResult.SUCCESS_SERVER) && player instanceof GriefLoggerServerPlayer glPlayer) { - Identifier entityLocation = this.getType().arch$registryName(); + if ((cir.getReturnValue() == InteractionResult.SUCCESS) && player instanceof GriefLoggerServerPlayer glPlayer) { + ResourceLocation entityLocation = this.getType().arch$registryName(); if (entityLocation != null) { Services.BLOCK.insertEntity( glPlayer.grieflogger$asServerPlayer().getUUID(), - this.level().dimension().identifier().toString(), + this.level().dimension().location().toString(), this.blockPosition(), entityLocation.toString(), BlockAction.INTERACT_ENTITY diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java index f209301..2bf5f16 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinBucketItem.java @@ -1,14 +1,9 @@ package com.daqem.grieflogger.mixin; -import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.event.block.BreakBlockEvent; -import com.daqem.grieflogger.event.block.PlaceBlockEvent; -import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BucketItem; import net.minecraft.world.item.ItemStack; @@ -17,6 +12,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import com.llamalad7.mixinextras.sugar.Local; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BucketItem.class) @@ -30,9 +26,11 @@ public class MixinBucketItem { ordinal = 0 ) ) - private void onBucketFilled(Level level, Player player, InteractionHand interactionHand, CallbackInfoReturnable cir, @Local(ordinal = 1) ItemStack itemStack2, @Local BlockHitResult blockHitResult) { - if (player instanceof ServerPlayer serverPlayer && itemStack2.getItem() instanceof BucketItem bucketItem) { - BreakBlockEvent.breakBlock(level, blockHitResult.getBlockPos(), bucketItem.arch$getFluid().defaultFluidState().createLegacyBlock(), serverPlayer, null); + private void onBucketFilled(Level level, Player player, InteractionHand interactionHand, + CallbackInfoReturnable cir, @Local(ordinal = 1) ItemStack filledBucket, @Local BlockHitResult hitResult + ) { + if (player instanceof ServerPlayer serverPlayer && filledBucket.getItem() instanceof BucketItem bucketItem) { + BreakBlockEvent.breakBlock(level, hitResult.getBlockPos(), bucketItem.arch$getFluid().defaultFluidState().createLegacyBlock(), serverPlayer, null); } } } \ No newline at end of file diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java index 53b835c..28de0e2 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinItemStack.java @@ -1,39 +1,27 @@ package com.daqem.grieflogger.mixin; import com.daqem.grieflogger.event.item.BreakItemEvent; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.RandomSource; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.function.Consumer; + @Mixin(ItemStack.class) public class MixinItemStack { - @Inject(at = @At(value = "HEAD"), method = "hurtAndBreak(ILnet/minecraft/server/level/ServerLevel;Lnet/minecraft/server/level/ServerPlayer;Ljava/util/function/Consumer;)V") - private void hurtAndBreak(int i, ServerLevel serverLevel, ServerPlayer serverPlayer, Consumer consumer, CallbackInfo ci) { - ItemStack itemStack = (ItemStack) (Object) this; - if (itemStack.isDamageableItem()) { - if (serverPlayer == null || !serverPlayer.hasInfiniteMaterials()) { - if (i > 0) { - i = EnchantmentHelper.processDurabilityChange(serverLevel, itemStack, i); - if (i <= 0) { - return; - } - } - - if (serverPlayer != null && i != 0) { - CriteriaTriggers.ITEM_DURABILITY_CHANGED.trigger(serverPlayer, itemStack, itemStack.getDamageValue() + i); - } - - int j = itemStack.getDamageValue() + i; - if (j >= itemStack.getMaxDamage()) { - BreakItemEvent.breakItem(serverPlayer, itemStack.copyWithCount(1)); - } - } + @Inject(at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/item/ItemStack;shrink(I)V", + shift = At.Shift.BEFORE + ), method = "hurtAndBreak(ILnet/minecraft/world/entity/LivingEntity;Ljava/util/function/Consumer;)V") + public void onHurtAndBreak(int i, T livingEntity, Consumer consumer, CallbackInfo ci) { + if (livingEntity instanceof Player player) { + BreakItemEvent.breakItem(player, (ItemStack) (Object) this); } } } diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerExplosion.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerExplosion.java index 1a4c884..8bc5726 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerExplosion.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerExplosion.java @@ -2,14 +2,15 @@ import com.daqem.grieflogger.model.action.BlockAction; import com.daqem.grieflogger.util.EntityUtils; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.monster.Creeper; -import net.minecraft.world.level.ServerExplosion; +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import org.jspecify.annotations.Nullable; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -17,23 +18,18 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import java.util.List; - -@Mixin(ServerExplosion.class) +@Mixin(Explosion.class) public abstract class MixinServerExplosion { - - @Shadow - @Final - private @Nullable Entity source; - - @Shadow - @Final - private ServerLevel level; + @Shadow @Final private Level level; + @Shadow @Nullable public Entity source; + @Shadow @Final private ObjectArrayList toBlow; @Shadow public abstract @Nullable LivingEntity getIndirectSourceEntity(); - @Inject(method = "interactWithBlocks", at = @At("HEAD")) - private void onInteractWithBlocks(List list, CallbackInfo ci) { + @Inject(method = "finalizeExplosion", at = @At("HEAD")) + private void onInteractWithBlocks(boolean spawnParticles, CallbackInfo ci) { + if (!(this.level instanceof ServerLevel serverLevel)) return; + // actor = Who to blame (Player or the Mob itself) Entity actor = this.getIndirectSourceEntity(); if (actor == null) actor = this.source; @@ -43,11 +39,11 @@ private void onInteractWithBlocks(List list, CallbackInfo ci) { if (actor == null || original == null) return; - for (BlockPos pos : list) { - BlockState state = this.level.getBlockState(pos); + for (BlockPos pos : this.toBlow) { + BlockState state = serverLevel.getBlockState(pos); if (!state.isAir()) { // Pass both to our new utility - EntityUtils.logBlockAction(this.level, pos, state, actor, original, BlockAction.BREAK_BLOCK); + EntityUtils.logBlockAction(serverLevel, pos, state, actor, original, BlockAction.BREAK_BLOCK); } } } diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java index 8a9a39a..87b6381 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/MixinServerPlayer.java @@ -7,16 +7,21 @@ import com.daqem.grieflogger.block.container.IContainerTransactionManager; import com.daqem.grieflogger.command.page.Page; import com.daqem.grieflogger.database.service.Services; +import com.daqem.grieflogger.event.item.DropItemEvent; import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.model.action.ItemAction; import com.daqem.grieflogger.model.history.IHistory; import com.daqem.grieflogger.player.GriefLoggerServerPlayer; import com.mojang.authlib.GameProfile; +import dev.architectury.utils.EnvExecutor; +import net.fabricmc.api.EnvType; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; import org.spongepowered.asm.mixin.Mixin; @@ -65,7 +70,7 @@ public MixinServerPlayer(Level level, BlockPos blockPos, float f, GameProfile ga } else { List pages = Page.convertToPages(historyList, true); grieflogger$setPages(pages); - Page pageToDisplay = pages.getFirst(); + Page pageToDisplay = pages.get(0); pageToDisplay.sendToPlayer(grieflogger$asServerPlayer()); } } diff --git a/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java b/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java index 84bb7db..57034dc 100644 --- a/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java +++ b/common/src/main/java/com/daqem/grieflogger/mixin/ProjectileMixin.java @@ -4,17 +4,17 @@ import com.daqem.grieflogger.event.item.ThrowItemEvent; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.entity.projectile.throwableitemprojectile.ThrowableItemProjectile; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Projectile.class) public class ProjectileMixin { - @Inject(at = @At("HEAD"), method = "shootFromRotation(Lnet/minecraft/world/entity/Entity;FFFFF)V") private void shootFromRotation(Entity entity, float f, float g, float h, float i, float j, CallbackInfo ci) { if (entity instanceof Player player) { diff --git a/common/src/main/java/com/daqem/grieflogger/model/BlockPosition.java b/common/src/main/java/com/daqem/grieflogger/model/BlockPosition.java index 3de193f..4cb1031 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/BlockPosition.java +++ b/common/src/main/java/com/daqem/grieflogger/model/BlockPosition.java @@ -12,7 +12,7 @@ public record BlockPosition(int x, int y, int z) { public Component getComponent() { return GriefLogger.translate("lookup.position", x, y, z) .withStyle(Style.EMPTY.withColor(ChatFormatting.GRAY) - .withHoverEvent(new HoverEvent.ShowText(GriefLogger.literal("Click to teleport to this position."))) - .withClickEvent(new ClickEvent.RunCommand("/tp " + x + " " + y + " " + z))); + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, GriefLogger.literal("Click to teleport to this position."))) + .withClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/tp " + x + " " + y + " " + z))); } } diff --git a/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java b/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java index 5e9997e..da4f8ea 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java +++ b/common/src/main/java/com/daqem/grieflogger/model/SimpleItemStack.java @@ -1,16 +1,12 @@ package com.daqem.grieflogger.model; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import io.netty.buffer.Unpooled; -import net.minecraft.core.component.DataComponentPatch; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.TagParser; -import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import java.nio.charset.StandardCharsets; @@ -20,7 +16,7 @@ public class SimpleItemStack { private final Item item; private int count; - private final DataComponentPatch tag; + private final CompoundTag tag; public SimpleItemStack(ItemStack itemStack) { this(itemStack.getItem(), itemStack.getCount(), itemStack.getTag()); diff --git a/common/src/main/java/com/daqem/grieflogger/model/Time.java b/common/src/main/java/com/daqem/grieflogger/model/Time.java index f984eb2..98cf02b 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/Time.java +++ b/common/src/main/java/com/daqem/grieflogger/model/Time.java @@ -38,7 +38,8 @@ private MutableComponent getTimeAgoComponent(double timeAgo, Component unit) { return GriefLogger.translate("lookup.time.ago", String.format("%.2f", timeAgo), GriefLogger.translate("time.divider"), unit) .withStyle(Style.EMPTY .withColor(ChatFormatting.GRAY) - .withHoverEvent(new HoverEvent.ShowText(GriefLogger.literal(new Date(time).toString()) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + GriefLogger.literal(new Date(time).toString()) .withStyle(ChatFormatting.GRAY)))); } } diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java index 15ff8bf..5bd43c9 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/BlockHistory.java @@ -1,23 +1,22 @@ package com.daqem.grieflogger.model.history; -import java.util.UUID; - import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.i18n.LanguageManager; import com.daqem.grieflogger.model.BlockPosition; import com.daqem.grieflogger.model.Time; import com.daqem.grieflogger.model.User; import com.daqem.grieflogger.model.action.BlockAction; - -import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; + +import java.util.UUID; public class BlockHistory extends History { @@ -43,11 +42,12 @@ public Component getComponent() { } public Component getMaterialComponent() { - Holder.Reference blockReference = BuiltInRegistries.BLOCK.get(Identifier.parse(material)).orElse(null); - Item item = blockReference != null ? blockReference.value().asItem() : Items.AIR; + ResourceLocation id = ResourceLocation.tryParse(material); + Block block = id != null ? BuiltInRegistries.BLOCK.get(id) : Blocks.AIR; + Item item = block.asItem(); MutableComponent mutableComponent; - if (blockReference != null) { - mutableComponent = GriefLogger.themedLiteral(LanguageManager.getString(blockReference.value().getDescriptionId())); + if (block != Blocks.AIR) { + mutableComponent = GriefLogger.themedLiteral(LanguageManager.getString(block.getDescriptionId())); } else { mutableComponent = GriefLogger.themedLiteral(this.material.replace("minecraft:", "")); } @@ -56,16 +56,20 @@ public Component getMaterialComponent() { .withStyle(mutableComponent .getStyle() .withHoverEvent( - new HoverEvent.ShowItem( + new HoverEvent( + HoverEvent.Action.SHOW_ITEM, + new HoverEvent.ItemStackInfo( item.getDefaultInstance() - ))); + )))); } else { return mutableComponent .withStyle(mutableComponent .getStyle() - .withHoverEvent(new HoverEvent.ShowText( - Component.literal(this.material) - ))); + .withHoverEvent( + new HoverEvent( + HoverEvent.Action.SHOW_TEXT, + Component.literal(this.material) + ))); } } } diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ContainerHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ContainerHistory.java index b069b9d..c09209c 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ContainerHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ContainerHistory.java @@ -1,18 +1,10 @@ package com.daqem.grieflogger.model.history; -import com.daqem.grieflogger.GriefLogger; import com.daqem.grieflogger.model.BlockPosition; import com.daqem.grieflogger.model.SimpleItemStack; import com.daqem.grieflogger.model.Time; import com.daqem.grieflogger.model.User; import com.daqem.grieflogger.model.action.IAction; -import com.daqem.grieflogger.model.action.ItemAction; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.HoverEvent; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.Identifier; - -import java.util.UUID; public class ContainerHistory extends ItemHistory { diff --git a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java index c7725fa..cbedf53 100644 --- a/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java +++ b/common/src/main/java/com/daqem/grieflogger/model/history/ItemHistory.java @@ -7,7 +7,6 @@ import com.daqem.grieflogger.model.User; import com.daqem.grieflogger.model.action.IAction; import com.daqem.grieflogger.model.action.ItemAction; -import net.minecraft.core.component.DataComponentPatch; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.MutableComponent; diff --git a/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java b/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java index 2e8c8d4..8cccef9 100644 --- a/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java +++ b/common/src/main/java/com/daqem/grieflogger/thread/ThreadManager.java @@ -1,6 +1,5 @@ package com.daqem.grieflogger.thread; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.*; import java.util.stream.Collectors; diff --git a/common/src/main/java/com/daqem/grieflogger/util/EntityUtils.java b/common/src/main/java/com/daqem/grieflogger/util/EntityUtils.java index 701a239..9e6d8a0 100644 --- a/common/src/main/java/com/daqem/grieflogger/util/EntityUtils.java +++ b/common/src/main/java/com/daqem/grieflogger/util/EntityUtils.java @@ -4,7 +4,7 @@ import com.daqem.grieflogger.model.action.BlockAction; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.OwnableEntity; @@ -30,11 +30,11 @@ public static void logBlockAction(Level level, BlockPos pos, BlockState state, E Services.USER.insertOrUpdateName(uuid, name); - Identifier materialLocation = state.getBlock().arch$registryName(); + ResourceLocation materialLocation = state.getBlock().arch$registryName(); if (materialLocation != null) { Services.BLOCK.insertMaterial( uuid, - level.dimension().identifier().toString(), + level.dimension().location().toString(), pos, materialLocation.toString(), action diff --git a/common/src/main/resources/grieflogger-common.mixins.json b/common/src/main/resources/grieflogger-common.mixins.json index abdb242..9c1e8a9 100644 --- a/common/src/main/resources/grieflogger-common.mixins.json +++ b/common/src/main/resources/grieflogger-common.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "com.daqem.grieflogger.mixin", - "compatibilityLevel": "JAVA_21", + "compatibilityLevel": "JAVA_17", "minVersion": "0.8", "client": [ ], diff --git a/common/src/main/resources/grieflogger.accesswidener b/common/src/main/resources/grieflogger.accesswidener index 5a0e4a3..e739a13 100644 --- a/common/src/main/resources/grieflogger.accesswidener +++ b/common/src/main/resources/grieflogger.accesswidener @@ -1,3 +1,3 @@ accessWidener v2 named -accessible method net/minecraft/world/entity/projectile/arrow/AbstractArrow getPickupItem ()Lnet/minecraft/world/item/ItemStack; \ No newline at end of file +accessible method net/minecraft/world/entity/projectile/AbstractArrow getPickupItem ()Lnet/minecraft/world/item/ItemStack; \ No newline at end of file diff --git a/fabric/build.gradle b/fabric/build.gradle index f5b39a4..bc34f88 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,7 +1,6 @@ plugins { id "com.github.johnrengelman.shadow" - id "com.matthewprenger.cursegradle" version "1.4.0" - id "com.modrinth.minotaur" version "2.+" + id "com.hypherionmc.modutils.modpublisher" version "2.1.8" } architectury { @@ -39,13 +38,17 @@ dependencies { common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowBundle project(path: ":common", configuration: "transformProductionFabric") + include annotationProcessor(implementation("io.github.llamalad7:mixinextras-fabric:${rootProject.mixin_extras_version}")) + modImplementation "org.xerial:sqlite-jdbc:${project.sqlite_version}" shadowBundle "org.xerial:sqlite-jdbc:${project.sqlite_version}" modImplementation "com.mysql:mysql-connector-j:${project.mysql_version}" shadowBundle "com.mysql:mysql-connector-j:${project.mysql_version}" - modImplementation "maven.modrinth:supermartijn642s-config-lib:${rootProject.config_library_version_fabric}-fabric-mc${project.minecraft_version}" + modImplementation "maven.modrinth:supermartijn642s-config-lib:${rootProject.config_library_version_fabric}" + + modCompileOnly "me.lucko:fabric-permissions-api:${rootProject.permissions_api_version_fabric}" } processResources { @@ -61,7 +64,7 @@ processResources { "minecraft_version": project.minecraft_version, "architectury_version": project.architectury_version, - "config_library_version": project.config_library_version_fabric + "config_library_version": project.config_library_version_fabric.split('-')[0].replaceAll(/(\d)([a-zA-Z])$/, '$1+$2') ] inputs.properties replaceProperties @@ -146,50 +149,35 @@ publishing { } } -curseforge { - apiKey = System.getenv("CURSEFORGE_API_KEY") - project { - id = project.curse_forge_project_id - releaseType = project.release_type - changelogType = "markdown" - changelog = rootProject.file('changelog.md') +publisher { + apiKeys { + modrinth System.getenv("MODRINTH_TOKEN") + curseforge System.getenv("CURSE_TOKEN") + github System.getenv("GITHUB_TOKEN") + } - project.supported_minecraft_versions.split(',').each { version -> - addGameVersion version - } + setCurseID(project.curse_forge_project_id) + setModrinthID(project.modrinth_project_id) + setChangelog(rootProject.file("changelog.md")) + setVersionType(project.release_type) - addGameVersion "Java 17" - addGameVersion "Fabric" + setGameVersions(project.supported_minecraft_versions.split(",").collect { it.trim() }) + setJavaVersions(["Java 17"]) - relations { - project.curseforge_dependencies.split(',').each { dep -> - requiredDependency dep.trim() - } - } + setVersion(project.mod_version) + setDisplayName("${project.mod_name} Fabric ${project.minecraft_version} - ${project.mod_version}") - mainArtifact(remapJar) { - displayName = "$project.mod_name Fabric $project.minecraft_version - $project.mod_version" - } - - addArtifact(remapSourcesJar) { + modrinthDepends { + project.modrinth_dependencies.split(",").each { + required(it.trim()) } } -} - -modrinth { - token = System.getenv("MODRINTH_API_KEY") - projectId = project.modrinth_project_id - versionName = "$project.mod_name Fabric $project.minecraft_version - $project.mod_version" - versionNumber = "$project.mod_version" - versionType = "$project.release_type" - uploadFile = remapJar - additionalFiles = [remapSourcesJar] - gameVersions = project.supported_minecraft_versions.split(',').toList() - loaders = ["fabric"] - changelog = rootProject.file('changelog.md').text - dependencies { - project.modrinth_dependencies.split(',').each { dep -> - required.project dep + curseDepends { + project.curseforge_dependencies.split(",").each { + required(it.trim()) } } + + setArtifact(tasks.remapJar) + addAdditionalFile(tasks.remapSourcesJar) } \ No newline at end of file diff --git a/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java b/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java index 6154e94..401554e 100644 --- a/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java +++ b/fabric/src/main/java/com/daqem/grieflogger/fabric/GriefLoggerPermissionsImpl.java @@ -2,9 +2,6 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.commands.CommandSourceStack; -import net.minecraft.server.permissions.Permission; -import net.minecraft.server.permissions.PermissionLevel; -import net.minecraft.server.permissions.Permissions; public class GriefLoggerPermissionsImpl { @@ -16,9 +13,9 @@ public static boolean check(CommandSourceStack source, String permissionNode, in return me.lucko.fabric.api.permissions.v0.Permissions.check(source, permissionNode, fallbackLevel); } catch (Throwable t) { // Fallback if something goes wrong with the API - return source.permissions().hasPermission(new Permission.HasCommandLevel(PermissionLevel.byId(fallbackLevel))); + return source.hasPermission(fallbackLevel); } } - return source.permissions().hasPermission(new Permission.HasCommandLevel(PermissionLevel.byId(fallbackLevel))); + return source.hasPermission(fallbackLevel); } } \ No newline at end of file diff --git a/fabric/src/main/java/com/daqem/grieflogger/fabric/mixin/MixinBucketItem.java b/fabric/src/main/java/com/daqem/grieflogger/fabric/mixin/MixinBucketItem.java index a2f11f5..df1610b 100644 --- a/fabric/src/main/java/com/daqem/grieflogger/fabric/mixin/MixinBucketItem.java +++ b/fabric/src/main/java/com/daqem/grieflogger/fabric/mixin/MixinBucketItem.java @@ -4,6 +4,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BucketItem; import net.minecraft.world.level.Level; import net.minecraft.world.phys.BlockHitResult; @@ -23,8 +24,8 @@ public class MixinBucketItem { shift = At.Shift.AFTER ) ) - private void onLiquidPlaced(LivingEntity livingEntity, Level level, BlockPos blockPos, BlockHitResult blockHitResult, CallbackInfoReturnable cir) { - if (livingEntity instanceof ServerPlayer serverPlayer) { + private void onLiquidPlaced(Player player, Level level, BlockPos blockPos, BlockHitResult blockHitResult, CallbackInfoReturnable cir) { + if (player instanceof ServerPlayer serverPlayer) { PlaceBlockEvent.placeBlock(level, blockPos, level.getBlockState(blockPos), serverPlayer); } } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 62716b6..bd7261a 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -27,6 +27,6 @@ "fabric": "*", "minecraft": ">=${minecraft_version}", "architectury": ">=${architectury_version}", - "yamlconfig": ">=${config_library_version}" + "supermartijn642configlib": ">=${config_library_version}" } } \ No newline at end of file diff --git a/fabric/src/main/resources/grieflogger-fabric.mixins.json b/fabric/src/main/resources/grieflogger-fabric.mixins.json index 112d0a9..ea98482 100644 --- a/fabric/src/main/resources/grieflogger-fabric.mixins.json +++ b/fabric/src/main/resources/grieflogger-fabric.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "com.daqem.grieflogger.fabric.mixin", - "compatibilityLevel": "JAVA_21", + "compatibilityLevel": "JAVA_17", "minVersion": "0.8", "client": [ ], diff --git a/forge/build.gradle b/forge/build.gradle index 9847d06..c7d21a5 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,7 +1,6 @@ plugins { - id "com.github.johnrengelman.shadow" version "7.1.2" - id "com.matthewprenger.cursegradle" version "1.4.0" - id "com.modrinth.minotaur" version "2.+" + id "com.github.johnrengelman.shadow" + id "com.hypherionmc.modutils.modpublisher" version "2.1.8" } architectury { @@ -22,28 +21,39 @@ loom { } configurations { - common - shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. + common { + canBeResolved = true + canBeConsumed = false + } compileClasspath.extendsFrom common runtimeClasspath.extendsFrom common developmentForge.extendsFrom common + + // Files in this configuration will be bundled into your mod using the Shadow plugin. + // Don't use the `shadow` configuration from the plugin itself as it's meant for excluding files. + shadowBundle { + canBeResolved = true + canBeConsumed = false + } } dependencies { - forge "net.minecraftforge:forge:${rootProject.forge_version}" + forge "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}" // Remove the next line if you don't want to depend on the API modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}" - common(project(path: ":common", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } + common(project(path: ':common', configuration: 'namedElements')) { transitive false } + shadowBundle project(path: ':common', configuration: 'transformProductionForge') + + implementation include((("io.github.llamalad7:mixinextras-forge:${rootProject.mixin_extras_version}"))) - modImplementation "org.xerial:sqlite-jdbc:3.47.2.0" - shadowCommon "org.xerial:sqlite-jdbc:3.47.2.0" + implementation "org.xerial:sqlite-jdbc:${project.sqlite_version}" + shadowBundle "org.xerial:sqlite-jdbc:${project.sqlite_version}" - modImplementation "com.mysql:mysql-connector-j:8.4.0" - shadowCommon "com.mysql:mysql-connector-j:8.4.0" + implementation "com.mysql:mysql-connector-j:${project.mysql_version}" + shadowBundle "com.mysql:mysql-connector-j:${project.mysql_version}" - modImplementation "curse.maven:supermartijn642s-config-lib-438332:${project.config_library_file_forge}-forge-mc${project.minecraft_version.split('\\\\.')[0..1].join('.')}" + modImplementation "maven.modrinth:supermartijn642s-config-lib:${rootProject.config_library_version_forge}" } processResources { @@ -57,10 +67,10 @@ processResources { "mod_website": project.mod_website, "mod_repository": project.mod_repository, - "supported_forge_modloader_version": project.supported_forge_modloader_version, + "supported_forge_loader_version": project.supported_forge_loader_version, "minecraft_version": project.minecraft_version, "architectury_version": project.architectury_version, - "config_library_version": project.config_library_version_forge + "config_library_version": project.config_library_version_forge.split('-')[0] ] inputs.properties replaceProperties @@ -86,7 +96,7 @@ shadowJar { relocate "com.mysql", "gl_mysql" configurations = [project.configurations.shadowBundle] - archiveClassifier = "forge-dev-shadow" + archiveClassifier = "dev-shadow" mergeServiceFiles() } @@ -143,50 +153,35 @@ publishing { } } -curseforge { - apiKey = System.getenv("CURSEFORGE_API_KEY") - project { - id = project.curse_forge_project_id - releaseType = project.release_type - changelogType = "markdown" - changelog = rootProject.file('changelog.md') +publisher { + apiKeys { + modrinth System.getenv("MODRINTH_TOKEN") + curseforge System.getenv("CURSE_TOKEN") + github System.getenv("GITHUB_TOKEN") + } - project.supported_minecraft_versions.split(',').each { version -> - addGameVersion version - } + setCurseID(project.curse_forge_project_id) + setModrinthID(project.modrinth_project_id) + setChangelog(rootProject.file("changelog.md")) + setVersionType(project.release_type) - addGameVersion "Java 17" - addGameVersion "Forge" + setGameVersions(project.supported_minecraft_versions.split(",").collect { it.trim() }) + setJavaVersions(["Java 17"]) - relations { - project.curseforge_dependencies.split(',').each { dep -> - requiredDependency dep.trim() - } - } - - mainArtifact(remapJar) { - displayName = "$project.mod_name Forge $project.minecraft_version - $project.mod_version" - } + setVersion(project.mod_version) + setDisplayName("${project.mod_name} Forge ${project.minecraft_version} - ${project.mod_version}") - addArtifact(remapSourcesJar) { + modrinthDepends { + project.modrinth_dependencies.split(",").each { + required(it.trim()) } } -} - -modrinth { - token = System.getenv("MODRINTH_API_KEY") - projectId = project.modrinth_project_id - versionName = "$project.mod_name Forge $project.minecraft_version - $project.mod_version" - versionNumber = "$project.mod_version" - versionType = "$project.release_type" - uploadFile = remapJar - additionalFiles = [remapSourcesJar] - gameVersions = project.supported_minecraft_versions.split(',').toList() - loaders = ["forge"] - changelog = rootProject.file('changelog.md').text - dependencies { - project.modrinth_dependencies.split(',').each { dep -> - required.project dep + curseDepends { + project.curseforge_dependencies.split(",").each { + required(it.trim()) } } + + setArtifact(tasks.remapJar) + addAdditionalFile(tasks.remapSourcesJar) } \ No newline at end of file diff --git a/forge/src/main/java/com/daqem/grieflogger/forge/GriefLoggerExpectPlatformImpl.java b/forge/src/main/java/com/daqem/grieflogger/forge/GriefLoggerExpectPlatformImpl.java deleted file mode 100644 index 084af84..0000000 --- a/forge/src/main/java/com/daqem/grieflogger/forge/GriefLoggerExpectPlatformImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.daqem.grieflogger.forge; - -import com.daqem.grieflogger.GriefLoggerExpectPlatform; -import net.minecraftforge.fml.loading.FMLPaths; - -import java.nio.file.Path; - -public class GriefLoggerExpectPlatformImpl { - /** - * This is our actual method to {@link GriefLoggerExpectPlatform#getConfigDirectory()}. - */ - public static Path getConfigDirectory() { - return FMLPaths.CONFIGDIR.get(); - } -} diff --git a/forge/src/main/java/com/daqem/grieflogger/forge/mixin/MixinBucketItem.java b/forge/src/main/java/com/daqem/grieflogger/forge/mixin/MixinBucketItem.java new file mode 100644 index 0000000..f635b8d --- /dev/null +++ b/forge/src/main/java/com/daqem/grieflogger/forge/mixin/MixinBucketItem.java @@ -0,0 +1,32 @@ +package com.daqem.grieflogger.forge.mixin; + +import com.daqem.grieflogger.event.block.PlaceBlockEvent; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BucketItem.class) +public class MixinBucketItem { + @Inject( + method = "emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;Lnet/minecraft/world/item/ItemStack;)Z", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z", + shift = At.Shift.AFTER + ) + ) + private void onLiquidPlaced(Player livingEntity, Level level, BlockPos blockPos, BlockHitResult blockHitResult, ItemStack container, CallbackInfoReturnable cir) { + if (livingEntity instanceof ServerPlayer serverPlayer) { + PlaceBlockEvent.placeBlock(level, blockPos, level.getBlockState(blockPos), serverPlayer); + } + } +} \ No newline at end of file diff --git a/forge/src/main/resources/grieflogger.mixins.json b/forge/src/main/resources/grieflogger.mixins.json index caa2ad9..71717e4 100644 --- a/forge/src/main/resources/grieflogger.mixins.json +++ b/forge/src/main/resources/grieflogger.mixins.json @@ -1,12 +1,7 @@ { "required": true, -<<<<<<<< HEAD:forge/src/main/resources/grieflogger.mixins.json "package": "com.daqem.grieflogger.forge.mixin", "compatibilityLevel": "JAVA_17", -======== - "package": "com.daqem.grieflogger.neoforge.mixin", - "compatibilityLevel": "JAVA_21", ->>>>>>>> 19.0.5:forge/src/main/resources/grieflogger-neoforge.mixins.json "minVersion": "0.8", "client": [ ], diff --git a/gradle.properties b/gradle.properties index 1c211da..3dcf8e8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,12 +16,12 @@ mod_repository=https://github.com/DAQEM/GriefLogger # Publishing supported_minecraft_versions=1.20.1 -supported_forge_modloader_version=47 +supported_forge_loader_version=47 release_type=release - +# Modrinth curse_forge_project_id=435029 curseforge_dependencies=architectury-api,supermartijn642s-config-lib - +# Curseforge modrinth_project_id=8oGVUFuX modrinth_dependencies=architectury-api,supermartijn642s-config-lib @@ -37,7 +37,9 @@ forge_version=47.4.10 # Dependencies architectury_version=9.2.14 -config_library_version_forge=1.1.8 -config_library_version_fabric=1.1.8a +mixin_extras_version=0.5.3 +config_library_version_forge=1.1.8-forge-mc1.20 +config_library_version_fabric=1.1.8a-fabric-mc1.20.1 +permissions_api_version_fabric=0.3.1 sqlite_version=3.47.2.0 mysql_version=8.4.0 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 707e499..9bf7bd3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/relocate_natives/prepare.sh b/relocate_natives/prepare.sh old mode 100644 new mode 100755 diff --git a/relocate_natives/requirements.txt b/relocate_natives/requirements.txt index f8d132bea1bfb98e44401a5c2c7f6b11aebc1c9b..3664d4150fd26de5057fb1390b0f9994dcdfd99b 100644 GIT binary patch delta 13 UcmZ>Anjpez&Y;I&JW)~;024|AnE(I) delta 13 UcmZ>Anjpez#-PVwG*MC$024j}mjD0& diff --git a/settings.gradle b/settings.gradle index a71de20..8ca2dc1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,6 +3,7 @@ pluginManagement { maven { url "https://maven.fabricmc.net/" } maven { url "https://maven.architectury.dev/" } maven { url "https://maven.minecraftforge.net/" } + maven { url "https://maven.firstdark.dev/releases" } gradlePluginPortal() } } From 94408325a5d895837aec601a86858bc089086e77 Mon Sep 17 00:00:00 2001 From: brickmasterhunt Date: Thu, 12 Feb 2026 17:51:30 -0500 Subject: [PATCH 52/52] Implement GriefLoggerPermissionsImpl on forge, server now won't crash upon every login on forge lol --- .../forge/GriefLoggerPermissionsImpl.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 forge/src/main/java/com/daqem/grieflogger/forge/GriefLoggerPermissionsImpl.java diff --git a/forge/src/main/java/com/daqem/grieflogger/forge/GriefLoggerPermissionsImpl.java b/forge/src/main/java/com/daqem/grieflogger/forge/GriefLoggerPermissionsImpl.java new file mode 100644 index 0000000..a5ded87 --- /dev/null +++ b/forge/src/main/java/com/daqem/grieflogger/forge/GriefLoggerPermissionsImpl.java @@ -0,0 +1,56 @@ +package com.daqem.grieflogger.forge; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.server.permission.PermissionAPI; +import net.minecraftforge.server.permission.nodes.PermissionNode; +import net.minecraftforge.server.permission.nodes.PermissionTypes; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class GriefLoggerPermissionsImpl { + + // Cache dynamic nodes so we don't re-create them constantly, + // though ideally, nodes should be registered during startup event. + // For simple compatibility without heavy registration logic, checking string nodes + // often requires the permission manager (LuckPerms) to handle unregistered nodes gracefully. + private static final Map> NODES = new ConcurrentHashMap<>(); + + public static boolean check(CommandSourceStack source, String permissionNode, int fallbackLevel) { + if (source.getEntity() instanceof ServerPlayer player) { + // LuckPerms on Forge can usually intercept permission checks even if + // the node isn't strictly registered in the PermissionAPI registry, + // depending on how the PermissionHandler is implemented. + // However, the "Correct" way is to use PermissionAPI.getPermission. + + // If you want strict node registration, you'd need a registry event. + // For lightweight compat, we try to get the permission value. + + // Create a temporary node wrapper or lookup existing (Logic depends on if you want + // to pre-register specific nodes or allow dynamic strings). + + PermissionNode node = NODES.computeIfAbsent(permissionNode, id -> + new PermissionNode<>( + "grieflogger", + id.replace("grieflogger.", ""), + PermissionTypes.BOOLEAN, + (p, uuid, context) -> false + ) + ); + + // Note: Using PermissionAPI with unregistered nodes might warn or default to false + // depending on the implementation installed (e.g. Default vs LuckPerms). + // LuckPerms usually handles unregistered lookups fine. + try { + return PermissionAPI.getPermission(player, node); + } catch (Exception e) { + // Fallback to OP if PermissionAPI fails or node is unknown/unregistered context + return source.hasPermission(fallbackLevel); + } + } + + // Console / Command Blocks + return source.hasPermission(fallbackLevel); + } +} \ No newline at end of file