hytale-server/com/hypixel/hytale/builtin/crafting/state/BenchState.java

128 lines
4.5 KiB
Java

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 = 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, ItemStack[]::new)),
(state, o) -> state.upgradeItems = o,
state -> state.upgradeItems,
(state, parent) -> state.upgradeItems = parent.upgradeItems
)
.add()
.build();
private int tierLevel = 1;
protected ItemStack[] upgradeItems = ItemStack.EMPTY_ARRAY;
protected Bench bench;
public int getTierLevel() {
return this.tierLevel;
}
@Override
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 = consumed.toArray(ItemStack[]::new);
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.getAssetMap().getAsset(baseBlockKey);
if (baseBlockType == null) {
baseBlockType = currentBlockType;
}
return baseBlockType;
}
public String getTierStateName() {
return this.tierLevel > 1 ? "Tier" + this.tierLevel : "default";
}
@Override
public void onDestroy() {
this.dropUpgradeItems();
}
}