Advertisement
Scouter456

Untitled

Jul 20th, 2023
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.31 KB | None | 0 0
  1. /**
  2.      * Give items a tag and change them also check if they can be upgraded
  3.      */
  4.     @Override
  5.     public void entityInside(BlockState state, Level level, BlockPos position, Entity entity) {
  6.         if(entity instanceof ItemEntity itemEntity && !itemEntity.getItem().is(Items.AIR)) {
  7.             ItemStack stack = itemEntity.getItem();
  8.             int count = stack.getCount();
  9.             if(stack.hasTag()){
  10.                 CompoundTag tag = stack.getOrCreateTag();
  11.                 boolean flag1 = tag.contains("blockChangePos");
  12.                 if(flag1){
  13.                     if(!NbtUtils.readBlockPos((CompoundTag) stack.getOrCreateTag().get("blockChangePos")).equals(position))
  14.                     return;
  15.                 } else {
  16.                     tag.put("blockChangePos", NbtUtils.writeBlockPos(position));
  17.                     stack.setTag(tag);
  18.                 }
  19.  
  20.             } else {
  21.                 CompoundTag tag = stack.getOrCreateTag();
  22.                 tag.put("blockChangePos", NbtUtils.writeBlockPos(position));
  23.                 stack.setTag(tag);
  24.             }
  25.  
  26.             CraftingRecipe[] recipes = getRecipesFor(stack, level);
  27.             int size = recipes.length;
  28.  
  29.             if(size > 0){
  30.                 if(!level.isClientSide){
  31.                 CraftingRecipe recipe = recipes[size - 1];
  32.                 ItemStack[] recipeItems = getIngredients(recipe, level);
  33.                     for(int i = 0; i < count; i++){
  34.                         for(ItemStack itemStack : recipeItems){
  35.                             ItemEntity item = new ItemEntity(level, position.getX(), position.getY(), position.getZ(), itemStack, 0, 1,0);
  36.                             level.addFreshEntity(item);
  37.                             entity.discard();
  38.                         }
  39.                     }
  40.                 }
  41.             }
  42.  
  43.         }
  44.  
  45.  
  46.  
  47.  
  48.         super.entityInside(state, level, position, entity);
  49.     }
  50.  
  51.     private static CraftingRecipe[] getRecipesFor(ItemStack inputStack, Level world) {
  52.  
  53.         List<CraftingRecipe> recipes = new ArrayList<>();
  54.  
  55.         if (!inputStack.isEmpty()) {
  56.             for (Recipe<?> recipe : world.getRecipeManager().getRecipes()) {
  57.                 if (recipe instanceof CraftingRecipe rec && recipe.canCraftInDimensions(3, 3) && !recipe.getIngredients().isEmpty() && matches(inputStack, recipe.getResultItem())) {
  58.                         recipes.add(rec);
  59.                 }
  60.             }
  61.         }
  62.  
  63.         return recipes.toArray(new CraftingRecipe[0]);
  64.     }
  65.  
  66.  
  67.     private ItemStack[] getIngredients(CraftingRecipe recipe, Level level) {
  68.         ItemStack[] stacks = new ItemStack[recipe.getIngredients().size()];
  69.         for (int i = 0; i < recipe.getIngredients().size(); i++) {
  70.             ItemStack[] matchingStacks = Arrays.stream(recipe.getIngredients().get(i).getItems()).toArray(ItemStack[]::new);
  71.  
  72.             if(matchingStacks.length > 0){
  73.                 int randomNr = level.random.nextInt(matchingStacks.length);
  74.                 stacks[i] = matchingStacks[randomNr];
  75.             } else {
  76.                 stacks[i] = ItemStack.EMPTY;
  77.             }
  78.  
  79.  
  80.         }
  81.  
  82.         return stacks;
  83.     }
  84.  
  85.     private static boolean matches(ItemStack input, ItemStack output) {
  86.         return input.is(output.getItem()) && input.getCount() >= output.getCount();
  87.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement