BarterEventData class

Пакет: com.hypixel.hytale.builtin.adventure.shop.barter

Файл: com/hypixel/hytale/builtin/adventure/shop/barter/BarterPage.java

Поля (7)

МодификаторыТипИмя
public static final BuilderCodec<BarterPage.BarterEventData> CODEC
static final String QUANTITY
static final String SHIFT_HELD
static final String TRADE_INDEX
private int quantity
private boolean shiftHeld
private int tradeIndex

Методы (4)

МодификаторыВозвратСигнатура
public int getQuantitypublic int getQuantity()
public int getTradeIndexpublic int getTradeIndex()
if if(var1 != null)
public boolean isShiftHeldpublic boolean isShiftHeld()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.adventure.shop.barter;

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.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
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.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.entity.ItemUtils;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage;
class="kw">import com.hypixel.hytale.server.core.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.inventory.container.CombinedItemContainer;
class="kw">import com.hypixel.hytale.server.core.inventory.container.ItemContainer;
class="kw">import com.hypixel.hytale.server.core.inventory.transaction.ItemStackTransaction;
class="kw">import com.hypixel.hytale.server.core.inventory.transaction.ListTransaction;
class="kw">import com.hypixel.hytale.server.core.modules.item.ItemModule;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
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 it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap.Entry;
class="kw">import java.time.Duration;
class="kw">import java.time.Instant;
class="kw">import java.time.LocalTime;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class BarterPage class="kw">extends InteractiveCustomUIPage<BarterPage.BarterEventData> {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   @Nullable
   class="kw">private class="kw">final BarterShopAsset shopAsset;

   class="kw">public BarterPage(@Nonnull PlayerRef var1, @Nonnull String var2) {
      super(var1, CustomPageLifetime.CanDismissOrCloseThroughInteraction, BarterPage.BarterEventData.CODEC);
      this.shopAsset = BarterShopAsset.getAssetMap().getAsset(var2);
   }

   class="kw">private boolean isTradeValid(@Nonnull BarterTrade var1) {
      if (!ItemModule.exists(var1.getOutput().getItemId())) {
         class="kw">return false;
      }

      for (BarterItemStack var5 : var1.getInput()) {
         if (!ItemModule.exists(var5.getItemId())) {
            class="kw">return false;
         }
      }

      class="kw">return true;
   }

   @Nonnull
   class="kw">private String getSafeItemId(@Nonnull String var1) {
      class="kw">return ItemModule.exists(var1) ? var1 : "Unknown";
   }

   @Override
   class="kw">public void build(@Nonnull Ref<EntityStore> var1, @Nonnull UICommandBuilder var2, @Nonnull UIEventBuilder var3, @Nonnull Store<EntityStore> var4) {
      if (this.shopAsset != null) {
         var2.append("Pages/BarterPage.ui");
         String var5 = this.shopAsset.getDisplayNameKey() != null ? this.shopAsset.getDisplayNameKey() : this.shopAsset.getId();
         var2.set("#ShopTitle.Text", Message.translation(var5));
         WorldTimeResource var6 = var4.getResource(WorldTimeResource.getResourceType());
         Instant var7 = var6.getGameTime();
         BarterShopState var8 = BarterShopState.get();
         int[] var9 = var8.getStockArray(this.shopAsset, var7);
         Message var10 = this.getRefreshTimerText(var8, var7);
         if (var10 != null) {
            var2.set("#RefreshTimer.Text", var10);
         }

         var2.clear("#TradeGrid");
         Ref var11 = this.playerRef.getReference();
         Player var12 = var11 != null ? var4.getComponent(var11, Player.getComponentType()) : null;
         ItemContainer var13 = null;
         if (var12 != null) {
            var13 = InventoryComponent.getCombined(var4, var11, InventoryComponent.HOTBAR_FIRST);
         }

         BarterTrade[] var14 = var8.getResolvedTrades(this.shopAsset, var7);

         for (int var15 = 0; var15 < var14.length; var15++) {
            BarterTrade var16 = var14[var15];
            String var17 = "#TradeGrid[" + var15 + "]";
            int var18 = var15 < var9.length ? var9[var15] : 0;
            boolean var19 = this.isTradeValid(var16);
            var2.append("#TradeGrid", "Pages/BarterTradeRow.ui");
            var2.set(var17 + " #OutputSlot.ItemId", this.getSafeItemId(var16.getOutput().getItemId()));
            int var20 = var16.getOutput().getQuantity();
            var2.set(var17 + " #OutputQuantity.Text", var20 > 1 ? String.valueOf(var20) : "");
            boolean var21 = true;
            int var22 = 0;
            if (var16.getInput().length > 0) {
               Object2IntMap var23 = aggregateInputQuantities(var16.getInput());
               BarterItemStack var24 = var16.getInput()[0];
               String var25 = var24.getItemId();
               int var26 = var23.get(var25);
               var2.set(var17 + " #InputSlot.ItemId", this.getSafeItemId(var25));
               var2.set(var17 + " #InputQuantity.Text", var26 > 1 ? String.valueOf(var26) : "");
               if (var19 && var13 != null) {
                  var22 = countRemovableItems(var13, var25);
                  var21 = canRemoveInputs(var13, var23, 1);
               } else {
                  var21 = false;
               }

               var2.set(var17 + " #InputSlotBorder.Background", var21 ? "#2a5a3a" : "#5a2a2a");
               var2.set(var17 + " #HaveNeedLabel.Text", Message.translation("server.barter.customUI.barterPage.quantityStock").param("count", var22));
               var2.set(var17 + " #HaveNeedLabel.Style.TextColor", var21 ? "#3d913f" : "#962f2f");
            }

            if (!var19) {
               var2.set(var17 + " #Stock.Visible", false);
               var2.set(var17 + " #OutOfStockOverlay.Visible", true);
               var2.set(var17 + " #OutOfStockLabel.Text", Message.translation("server.barter.customUI.barterPage.invalidItem"));
               var2.set(var17 + " #OutOfStockLabel.Style.TextColor", "#cc8844");
               var2.set(var17 + " #TradeButton.Disabled", true);
               var2.set(var17 + " #TradeButton.Style.Disabled.Background", "#4a3020");
            } else if (var18 <= 0) {
               var2.set(var17 + " #Stock.Visible", false);
               var2.set(var17 + " #OutOfStockOverlay.Visible", true);
               var2.set(var17 + " #OutOfStockLabel.Text", Message.translation("server.barter.customUI.barterPage.noStock"));
               var2.set(var17 + " #OutOfStockLabel.Style.TextColor", "#cc4444");
               var2.set(var17 + " #TradeButton.Disabled", true);
               var2.set(var17 + " #TradeButton.Style.Disabled.Background", "#4a2020");
            } else {
               var2.set(var17 + " #Stock.TextSpans", Message.translation("server.barter.customUI.barterPage.inStock").param("count", var18));
            }

            var3.addEventBinding(
               CustomUIEventBindingType.Activating, var17 + " #TradeButton", EventData.of("TradeIndex", String.valueOf(var15)).append("Quantity", "1"), false
            );
            var3.addEventBinding(
               CustomUIEventBindingType.RightClicking,
               var17 + " #TradeButton",
               EventData.of("TradeIndex", String.valueOf(var15)).append("Quantity", "1"),
               false
            );
         }

         int var27 = 3;
         int var28 = var14.length % 3;
         if (var28 > 0) {
            int var29 = 3 - var28;

            for (int var30 = 0; var30 < var29; var30++) {
               var2.append("#TradeGrid", "Pages/BarterGridSpacer.ui");
            }
         }
      }
   }

   class="kw">public void handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull BarterPage.BarterEventData var3) {
      if (this.shopAsset != null) {
         int var4 = var3.getTradeIndex();
         int var5 = var3.getQuantity();
         if (var5 > 0) {
            WorldTimeResource var6 = var2.getResource(WorldTimeResource.getResourceType());
            Instant var7 = var6.getGameTime();
            BarterShopState var8 = BarterShopState.get();
            BarterTrade[] var9 = var8.getResolvedTrades(this.shopAsset, var7);
            if (var4 >= 0 && var4 < var9.length) {
               BarterTrade var10 = var9[var4];
               if (this.isTradeValid(var10)) {
                  BarterShopState.ShopInstanceState var11 = var8.getOrCreateShopState(this.shopAsset, var7);
                  int var12 = var11.getStock(var4);
                  if (var12 > 0) {
                     Ref var13 = this.playerRef.getReference();
                     if (var13 != null) {
                        Player var14 = var2.getComponent(var13, Player.getComponentType());
                        if (var14 != null) {
                           CombinedItemContainer var15 = InventoryComponent.getCombined(var2, var13, InventoryComponent.HOTBAR_FIRST);
                           Object2IntMap var16 = aggregateInputQuantities(var10.getInput());
                           int var17 = Math.min(var5, var12);
                           int var18 = calculateAffordableQuantity(var15, var16, var17);
                           if (var18 > 0) {
                              int var19 = var18;
                              List var20 = buildPayments(var16, var19);
                              if (var20 != null) {
                                 ListTransaction var21 = var15.removeItemStacks(var20);
                                 if (!var21.succeeded()) {
                                    LOGGER.at(Level.WARNING).log("Failed to remove barter inputs for player '%s'.", this.playerRef.getUuid());
                                 } else {
                                    BarterItemStack var22 = var10.getOutput();
                                    ItemStack var23 = new ItemStack(var22.getItemId(), var22.getQuantity() * var19);
                                    ItemStackTransaction var24 = var15.addItemStack(var23);
                                    ItemStack var25 = var24.getRemainder();
                                    if (var25 != null && !var25.isEmpty()) {
                                       int var26 = var23.getQuantity() - var25.getQuantity();
                                       if (var26 > 0) {
                                          Player.notifyPickupItem(var13, var23.withQuantity(var26), null, var2);
                                       }

                                       ItemUtils.dropItem(var13, var25, var2);
                                    } else {
                                       Player.notifyPickupItem(var13, var23, null, var2);
                                    }

                                    var8.executeTrade(this.shopAsset, var4, var19, var7);
                                    this.updateAfterTrade(var1, var2, var4);
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">private void updateAfterTrade(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, int var3) {
      UICommandBuilder var4 = new UICommandBuilder();
      WorldTimeResource var5 = var2.getResource(WorldTimeResource.getResourceType());
      Instant var6 = var5.getGameTime();
      BarterShopState var7 = BarterShopState.get();
      int[] var8 = var7.getStockArray(this.shopAsset, var6);
      BarterTrade[] var9 = var7.getResolvedTrades(this.shopAsset, var6);
      Ref var10 = this.playerRef.getReference();
      Player var11 = var10 != null ? var2.getComponent(var10, Player.getComponentType()) : null;
      ItemContainer var12 = null;
      if (var11 != null) {
         var12 = InventoryComponent.getCombined(var2, var10, InventoryComponent.HOTBAR_FIRST);
      }

      for (int var13 = 0; var13 < var9.length; var13++) {
         BarterTrade var14 = var9[var13];
         String var15 = "#TradeGrid[" + var13 + "]";
         int var16 = var13 < var8.length ? var8[var13] : 0;
         boolean var17 = this.isTradeValid(var14);
         if (var14.getInput().length > 0) {
            Object2IntMap var18 = aggregateInputQuantities(var14.getInput());
            BarterItemStack var19 = var14.getInput()[0];
            int var20 = 0;
            boolean var21 = false;
            if (var17 && var12 != null) {
               var20 = countRemovableItems(var12, var19.getItemId());
               var21 = canRemoveInputs(var12, var18, 1);
            }

            var4.set(var15 + " #InputSlotBorder.Background", var21 ? "#2a5a3a" : "#5a2a2a");
            var4.set(var15 + " #HaveNeedLabel.Text", Message.translation("server.barter.customUI.barterPage.quantityStock").param("count", var20));
            var4.set(var15 + " #HaveNeedLabel.Style.TextColor", var21 ? "#3d913f" : "#962f2f");
         }

         if (!var17) {
            var4.set(var15 + " #Stock.Visible", false);
            var4.set(var15 + " #OutOfStockOverlay.Visible", true);
            var4.set(var15 + " #TradeButton.Disabled", true);
         } else if (var16 <= 0) {
            var4.set(var15 + " #Stock.Visible", false);
            var4.set(var15 + " #OutOfStockOverlay.Visible", true);
            var4.set(var15 + " #OutOfStockLabel.Text", Message.translation("server.barter.customUI.barterPage.noStock"));
            var4.set(var15 + " #OutOfStockLabel.Style.TextColor", "#cc4444");
            var4.set(var15 + " #TradeButton.Disabled", true);
            var4.set(var15 + " #TradeButton.Style.Disabled.Background", "#4a2020");
         } else {
            var4.set(var15 + " #Stock.Visible", true);
            var4.set(var15 + " #Stock.TextSpans", Message.translation("server.barter.customUI.barterPage.inStock").param("count", var16));
            var4.set(var15 + " #OutOfStockOverlay.Visible", false);
            var4.set(var15 + " #TradeButton.Disabled", false);
            var4.set(var15 + " #TradeButton.Style.Default.Background", "#1e2a3a");
         }
      }

      this.sendUpdate(var4, new UIEventBuilder(), false);
   }

   @Nonnull
   class="kw">static Object2IntMap<String> aggregateInputQuantities(@Nonnull BarterItemStack[] var0) {
      Object2IntLinkedOpenHashMap var1 = new Object2IntLinkedOpenHashMap();

      for (BarterItemStack var5 : var0) {
         var1.addTo(var5.getItemId(), var5.getQuantity());
      }

      class="kw">return var1;
   }

   @Nullable
   class="kw">private class="kw">static List<ItemStack> buildPayments(@Nonnull Object2IntMap<String> var0, int var1) {
      ArrayList var2 = new ArrayList<>(var0.size());
      ObjectIterator var3 = var0.object2IntEntrySet().iterator();

      while (var3.hasNext()) {
         Entry var4 = (Entry<String>)var3.next();
         long var5 = (long)var4.getIntValue() * var1;
         if (var5 < 1L || var5 > 2147483647L) {
            class="kw">return null;
         }

         var2.add(new ItemStack((String)var4.getKey(), (int)var5));
      }

      class="kw">return var2;
   }

   class="kw">private class="kw">static int calculateAffordableQuantity(@Nonnull ItemContainer var0, @Nonnull Object2IntMap<String> var1, int var2) {
      int var3 = 0;
      int var4 = var2;

      while (var3 < var4) {
         int var5 = var3 + (int)(((long)var4 - var3 + 1L) / 2L);
         if (canRemoveInputs(var0, var1, var5)) {
            var3 = var5;
         } else {
            var4 = var5 - 1;
         }
      }

      class="kw">return var3;
   }

   class="kw">private class="kw">static boolean canRemoveInputs(@Nonnull ItemContainer var0, @Nonnull Object2IntMap<String> var1, int var2) {
      List var3 = buildPayments(var1, var2);
      class="kw">return var3 != null && var0.canRemoveItemStacks(var3);
   }

   class="kw">private class="kw">static int countRemovableItems(@Nonnull ItemContainer var0, @Nonnull String var1) {
      ItemStack var2 = new ItemStack(var1, 1);
      int var3 = var0.countItemStacks(var2::isStackableWith);
      Object2IntLinkedOpenHashMap var4 = new Object2IntLinkedOpenHashMap();
      var4.put(var1, 1);
      class="kw">return calculateAffordableQuantity(var0, var4, var3);
   }

   class="kw">private void refreshUI(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      UICommandBuilder var3 = new UICommandBuilder();
      UIEventBuilder var4 = new UIEventBuilder();
      this.build(var1, var3, var4, var2);
      this.sendUpdate(var3, var4, true);
   }

   @Nullable
   class="kw">private Message getRefreshTimerText(@Nonnull BarterShopState var1, @Nonnull Instant var2) {
      if (this.shopAsset == null) {
         class="kw">return null;
      }

      RefreshInterval var3 = this.shopAsset.getRefreshInterval();
      if (var3 == null) {
         class="kw">return null;
      }

      BarterShopState.ShopInstanceState var4 = var1.getOrCreateShopState(this.shopAsset, var2);
      Instant var5 = var4.getNextRefreshTime();
      if (var5 == null) {
         class="kw">return null;
      }

      Duration var6 = Duration.between(var2, var5);
      if (!var6.isNegative() && !var6.isZero()) {
         long var7 = var2.getEpochSecond() / WorldTimeResource.SECONDS_PER_DAY;
         long var9 = var5.getEpochSecond() / WorldTimeResource.SECONDS_PER_DAY;
         long var11 = var9 - var7;
         LocalTime var13 = LocalTime.of(this.shopAsset.getRestockHour(), 0);
         String var14 = var13.toString();
         if (var11 <= 0L) {
            class="kw">return Message.translation("server.barter.customUI.barterPage.restocksToday").param("restockTime", var14);
         } else {
            class="kw">return var11 == 1L
               ? Message.translation("server.barter.customUI.barterPage.restocksTomorrow").param("restockTime", var14)
               : Message.translation("server.barter.customUI.barterPage.restocksInDays").param("days", (int)var11);
         }
      } else {
         class="kw">return null;
      }
   }

   class="kw">public class="kw">static class BarterEventData {
      @Nonnull
      class="kw">static class="kw">final String TRADE_INDEX = "TradeIndex";
      @Nonnull
      class="kw">static class="kw">final String QUANTITY = "Quantity";
      @Nonnull
      class="kw">static class="kw">final String SHIFT_HELD = "ShiftHeld";
      @Nonnull
      class="kw">public class="kw">static class="kw">final BuilderCodec<BarterPage.BarterEventData> CODEC = BuilderCodec.builder(
            BarterPage.BarterEventData.class, BarterPage.BarterEventData::new
         )
         .append(new KeyedCodec<>("TradeIndex", Codec.STRING), (var0, var1) -> {
            try {
               var0.tradeIndex = Integer.parseInt(var1);
            } catch (NumberFormatException var3) {
               var0.tradeIndex = -1;
            }
         }, var0 -> String.valueOf(var0.tradeIndex))
         .add()
         .append(new KeyedCodec<>("Quantity", Codec.STRING), (var0, var1) -> {
            try {
               var0.quantity = Integer.parseInt(var1);
            } catch (NumberFormatException var3) {
               var0.quantity = -1;
            }
         }, var0 -> String.valueOf(var0.quantity))
         .add()
         .append(new KeyedCodec<>("ShiftHeld", Codec.BOOLEAN), (var0, var1) -> {
            if (var1 != null) {
               var0.shiftHeld = var1;
            }
         }, var0 -> var0.shiftHeld)
         .add()
         .build();
      class="kw">private int tradeIndex = -1;
      class="kw">private int quantity = 1;
      class="kw">private boolean shiftHeld = false;

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

      class="kw">public int getTradeIndex() {
         class="kw">return this.tradeIndex;
      }

      class="kw">public int getQuantity() {
         class="kw">return this.quantity <= 0 ? this.quantity : (this.shiftHeld ? 10 : this.quantity);
      }

      class="kw">public boolean isShiftHeld() {
         class="kw">return this.shiftHeld;
      }
   }
}