diff --git a/src/main/java/dev/micle/totemofreviving/network/ReviveTargetPacket.java b/src/main/java/dev/micle/totemofreviving/network/ReviveTargetPacket.java index f998eb7..6af1683 100644 --- a/src/main/java/dev/micle/totemofreviving/network/ReviveTargetPacket.java +++ b/src/main/java/dev/micle/totemofreviving/network/ReviveTargetPacket.java @@ -1,21 +1,18 @@ package dev.micle.totemofreviving.network; import dev.micle.totemofreviving.TotemOfReviving; -import dev.micle.totemofreviving.config.Config; -import dev.micle.totemofreviving.item.StrawTotemItem; +import dev.micle.totemofreviving.item.TotemItem; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; +import net.minecraft.stats.Stats; import net.minecraft.util.Hand; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.network.NetworkEvent; -import java.util.UUID; import java.util.function.Supplier; -import static dev.micle.totemofreviving.item.StrawTotemItem.*; - public class ReviveTargetPacket { private final Hand hand; @@ -38,33 +35,48 @@ public class ReviveTargetPacket { context.enqueueWork(() -> { ServerPlayerEntity sender = context.getSender(); if (sender == null) { return; } - ItemStack totem = sender.getItemInHand(packet.hand); - int charge = totem.getOrCreateTag().getInt(TAG_CHARGE); - int targetCharge = totem.getOrCreateTag().getInt(TAG_TARGET_CHARGE); - String targetUUID = totem.getOrCreateTag().getString(TAG_TARGET_UUID); - ServerPlayerEntity target = TotemOfReviving.PROXY.getServer().getPlayerList().getPlayer(UUID.fromString(targetUUID)); - if (target == null) { return; } + ItemStack totemStack = sender.getItemInHand(packet.hand); + ServerPlayerEntity target; + + try { + target = TotemOfReviving.PROXY.getServer().getPlayerList().getPlayer(TotemItem.getTargetUUID(totemStack)); + if (target == null) { throw new NullPointerException("Target is null!"); } + } catch (NullPointerException exception) { + sender.sendMessage(new StringTextComponent(TextFormatting.WHITE + "Unable to find player!"), sender.getUUID()); + return; + } + + int charge = TotemItem.getCharge(totemStack); + int targetCost = TotemItem.getTargetCost(totemStack); + if (TotemItem.isCostDynamic(totemStack) && targetCost != target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS))) { + targetCost = target.getStats().getValue(Stats.CUSTOM.get(Stats.DEATHS)); + TotemItem.setTargetCost(totemStack, targetCost); + } else if (!TotemItem.isCostDynamic(totemStack) && targetCost != TotemItem.getMaxCharge(totemStack)) { + targetCost = TotemItem.getMaxCharge(totemStack); + TotemItem.setTargetCost(totemStack, targetCost); + } if (!target.isSpectator()) { sender.sendMessage(new StringTextComponent(TextFormatting.GRAY + target.getDisplayName().getString() + TextFormatting.WHITE + " is not dead!"), sender.getUUID()); return; } - if (!target.getLevel().equals(sender.getLevel())) { - if (totem.getItem() instanceof StrawTotemItem && !Config.Server.getStrawTotemConfig().getCanReviveAcrossDimensions()) { - sender.sendMessage(new StringTextComponent(TextFormatting.GRAY + target.getDisplayName().getString() + TextFormatting.WHITE + " is in a different dimension!"), sender.getUUID()); - return; - } + + if (!target.getLevel().equals(sender.getLevel()) && !TotemItem.canReviveAcrossDimensions(totemStack)) { + sender.sendMessage(new StringTextComponent(TextFormatting.GRAY + target.getDisplayName().getString() + TextFormatting.WHITE + " is in a different dimension!"), sender.getUUID()); + return; } - if (charge < targetCharge) { + + if (charge < targetCost) { sender.sendMessage(new StringTextComponent(TextFormatting.WHITE + "Not enough charge!"), sender.getUUID()); return; } - target.setLevel(sender.getLevel()); - target.moveTo(sender.position().x, sender.position().y, sender.position().z); + + target.teleportTo(sender.getLevel(), sender.position().x, sender.position().y, sender.position().z, sender.yRot, sender.xRot); target.setGameMode(sender.getLevel().getServer().getDefaultGameType()); - totem.getOrCreateTag().putInt(TAG_CHARGE, charge - targetCharge); - totem.hurtAndBreak(1, sender, e -> e.broadcastBreakEvent(packet.hand)); + TotemItem.setCharge(totemStack, charge - targetCost); + totemStack.hurtAndBreak(1, sender, e -> e.broadcastBreakEvent(packet.hand)); + sender.sendMessage(new StringTextComponent(TextFormatting.WHITE + "Successfully revived " + TextFormatting.GRAY + target.getDisplayName().getString()), sender.getUUID()); }); context.setPacketHandled(true); }