RespawnPage class

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

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

extends: InteractiveCustomUIPage<RespawnPage.RespawnPageEventData>

Поля (20)

МодификаторыТипИмя
static final String ACTION_CONFIRM
public static final BuilderCodec<RespawnPage.RespawnPageEventData> CODEC
static final String KEY_ACTION
private String action
ArrayList var1
HashMap var2
Ref var3
Player var3
boolean var3
CompletableFuture var4
Player var4
DecimalFormat var5
PlayerRef var5
UICommandBuilder var6
String var7
ItemStack var7
int var8
String var8
ItemStack var9
String var9

Методы (17)

МодификаторыВозвратСигнатура
public RespawnPageEventDatapublic RespawnPageEventData()
private void closePagevoid closePage(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2)
for for(ItemStack var6 : var0)
for for(int var6 = 0; var6 < this.itemsLostOnDeath.length; var6++)
public void handleDataEventvoid handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull RespawnPage.RespawnPageEventData var3)
if if(var0 == null)
if if(var9 != null)
if if(this.permadeathMessage != null)
if if(!this.displayDataOnDeathScreen)
if if(this.itemsLostOnDeath != null && this.itemsLostOnDeath.length != 0)
if if(this.permadeathMessage != null)
if if(var4 != null)
if if(this.permadeathMessage == null)
if if(var3)
static void setNotevoid setNote(@Nonnull UICommandBuilder var0, @Nonnull Message var1)
abstract setNote setNote(var2, this.permadeathMessage)
abstract super super(var1, var5 != null ? CustomPageLifetime.CanDismiss : CustomPageLifetime.CantClose, RespawnPage.RespawnPageEventData.CODEC)

Исходный код

Показать/скрыть
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() {
      }
   }
}