RespawnPageEventData class

Пакет: com.hypixel.hytale.server.core.entity.entities.player.pages

Файл: com/hypixel/hytale/server/core/entity/entities/player/pages/RespawnPage.java

Поля (4)

МодификаторыТипИмя
static final String ACTION_CONFIRM
public static final BuilderCodec<RespawnPage.RespawnPageEventData> CODEC
static final String KEY_ACTION
private String action

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.entity.entities.player.pages;

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.common.util.CompletableFutureUtil;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.Page;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.DeathConfig;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DeathComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DeathItemLoss;
class="kw">import com.hypixel.hytale.server.core.ui.builder.EventData;
class="kw">import com.hypixel.hytale.server.core.ui.builder.UICommandBuilder;
class="kw">import com.hypixel.hytale.server.core.ui.builder.UIEventBuilder;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.text.DecimalFormat;
class="kw">import java.util.ArrayList;
class="kw">import java.util.HashMap;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class RespawnPage class="kw">extends InteractiveCustomUIPage<RespawnPage.RespawnPageEventData> {
   @Nonnull
   class="kw">private class="kw">static class="kw">final String UI_RESPAWN_PAGE = "Pages/RespawnPage.ui";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String ELEMENT_BUTTON_RESPAWN = "#RespawnButton";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String ELEMENT_BUTTON_SPECTATE = "#SpectateButton";
   @Nonnull
   class="kw">private class="kw">static class="kw">final String ELEMENT_LABEL_DEATH_REASON_TEXT_SPANS = "#DeathReason.TextSpans";
   @Nullable
   class="kw">private class="kw">final Message deathReason;
   class="kw">private class="kw">final boolean displayDataOnDeathScreen;
   class="kw">private class="kw">final DeathItemLoss deathItemLoss;
   class="kw">private class="kw">final ItemStack[] itemsLostOnDeath;
   @Nullable
   class="kw">private class="kw">final Message permadeathMessage;
   class="kw">private class="kw">final int livesRemaining;

   class="kw">private RespawnPage(@Nonnull PlayerRef var1, @Nullable Message var2, boolean var3, DeathItemLoss var4, @Nullable Message var5, int var6) {
      super(var1, var5 != null ? CustomPageLifetime.CanDismiss : CustomPageLifetime.CantClose, RespawnPage.RespawnPageEventData.CODEC);
      this.deathReason = var2;
      this.displayDataOnDeathScreen = var3;
      this.deathItemLoss = var4;
      this.permadeathMessage = var5;
      this.livesRemaining = var6;
      this.itemsLostOnDeath = combineSimilarItemStacks(var4.getItemsLost());
   }

   @Nonnull
   class="kw">public class="kw">static RespawnPage forRespawn(@Nonnull PlayerRef var0, @Nullable Message var1, boolean var2, DeathItemLoss var3, int var4) {
      class="kw">return new RespawnPage(var0, var1, var2, var3, null, var4);
   }

   @Nonnull
   class="kw">public class="kw">static RespawnPage forPermadeath(@Nonnull PlayerRef var0, @Nullable Message var1, boolean var2, DeathItemLoss var3, @Nonnull Message var4) {
      class="kw">return new RespawnPage(var0, var1, var2, var3, var4, 0);
   }

   @Nullable
   class="kw">private class="kw">static ItemStack[] combineSimilarItemStacks(@Nullable ItemStack[] var0) {
      if (var0 == null) {
         class="kw">return null;
      }

      ArrayList var1 = new ArrayList<>();
      HashMap var2 = new HashMap<>();

      for (ItemStack var6 : var0) {
         if (var6.getItem().getMaxStack() <= 1) {
            var1.add(var6);
         } else {
            String var7 = var6.getItemId();
            int var8 = var6.getQuantity();
            ItemStack var9 = var2.get(var7);
            if (var9 != null) {
               var8 += var9.getQuantity();
            }

            var2.put(var7, var6.withQuantity(var8));
         }
      }

      var1.addAll(var2.values());
      class="kw">return var1.toArray(ItemStack[]::new);
   }

   @Override
   class="kw">public void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
      var2.append("Pages/RespawnPage.ui");
      var2.set("#DeathReason.TextSpans", this.deathReason != null ? this.deathReason : Message.empty());
      if (this.permadeathMessage != null) {
         var2.set("#RespawnButton.Visible", false);
         var2.set("#SpectateButton.Visible", true);
         setNote(var2, this.permadeathMessage);
      } else if (this.livesRemaining > 0) {
         setNote(var2, Message.translation("server.customUI.respawnPage.livesRemaining").param("remaining", this.livesRemaining));
      }

      if (!this.displayDataOnDeathScreen) {
         var2.set("#DeathData.Visible", false);
      } else {
         DecimalFormat var5 = new DecimalFormat("#.##");
         var5.setDecimalSeparatorAlwaysShown(false);
         if (this.deathItemLoss.getLossMode() == DeathConfig.ItemsLossMode.NONE) {
            var2.set("#ItemsLossStatus.TextSpans", Message.translation("server.general.itemsLossPrevented"));
         } else {
            var2.set(
               "#ItemsLossStatus.TextSpans",
               Message.translation("server.general.itemsDurabilityLoss").param("percentage", var5.format(this.deathItemLoss.getDurabilityLossPercentage()))
            );
         }

         if (this.itemsLostOnDeath != null && this.itemsLostOnDeath.length != 0) {
            var2.set("#ItemsAmountLoss.TextSpans", Message.translation("server.general.itemsAmountLoss"));
            var2.set("#DroppedItemsContainer.Visible", true);
            var2.clear("#DroppedItemsContainer");

            for (int var6 = 0; var6 < this.itemsLostOnDeath.length; var6++) {
               ItemStack var7 = this.itemsLostOnDeath[var6];
               String var8 = "#DroppedItemsContainer[" + var6 + "] ";
               var2.append("#DroppedItemsContainer", "Pages/DroppedItemSlot.ui");
               var2.set(var8 + "#ItemIcon.ItemId", var7.getItemId());
               var2.set(var8 + "#ItemIcon.Quantity", var7.getQuantity());
               if (var7.getQuantity() > 1) {
                  var2.set(var8 + "#QuantityLabel.Text", String.valueOf(var7.getQuantity()));
               } else {
                  var2.set(var8 + "#QuantityLabel.Visible", false);
               }
            }
         } else {
            var2.set("#ItemsAmountLoss.Visible", false);
            var2.set("#DroppedItemsContainer.Visible", false);
         }
      }

      String var9 = this.permadeathMessage != null ? "#SpectateButton" : "#RespawnButton";
      var3.addEventBinding(CustomUIEventBindingType.Activating, var9, EventData.of("Action", "Confirm"));
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull RespawnPage.RespawnPageEventData var3) {
      if ("Confirm".equals(var3.action)) {
         if (this.permadeathMessage != null) {
            this.closePage(var1, var2);
         } else {
            CompletableFuture var4 = DeathComponent.respawn(var2, var1);
            if (var4 != null) {
               PlayerRef var5 = var2.getComponent(var1, PlayerRef.getComponentType());
               assert var5 != null;
               UICommandBuilder var6 = new UICommandBuilder();
               var6.set("#RespawnButton.Disabled", true);
               this.sendUpdate(var6);
               CompletableFutureUtil._catch(var4.thenCompose(var2x -> {
                  Ref var3 = var5.getReference();
                  class="kw">return var3 != null && var3.isValid() ? CompletableFuture.runAsync(() -> {
                     if (var3.isValid()) {
                        this.closePage(var3, var3.getStore());
                     }
                  }, var3.getStore().getExternalData().getWorld()) : CompletableFuture.completedFuture(null);
               }));
            }
         }
      }
   }

   class="kw">private class="kw">static void setNote(@Nonnull UICommandBuilder var0, @Nonnull Message var1) {
      var0.set("#DeathScreenNote.Visible", true);
      var0.set("#DeathScreenNoteText.TextSpans", var1);
   }

   class="kw">private void closePage(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      Player var3 = var2.getComponent(var1, Player.getComponentType());
      assert var3 != null;
      if (var3.getPageManager().getCustomPage() == this) {
         var3.getPageManager().setPage(var1, var2, Page.None);
      }
   }

   @Override
   class="kw">public void onDismiss(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      super.onDismiss(var1, var2);
      if (this.permadeathMessage == null) {
         boolean var3 = var2.getArchetype(var1).contains(DeathComponent.getComponentType());
         if (var3) {
            Player var4 = var2.getComponent(var1, Player.getComponentType());
            assert var4 != null;
            DeathComponent.respawn(var2, var1);
         }
      }
   }

   class="kw">public class="kw">static class RespawnPageEventData {
      class="kw">static class="kw">final String KEY_ACTION = "Action";
      class="kw">static class="kw">final String ACTION_CONFIRM = "Confirm";
      class="kw">public class="kw">static class="kw">final BuilderCodec<RespawnPage.RespawnPageEventData> CODEC = BuilderCodec.builder(
            RespawnPage.RespawnPageEventData.class, RespawnPage.RespawnPageEventData::new
         )
         .addField(new KeyedCodec<>("Action", Codec.STRING), (var0, var1) -> var0.action = var1, var0 -> var0.action)
         .build();
      class="kw">private String action;

      class="kw">public RespawnPageEventData() {
      }
   }
}