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;
}
}
}