Draconix_Dust

BeerBarrelBlockEntity

Apr 15th, 2022
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.07 KB | None | 0 0
  1. package lekavar.lma.drinkbeer.blockentities;
  2.  
  3. import lekavar.lma.drinkbeer.gui.BeerBarrelContainer;
  4. import lekavar.lma.drinkbeer.recipes.BrewingRecipe;
  5. import lekavar.lma.drinkbeer.recipes.IBrewingInventory;
  6. import lekavar.lma.drinkbeer.registries.BlockEntityRegistry;
  7. import lekavar.lma.drinkbeer.registries.RecipeRegistry;
  8. import net.minecraft.core.BlockPos;
  9. import net.minecraft.core.NonNullList;
  10. import net.minecraft.nbt.CompoundTag;
  11. import net.minecraft.network.Connection;
  12. import net.minecraft.network.chat.Component;
  13. import net.minecraft.network.chat.TranslatableComponent;
  14. import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket;
  15. import net.minecraft.world.ContainerHelper;
  16. import net.minecraft.world.entity.player.Inventory;
  17. import net.minecraft.world.entity.player.Player;
  18. import net.minecraft.world.inventory.AbstractContainerMenu;
  19. import net.minecraft.world.inventory.ContainerData;
  20. import net.minecraft.world.item.BucketItem;
  21. import net.minecraft.world.item.ItemStack;
  22. import net.minecraft.world.item.Items;
  23. import net.minecraft.world.item.MilkBucketItem;
  24. import net.minecraft.world.level.block.entity.BaseContainerBlockEntity;
  25. import net.minecraft.world.level.block.state.BlockState;
  26.  
  27. import javax.annotation.Nonnull;
  28. import javax.annotation.Nullable;
  29. import java.util.List;
  30.  
  31. public class BeerBarrelBlockEntity extends BaseContainerBlockEntity implements IBrewingInventory {
  32.     private NonNullList<ItemStack> items = NonNullList.withSize(6, ItemStack.EMPTY);
  33.     // This int will not only indicate remainingBrewTime, but also represent Standard Brewing Time if valid in "waiting for ingredients" stage
  34.     private int remainingBrewTime;
  35.     // 0 - waiting for ingredient, 1 - brewing, 2 - waiting for pickup product
  36.     private int statusCode;
  37.     public final ContainerData syncData = new ContainerData() {
  38.         @Override
  39.         public int get(int p_221476_1_) {
  40.             switch (p_221476_1_) {
  41.                 case 0:
  42.                     return remainingBrewTime;
  43.                 case 1:
  44.                     return statusCode;
  45.                 default:
  46.                     return 0;
  47.             }
  48.         }
  49.  
  50.         @Override
  51.         public void set(int p_221477_1_, int p_221477_2_) {
  52.             switch (p_221477_1_) {
  53.                 case 0:
  54.                     remainingBrewTime = p_221477_2_;
  55.                     break;
  56.                 case 1:
  57.                     statusCode = p_221477_2_;
  58.                     break;
  59.             }
  60.         }
  61.  
  62.         @Override
  63.         public int getCount() {
  64.             return 1;
  65.         }
  66.     };
  67.  
  68.     public BeerBarrelBlockEntity(BlockPos pos, BlockState state) {
  69.         super(BlockEntityRegistry.BEER_BARREL_TILEENTITY.get(), pos, state);
  70.     }
  71.  
  72.     public void tickServer() {
  73.         // waiting for ingredient
  74.         if (statusCode == 0) {
  75.             // ingredient slots must have no empty slot
  76.             if (!getIngredients().contains(ItemStack.EMPTY)) {
  77.                 // Try match Recipe
  78.                 BrewingRecipe recipe = level.getRecipeManager().getRecipeFor(RecipeRegistry.Type.BREWING, this, this.level).orElse(null);
  79.                 if (canBrew(recipe)) {
  80.                     // Show Standard Brewing Time & Result
  81.                     showPreview(recipe);
  82.                     // Check Weather have enough cup.
  83.                     if (hasEnoughEmptyCap(recipe)) {
  84.                         startBrewing(recipe);
  85.  
  86.                     }
  87.                 }
  88.                 // Time remainingBrewTime will be reset since it also represents Standard Brewing Time if valid in this stage
  89.                 else {
  90.                     clearPreview();
  91.                 }
  92.             } else {
  93.                 clearPreview();
  94.             }
  95.         }
  96.         // brewing
  97.         else if (statusCode == 1) {
  98.             if (remainingBrewTime > 0) {
  99.                 remainingBrewTime--;
  100.             }
  101.             // Enter "waiting for pickup"
  102.             else {
  103.                 // Prevent wired glitch such as remainingTime been set to one;
  104.                 remainingBrewTime = 0;
  105.                 // Enter Next Stage
  106.                 statusCode = 2;
  107.             }
  108.             setChanged();
  109.         }
  110.         // waiting for pickup
  111.         else if (statusCode == 2) {
  112.             // Reset Stage to 0 (waiting for ingredients) after pickup Item
  113.             if (items.get(5).isEmpty()) {
  114.                 statusCode = 0;
  115.                 setChanged();
  116.             }
  117.         }
  118.         // Error status reset
  119.         else {
  120.             remainingBrewTime = 0;
  121.             statusCode = 0;
  122.             setChanged();
  123.         }
  124.     }
  125.  
  126.  
  127.     private boolean canBrew(@Nullable BrewingRecipe recipe) {
  128.         if (recipe != null) {
  129.             return recipe.matches(this, this.level);
  130.         } else {
  131.             return false;
  132.         }
  133.     }
  134.  
  135.     private boolean hasEnoughEmptyCap(BrewingRecipe recipe) {
  136.         return recipe.isCupQualified(this);
  137.     }
  138.  
  139.     private void startBrewing(BrewingRecipe recipe) {
  140.         // Pre-set bear to output Slot
  141.         // This Step must be done first
  142.         items.set(5, recipe.assemble(this));
  143.         // Consume Ingredient & Cup;
  144.         for (int i = 0; i < 4; i++) {
  145.             ItemStack ingred = items.get(i);
  146.             if (isBucket(ingred)) items.set(i, Items.BUCKET.getDefaultInstance());
  147.             else ingred.shrink(1);
  148.         }
  149.         items.get(4).shrink(recipe.getRequiredCupCount());
  150.         // Set Remaining Time;
  151.         remainingBrewTime = recipe.getBrewingTime();
  152.         // Change Status Code to 1 (brewing)
  153.         statusCode = 1;
  154.  
  155.         setChanged();
  156.     }
  157.  
  158.     private boolean isBucket(ItemStack itemStack) {
  159.         return itemStack.getItem() instanceof BucketItem || itemStack.getItem() instanceof MilkBucketItem;
  160.     }
  161.  
  162.     private void clearPreview() {
  163.         items.set(5, ItemStack.EMPTY);
  164.         remainingBrewTime = 0;
  165.         setChanged();
  166.     }
  167.  
  168.     private void showPreview(BrewingRecipe recipe) {
  169.         items.set(5, recipe.assemble(this));
  170.         remainingBrewTime = recipe.getBrewingTime();
  171.         setChanged();
  172.     }
  173.  
  174.  
  175.     @Nonnull
  176.     @Override
  177.     public List<ItemStack> getIngredients() {
  178.         NonNullList<ItemStack> sample = NonNullList.withSize(4, ItemStack.EMPTY);
  179.         for (int i = 0; i < 4; i++) {
  180.             sample.set(i, items.get(i).copy());
  181.         }
  182.         return sample;
  183.     }
  184.  
  185.     @Nonnull
  186.     @Override
  187.     public ItemStack getCup() {
  188.         return items.get(4).copy();
  189.     }
  190.  
  191.     @Override
  192.     public void saveAdditional(CompoundTag tag) {
  193.         ContainerHelper.saveAllItems(tag, this.items);
  194.         tag.putShort("RemainingBrewTime", (short) this.remainingBrewTime);
  195.         tag.putShort("statusCode", (short) this.statusCode);
  196.     }
  197.  
  198.     @Override
  199.     public void load(@Nonnull CompoundTag tag) {
  200.         super.load(tag);
  201.         this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY);
  202.         ContainerHelper.loadAllItems(tag, this.items);
  203.         this.remainingBrewTime = tag.getShort("RemainingBrewTime");
  204.         this.statusCode = tag.getShort("statusCode");
  205.     }
  206.  
  207.     @Override
  208.     public Component getDisplayName() {
  209.         return new TranslatableComponent("block.drinkbeer.beer_barrel");
  210.     }
  211.  
  212.     @Override
  213.     protected Component getDefaultName() {
  214.         return new TranslatableComponent("block.drinkbeer.beer_barrel");
  215.     }
  216.  
  217.     @Nullable
  218.     @Override
  219.     public AbstractContainerMenu createMenu(int id, Inventory inventory, Player player) {
  220.         return new BeerBarrelContainer(id, this, syncData, inventory, this);
  221.     }
  222.  
  223.     @Override
  224.     protected AbstractContainerMenu createMenu(int p_58627_, Inventory p_58628_) {
  225.         return null;
  226.     }
  227.  
  228.     @Override
  229.     public void onDataPacket(Connection net, ClientboundBlockEntityDataPacket pkt) {
  230.         handleUpdateTag(pkt.getTag());
  231.     }
  232.  
  233.     @Nullable
  234.     @Override
  235.     public ClientboundBlockEntityDataPacket getUpdatePacket() {
  236.         return ClientboundBlockEntityDataPacket.create(this);
  237.     }
  238.  
  239.     @Override
  240.     public CompoundTag getUpdateTag() {
  241.         CompoundTag tag = super.getUpdateTag();
  242.         ContainerHelper.saveAllItems(tag, this.items);
  243.         tag.putShort("RemainingBrewTime", (short) this.remainingBrewTime);
  244.         return tag;
  245.     }
  246.  
  247.     @Override
  248.     public void handleUpdateTag(CompoundTag tag) {
  249.         ContainerHelper.loadAllItems(tag, this.items);
  250.         this.remainingBrewTime = tag.getShort("RemainingBrewTime");
  251.     }
  252.  
  253.     @Override
  254.     public int getContainerSize() {
  255.         return items.size();
  256.     }
  257.  
  258.     @Override
  259.     public boolean isEmpty() {
  260.         for (ItemStack itemstack : this.items) {
  261.             if (!itemstack.isEmpty()) {
  262.                 return false;
  263.             }
  264.         }
  265.         return true;
  266.     }
  267.  
  268.     @Override
  269.     public ItemStack getItem(int p_70301_1_) {
  270.         return p_70301_1_ >= 0 && p_70301_1_ < this.items.size() ? this.items.get(p_70301_1_) : ItemStack.EMPTY;
  271.     }
  272.  
  273.     @Override
  274.     public ItemStack removeItem(int p_70298_1_, int p_70298_2_) {
  275.         return ContainerHelper.removeItem(this.items, p_70298_1_, p_70298_2_);
  276.     }
  277.  
  278.     @Override
  279.     public ItemStack removeItemNoUpdate(int p_70304_1_) {
  280.         return ContainerHelper.takeItem(this.items, p_70304_1_);
  281.     }
  282.  
  283.     @Override
  284.     public void setItem(int p_70299_1_, ItemStack p_70299_2_) {
  285.         if (p_70299_1_ >= 0 && p_70299_1_ < this.items.size()) {
  286.             this.items.set(p_70299_1_, p_70299_2_);
  287.         }
  288.     }
  289.  
  290.     @Override
  291.     public int getMaxStackSize() {
  292.         return IBrewingInventory.super.getMaxStackSize();
  293.     }
  294.  
  295.     @Override
  296.     public boolean stillValid(Player p_70300_1_) {
  297.         if (this.level.getBlockEntity(this.worldPosition) != this) {
  298.             return false;
  299.         } else {
  300.             return !(p_70300_1_.distanceToSqr((double) this.worldPosition.getX() + 0.5D, (double) this.worldPosition.getY() + 0.5D, (double) this.worldPosition.getZ() + 0.5D) > 64.0D);
  301.         }
  302.     }
  303.  
  304.     @Override
  305.     public void clearContent() {
  306.         this.items.clear();
  307.     }
  308. }
  309.  
Add Comment
Please, Sign In to add comment