Решил значит магазинчик сделать))0

Версия Minecraft
1.7.10
344
1
47
Делаю вообщем магазин, все нормально, все шикарно.
По нажатию на кнопку все идет гладно. Товар покупается, айтем*монетка оплаты забирается*
Стоить закрыть магазин, и попробовать передвинуть айтем, то он исчезает, а монетка которой оплачивал возвращается.. Не знаю, даже в чем проблемка.
Код:
protected void boy1(GuiButton button)
{
MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
World world = server.worldServers[0];

if (button.id == 0){

if(true && (((EntityPlayer)entity).inventory.hasItem(Items.diamond))){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).inventory.addItemStackToInventory(new ItemStack(Blocks.stone_button, 500));
}

if(true){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).inventory.consumeInventoryItem(Items.diamond);
//inventory.clearInventory(new ItemStack(Blocks.stone_button, 500));
}

if(true){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).addStat(AchievementList.theEnd2, 1);
}
if(true){
MinecraftServer.getServer().addChatMessage(new ChatComponentText("Спасибо за покупку!"));
}}}
 

Вложения

  • Снимок_экрана_110716_051318_PM.jpg
    Снимок_экрана_110716_051318_PM.jpg
    54.9 KB · Просмотры: 39
344
1
47
Dahaka написал(а):
У тебя твой магазин без контейнера, походу.


Что за MinecraftServer в гуи? Мир можно достать из Minecraft.getMinecrft().worldObj


Это по нажатию на кнопку метод. >> [font=Monaco, Consolas, Courier, monospace]if[/font][font=Monaco, Consolas, Courier, monospace] (button.id == [/font][font=Monaco, Consolas, Courier, monospace]0[/font][font=Monaco, Consolas, Courier, monospace]){[/font]


Сам гуи
Код:
public void initGui(){
super.initGui();
this.guiLeft = (this.width - 176) / 2;
this.guiTop = (this.height - 166) / 2;
Keyboard.enableRepeatEvents(true);
this.buttonList.clear();
int posX = (this.width) / 2;
int posY = (this.height) / 2;
this.buttonList.add(new GuiButton(0, this.guiLeft + 42, this.guiTop + 50, 36, 20, "Купить"));

}
 
344
1
47
Dahaka написал(а):
Код:
public static class GuiContainerMod extends Container {
 
 World world = null;
 EntityPlayer entity = null;
 int i,j,k;
 
        public GuiContainerMod (World world, int i, int j, int k, EntityPlayer player){
 
 this.world = world;
 this.entity = player;
 this.i = i;
 this.j = j;
 this.k = k;
 
 
        }

        @Override
        public boolean canInteractWith(EntityPlayer player) {
                return true;
        }


        protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) {
 int i;
         int j;
 
         for (i = 0; i < 3; ++i){
 for (j = 0; j < 9; ++j){
 this.addSlotToContainer(new Slot(inventoryPlayer, j + (i + 1) * 9, 8 + j * 18, 84 + i * 18));
 }
         }

         for (i = 0; i < 9; ++i){
 this.addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142));
         }
        }

        @Override
        public ItemStack transferStackInSlot(EntityPlayer playerIn, 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 < 9){
                if (!this.mergeItemStack(itemstack1, 9, (45-9), true)){//fixes shiftclick error
                    return null;
                }
            }else if (!this.mergeItemStack(itemstack1, 0, 9, false)){
                return null;
            }

            if (itemstack1.stackSize == 0){
                slot.putStack((ItemStack)null);
            }else{
                slot.onSlotChanged();
            }

            if (itemstack1.stackSize == itemstack.stackSize){
                return null;
            }

            slot.onPickupFromSlot(playerIn, itemstack1);
        }

        return itemstack;
    }
 
 public void onContainerClosed(EntityPlayer playerIn)
    {
        super.onContainerClosed(playerIn);

 
 
        
    }
}

public static class GuiWindow extends GuiContainer
{

 int i = 0;
 int j = 0;
 int k = 0;
 EntityPlayer entity = null;

 

public GuiWindow(World world, int i, int j, int k, EntityPlayer entity){
 super(new GuiContainerMod(world, i, j, k, entity));
 this.i = i;
 this.j = j;
 this.k = k;
 this.entity = entity;
 this.xSize=256;
 this.ySize=200;
}

private static final ResourceLocation texture = new ResourceLocation("Tte.png");

protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
{
 int posX = (this.width) /2;
 int posY = (this.height) /2;
 GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
 
this.mc.renderEngine.bindTexture(texture);
int k = (this.width - this.xSize) / 2;
int l = (this.height - this.ySize) / 2;
this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);


    zLevel = 100.0F;
    

}

protected void mouseClicked(int par1, int par2, int par3)
{
super.mouseClicked(par1, par2, par3);

}

public void updateScreen()
{
int posX = (this.width) /2;
int posY = (this.height) /2;

}

protected void keyTyped(char par1, int par2)
{

super.keyTyped(par1,par2);



}

protected void drawGuiContainerForegroundLayer(int par1, int par2){
 int posX = (this.width) /2;
 int posY = (this.height) /2;
 
}

public void onGuiClosed()
{
Keyboard.enableRepeatEvents(false);
}

public void initGui(){
super.initGui();
this.guiLeft = (this.width - 176) / 2;
this.guiTop = (this.height - 166) / 2;
Keyboard.enableRepeatEvents(true);
this.buttonList.clear();
int posX = (this.width) / 2;
int posY = (this.height) / 2;
this.buttonList.add(new GuiButton(0, this.guiLeft + 42, this.guiTop + 50, 36, 20, "Купить"));

}

protected void actionPerformed(GuiButton button)
{
//MinecraftServer server = FMLCommonHandler.instance().getMinecraftServerInstance();
//World world = server.worldServers[0];

if (button.id == 0){

if(true && (((EntityPlayer)entity).inventory.hasItem(Items.diamond))){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).inventory.addItemStackToInventory(new ItemStack(Blocks.stone_button, 500));
}

if(true){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).inventory.consumeInventoryItem(Items.diamond);
//inventory.clearInventory(new ItemStack(Blocks.stone_button, 500));
}

if(true){
if(entity instanceof EntityPlayer)((EntityPlayer)entity).addStat(AchievementList.theEnd2, 1);
}
if(true){
MinecraftServer.getServer().addChatMessage(new ChatComponentText("Спасибо за покупку!"));
}}}

public boolean doesGuiPauseGame()
{
    return false;
}
 
}

}
Тебе нужно гуи с контейнером. А то, что ты скинул не несет никакой полезной информации.
Покажи, гуиХэндлер и как ты отрываешь гуи.
Весь класс. *он только 1*
 
2,505
81
397
timaxa007 написал(а):
Пакеты нужно использовать. Ты даёшь предмет на клиентской стороне, а не на серверной.
Нет, не нужно. В контейнере есть вся необходимая синхронизация.
 

timaxa007

Модератор
5,831
409
672
У него через кнопку, а не только через слоты. На слот автоматизировано срабатывают нужные пакеты, но он нажимает на кнопку, пакеты не какие не отправляются.
 
2,505
81
397
Есть такой метод
Код:
mc.playerController.sendEnchantPacket(inventorySlots.windowId, флаг);
Его можно вызвать в гуи по нажатию кнопки. Я понимаю, что это пакет, но своих велосипедов пилить не нужно. Тогда на серверной стороне вызовется метод Container#enchantItem(EntityPlayer, int).
Интовый параметр - это флаг. В этом методе можно будет выдать итем игроку.
 
Сверху