- 84
- 5
- 6
Сначала я создал свой контейнер(а точнее своровал у камнереза)
потом создал вот такой вот класс для блока
Ну и все запускается никаких ошибок
Только вот всё это дело открывается и через секунду закрывается(контейнер мой видно, видно что он есть)
Потом решил создать обыкновенный верстак(просто с другой текстурой)
взяв стандартный CraftingTableBlock и..и.. у него та же проблема.....
Хелп ми плис
Java:
private final IWorldPosCallable worldPosCallable;
private final IntReferenceHolder selectedRecipe = IntReferenceHolder.single();
private final World world;
private List<StonecuttingRecipe> recipes = Lists.newArrayList();
private ItemStack itemStackInput = ItemStack.EMPTY;
private long lastOnTake;
final Slot inputInventorySlot;
/** The inventory slot that stores the output of the crafting recipe. */
final Slot outputInventorySlot;
private Runnable inventoryUpdateListener = () -> {
};
public final IInventory inputInventory = new Inventory(1) {
/**
* For tile entities, ensures the chunk containing the tile entity is saved to disk later - the game won't think
* it hasn't changed and skip it.
*/
public void markDirty() {
super.markDirty();
LumberjackContainer.this.onCraftMatrixChanged(this);
LumberjackContainer.this.inventoryUpdateListener.run();
}
};
/** The inventory that stores the output of the crafting recipe. */
private final CraftResultInventory inventory = new CraftResultInventory();
public LumberjackContainer(int windowIdIn, PlayerInventory playerInventoryIn) {
this(windowIdIn, playerInventoryIn, IWorldPosCallable.DUMMY);
}
public LumberjackContainer(int windowIdIn, PlayerInventory playerInventoryIn, final IWorldPosCallable worldPosCallableIn) {
super(ContainerType.STONECUTTER, windowIdIn);
this.worldPosCallable = worldPosCallableIn;
this.world = playerInventoryIn.player.world;
this.inputInventorySlot = this.addSlot(new Slot(this.inputInventory, 0, 20, 33));
this.outputInventorySlot = this.addSlot(new Slot(this.inventory, 1, 143, 33) {
/**
* Check if the stack is allowed to be placed in this slot, used for armor slots as well as furnace fuel.
*/
public boolean isItemValid(ItemStack stack) {
return false;
}
public ItemStack onTake(PlayerEntity thePlayer, ItemStack stack) {
stack.onCrafting(thePlayer.world, thePlayer, stack.getCount());
LumberjackContainer.this.inventory.onCrafting(thePlayer);
ItemStack itemstack = LumberjackContainer.this.inputInventorySlot.decrStackSize(1);
if (!itemstack.isEmpty()) {
LumberjackContainer.this.updateRecipeResultSlot();
}
worldPosCallableIn.consume((p_216954_1_, p_216954_2_) -> {
long l = p_216954_1_.getGameTime();
if (LumberjackContainer.this.lastOnTake != l) {
p_216954_1_.playSound((PlayerEntity)null, p_216954_2_, SoundEvents.UI_STONECUTTER_TAKE_RESULT, SoundCategory.BLOCKS, 1.0F, 1.0F);
LumberjackContainer.this.lastOnTake = l;
}
});
return super.onTake(thePlayer, stack);
}
});
for(int i = 0; i < 3; ++i) {
for(int j = 0; j < 9; ++j) {
this.addSlot(new Slot(playerInventoryIn, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
for(int k = 0; k < 9; ++k) {
this.addSlot(new Slot(playerInventoryIn, k, 8 + k * 18, 142));
}
this.trackInt(this.selectedRecipe);
}
/**
* Returns the index of the selected recipe.
*/
@OnlyIn(Dist.CLIENT)
public int getSelectedRecipe() {
return this.selectedRecipe.get();
}
@OnlyIn(Dist.CLIENT)
public List<StonecuttingRecipe> getRecipeList() {
return this.recipes;
}
@OnlyIn(Dist.CLIENT)
public int getRecipeListSize() {
return this.recipes.size();
}
@OnlyIn(Dist.CLIENT)
public boolean hasItemsinInputSlot() {
return this.inputInventorySlot.getHasStack() && !this.recipes.isEmpty();
}
/**
* Determines whether supplied player can use this container
*/
public boolean canInteractWith(PlayerEntity playerIn) {
return isWithinUsableDistance(this.worldPosCallable, playerIn, Blocks.STONECUTTER);
}
/**
* Handles the given Button-click on the server, currently only used by enchanting. Name is for legacy.
*/
public boolean enchantItem(PlayerEntity playerIn, int id) {
if (this.func_241818_d_(id)) {
this.selectedRecipe.set(id);
this.updateRecipeResultSlot();
}
return true;
}
private boolean func_241818_d_(int p_241818_1_) {
return p_241818_1_ >= 0 && p_241818_1_ < this.recipes.size();
}
/**
* Callback for when the crafting matrix is changed.
*/
public void onCraftMatrixChanged(IInventory inventoryIn) {
ItemStack itemstack = this.inputInventorySlot.getStack();
if (itemstack.getItem() != this.itemStackInput.getItem()) {
this.itemStackInput = itemstack.copy();
this.updateAvailableRecipes(inventoryIn, itemstack);
}
}
private void updateAvailableRecipes(IInventory inventoryIn, ItemStack stack) {
this.recipes.clear();
this.selectedRecipe.set(-1);
this.outputInventorySlot.putStack(ItemStack.EMPTY);
if (!stack.isEmpty()) {
this.recipes = this.world.getRecipeManager().getRecipes(IRecipeType.STONECUTTING, inventoryIn, this.world);
}
}
private void updateRecipeResultSlot() {
if (!this.recipes.isEmpty() && this.func_241818_d_(this.selectedRecipe.get())) {
StonecuttingRecipe stonecuttingrecipe = this.recipes.get(this.selectedRecipe.get());
this.inventory.setRecipeUsed(stonecuttingrecipe);
this.outputInventorySlot.putStack(stonecuttingrecipe.getCraftingResult(this.inputInventory));
} else {
this.outputInventorySlot.putStack(ItemStack.EMPTY);
}
this.detectAndSendChanges();
}
public ContainerType<?> getType() {
return ContainerType.STONECUTTER;
}
@OnlyIn(Dist.CLIENT)
public void setInventoryUpdateListener(Runnable listenerIn) {
this.inventoryUpdateListener = listenerIn;
}
/**
* Called to determine if the current slot is valid for the stack merging (double-click) code. The stack passed in is
* null for the initial slot that was double-clicked.
*/
public boolean canMergeSlot(ItemStack stack, Slot slotIn) {
return slotIn.inventory != this.inventory && super.canMergeSlot(stack, slotIn);
}
/**
* Handle when the stack in slot {@code index} is shift-clicked. Normally this moves the stack between the player
* inventory and the other inventory(s).
*/
public ItemStack transferStackInSlot(PlayerEntity playerIn, int index) {
ItemStack itemstack = ItemStack.EMPTY;
Slot slot = this.inventorySlots.get(index);
if (slot != null && slot.getHasStack()) {
ItemStack itemstack1 = slot.getStack();
Item item = itemstack1.getItem();
itemstack = itemstack1.copy();
if (index == 1) {
item.onCreated(itemstack1, playerIn.world, playerIn);
if (!this.mergeItemStack(itemstack1, 2, 38, true)) {
return ItemStack.EMPTY;
}
slot.onSlotChange(itemstack1, itemstack);
} else if (index == 0) {
if (!this.mergeItemStack(itemstack1, 2, 38, false)) {
return ItemStack.EMPTY;
}
} else if (this.world.getRecipeManager().getRecipe(IRecipeType.STONECUTTING, new Inventory(itemstack1), this.world).isPresent()) {
if (!this.mergeItemStack(itemstack1, 0, 1, false)) {
return ItemStack.EMPTY;
}
} else if (index >= 2 && index < 29) {
if (!this.mergeItemStack(itemstack1, 29, 38, false)) {
return ItemStack.EMPTY;
}
} else if (index >= 29 && index < 38 && !this.mergeItemStack(itemstack1, 2, 29, false)) {
return ItemStack.EMPTY;
}
if (itemstack1.isEmpty()) {
slot.putStack(ItemStack.EMPTY);
}
slot.onSlotChanged();
if (itemstack1.getCount() == itemstack.getCount()) {
return ItemStack.EMPTY;
}
slot.onTake(playerIn, itemstack1);
this.detectAndSendChanges();
}
return itemstack;
}
/**
* Called when the container is closed.
*/
public void onContainerClosed(PlayerEntity playerIn) {
super.onContainerClosed(playerIn);
this.inventory.removeStackFromSlot(1);
this.worldPosCallable.consume((p_217079_2_, p_217079_3_) -> {
this.clearContainer(playerIn, playerIn.world, this.inputInventory);
});
}
}
потом создал вот такой вот класс для блока
Java:
public class LumberjackTable extends StonecutterBlock {
private static final ITextComponent CONTAINER_NAME = new TranslationTextComponent("container.woodcutter");
public LumberjackTable(AbstractBlock.Properties properties) {
super(properties);
}
@Override
public ActionResultType onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn, BlockRayTraceResult hit) {
if (worldIn.isRemote) {
return ActionResultType.SUCCESS;
} else {
player.openContainer(state.getContainer(worldIn, pos));
player.addStat(Stats.INTERACT_WITH_CRAFTING_TABLE);
return ActionResultType.CONSUME;
}
}
@Override
public INamedContainerProvider getContainer(BlockState state, World worldIn, BlockPos pos) {
return new SimpleNamedContainerProvider((id, inventory, player) -> {
return new WorkbenchContainer(id, inventory, IWorldPosCallable.of(worldIn, pos));
}, CONTAINER_NAME);
}
}
Ну и все запускается никаких ошибок
Только вот всё это дело открывается и через секунду закрывается(контейнер мой видно, видно что он есть)
Потом решил создать обыкновенный верстак(просто с другой текстурой)
взяв стандартный CraftingTableBlock и..и.. у него та же проблема.....
Хелп ми плис