- 84
- 5
- 6
хай
в общем, тут еще одна проблемка нарисовалась
Gui не открывается,
а intellij выкидывает вот такое вот сообщение
WoodcutterScreen(Нагло сворован у камнереза)
Container(Тоже нагло сворован у камнереза)
Класс рецепта
Класс Блока
хелп ми плиз
в общем, тут еще одна проблемка нарисовалась
Gui не открывается,
а intellij выкидывает вот такое вот сообщение
[11:28:15] [Render thread/WARN] [minecraft/ScreenManager]: Trying to open invalid screen with name: container.woodcutter
WoodcutterScreen(Нагло сворован у камнереза)
Java:
@OnlyIn(Dist.CLIENT)
public class WoodcutterScreen extends ContainerScreen<WoodcutterContainer>{
private static final ResourceLocation BACKGROUND_TEXTURE = new ResourceLocation(ue.MODID, "textures/gui/container/stonecutter.png");
private float sliderProgress;
private boolean clickedOnSroll;
private int recipeIndexOffset;
private boolean hasItemsInInputSlot;
public WoodcutterScreen(WoodcutterContainer containerIn, PlayerInventory playerInv, ITextComponent titleIn) {
super(containerIn, playerInv, titleIn);
containerIn.setInventoryUpdateListener(this::onInventoryUpdate);
--this.titleY;
}
public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) {
super.render(matrixStack, mouseX, mouseY, partialTicks);
this.renderHoveredTooltip(matrixStack, mouseX, mouseY);
}
protected void drawGuiContainerBackgroundLayer(MatrixStack matrixStack, float partialTicks, int x, int y) {
this.renderBackground(matrixStack);
RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
this.minecraft.getTextureManager().bindTexture(BACKGROUND_TEXTURE);
int i = this.guiLeft;
int j = this.guiTop;
this.blit(matrixStack, i, j, 0, 0, this.xSize, this.ySize);
int k = (int)(41.0F * this.sliderProgress);
this.blit(matrixStack, i + 119, j + 15 + k, 176 + (this.canScroll() ? 0 : 12), 0, 12, 15);
int l = this.guiLeft + 52;
int i1 = this.guiTop + 14;
int j1 = this.recipeIndexOffset + 12;
this.func_238853_b_(matrixStack, x, y, l, i1, j1);
this.drawRecipesItems(l, i1, j1);
}
protected void renderHoveredTooltip(MatrixStack matrixStack, int x, int y) {
super.renderHoveredTooltip(matrixStack, x, y);
if (this.hasItemsInInputSlot) {
int i = this.guiLeft + 52;
int j = this.guiTop + 14;
int k = this.recipeIndexOffset + 12;
List<WoodcuttingRecipe> list = this.container.getRecipeList();
for(int l = this.recipeIndexOffset; l < k && l < this.container.getRecipeListSize(); ++l) {
int i1 = l - this.recipeIndexOffset;
int j1 = i + i1 % 4 * 16;
int k1 = j + i1 / 4 * 18 + 2;
if (x >= j1 && x < j1 + 16 && y >= k1 && y < k1 + 18) {
this.renderTooltip(matrixStack, list.get(l).getRecipeOutput(), x, y);
}
}
}
}
private void func_238853_b_(MatrixStack matrixStack, int x, int y, int p_238853_4_, int p_238853_5_, int p_238853_6_) {
for(int i = this.recipeIndexOffset; i < p_238853_6_ && i < this.container.getRecipeListSize(); ++i) {
int j = i - this.recipeIndexOffset;
int k = p_238853_4_ + j % 4 * 16;
int l = j / 4;
int i1 = p_238853_5_ + l * 18 + 2;
int j1 = this.ySize;
if (i == this.container.getSelectedRecipe()) {
j1 += 18;
} else if (x >= k && y >= i1 && x < k + 16 && y < i1 + 18) {
j1 += 36;
}
this.blit(matrixStack, k, i1 - 1, 0, j1, 16, 18);
}
}
private void drawRecipesItems(int left, int top, int recipeIndexOffsetMax) {
List<WoodcuttingRecipe> list = this.container.getRecipeList();
for(int i = this.recipeIndexOffset; i < recipeIndexOffsetMax && i < this.container.getRecipeListSize(); ++i) {
int j = i - this.recipeIndexOffset;
int k = left + j % 4 * 16;
int l = j / 4;
int i1 = top + l * 18 + 2;
this.minecraft.getItemRenderer().renderItemAndEffectIntoGUI(list.get(i).getRecipeOutput(), k, i1);
}
}
public boolean mouseClicked(double mouseX, double mouseY, int button) {
this.clickedOnSroll = false;
if (this.hasItemsInInputSlot) {
int i = this.guiLeft + 52;
int j = this.guiTop + 14;
int k = this.recipeIndexOffset + 12;
for(int l = this.recipeIndexOffset; l < k; ++l) {
int i1 = l - this.recipeIndexOffset;
double d0 = mouseX - (double)(i + i1 % 4 * 16);
double d1 = mouseY - (double)(j + i1 / 4 * 18);
if (d0 >= 0.0D && d1 >= 0.0D && d0 < 16.0D && d1 < 18.0D && this.container.enchantItem(this.minecraft.player, l)) {
Minecraft.getInstance().getSoundHandler().play(SimpleSound.master(UESoundEvents.UI_WOODCUTTER_TAKE_RESULT.get(), 1.0F));
this.minecraft.playerController.sendEnchantPacket((this.container).windowId, l);
return true;
}
}
i = this.guiLeft + 119;
j = this.guiTop + 9;
if (mouseX >= (double)i && mouseX < (double)(i + 12) && mouseY >= (double)j && mouseY < (double)(j + 54)) {
this.clickedOnSroll = true;
}
}
return super.mouseClicked(mouseX, mouseY, button);
}
public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) {
if (this.clickedOnSroll && this.canScroll()) {
int i = this.guiTop + 14;
int j = i + 54;
this.sliderProgress = ((float)mouseY - (float)i - 7.5F) / ((float)(j - i) - 15.0F);
this.sliderProgress = MathHelper.clamp(this.sliderProgress, 0.0F, 1.0F);
this.recipeIndexOffset = (int)((double)(this.sliderProgress * (float)this.getHiddenRows()) + 0.5D) * 4;
return true;
} else {
return super.mouseDragged(mouseX, mouseY, button, dragX, dragY);
}
}
public boolean mouseScrolled(double mouseX, double mouseY, double delta) {
if (this.canScroll()) {
int i = this.getHiddenRows();
this.sliderProgress = (float)((double)this.sliderProgress - delta / (double)i);
this.sliderProgress = MathHelper.clamp(this.sliderProgress, 0.0F, 1.0F);
this.recipeIndexOffset = (int)((double)(this.sliderProgress * (float)i) + 0.5D) * 4;
}
return true;
}
private boolean canScroll() {
return this.hasItemsInInputSlot && this.container.getRecipeListSize() > 12;
}
protected int getHiddenRows() {
return (this.container.getRecipeListSize() + 4 - 1) / 4 - 3;
}
private void onInventoryUpdate() {
this.hasItemsInInputSlot = this.container.hasItemsinInputSlot();
if (!this.hasItemsInInputSlot) {
this.sliderProgress = 0.0F;
this.recipeIndexOffset = 0;
}
}
}
Container(Тоже нагло сворован у камнереза)
Java:
public class WoodcutterContainer extends Container
private final IWorldPosCallable worldPosCallable;
private final IntReferenceHolder selectedRecipe = IntReferenceHolder.single();
private final World world;
private List<WoodcuttingRecipe> recipes = Lists.newArrayList();
private ItemStack itemStackInput = ItemStack.EMPTY;
private long lastOnTake;
final Slot inputInventorySlot;
final Slot outputInventorySlot;
private Runnable inventoryUpdateListener = () -> {
};
public final IInventory inputInventory = new Inventory(1) {
public void markDirty() {
super.markDirty();
WoodcutterContainer.this.onCraftMatrixChanged(this);
WoodcutterContainer.this.inventoryUpdateListener.run();
}
};
private final CraftResultInventory inventory = new CraftResultInventory();
public WoodcutterContainer(int windowIdIn, PlayerInventory playerInventoryIn) {
this(windowIdIn, playerInventoryIn, IWorldPosCallable.DUMMY);
}
public WoodcutterContainer(int windowIdIn, PlayerInventory playerInventoryIn, final IWorldPosCallable worldPosCallableIn) {
super(UEContainers.WOODCUTTER, 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) {
public boolean isItemValid(ItemStack stack) {
return false;
}
public ItemStack onTake(PlayerEntity thePlayer, ItemStack stack) {
stack.onCrafting(thePlayer.world, thePlayer, stack.getCount());
WoodcutterContainer.this.inventory.onCrafting(thePlayer);
ItemStack itemstack = WoodcutterContainer.this.inputInventorySlot.decrStackSize(1);
if (!itemstack.isEmpty()) {
WoodcutterContainer.this.updateRecipeResultSlot();
}
worldPosCallableIn.consume((p_216954_1_, p_216954_2_) -> {
long l = p_216954_1_.getGameTime();
if (WoodcutterContainer.this.lastOnTake != l) {
p_216954_1_.playSound((PlayerEntity) null, p_216954_2_, UESoundEvents.UI_WOODCUTTER_TAKE_RESULT.get(), SoundCategory.BLOCKS, 1.0F, 1.0F);
WoodcutterContainer.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);
}
@OnlyIn(Dist.CLIENT)
public int getSelectedRecipe() {
return this.selectedRecipe.get();
}
@OnlyIn(Dist.CLIENT)
public List<WoodcuttingRecipe> 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();
}
public boolean canInteractWith(PlayerEntity playerIn) {
return isWithinUsableDistance(this.worldPosCallable, playerIn, UEBlocks.LUMBERJACK_TABLE.get());
}
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();
}
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(UERecipeType.WOODCUTTING, inventoryIn, this.world);
}
}
private void updateRecipeResultSlot() {
if (!this.recipes.isEmpty() && this.func_241818_d_(this.selectedRecipe.get())) {
WoodcuttingRecipe woodcuttingRecipe = this.recipes.get(this.selectedRecipe.get());
this.inventory.setRecipeUsed(woodcuttingRecipe);
this.outputInventorySlot.putStack(woodcuttingRecipe.getCraftingResult(this.inputInventory));
} else {
this.outputInventorySlot.putStack(ItemStack.EMPTY);
}
this.detectAndSendChanges();
}
public ContainerType<?> getType() {
return UEContainers.WOODCUTTER;
}
@OnlyIn(Dist.CLIENT)
public void setInventoryUpdateListener(Runnable listenerIn) {
this.inventoryUpdateListener = listenerIn;
}
public boolean canMergeSlot(ItemStack stack, Slot slotIn) {
return slotIn.inventory != this.inventory && super.canMergeSlot(stack, slotIn);
}
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(UERecipeType.WOODCUTTING, 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;
}
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 WoodcuttingRecipe(ResourceLocation id, String group, Ingredient ingredient, ItemStack stack)
{
super(UERecipeType.WOODCUTTING, UERecipeSerializer.WOODCUTTING, id, group, ingredient, stack);
}
@Override
public boolean matches(IInventory inventory, World world)
{
return this.ingredient.test(inventory.getStackInSlot(0));
}
@Override
public ItemStack getIcon()
{
return new ItemStack(UEBlocks.LUMBERJACK_TABLE.get());
}
public static class Serializer<T extends WoodcuttingRecipe> extends net.minecraftforge.registries.ForgeRegistryEntry<IRecipeSerializer<?>> implements IRecipeSerializer<T>
{
private final WoodcuttingRecipe.Serializer.IRecipeFactory<T> factory;
public Serializer(WoodcuttingRecipe.Serializer.IRecipeFactory<T> factory)
{
this.factory = factory;
}
@Override
public T read(ResourceLocation recipeId, JsonObject json)
{
String group = JSONUtils.getString(json, "group", "");
Ingredient ingredient;
if(JSONUtils.isJsonArray(json, "ingredient"))
{
ingredient = Ingredient.deserialize(JSONUtils.getJsonArray(json, "ingredient"));
}
else
{
ingredient = Ingredient.deserialize(JSONUtils.getJsonObject(json, "ingredient"));
}
String result = JSONUtils.getString(json, "result");
int count = JSONUtils.getInt(json, "count");
ItemStack stack = new ItemStack(Registry.ITEM.getOrDefault(new ResourceLocation(result)), count);
return this.factory.create(recipeId, group, ingredient, stack);
}
@Override
public T read(ResourceLocation recipeId, PacketBuffer buffer)
{
String group = buffer.readString(32767);
Ingredient ingredient = Ingredient.read(buffer);
ItemStack stack = buffer.readItemStack();
return this.factory.create(recipeId, group, ingredient, stack);
}
@Override
public void write(PacketBuffer buffer, T recipe)
{
buffer.writeString(recipe.group);
recipe.ingredient.write(buffer);
buffer.writeItemStack(recipe.result);
}
public interface IRecipeFactory<T extends WoodcuttingRecipe>
{
T create(ResourceLocation id, String group, Ingredient ingredient, ItemStack stack);
}
}
}
Класс Блока
Java:
public class WoodcutterBlock extends Block {
private static final ITextComponent CONTAINER_NAME = new TranslationTextComponent("container.woodcutter");
public static final DirectionProperty FACING = HorizontalBlock.HORIZONTAL_FACING;
protected static final VoxelShape SHAPE = Block.makeCuboidShape(0.0D, 0.0D, 0.0D, 16.0D, 9.0D, 16.0D);
public WoodcutterBlock(AbstractBlock.Properties propertiesIn) {
super(propertiesIn);
this.setDefaultState(this.stateContainer.getBaseState().with(FACING, Direction.NORTH));
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
return this.getDefaultState().with(FACING, context.getPlacementHorizontalFacing().getOpposite());
}
@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_STONECUTTER);
return ActionResultType.CONSUME;
}
}
@Override
@Nullable
public INamedContainerProvider getContainer(BlockState state, World worldIn, BlockPos pos) {
return new SimpleNamedContainerProvider((id, inventory, player) -> {
return new WoodcutterContainer(id, inventory, IWorldPosCallable.of(worldIn, pos));
}, CONTAINER_NAME);
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return SHAPE;
}
@Override
public boolean isTransparent(BlockState state) {
return true;
}
@Override
public BlockRenderType getRenderType(BlockState state) {
return BlockRenderType.MODEL;
}
@Override
public BlockState rotate(BlockState state, Rotation rot) {
return state.with(FACING, rot.rotate(state.get(FACING)));
}
public BlockState mirror(BlockState state, Mirror mirrorIn) {
return state.rotate(mirrorIn.toRotation(state.get(FACING)));
}
@Override
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> builder) {
builder.add(FACING);
}
@Override
public boolean allowsMovement(BlockState state, IBlockReader worldIn, BlockPos pos, PathType type) {
return false;
}
}
хелп ми плиз