Jump to content

Recommended Posts

Posted

So, I was testing my mod on a test server I created with eclipse and, during the process I opened my shop Gui. Worked fine until I clicked the button that displays another gui. Then the client crashed and gave me this:

 

net.minecraft.util.ReportedException: Updating screen events
at net.minecraft.client.Minecraft.func_71407_l(Minecraft.java:1642) ~[bao.class:?]
at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:961) ~[bao.class:?]
at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:887) [bao.class:?]
at net.minecraft.client.main.Main.main(SourceFile:148) [Main.class:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_25]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_25]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_25]
at java.lang.reflect.Method.invoke(Method.java:483) ~[?:1.8.0_25]
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.11.jar:?]
at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.11.jar:?]
Caused by: java.lang.NullPointerException
at com.happykiller.crewmod.client.gui.GuiShopBlock.func_146284_a(GuiShopBlock.java:100) ~[GuiShopBlock.class:?]
at net.minecraft.client.gui.GuiScreen.func_73864_a(GuiScreen.java:225) ~[bdw.class:?]
at com.happykiller.crewmod.client.gui.GuiShopBlock.func_73864_a(GuiShopBlock.java:259) ~[GuiShopBlock.class:?]
at net.minecraft.client.gui.GuiScreen.func_146274_d(GuiScreen.java:296) ~[bdw.class:?]
at net.minecraft.client.gui.GuiScreen.func_146269_k(GuiScreen.java:268) ~[bdw.class:?]
at net.minecraft.client.Minecraft.func_71407_l(Minecraft.java:1628) ~[bao.class:?]
... 9 more

 

The two lines that it says caused it are as followed:

World world = FMLCommonHandler.instance().getMinecraftServerInstance().getEntityWorld(); //Line 100 in the actionPerformed method.

super.mouseClicked(mouseX, mouseY, which); //Line 259 under the mouseClicked method.

 

I do not understand how it can not get the world. I can't do a server check or else the world for the server will be unreachable by lower code that requires it. Any help will be greatly appreciated!

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

You cannot ever access to any Server-only fields on the Client side(Gui)!

You should use Minecraft#thePlayer#worldObj instead.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Posted

What are you doing? :o

 

Full code please - in Gui you can only access your player and entities that are loaded by client thread, so entites around your player that were sent to you from server.

666TH POST

 

e3af7181bf70858494f7d2a484aceb7d.jpg

1.7.10 is no longer supported by forge, you are on your own.

Posted

I'll post the full code if my recent edit doesn't work. And Ernio... CONGRATS xD

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

So, using "this.mc.thePlayer.worldObj" yielded the error "EntityClientPlayerMP cannot be cast to EntityPlayerMP" which I kinda expected. xD Here's my class code (quite messy considering the development it is still in):

public class GuiShopBlock extends GuiScreen {

public static final ResourceLocation texture = new ResourceLocation(MR.TNAME + "textures/gui/crew_shop.png");
private static final ResourceLocation crewShopPurchase = new ResourceLocation(MR.TNAME + "textures/gui/crew_shop_purchase.png");

private int xSize;
private int ySize;

private int itemPrice;

RenderItem renderedItem;

Item item;

GuiSlider slider;
GuiButton buy;
GuiButton exit;
GuiButton prev;
GuiButton next;
GuiButton exitGui;

private boolean canDisplayPurchase;

public GuiShopBlock() {
	this.xSize = 176;
	this.ySize = 166;

	renderedItem = new RenderItem();

	canDisplayPurchase = false;
	itemPrice = 0;
	item = null;
}

public void initGui() {
        int k = (this.width - this.xSize) / 2;
        int l = (this.height - this.ySize) / 2;
        
	buttonList.clear();

	slider = new GuiSlider(0, k + 48, l + 40, 72, 14, "Quantity: ", "", 1, 64, 1, false, true);
	buy = new GuiButton(1, k + 49, l + 79, 26, 14, "Buy");
	exit = new GuiButton(2, k + 92, l + 79, 26, 14, "Exit");
	prev = new GuiButton(3, k + 6, l + 142, 10, 20, "<");
	next = new GuiButton(4, k + 158, l + 142, 10, 20, ">");
	exitGui = new GuiButton(5, k + 70, l + 142, 30, 20, "Exit");

	buttonList.add(slider);
	buttonList.add(buy);
	buttonList.add(exit);
	buttonList.add(prev);
	buttonList.add(next);
	buttonList.add(exitGui);

	slider.visible = false;
	buy.visible = false;
	exit.visible = false;
	prev.enabled = false;
}

public void actionPerformed(GuiButton button) {
	int cost = (int)(slider.getValueInt() * itemPrice);
	int userID = this.mc.thePlayer.getEntityId();
	World world = this.mc.thePlayer.worldObj;
	EntityPlayer player = (EntityPlayer)world.getEntityByID(userID);
	ExtendedPlayer ep = ExtendedPlayer.get(player);

	switch(button.id) {
		case 0:
			break;
		case 1:
			if(canPlayerBuy(cost)) {
				ep.modifyCrewCoins(-cost);

				PacketRegistry.network.sendTo(new PacketCoinChangeClient(player, ep.getCrewCoinAmount()), (EntityPlayerMP)player);

				ItemStack stack = new ItemStack(this.item, slider.getValueInt(), 0);

				if(stack != null) {
					EntityItem item = new EntityItem(world, player.posX, player.posY, player.posZ, stack);

					if(!world.isRemote) {
						world.spawnEntityInWorld(item);
					}
				}

				closePurchase();
			}else {
				EventsClientForge.purchaseError();
			}

			break;
		case 2:
			closePurchase();
			break;
		case 3:
			break;
		case 4:
			if(this.mc.theWorld.isRemote)
				this.mc.displayGuiScreen(new GuiShopBlockP2());
			break;
		case 5:
			this.mc.displayGuiScreen((GuiScreen)null);
			break;
	}
}

public void drawScreen(int x, int y, float f) {
	GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

        int k = (this.width - this.xSize) / 2;
        int l = (this.height - this.ySize) / 2;

	mc.getTextureManager().bindTexture(texture);

	this.drawTexturedModalRect(k, l, 0, 0, xSize, ySize);

	this.renderItemOnGui(Items.emerald, 0, 0);
	this.renderItemOnGui(Items.diamond, 100, 0);

	this.renderItemOnGui(Items.gold_ingot, 0, 25);
	this.renderItemOnGui(Items.iron_ingot, 100, 25);

	this.renderItemOnGui(Items.quartz, 0, 50);
	this.renderItemOnGui(Items.redstone, 100, 50);

	this.drawString(mc.fontRenderer, "Crew Shop", k + 60, l + 8, 0xFFFFFF);
	this.drawString(mc.fontRenderer, "Welcome to the Crew Shop!", k + 20, l + 100, 0xFFFFFF);
	this.drawString(mc.fontRenderer, "To purchase an something,", k + 18, l + 114, 0xFFFFFF);
	this.drawString(mc.fontRenderer, "please click an item above.", k + 20, l + 124, 0xFFFFFF);

	if(this.canDisplayPurchase) {
		this.drawPurchaseOverlay();
	}

	super.drawScreen(x, y, f);

	this.drawToolTips(x, y);
}

public void drawToolTips(int mouseX, int mouseY) {
    int boxX = (this.width - this.xSize) / 2 + 25;
    int boxY = (this.height - this.ySize) / 2 + 25;

	int defaultX = 16;
	int defaultY = 16;

	/* Left Side */
	if(mouseX > boxX && mouseX < boxX + defaultX && mouseY > boxY && mouseY < boxY + defaultY) {
		List list = new ArrayList();
		defaultTooltip(list, ItemPrices.EMERALD, "Emerald");
		this.drawTooltipText(list, mouseX, mouseY, fontRendererObj);
	}

	if(mouseX > boxX && mouseX < boxX + defaultX && mouseY > boxY + 25 && mouseY < boxY + 25 + defaultY) {
		List list = new ArrayList();
		defaultTooltip(list, ItemPrices.GOLD_INGOT, "Gold Ingot");
		this.drawTooltipText(list, mouseX, mouseY, fontRendererObj);
	}

	if(mouseX > boxX && mouseX < boxX + defaultX && mouseY > boxY + 50 && mouseY < boxY + 50 + defaultY) {
		List list = new ArrayList();
		defaultTooltip(list, ItemPrices.QUARTZ, "Quartz");
		this.drawTooltipText(list, mouseX, mouseY, fontRendererObj);
	}

	/* Right Side */
	if(mouseX > boxX + 100 && mouseX < boxX + 100 + defaultX && mouseY > boxY && mouseY < boxY + defaultY) {
		List list = new ArrayList();
		defaultTooltip(list, ItemPrices.DIAMOND, "Diamond");
		this.drawTooltipText(list, mouseX, mouseY, fontRendererObj);
	}

	if(mouseX > boxX + 100 && mouseX < boxX + 100 + defaultX && mouseY > boxY + 25 && mouseY < boxY + 25 + defaultY) {
		List list = new ArrayList();
		defaultTooltip(list, ItemPrices.IRON_INGOT, "Iron Ingot");
		this.drawTooltipText(list, mouseX, mouseY, fontRendererObj);
	}

	if(mouseX > boxX + 100 && mouseX < boxX + 100 + defaultX && mouseY > boxY + 50 && mouseY < boxY + 50 + defaultY) {
		List list = new ArrayList();
		defaultTooltip(list, ItemPrices.REDSTONE, "Redstone");
		this.drawTooltipText(list, mouseX, mouseY, fontRendererObj);
	}
}

public void mouseClicked(int mouseX, int mouseY, int which) {
    int boxX = (this.width - this.xSize) / 2 + 25;
    int boxY = (this.height - this.ySize) / 2 + 25;

	int defaultX = 16;
	int defaultY = 16;

	if(!this.canDisplayPurchase && which == 0) {

		/* Left Side */
		if(mouseX > boxX && mouseX < boxX + defaultX && mouseY > boxY && mouseY < boxY + defaultY) {
			openPurchase(ItemPrices.EMERALD, Items.emerald);
		}

		if(mouseX > boxX && mouseX < boxX + defaultX && mouseY > boxY + 25 && mouseY < boxY + 25 + defaultY) {
			openPurchase(ItemPrices.GOLD_INGOT, Items.gold_ingot);
		}

		if(mouseX > boxX && mouseX < boxX + defaultX && mouseY > boxY + 50 && mouseY < boxY + 50 + defaultY) {
			openPurchase(ItemPrices.QUARTZ, Items.quartz);
		}

		/* Right Side */
		if(mouseX > boxX + 100 && mouseX < boxX + 100 + defaultX && mouseY > boxY && mouseY < boxY + defaultY) {
			openPurchase(ItemPrices.DIAMOND, Items.diamond);
		}

		if(mouseX > boxX + 100 && mouseX < boxX + 100 + defaultX && mouseY > boxY + 25 && mouseY < boxY + 25 + defaultY) {
			openPurchase(ItemPrices.IRON_INGOT, Items.iron_ingot);
		}

		if(mouseX > boxX + 100 && mouseX < boxX + 100 + defaultX && mouseY > boxY + 50 && mouseY < boxY + 50 + defaultY) {
			openPurchase(ItemPrices.REDSTONE, Items.redstone);
		}
	}

	super.mouseClicked(mouseX, mouseY, which);
}

public void renderItemOnGui(Item item, int mulX, int mulY) {
        int k = (this.width - this.xSize) / 2 + 25;
        int l = (this.height - this.ySize) / 2 + 25;
        
	GL11.glPushMatrix();

	RenderHelper.enableGUIStandardItemLighting();
        GL11.glDisable(GL11.GL_LIGHTING);
        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
        GL11.glEnable(GL11.GL_LIGHTING);
        
        //GL11.glScalef(2.00F, 2.00F, 2.00F);
        
        renderedItem.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), new ItemStack(item), k + mulX, l + mulY);
        GL11.glDisable(GL11.GL_LIGHTING);
        GL11.glDepthMask(true);
        GL11.glEnable(GL11.GL_DEPTH_TEST);
        RenderHelper.disableStandardItemLighting();
        
        GL11.glPopMatrix();
}

private void drawPurchaseOverlay() {
	//GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);

	int xSize = 80;
	int ySize = 62;

        int k = (this.width - this.xSize) / 2;
        int l = (this.height - this.ySize) / 2;

	mc.getTextureManager().bindTexture(crewShopPurchase);

	this.drawTexturedModalRect(k + 44, l + 34, 0, 0, this.xSize, this.ySize);

	this.renderItemOnGui(this.item, 50, 36);

	//this.drawCenteredString(mc.fontRenderer, "Purchase Item", k + 84, l + 40, 0xFFFFFF);

	//RenderHelper.enableGUIStandardItemLighting();
        //GL11.glDisable(GL11.GL_LIGHTING);
        //GL11.glEnable(GL12.GL_RESCALE_NORMAL);
       //GL11.glEnable(GL11.GL_COLOR_MATERIAL);
        //GL11.glEnable(GL11.GL_LIGHTING);
        
        //GL11.glScalef(2.00F, 2.00F, 2.00F);
        
        //renderedItem.renderItemAndEffectIntoGUI(mc.fontRenderer, mc.getTextureManager(), new ItemStack(itemForRender), k + 25, l + 25);
        //GL11.glDisable(GL11.GL_LIGHTING);
        //GL11.glDepthMask(true);
        //GL11.glEnable(GL11.GL_DEPTH_TEST);
        
        //GL11.glPopMatrix();
}

private void openPurchase(int itemPrice, Item itemToDrop) {
	this.canDisplayPurchase = true;
	slider.visible = true;
	buy.visible = true;
	exit.visible = true;
	this.itemPrice = itemPrice;
	this.item = itemToDrop;
	slider.maxValue = item.getItemStackLimit();
	slider.updateSlider();
	next.enabled = false;
	exitGui.enabled = false;
}

public void closePurchase() {
	canDisplayPurchase = false;
	slider.visible = false;
	buy.visible = false;
	exit.visible = false;
	slider.setValue(1D);
	slider.maxValue = 64;
	slider.updateSlider();
	this.item = null;
	next.enabled = true;
	exitGui.enabled = true;
}

private void drawTooltipText(List list, int mouseX, int mouseY, FontRenderer fr) {
	if(!this.canDisplayPurchase) {
		this.drawHoveringText(list, mouseX, mouseY, fr);
	}else {
		return;
	}
}

private void defaultTooltip(List list, int itemP, String itemN) {
	list.add(EnumChatFormatting.YELLOW + itemN);
	list.add(EnumChatFormatting.AQUA + "Price: " + getCost(itemP));
}

private boolean canPlayerBuy(int cost) {
	if(ExtendedPlayer.get(this.mc.thePlayer).getCrewCoinAmount() >= cost) {
		return true;
	}else {
		return false;
	}
}

private String getCost(int itemPrice) {
	if(ExtendedPlayer.get(this.mc.thePlayer).getCrewCoinAmount() >= itemPrice) {
		return EnumChatFormatting.GREEN.toString() + itemPrice;
	}else {
		return EnumChatFormatting.RED.toString() + itemPrice;
	}
}

public void keyTyped(char character, int key) {
	if(key == Keyboard.KEY_E) {
		if(this.canDisplayPurchase) {
			closePurchase();
		}else {
			this.mc.displayGuiScreen((GuiScreen)null);
		}
	}

	super.keyTyped(character, key);
}

public boolean doesGuiPauseGame() {
	return false;
}
}

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

Well, when sending a packet to the server and then, in the onMessage having it send the client change packet back; it updates but the value doesn't save so, the next time I pick up a coin, it's like it never charged me.

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

So, I need to subtract the cost in the server packet?

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

Let's say you have 2 operations - spending coins and gaining coins.

You gain coins by picking them up, you spend them by clicking button in GUI in your shop.

Picking up happens always on server, so what you have to do:

1. You pick up coin.

2. You save value to server-sided ExtendedPlayer (EP) and send packet to Client to update client-sided EP.

Now how spending should work:

1. You click on button, which have some ID assigned that is an internal static shared value (server and client), you send packet from client to server (that will contain this ID, and for e.g the item you picked from your shop gui).

2. In Server IMessageHandler in onMessage you get EP's total coins and check if you have enough to buy given item. If you can you spend server-sided coins on it and you put given item to your inventory.

3. You send packet from server to client with new coin amount (just like in "picking up coins"). And you also have to send inventory update packet, client doesn't always get synchronized there.

 

I know you have picking-up coded, so what is the problem? Code that handles buying please.

 

EDIT:

And yes to above - Data is saved only on SERVER, client doesn't save anything (but cache, which doesn't matter).

Server is teapot, client is teacup.

1.7.10 is no longer supported by forge, you are on your own.

Posted

All the code that handles the buying is in the guishopblock. I think I understand what to do now though. xD

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

All the code that handles the buying is in the guishopblock.

 

Jesus christ.

 

The client only knows what the values are, it can't change them!

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

No need for the anger. I understand that and, that's what I'm changing as we speak. Ernio asked for the buying code so, I told him where it currently was.

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

So, just a small question: how would I save the Item that I sent for processing to the ByteBuf?

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

If you would make GOOD design, the client would be only a mirror of server shop, so only thing you would neex was an index.

 

Let's say you open shop, server loads all ItemStacks that this shop can sell and puts them into some ItemStack[]. Those stacks would be sent to client with corresponding ID:

@Override
public void toBytes(ByteBuf buffer)
{
	for (some for loop that would write all possible itemstacks, index++) {
		buffer.writeInt(index);
		PacketBuffer pb = new PacketBuffer(buffer);
		pb.writeItemStackToBuffer(this.stack);
	}
}

 

You get the idea.

On client you would have mirror of what server has and inside packet that should say "buy this item" you would only have to send the ID of button you pressed ("buy") and index of slot.

 

Otherwise - you can always use pb.writeItemStackToBuffer(this.stack); and do this other way around. I am presenting how it would be smart. That's probably similar to what villagers do (I think).

 

1.7.10 is no longer supported by forge, you are on your own.

Posted

For my packet, I just send one item at a time per purchase. xD So, would I just create an itemstack and save it?

I am not a cat. I know my profile picture is sexy and amazing beyond anything you could imagine but my cat like features only persist in my fierce eyes. I might be a cat.

Posted

If you plan to purchase metadata or NBT items too, then you should create itemstack.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.