From c9fcce403d6eb5f71ce6b18b8212e9b40435ccae Mon Sep 17 00:00:00 2001 From: Micle Date: Sun, 16 Jan 2022 20:49:39 +0000 Subject: [PATCH] Implemented reviving. --- .../totemofreviving/item/StrawTotemItem.java | 7 +- .../totemofreviving/network/Network.java | 5 ++ .../network/ReviveTargetPacket.java | 71 +++++++++++++++++++ 3 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 src/main/java/dev/micle/totemofreviving/network/ReviveTargetPacket.java diff --git a/src/main/java/dev/micle/totemofreviving/item/StrawTotemItem.java b/src/main/java/dev/micle/totemofreviving/item/StrawTotemItem.java index fabb4ba..e88caed 100644 --- a/src/main/java/dev/micle/totemofreviving/item/StrawTotemItem.java +++ b/src/main/java/dev/micle/totemofreviving/item/StrawTotemItem.java @@ -5,6 +5,7 @@ import dev.micle.totemofreviving.config.Config; import dev.micle.totemofreviving.network.ChangeTargetPacket; import dev.micle.totemofreviving.network.ChargeTotemPacket; import dev.micle.totemofreviving.network.Network; +import dev.micle.totemofreviving.network.ReviveTargetPacket; import net.minecraft.client.Minecraft; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.client.util.InputMappings; @@ -89,13 +90,10 @@ public class StrawTotemItem extends Item { @ParametersAreNonnullByDefault public ActionResult use(World world, PlayerEntity playerEntity, Hand hand) { if (!Config.Server.getStrawTotemConfig().getIsEnabled() || world.isClientSide) { return super.use(world, playerEntity, hand); } - ItemStack totem; ItemStack charge; if (hand.equals(Hand.MAIN_HAND)) { - totem = playerEntity.getMainHandItem(); charge = playerEntity.getOffhandItem(); } else { - totem = playerEntity.getOffhandItem(); charge = playerEntity.getMainHandItem(); } @@ -105,8 +103,7 @@ public class StrawTotemItem extends Item { if (charge.getItem() instanceof StrawChargeItem) { Network.channel.sendToServer(new ChargeTotemPacket(hand)); } - // Revive target - //totem.hurtAndBreak(1, sender, e -> e.broadcastBreakEvent(packet.hand)); + Network.channel.sendToServer(new ReviveTargetPacket(hand)); } return super.use(world, playerEntity, hand); } diff --git a/src/main/java/dev/micle/totemofreviving/network/Network.java b/src/main/java/dev/micle/totemofreviving/network/Network.java index 7fcdca7..48e4caf 100644 --- a/src/main/java/dev/micle/totemofreviving/network/Network.java +++ b/src/main/java/dev/micle/totemofreviving/network/Network.java @@ -34,6 +34,11 @@ public class Network { .decoder(ChargeTotemPacket::decode) .consumer(ChargeTotemPacket::handle) .add(); + channel.messageBuilder(ReviveTargetPacket.class, id++) + .encoder(ReviveTargetPacket::encode) + .decoder(ReviveTargetPacket::decode) + .consumer(ReviveTargetPacket::handle) + .add(); } public static void writeVersionInfo(PacketBuffer buffer) { diff --git a/src/main/java/dev/micle/totemofreviving/network/ReviveTargetPacket.java b/src/main/java/dev/micle/totemofreviving/network/ReviveTargetPacket.java new file mode 100644 index 0000000..b7e0c35 --- /dev/null +++ b/src/main/java/dev/micle/totemofreviving/network/ReviveTargetPacket.java @@ -0,0 +1,71 @@ +package dev.micle.totemofreviving.network; + +import dev.micle.totemofreviving.TotemOfReviving; +import dev.micle.totemofreviving.config.Config; +import dev.micle.totemofreviving.item.StrawTotemItem; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +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; + + public ReviveTargetPacket(final Hand hand) { + this.hand = hand; + } + + public static void encode(final ReviveTargetPacket packet, final PacketBuffer buffer) { + Network.writeVersionInfo(buffer); + buffer.writeEnum(packet.hand); + } + + public static ReviveTargetPacket decode(final PacketBuffer buffer) { + Network.checkVersion(buffer); + return new ReviveTargetPacket(buffer.readEnum(Hand.class)); + } + + public static void handle(final ReviveTargetPacket packet, final Supplier contextSupplier) { + final NetworkEvent.Context context = contextSupplier.get(); + 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; } + + 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 (charge < targetCharge) { + 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.setGameMode(sender.getLevel().getServer().getDefaultGameType()); + totem.getOrCreateTag().putInt(TAG_CHARGE, charge - targetCharge); + totem.hurtAndBreak(1, sender, e -> e.broadcastBreakEvent(packet.hand)); + }); + context.setPacketHandled(true); + } +}