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:
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user