From 300e0a940aaaf704576d885df03070b91251b574 Mon Sep 17 00:00:00 2001 From: micle Date: Sat, 10 Jan 2026 19:24:37 +0100 Subject: [PATCH] Rewrote TotemItem methods to simplify usage and keep functionality within the same class. --- .../totemofreviving/item/totem/TotemItem.java | 216 +++++++++--------- 1 file changed, 108 insertions(+), 108 deletions(-) diff --git a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java index e54eb5a..378888d 100644 --- a/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/totem/TotemItem.java @@ -10,10 +10,13 @@ import dev.micle.totemofreviving.setup.ModDataComponents; import dev.micle.totemofreviving.setup.ModKeyMappings; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.players.PlayerList; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; @@ -25,6 +28,7 @@ import net.neoforged.api.distmarker.OnlyIn; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -38,133 +42,129 @@ public abstract class TotemItem extends Item { super(new Properties().stacksTo(1).rarity(rarity).durability(durability)); } + public abstract boolean isCharge(ItemStack stack); + + public abstract Config.TotemConfig getConfig(); + + private boolean isChargeFull(TotemData totemData) { + return totemData.getCharge() >= getMaxCharge(); + } + + private int getMaxCharge() { + return getConfig().getChargeCost() == -1 + ? getConfig().getChargeCostLimit() + : getConfig().getChargeCost(); + } + + private int getTargetCost(TotemData totemData) { + return getConfig().getChargeCost() != -1 + ? getConfig().getChargeCost() + : (int)(totemData.getTargetDeaths() * getConfig().getChargeCostMultiplier()); + } + + private boolean canAffordTarget(TotemData totemData) { + return totemData.getCharge() >= getTargetCost(totemData) || (isChargeFull(totemData) && getConfig().getCanReviveMoreExpensiveTargets()); + } + + private static TotemData getTotemData(ItemStack itemStack) { + return itemStack.getComponents().get(ModDataComponents.TOTEM_DATA.get()); + } + + private static void setTotemData(ItemStack itemStack, TotemData totemData) { + itemStack.set(ModDataComponents.TOTEM_DATA.get(), totemData); + } + public static boolean isTotem(ItemStack stack) { return (stack.getItem() instanceof TotemItem); } - public abstract boolean isCharge(ItemStack stack); + @OnlyIn(Dist.DEDICATED_SERVER) + public static Optional cycleTarget(ItemStack itemStack, PlayerList playerList) { + if (!isTotem(itemStack)) return Optional.empty(); + TotemData totemData = getTotemData(itemStack); - public static Optional getTargetIndex(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getTargetIndex())); - } - public static void setTargetIndex(ItemStack stack, int targetIndex) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } + int targetIndex = totemData.getTargetIndex() + 1; + targetIndex = targetIndex > playerList.getPlayerCount() ? 0 : targetIndex; - data.get().setTargetIndex(targetIndex); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); + ServerPlayer target = playerList.getPlayers().get(targetIndex); + + totemData.setTargetIndex(targetIndex); + totemData.setTargetUUID(target.getStringUUID()); + totemData.setTargetName(target.getScoreboardName()); + totemData.setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); + + setTotemData(itemStack, totemData); + return Optional.of(totemData); } - public static Optional getTargetUUID(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(UUID.fromString(totemData.getTargetUUID()))); - } - public static void setTargetUUID(ItemStack stack, UUID targetUUID) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } + @OnlyIn(Dist.DEDICATED_SERVER) + public static boolean chargeTotem(ItemStack totemStack, ItemStack chargeStack) { + if (!isTotem(totemStack)) return false; + TotemData totemData = getTotemData(totemStack); + TotemItem totemItem = ((TotemItem) totemStack.getItem()); - data.get().setTargetUUID(targetUUID.toString()); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); + if (!totemItem.isCharge(chargeStack)) return false; + if (totemItem.isChargeFull(totemData)) return false; + + totemData.setCharge(totemData.getCharge() + 1); + + setTotemData(totemStack, totemData); + chargeStack.setCount(chargeStack.getCount() - 1); + return true; } - public static Optional getTargetName(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getTargetName())); - } - public static void setTargetName(ItemStack stack, String targetName) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } + @OnlyIn(Dist.DEDICATED_SERVER) + public static Component reviveTarget(EquipmentSlot slot, ItemStack itemStack, ServerPlayer user, PlayerList playerList) { + if (!isTotem(itemStack)) return Component.empty(); + TotemData totemData = getTotemData(itemStack); + TotemItem totemItem = ((TotemItem) itemStack.getItem()); + Config.TotemConfig config = totemItem.getConfig(); - data.get().setTargetName(targetName); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); + ServerPlayer target = playerList.getPlayer(UUID.fromString(totemData.getTargetUUID())); + if (target == null) { + return Component.literal(ChatFormatting.WHITE + "Unable to find player!"); + } + + totemData.setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); + setTotemData(itemStack, totemData); + + if (!target.isSpectator()) { + return Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is not dead!"); + } + + try (ServerLevel targetLevel = target.serverLevel()) { + if (!targetLevel.equals(user.serverLevel()) && !config.getCanReviveAcrossDimensions()) { + return Component.literal(ChatFormatting.GRAY + target.getDisplayName().getString() + ChatFormatting.WHITE + " is in a different dimension!"); + } + } catch (IOException e) { + return Component.literal(ChatFormatting.WHITE + "Unable to get " + ChatFormatting.GRAY + target.getDisplayName().getString() + "'s " + ChatFormatting.WHITE + " level!"); + } + + if (!totemItem.canAffordTarget(totemData)) { + return Component.literal(ChatFormatting.WHITE + "Not enough charge!"); + } + + try (ServerLevel userLevel = user.serverLevel()) { + target.teleportTo(userLevel, user.position().x, user.position().y, user.position().z, user.getYRot(), user.getXRot()); + target.setGameMode(userLevel.getServer().getDefaultGameType()); + } catch (IOException e) { + return Component.literal(ChatFormatting.WHITE + "Unable to get your level!"); + } + + totemData.setCharge(totemData.getCharge() - totemItem.getTargetCost(totemData)); + + setTotemData(itemStack, totemData); + itemStack.hurtAndBreak(1, user, slot); + + return Component.literal(ChatFormatting.WHITE + "Successfully revived " + ChatFormatting.GRAY + target.getDisplayName().getString() + "!"); } - public static Optional getTargetDeaths(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getTargetDeaths())); - } - public static void setTargetDeaths(ItemStack stack, ServerPlayer target) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } - - data.get().setTargetDeaths(target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); - } - - public static Optional getCharge(ItemStack stack) { - return getTotemData(stack).flatMap(totemData -> Optional.of(totemData.getCharge())); - } - public static void setCharge(ItemStack stack, int charge) { - Optional data = getTotemData(stack); - if (data.isEmpty()) { return; } - - data.get().setCharge(charge); - stack.set(ModDataComponents.TOTEM_DATA.get(), data.get()); - } - - public static Optional getTargetCost(ItemStack stack) { - Optional config = getConfig(stack); - Optional targetDeaths = getTargetDeaths(stack); - if (config.isEmpty() || targetDeaths.isEmpty()) { return Optional.empty(); } - - return Optional.of( - config.get().getChargeCost() != -1 - ? config.get().getChargeCost() - : (int)(targetDeaths.get() * config.get().getChargeCostMultiplier()) - ); - } - - public static Optional getMaxCharge(ItemStack stack) { - return getConfig(stack).map(totemConfig -> totemConfig.getChargeCost() == -1 - ? totemConfig.getChargeCostLimit() - : totemConfig.getChargeCost() - ); - } - - public static Optional isTotemFull(ItemStack stack) { - Optional config = getConfig(stack); - Optional charge = getCharge(stack); - Optional maxCharge = getMaxCharge(stack); - if (config.isEmpty() || charge.isEmpty() || maxCharge.isEmpty()) { return Optional.empty(); } - - return Optional.of(charge.get().equals(maxCharge.get())); - } - - public static Optional canTotemAffordTarget(ItemStack stack) { - Optional charge = getCharge(stack); - Optional targetCost = getTargetCost(stack); - Optional isTotemFull = isTotemFull(stack); - Optional canReviveMoreExpensiveTargets = canReviveMoreExpensiveTargets(stack); - if (charge.isEmpty() || targetCost.isEmpty() || isTotemFull.isEmpty() || canReviveMoreExpensiveTargets.isEmpty()) { return Optional.empty(); } - - return Optional.of(charge.get() >= targetCost.get() || (isTotemFull.get() && canReviveMoreExpensiveTargets.get())); - } - - public static Optional canReviveAcrossDimensions(ItemStack stack) { - return getConfig(stack).map(Config.TotemConfig::getCanReviveAcrossDimensions); - } - - public static Optional canReviveMoreExpensiveTargets(ItemStack stack) { - return getConfig(stack).map(Config.TotemConfig::getCanReviveMoreExpensiveTargets); - } - - private static Optional getTotemData(ItemStack stack) { - return Optional.ofNullable(stack.getComponents().get(ModDataComponents.TOTEM_DATA.get())); - } - - private static Optional getConfig(ItemStack stack) { - return switch (stack.getItem()) { - case StrawTotemItem ignored -> Optional.of(Config.Server.getStrawTotemConfig()); - case IronTotemItem ignored -> Optional.of(Config.Server.getIronTotemConfig()); - case DiamondTotemItem ignored -> Optional.of(Config.Server.getDiamondTotemConfig()); - case NetheriteTotemItem ignored -> Optional.of(Config.Server.getNetheriteTotemConfig()); - default -> Optional.empty(); - }; - } - @Override @OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag tooltipFlag) { if (world == null) { return; } - + UUID targetUUID = getTargetUUID(stack); String targetName = getTargetName(stack); int targetCost = getTargetCost(stack);