package com.hypixel.hytale.builtin.crafting.state;
import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
import com.hypixel.hytale.component.AddReason;
import com.hypixel.hytale.component.Holder;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.math.vector.Vector3f;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.bench.Bench;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.bench.BenchUpgradeRequirement;
import com.hypixel.hytale.server.core.inventory.ItemStack;
import com.hypixel.hytale.server.core.modules.entity.item.ItemComponent;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.world.meta.BlockState;
import com.hypixel.hytale.server.core.universe.world.meta.state.DestroyableBlockState;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Nonnull;
public class BenchState extends BlockState implements DestroyableBlockState {
public static BuilderCodec<BenchState> CODEC;
private int tierLevel = 1;
protected ItemStack[] upgradeItems;
protected Bench bench;
public BenchState() {
this.upgradeItems = ItemStack.EMPTY_ARRAY;
}
public int getTierLevel() {
return this.tierLevel;
}
public boolean initialize(@Nonnull BlockType blockType) {
if (!super.initialize(blockType)) {
return false;
} else {
this.bench = blockType.getBench();
if (this.bench == null) {
if (this.upgradeItems.length > 0) {
this.dropUpgradeItems();
}
return false;
} else {
return true;
}
}
}
public void addUpgradeItems(List<ItemStack> consumed) {
consumed.addAll(Arrays.asList(this.upgradeItems));
this.upgradeItems = (ItemStack[])consumed.toArray((x$0) -> new ItemStack[x$0]);
this.markNeedsSave();
}
private void dropUpgradeItems() {
if (this.upgradeItems.length != 0) {
World world = this.getChunk().getWorld();
Store<EntityStore> entityStore = world.getEntityStore().getStore();
Vector3d dropPosition = this.getBlockPosition().toVector3d().add(0.5, 0.0, 0.5);
Holder<EntityStore>[] itemEntityHolders = ItemComponent.generateItemDrops(entityStore, List.of(this.upgradeItems), dropPosition, Vector3f.ZERO);
if (itemEntityHolders.length > 0) {
world.execute(() -> entityStore.addEntities(itemEntityHolders, AddReason.SPAWN));
}
this.upgradeItems = ItemStack.EMPTY_ARRAY;
}
}
public Bench getBench() {
return this.bench;
}
public void setTierLevel(int newTierLevel) {
if (this.tierLevel != newTierLevel) {
this.tierLevel = newTierLevel;
this.onTierLevelChange();
this.markNeedsSave();
}
}
public BenchUpgradeRequirement getNextLevelUpgradeMaterials() {
return this.bench.getUpgradeRequirement(this.tierLevel);
}
protected void onTierLevelChange() {
this.getChunk().setBlockInteractionState(this.getBlockPosition(), this.getBaseBlockType(), this.getTierStateName());
}
public BlockType getBaseBlockType() {
BlockType currentBlockType = this.getBlockType();
String baseBlockKey = currentBlockType.getDefaultStateKey();
BlockType baseBlockType = (BlockType)BlockType.getAssetMap().getAsset(baseBlockKey);
if (baseBlockType == null) {
baseBlockType = currentBlockType;
}
return baseBlockType;
}
public String getTierStateName() {
return this.tierLevel > 1 ? "Tier" + this.tierLevel : "default";
}
public void onDestroy() {
this.dropUpgradeItems();
}
static {
CODEC = ((BuilderCodec.Builder)((BuilderCodec.Builder)BuilderCodec.builder(BenchState.class, BenchState::new, BlockState.BASE_CODEC).appendInherited(new KeyedCodec("TierLevel", Codec.INTEGER), (state, o) -> state.tierLevel = o, (state) -> state.tierLevel, (state, parent) -> state.tierLevel = parent.tierLevel).add()).appendInherited(new KeyedCodec("UpgradeItems", new ArrayCodec(ItemStack.CODEC, (x$0) -> new ItemStack[x$0])), (state, o) -> state.upgradeItems = o, (state) -> state.upgradeItems, (state, parent) -> state.upgradeItems = parent.upgradeItems).add()).build();
}
}