BarterPage class

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

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

extends: InteractiveCustomUIPage<BarterPage.BarterEventData>

Поля (104)

МодификаторыТипИмя
public static final BuilderCodec<BarterPage.BarterEventData> CODEC
final HytaleLogger LOGGER
static final String QUANTITY
static final String SHIFT_HELD
static final String TRADE_INDEX
private int quantity
private boolean shiftHeld
private int tradeIndex
Object2IntLinkedOpenHashMap var1
Message var10
BarterTrade var10
Ref var10
Ref var11
BarterShopState.ShopInstanceState var11
Player var11
long var11
Player var12
int var12
ItemContainer var12
var12
ItemContainer var13
var13
Ref var13
LocalTime var13
BarterTrade[] var14
Player var14
BarterTrade var14
String var14
CombinedItemContainer var15
String var15
BarterTrade var16
Object2IntMap var16
int var16
String var17
int var17
boolean var17
int var18
int var18
Object2IntMap var18
boolean var19
int var19
BarterItemStack var19
ArrayList var2
ItemStack var2
int var20
List var20
int var20
var20
boolean var21
var21
var21
ListTransaction var21
boolean var21
var21
int var22
var22
BarterItemStack var22
Object2IntMap var23
ItemStack var23
BarterItemStack var24
ItemStackTransaction var24
String var25
ItemStack var25
int var26
int var26
int var27
int var28
int var29
ObjectIterator var3
int var3
var3
List var3
int var3
UICommandBuilder var3
RefreshInterval var3
int var4
UICommandBuilder var4
Entry var4
int var4
var4
Object2IntLinkedOpenHashMap var4
UIEventBuilder var4
BarterShopState.ShopInstanceState var4
String var5
int var5
WorldTimeResource var5
long var5
int var5
Instant var5
WorldTimeResource var6
WorldTimeResource var6
Instant var6
Duration var6
Instant var7
Instant var7
BarterShopState var7
long var7
BarterShopState var8
BarterShopState var8
int[] var8
int[] var9
BarterTrade[] var9
BarterTrade[] var9
long var9

Методы (42)

МодификаторыВозвратСигнатура
public BarterEventDatapublic BarterEventData()
static int calculateAffordableQuantityint calculateAffordableQuantity(@Nonnull ItemContainer var0, @Nonnull Object2IntMap<String> var1, int var2)
abstract return calculateAffordableQuantityreturn calculateAffordableQuantity(var0, var4, var3)
static boolean canRemoveInputsboolean canRemoveInputs(@Nonnull ItemContainer var0, @Nonnull Object2IntMap<String> var1, int var2)
static int countRemovableItemsint countRemovableItems(@Nonnull ItemContainer var0, @Nonnull String var1)
for for(int var15 = 0; var15 < var14.length; var15++)
for for(int var30 = 0; var30 < var29; var30++)
for for(int var13 = 0; var13 < var9.length; var13++)
for for(BarterItemStack var5 : var0)
public int getQuantitypublic int getQuantity()
public int getTradeIndexpublic int getTradeIndex()
public void handleDataEventvoid handleDataEvent(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, @Nonnull BarterPage.BarterEventData var3)
if if(this.shopAsset != null)
if if(var10 != null)
if if(var12 != null)
if if(var19 && var13 != null)
if if(!var19)
if if(var28 > 0)
if if(this.shopAsset != null)
if if(var5 > 0)
if if(var4 >= 0 && var4 < var9.length)
if if(var12 > 0)
if if(var13 != null)
if if(var14 != null)
if if(var18 > 0)
if if(var20 != null)
if if(var26 > 0)
if if(var11 != null)
if if(var17 && var12 != null)
if if(!var17)
if if(var5 < 1L || var5 > 2147483647L)
if if(this.shopAsset == null)
if if(var3 == null)
if if(var5 == null)
if if(var11 <= 0L)
if if(var1 != null)
public boolean isShiftHeldpublic boolean isShiftHeld()
private boolean isTradeValidboolean isTradeValid(@Nonnull BarterTrade var1)
private void refreshUIvoid refreshUI(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2)
abstract super super(var1, CustomPageLifetime.CanDismissOrCloseThroughInteraction, BarterPage.BarterEventData.CODEC)
private void updateAfterTradevoid updateAfterTrade(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2, int var3)
while while(var3 < var4)

Исходный код

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