Сразу оговорюсь, что опыта в моддинге майна нет.
Краш лог не вижу смысла скидывать, ибо он состоит полностью из того, что закончилась оперативная память.
Как я понял: при нажатии на ПКМ с предметом(сумка) в руке - либо где-то код уходит в бесконечный цикл, либо я не знаю что, но как итог забивается оперативная память и выбивает майн(порою и браузер, следом и остальной софт на ПК).
Пытался уже переписать код много раз, каждый раз были разные проблемы, отложил вопрос на форуме на последний вариант.
Для примера брал вот этот гайд на 1.7 и пытался переделать его под 1.12.
Понимаю, что скорее всего это является говнокодом(возможно я превзошел себя и это хуже моих прошлых работ) от меня, но на что способен. Если кто-то захочет помочь и нужны будут исходники - скину.
Краш лог не вижу смысла скидывать, ибо он состоит полностью из того, что закончилась оперативная память.
Как я понял: при нажатии на ПКМ с предметом(сумка) в руке - либо где-то код уходит в бесконечный цикл, либо я не знаю что, но как итог забивается оперативная память и выбивает майн(порою и браузер, следом и остальной софт на ПК).
Пытался уже переписать код много раз, каждый раз были разные проблемы, отложил вопрос на форуме на последний вариант.
Для примера брал вот этот гайд на 1.7 и пытался переделать его под 1.12.
InventoryBag:
import com.jackal.jrpg.items.ItemCoin;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraftforge.common.util.Constants;
public class InventoryBag implements IInventory
{
public String name = new TextComponentTranslation("inventory.bag.name").toString();
private final ItemStack invItem;
public static final int INV_SIZE = 9;
private ItemStack[] inventory = new ItemStack[INV_SIZE];
public InventoryBag(ItemStack stack)
{
invItem = stack;
if(!stack.hasTagCompound())
{
stack.setTagCompound(new NBTTagCompound());
}
readFromNBT(stack.getTagCompound());
}
@Override
public int getSizeInventory()
{
return inventory.length;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public ItemStack getStackInSlot(int slot)
{
return inventory[slot];
}
@Override
public ItemStack decrStackSize(int slot, int amount)
{
ItemStack stack = getStackInSlot(slot);
if(stack != null)
{
if(stack.getCount() > amount)
{
stack = stack.splitStack(amount);
markDirty();
}
else
{
setInventorySlotContents(slot, null);
}
}
return stack;
}
@Override
public ItemStack removeStackFromSlot(int slot)
{
ItemStack stack = getStackInSlot(slot);
setInventorySlotContents(slot, null);
return stack;
}
@Override
public void setInventorySlotContents(int slot, ItemStack stack)
{
inventory[slot] = stack;
if (stack != null && stack.getCount() > getInventoryStackLimit())
{
stack.setCount(getInventoryStackLimit());
}
markDirty();
}
@Override
public String getName()
{
return name;
}
@Override
public boolean hasCustomName()
{
return name.length() > 0;
}
@Override
public ITextComponent getDisplayName() {
return null;
}
@Override
public int getInventoryStackLimit()
{
return 64;
}
@Override
public void markDirty()
{
for(int i = 0; i < getSizeInventory(); i++)
{
if(getStackInSlot(i) != null && getStackInSlot(i).getCount() == 0)
{
inventory[i] = null;
}
}
writeToNBT(invItem.getTagCompound());
}
@Override
public boolean isUsableByPlayer(EntityPlayer player)
{
return true;
}
@Override
public void openInventory(EntityPlayer player) { }
@Override
public void closeInventory(EntityPlayer player) { }
@Override
public boolean isItemValidForSlot(int slot, ItemStack itemStack)
{
return (itemStack.getItem() instanceof ItemCoin);
}
@Override
public int getField(int id) {
return 0;
}
@Override
public void setField(int id, int value) {
}
@Override
public int getFieldCount() {
return 0;
}
@Override
public void clear() {
}
public void readFromNBT(NBTTagCompound compound)
{
NBTTagList items = compound.getTagList("ItemInventory", Constants.NBT.TAG_COMPOUND);
for(int i = 0; i < items.tagCount(); i++)
{
NBTTagCompound item = (NBTTagCompound) items.getCompoundTagAt(i);
int slot = item.getInteger("Slot");
if(slot >= 0 && slot < getSizeInventory())
{
inventory[slot] = new ItemStack(item);
}
}
}
public void writeToNBT(NBTTagCompound compound)
{
NBTTagList items = new NBTTagList();
for (int i = 0; i < getSizeInventory(); i++)
{
if(getStackInSlot(i) != null)
{
NBTTagCompound item = new NBTTagCompound();
item.setInteger("Slot", i);
getStackInSlot(i).writeToNBT(item);
items.appendTag(compound);
}
}
compound.setTag("ItemInventory", items);
}
}
ContainerBag:
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.ClickType;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHand;
public class ContainerBag extends Container
{
public final InventoryBag inventory;
public static final int INV_START = InventoryBag.INV_SIZE, INV_END = INV_START + 26,
HOTBAR_START = INV_END + 1, HOTBAR_END = HOTBAR_START + 8;
public ContainerBag(EntityPlayer player, InventoryPlayer invPlayer, InventoryBag invBag)
{
this.inventory = invBag;
int i;
/[I]Слоты инвентаря сумки[/I]/
for(i=0;i<InventoryBag.INV_SIZE;i++)
{
this.addSlotToContainer(new SlotItemInv(this.inventory, i, 80 + (18*(int)(i/4)),8+(18*(i%4))));
}
/[I]Слоты инвентаря игрока[/I]/
for(i=0; i<3;i++)
{
for(int j=0;j<9;i++)
{
this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
/[I]Хотбар игрока[/I]/
for (i=0;i<9;i++)
{
this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142));
}
}
@Override
public boolean canInteractWith(EntityPlayer player)
{
return inventory.isUsableByPlayer(player);
}
@Override
public ItemStack transferStackInSlot(EntityPlayer player, int index)
{
ItemStack itemStack = null;
Slot slot = (Slot)this.inventorySlots.get(index);
if(slot != null && slot.getHasStack())
{
ItemStack itemStack1 = slot.getStack();
itemStack = itemStack1.copy();
if(index<INV_START)
{
if(!this.mergeItemStack(itemStack1, INV_START, HOTBAR_END+1, true))
{
return null;
}
slot.onSlotChange(itemStack1, itemStack);
}
else
{
if (index >= INV_START)
{
// place in custom inventory
if (!this.mergeItemStack(itemStack1, 0, INV_START, false))
{
return null;
}
}
}
if (itemStack1.getCount() == 0)
{
slot.putStack((ItemStack) null);
}
else
{
slot.onSlotChanged();
}
if (itemStack1.getCount() == itemStack.getCount())
{
return null;
}
slot.onTake(player, itemStack1);
}
return itemStack;
}
@Override
public ItemStack slotClick(int slot, int button, ClickType clickType, EntityPlayer player)
{
if(slot >= 0 && getSlot(slot) != null && getSlot(slot).getStack() == player.getHeldItem(EnumHand.MAIN_HAND))
{
return null;
}
return super.slotClick(slot, button, clickType, player);
}
}
GuiContainerBag:
import com.jackal.jrpg.inv.ContainerBag;
import com.jackal.jrpg.inv.InventoryBag;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.gui.inventory.GuiInventory;
import net.minecraft.client.resources.I18n;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
public class GuiBagInventory extends GuiContainer
{
private float xSize_lo;
private float ySize_lo;
private static final ResourceLocation iconLocation = new ResourceLocation("jrpg","textures/gui/invBag.png");
private final InventoryBag inventory;
public GuiBagInventory(ContainerBag container)
{
super(container);
this.inventory = container.inventory;
}
public void drawScreen(int par1, int par2, float par3)
{
super.drawScreen(par1, par2, par3);
this.xSize_lo = (float)par1;
this.ySize_lo = (float)par2;
}
protected void drawGuiContainerForegroundLayer(int par1, int par2)
{
String s = this.inventory.hasCustomName() ? this.inventory.getDisplayName().toString() : this.inventory.getName();
this.fontRenderer.drawString(s, this.xSize / 2 - this.fontRenderer.getStringWidth(s) / 2, 0, 4210752);
this.fontRenderer.drawString(I18n.format("container.inventory"), 26, this.ySize - 96 + 4, 4210752);
}
protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
{
GL11.glColor4f(0.5F, 0.5F, 0.5F, 0.5F);
this.mc.getTextureManager().bindTexture(iconLocation);
int k = (this.width - this.xSize) / 2;
int l = (this.height - this.ySize) / 2;
this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);
GuiInventory.drawEntityOnScreen(k + 51, l + 75, 30, (float)(k + 51) - this.xSize_lo, (float)(l + 75 - 50) - this.ySize_lo, this.mc.player);
}
}
GuiHandler:
import com.jackal.jrpg.gui.GuiBagInventory;
import com.jackal.jrpg.inv.ContainerBag;
import com.jackal.jrpg.inv.InventoryBag;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.EnumHand;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.network.IGuiHandler;
public class GuiHandler implements IGuiHandler
{
@Override
public Object getServerGuiElement(int guiId, EntityPlayer player, World world, int x, int y, int z)
{
switch (guiId)
{
case 0: return new ContainerBag(player, player.inventory, new InventoryBag(player.getHeldItem(EnumHand.MAIN_HAND)));
}
return null;
}
@Override
public Object getClientGuiElement(int guiId, EntityPlayer player, World world, int x, int y, int z)
{
switch (guiId)
{
case 0: return new GuiBagInventory((ContainerBag) new ContainerBag(player, player.inventory, new InventoryBag(player.getHeldItem(EnumHand.MAIN_HAND))));
}
return null;
}
}
Понимаю, что скорее всего это является говнокодом(возможно я превзошел себя и это хуже моих прошлых работ) от меня, но на что способен. Если кто-то захочет помочь и нужны будут исходники - скину.
Последнее редактирование: