diff --git a/src/main/java/com/b1n_ry/yigd/compat/LevelzCompat.java b/src/main/java/com/b1n_ry/yigd/compat/LevelzCompat.java index 62e470b4..250e5215 100644 --- a/src/main/java/com/b1n_ry/yigd/compat/LevelzCompat.java +++ b/src/main/java/com/b1n_ry/yigd/compat/LevelzCompat.java @@ -70,9 +70,6 @@ public DefaultedList storeToPlayer(ServerPlayerEntity player) { public void handleDropRules(DeathContext context) { // Only default drop rule should matter, which is tested in #filterInv() // There are no specific drop rules for this component (except drop). Only a set standard from the config -// if (YigdConfig.getConfig().compatConfig.defaultLevelzDropRule == DropRule.DROP) { -// this.dropItems(context.world(), context.deathPos()); -// } } @Override diff --git a/src/main/java/com/b1n_ry/yigd/compat/NumismaticOverhaulCompat.java b/src/main/java/com/b1n_ry/yigd/compat/NumismaticOverhaulCompat.java index 7ebeb036..90123ab5 100644 --- a/src/main/java/com/b1n_ry/yigd/compat/NumismaticOverhaulCompat.java +++ b/src/main/java/com/b1n_ry/yigd/compat/NumismaticOverhaulCompat.java @@ -1,6 +1,5 @@ package com.b1n_ry.yigd.compat; -import com.b1n_ry.yigd.components.InventoryComponent; import com.b1n_ry.yigd.config.YigdConfig; import com.b1n_ry.yigd.data.DeathContext; import com.b1n_ry.yigd.events.DropRuleEvent; @@ -16,7 +15,6 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Pair; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.Vec3d; import java.util.function.Predicate; @@ -155,10 +153,6 @@ public DefaultedList> getAsStackDropList() { @Override public CompatComponent filterInv(Predicate predicate) { -// if (predicate.test(YigdConfig.getConfig().compatConfig.defaultNumismaticDropRule)) { -// return new NumismaticCompatComponent(this.inventory, this.dropValue, this.keepValue, this.destroyValue, this.graveValue); -// } - long totalValue = 0; if (predicate.test(DropRule.DROP)) totalValue += this.dropValue; diff --git a/src/main/java/com/b1n_ry/yigd/compat/OriginsCompat.java b/src/main/java/com/b1n_ry/yigd/compat/OriginsCompat.java index 68c385da..b84723e6 100644 --- a/src/main/java/com/b1n_ry/yigd/compat/OriginsCompat.java +++ b/src/main/java/com/b1n_ry/yigd/compat/OriginsCompat.java @@ -13,7 +13,6 @@ import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Pair; import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.Vec3d; import java.util.*; import java.util.function.Predicate; diff --git a/src/main/java/com/b1n_ry/yigd/compat/TravelersBackpackCompat.java b/src/main/java/com/b1n_ry/yigd/compat/TravelersBackpackCompat.java index 7cb01b5f..21c2586b 100644 --- a/src/main/java/com/b1n_ry/yigd/compat/TravelersBackpackCompat.java +++ b/src/main/java/com/b1n_ry/yigd/compat/TravelersBackpackCompat.java @@ -85,11 +85,7 @@ public DefaultedList merge(CompatComponent mergingComponent) { public DefaultedList storeToPlayer(ServerPlayerEntity player) { if (this.inventory.getLeft().isEmpty()) return DefaultedList.of(); - ITravelersBackpackComponent component = ComponentUtils.getComponent(player); - - component.setWearable(this.inventory.getLeft()); - component.setContents(this.inventory.getLeft()); - component.sync(); + ComponentUtils.equipBackpack(player, this.inventory.getLeft()); return DefaultedList.of(); } diff --git a/src/main/java/com/b1n_ry/yigd/components/GraveComponent.java b/src/main/java/com/b1n_ry/yigd/components/GraveComponent.java index 89daf9b4..98db3a96 100644 --- a/src/main/java/com/b1n_ry/yigd/components/GraveComponent.java +++ b/src/main/java/com/b1n_ry/yigd/components/GraveComponent.java @@ -11,6 +11,7 @@ import com.b1n_ry.yigd.events.GraveGenerationEvent; import com.b1n_ry.yigd.packets.LightGraveData; import com.b1n_ry.yigd.util.DropRule; +import com.b1n_ry.yigd.util.GraveCompassHelper; import com.b1n_ry.yigd.util.GraveOverrideAreas; import com.mojang.authlib.GameProfile; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -154,6 +155,10 @@ public void setLocked(boolean locked) { DeathInfoManager.INSTANCE.markDirty(); } public void setStatus(GraveStatus status) { + if (this.status == GraveStatus.UNCLAIMED + && YigdConfig.getConfig().extraFeatures.graveCompass.pointToClosest != YigdConfig.ExtraFeatures.GraveCompassConfig.CompassGraveTarget.DISABLED) { + GraveCompassHelper.setClaimed(this.worldRegistryKey, this.pos); + } this.status = status; DeathInfoManager.INSTANCE.markDirty(); } @@ -381,8 +386,7 @@ public ActionResult claim(ServerPlayerEntity player, ServerWorld world, BlockSta } } - this.status = GraveStatus.CLAIMED; - DeathInfoManager.INSTANCE.markDirty(); + this.setStatus(GraveStatus.CLAIMED); if (thisIsARobbery && config.graveConfig.graveRobbing.notifyWhenRobbed) { MinecraftServer server = world.getServer(); diff --git a/src/main/java/com/b1n_ry/yigd/config/YigdConfig.java b/src/main/java/com/b1n_ry/yigd/config/YigdConfig.java index 5a2e6bca..c82acf32 100644 --- a/src/main/java/com/b1n_ry/yigd/config/YigdConfig.java +++ b/src/main/java/com/b1n_ry/yigd/config/YigdConfig.java @@ -385,6 +385,7 @@ public static class GraveCompassConfig { public boolean deleteWhenUnlinked = true; public boolean cloneRecoveryCompassWithGUI = false; @ConfigEntry.Gui.RequiresRestart + @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) public CompassGraveTarget pointToClosest = CompassGraveTarget.DISABLED; public enum CompassGraveTarget { DISABLED, PLAYER, ALL diff --git a/src/main/java/com/b1n_ry/yigd/data/DeathInfoManager.java b/src/main/java/com/b1n_ry/yigd/data/DeathInfoManager.java index 9d4d4ffd..c6dab011 100644 --- a/src/main/java/com/b1n_ry/yigd/data/DeathInfoManager.java +++ b/src/main/java/com/b1n_ry/yigd/data/DeathInfoManager.java @@ -96,7 +96,8 @@ public void addBackup(GameProfile profile, GraveComponent component) { } } - if (config.extraFeatures.graveCompass.pointToClosest != YigdConfig.ExtraFeatures.GraveCompassConfig.CompassGraveTarget.DISABLED) { + if (config.extraFeatures.graveCompass.pointToClosest != YigdConfig.ExtraFeatures.GraveCompassConfig.CompassGraveTarget.DISABLED + && component.getStatus() == GraveStatus.UNCLAIMED) { GraveCompassHelper.addGravePosition(component.getWorldRegistryKey(), component.getPos(), profile.getId()); } } diff --git a/src/main/java/com/b1n_ry/yigd/events/YigdServerEventHandler.java b/src/main/java/com/b1n_ry/yigd/events/YigdServerEventHandler.java index 2d22f352..c9585586 100644 --- a/src/main/java/com/b1n_ry/yigd/events/YigdServerEventHandler.java +++ b/src/main/java/com/b1n_ry/yigd/events/YigdServerEventHandler.java @@ -6,6 +6,7 @@ import com.b1n_ry.yigd.data.DeathInfoManager; import com.b1n_ry.yigd.util.DropRule; import com.b1n_ry.yigd.data.ListMode; +import com.b1n_ry.yigd.util.GraveCompassHelper; import com.b1n_ry.yigd.util.GraveOverrideAreas; import com.b1n_ry.yigd.util.YigdTags; import me.lucko.fabric.api.permissions.v0.PermissionCheckEvent; @@ -97,17 +98,23 @@ public static void registerEventCallbacks() { YigdConfig config = YigdConfig.getConfig(); - if (config.extraFeatures.graveCompass.consumeOnUse) { + if (config.extraFeatures.graveCompass.consumeOnUse || config.extraFeatures.graveCompass.pointToClosest != YigdConfig.ExtraFeatures.GraveCompassConfig.CompassGraveTarget.DISABLED) { PlayerInventory inventory = player.getInventory(); for (int i = 0; i < inventory.size(); i++) { ItemStack stack = inventory.getStack(i); - NbtCompound stackNbt = stack.getNbt(); - if (stack.isOf(Items.COMPASS) && stackNbt != null && stackNbt.contains("linked_grave")) { - UUID graveId = stackNbt.getUuid("linked_grave"); - if (graveId.equals(grave.getGraveId())) { - stack.setCount(0); - break; + if (!stack.isOf(Items.COMPASS)) continue; + + if (config.extraFeatures.graveCompass.consumeOnUse) { + NbtCompound stackNbt = stack.getNbt(); + if (stack.isOf(Items.COMPASS) && stackNbt != null && stackNbt.contains("linked_grave")) { + UUID graveId = stackNbt.getUuid("linked_grave"); + if (graveId.equals(grave.getGraveId())) { + stack.setCount(0); + break; + } } + } else { // Redirect closest grave pointer + GraveCompassHelper.updateClosestNbt(world.getRegistryKey(), player.getBlockPos(), player.getUuid(), stack); } } } diff --git a/src/main/java/com/b1n_ry/yigd/util/GraveCompassHelper.java b/src/main/java/com/b1n_ry/yigd/util/GraveCompassHelper.java index 44d6fc3c..bf9cce5b 100644 --- a/src/main/java/com/b1n_ry/yigd/util/GraveCompassHelper.java +++ b/src/main/java/com/b1n_ry/yigd/util/GraveCompassHelper.java @@ -52,6 +52,8 @@ public static void updateClosestNbt(RegistryKey worldKey, BlockPos pos, U NbtCompound compassNbt = compass.getNbt(); if (compassNbt == null) return; + if (!compassNbt.contains("grave_pos")) return; // Not a grave compass + BlockPos closestPos = findClosest(holderId, worldKey, pos); if (closestPos != null) { compassNbt.put("grave_pos", NbtHelper.fromBlockPos(closestPos)); @@ -88,6 +90,34 @@ private static void addGravePosition(KDNode parent, UUID ownerId, int[] pos, int } } + public static void setClaimed(RegistryKey worldKey, BlockPos gravePos) { + KDNode root = GRAVE_POSITIONS.get(worldKey); + if (root == null) { + return; + } + + int[] pos = new int[] { gravePos.getX(), gravePos.getY(), gravePos.getZ() }; + + setClaimed(root, pos, 0); + } + private static void setClaimed(KDNode node, int[] pos, int depth) { + if (node == null) { + return; + } + + if (node.pos[0] == pos[0] && node.pos[1] == pos[1] && node.pos[2] == pos[2]) { + node.isUnclaimed = false; + return; + } + + int cmp = depth % 3; + if (node.pos[cmp] < pos[cmp]) { + setClaimed(node.right, pos, depth + 1); + } else { + setClaimed(node.left, pos, depth + 1); + } + } + public static @Nullable BlockPos findClosest(UUID ownerId, RegistryKey worldKey, BlockPos pos) { GraveCompassConfig config = YigdConfig.getConfig().extraFeatures.graveCompass; if (config.pointToClosest == GraveCompassConfig.CompassGraveTarget.DISABLED) return null; // What how are we here? @@ -104,14 +134,14 @@ private static void addGravePosition(KDNode parent, UUID ownerId, int[] pos, int return closest == null ? null : new BlockPos(closest[0], closest[1], closest[2]); } private static int[] findClosest(KDNode node, UUID ownerId, int[] pos, int depth, GraveCompassConfig config) { - if (node == null) { + if (node == null || depth > 100) { return null; } int cmp = depth % 3; int[] closest = null; // If not all, it's player specific. If not that, it's disabled, and won't reach this - if (config.pointToClosest == GraveCompassConfig.CompassGraveTarget.ALL || node.ownerId.equals(ownerId)) { + if ((config.pointToClosest == GraveCompassConfig.CompassGraveTarget.ALL || node.ownerId.equals(ownerId)) && node.isUnclaimed) { closest = node.pos; } @@ -144,6 +174,7 @@ private static double distanceSquared(int[] pos1, int[] pos2) { private static class KDNode { @NotNull private final UUID ownerId; + private boolean isUnclaimed = true; private final int @NotNull [] pos; @Nullable private KDNode left;