Posted July 31, 201312 yr Hi I have a mod full of Guis and I had a problem with the guis crashing the server as soon as I added @SideOnly(Side.CLIENT) to the onItemRightClick command it fixed the problem but the new problem is that I used to have guibuttons that when you click drops item @SideOnly(Side.CLIENT) annotation brokes them!! What can I do about this ? http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
July 31, 201312 yr never use @Sideonly period is there a bug if you DONT use it ? how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
July 31, 201312 yr Author If i dont use it it crashes the server because it attemps to render on server too http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
July 31, 201312 yr hen .. well you implemented your class im a odd way, no render class should be called from server side, can we see that ? how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
July 31, 201312 yr Author For example BlockCode: package netherfors.block; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.src.ModLoader; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.World; import netherfors.main; import netherfors.gui.GuiLavaCollector; import netherfors.tile.TileLavaCollector; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class LavaCollector extends BlockContainer{ private Icon top,bottom; public LavaCollector(int id) { super(id, Material.rock); this.setStepSound(Block.soundStoneFootstep); this.setCreativeTab(main.nettab); this.setHardness(5f); } @SideOnly(Side.CLIENT) public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) { TileLavaCollector tile = (TileLavaCollector) world.getBlockTileEntity(x, y, z); if(tile!=null){ Minecraft mc = ModLoader.getMinecraftInstance(); mc.displayGuiScreen(new GuiLavaCollector(player,world,tile)); } return true; } public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) { TileLavaCollector tile = (TileLavaCollector) world.getBlockTileEntity(x, y, z); if(tile!=null){ if(tile.itemamount>0){ EntityItem it = new EntityItem(world, x, y, z, new ItemStack(main.craftingitems,tile.itemamount,0)); if(!world.isRemote){ world.spawnEntityInWorld(it); } tile.itemamount = 0; } } } public void onBlockAdded(World world, int x, int y, int z) { TileLavaCollector t = (TileLavaCollector) world.getBlockTileEntity(x, y, z); if(t!=null){ t.itemamount = 0; t.amount = 0; t.interval = 0; t.time = 0; } } public void registerIcons(IconRegister r){ this.blockIcon = r.registerIcon("netherfors:lavaside"); this.top = r.registerIcon("netherfors:lavatop"); this.bottom = r.registerIcon("netherfors:lavabottom"); } public Icon getIcon(int par1, int par2) { return par1 == 1 ? this.top : (par1 == 0 ? this.bottom : (par1 != par2 ? this.blockIcon : this.blockIcon)); } @Override public TileEntity createNewTileEntity(World world) { return new TileLavaCollector(); } } GuiCode : package netherfors.gui; import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import netherfors.tile.TileLavaCollector; import org.lwjgl.opengl.GL11; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class GuiLavaCollector extends GuiScreen{ private int wi,he; private EntityPlayer player; private World world; private TileLavaCollector tile; // 88 // 65 public GuiLavaCollector(EntityPlayer pla,World wor,TileLavaCollector ti){ this.wi = 88; this.he = 90; this.world = wor; this.player = pla; this.tile = ti; } public boolean doesGuiPauseGame() { return false; } public void drawProgressBar(int i){ if(i>65){ i = 65; } GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.renderEngine.bindTexture("/mods/netherfors/textures/gui/lavacollector.png");; this.drawTexturedModalRect(width/2-35, (height/2-37)+(65-i), 88, 0, 20, i); } public void progressOverHundred(int o){ if(o>100){ o = 100; } int percent = (65*o)/100; drawProgressBar(percent); } public void initGui(){ } @SideOnly(Side.CLIENT) public void drawScreen(int par1, int par2, float par3) { this.drawGuiContainerBackgroundLayer(par3, par2, par1); int t = tile.amount; progressOverHundred(t); this.fontRenderer.drawSplitString("Progress\n"+Integer.toString(tile.amount)+"%\n\nAmount\n"+Integer.toString(tile.itemamount), width/2-20, height/2-34, 54, 0); super.drawScreen(par1, par2, par3); } @SideOnly(Side.CLIENT) protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.renderEngine.bindTexture("/mods/netherfors/textures/gui/lavacollector.png"); int k = (this.width - this.wi) / 2; int l = (this.height - this.he) / 2; this.drawTexturedModalRect(k, l, 0, 0, this.wi, this.he); } } If I dont put sideonly to the onBlockActivated it crashes the server http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
July 31, 201312 yr yeah make sens mc.displayGuiScreen(new GuiLavaCollector(player,world,tile)); this is wrong, you need a IGuiHandler and call this instead @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int a, float b, float c, float d) { TileEntity te = world.getBlockTileEntity(x, y, z); if(te != null){ TileEntityPlot tep = (TileEntityPlot)te; if(tep.isBought()){ return false; } if(player.username.equals(tep.owner)){ player.openGui(TheMod.instance, PlotSellerGui.GUI_ID, world, x, y, z); }else{ player.openGui(TheMod.instance, PlotBuyerGui.GUI_ID, world, x, y, z); } } return true; } example from one of my block ^^ how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
July 31, 201312 yr Author Ohh god ! This was easier...I was using IGuiHandler for only containers but now I should use it for GuiScreens too Thanks for help dude I will try it and tell the result here http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
August 1, 201312 yr Author yeah make sens mc.displayGuiScreen(new GuiLavaCollector(player,world,tile)); this is wrong, you need a IGuiHandler and call this instead @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int a, float b, float c, float d) { TileEntity te = world.getBlockTileEntity(x, y, z); if(te != null){ TileEntityPlot tep = (TileEntityPlot)te; if(tep.isBought()){ return false; } if(player.username.equals(tep.owner)){ player.openGui(TheMod.instance, PlotSellerGui.GUI_ID, world, x, y, z); }else{ player.openGui(TheMod.instance, PlotBuyerGui.GUI_ID, world, x, y, z); } } return true; } example from one of my block ^^ I converted all of my code into IGuiHandler but now world.spawnEntityInWorld() spawns fake items as well Still have the problem... http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
August 1, 201312 yr you need to use if(!world.isRemote){ spawn items } how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 1, 201312 yr Author Dude it spawns one item and it is fake http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
August 1, 201312 yr what do you mean fake ? like you can walk through it and you wont pick it up ? liek a ghost ? how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 2, 201312 yr this is a... very interesting concept I can't really help you tho, but if noone does then try looking into a tutorial on it
August 2, 201312 yr Author Dude just check out my mod I detect the items in the players inventory and give the player an item if the player has the needed items But when you add @SideOnly(Side.CLIENT) or IGuiHandler the Gui only gets opened in the client and it prevents you from spawing items etc http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
August 2, 201312 yr Don't.Use.SideOnly.Annotation. tile.itemamount This field in your tile entity should be >0 in order for items to spawn. Where is it incremented ?
August 2, 201312 yr Author God! This topic is going crazy Guys all I am trying to do is giving player items when you click a button but guis are clientsided so i cant do it This is my problem can anyone help ? http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
August 2, 201312 yr Author You cant depent on packets because players easily can exploit them And they are actually complicated http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
August 2, 201312 yr You cant depent on packets because players easily can exploit them And they are actually complicated Don't code a mod because players easily can exploit them And they are actually complicated
August 2, 201312 yr Author Okey thanks for help I will have a look in packets and implement that into my mod! Thanks one more! http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
August 2, 201312 yr Don't.Use.SideOnly.Annotation. never use @sideonly its only causing more confusion then anything NEVER You cant depent on packets because players easily can exploit them And they are actually complicated with this logic the mod is un-codable, the thing you must understand is that packet are good but you MUST filter them, dont accept anything "just because" IRL example: in my mod people have a skill tree that they can buy spell from, but player dont tell the server "hey im now max level" when they want to buy a new skill they send a packet to the server saying "can i buy this ?" and the server will decide yes or no, so theres no way around usign a hacked client on this And they are actually complicated you feed stuff in a stream on one side and collect it on the other .... how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 2, 201312 yr Author You know about packets it looks like Can you give me an example about how to send integers and execute them a fast one Because the packet tutorial on wiki is very complicated http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
August 2, 201312 yr yes only if you dont mind using MY classes....(located: http://www.minecraftforge.net/wiki/Organising_packet_handlers) //this code client side (in your gui ?) where the button was pressed or wtv int spawnItemId = 55; PacketWriteStream stream = new PacketWriteStream(); stream.put(spawnItemId); PacketDispatcher.sendPacketToServer(stream.makePacket("channel"); server side in method public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player playerEntity) : int spawnItemId = 55; PacketReadStream stream = new PacketReadStream(packet); int packetID = stream.readInt(); if(packetID == spawnItemId){ //make check to see if its a valid state //spawn item //to get a reference to the player that send this: EntityPlayer player = (EntityPlayer)playerEntity; //then player.doSomething() or player.worldObj.spawnItemInWorld(new EntityItem etc) } how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 2, 201312 yr Author With your classes it looks easy...Can I use these classes in my mod ? http://r1306.hizliresim.com/1b/1/np1mm.png[/img]
August 2, 201312 yr they are on the wiki link i gave you .. so yes thats the point how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
August 2, 201312 yr i actually looked into thsi class later, but these utility class were already done so wtv and my like 500 different packet are all written with this class ... soooo i dont want to change all that how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
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.