Rewrote handle method to use new totem item class. Improved target checking. Method now checks if the target cost has been updated since. Changed method for teleporting target to hopefully fix an issue where target got stuck in 'limbo'. Added a success message.

This commit is contained in:
2022-01-18 18:00:06 +00:00
parent c30803112a
commit 3f8ac8ddde

View File

@ -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);
}