Posted January 10, 201510 yr So I have been updating the Sim-U-Kraft mod from 1.6.4 to 1.7.10, however, the GUI buttons that should load upon starting a new world don't load. I don't see anything wrong with the code, however, I am quite sure there is something that I'm missing. Here is my code: package info.satscape.simukraft.client.Gui; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import org.lwjgl.input.Mouse; import info.satscape.simukraft.common.ModSimukraft; public class GuiRunMod extends GuiScreen { public boolean running = true; private int mouseCount = 0; public boolean doesGuiPauseGame() { return true; } public GuiRunMod() { } public void initGui() { buttonList.add(new GuiButton(0, (width / 2 - 75) , 40, "Do NOT run Sim-U-Kraft")); buttonList.add(new GuiButton(1, (width / 2 - 75) , 90, "Normal Mode")); buttonList.add(new GuiButton(2, (width / 2 - 75) , 140, "Creative Mode")); buttonList.add(new GuiButton(3, (width / 2 - 75) , 190, "Hardcore Mode")); } public void drawScreen(int i, int j, float f) { try { if (mouseCount < 10) { mouseCount++; Mouse.setGrabbed(false); } drawDefaultBackground(); drawCenteredString(fontRendererObj, "Please choose the game mode for Sim-U-Kraft", width / 2, 20, 0xffffff); drawCenteredString(fontRendererObj, "This mode switches off Sim-U-kraft for this world", width / 2, 60, 0xffff00); drawCenteredString(fontRendererObj, "Ideal for beginners and experts. Not too challenging.", width / 2, 110, 0xffff00); drawCenteredString(fontRendererObj, "No money needed, everything free, no blocks required, be creative!", width / 2, 160, 0xffff00); drawCenteredString(fontRendererObj, "Builders require ALL blocks, harder gameplay", width / 2, 210, 0xffff00); } catch (Exception e) { } super.drawScreen(i, j, f); } protected void actionPerformed(GuiButton guibutton) { if (guibutton.id == 0) //do not run { // ModSimukraft.states.runMod = 0; ModSimukraft.states.gameModeNumber = 10; } else if (guibutton.id == 1) // normal { // ModSimukraft.states.runMod = 1; ModSimukraft.states.gameModeNumber = 0; ModSimukraft.proxy.getClientWorld().playSound(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ, "satscapesimukraft:welcome", 1.0f, 1.0f, false); } else if (guibutton.id == 2) //creative { // ModSimukraft.states.runMod = 1; ModSimukraft.states.gameModeNumber = 1; ModSimukraft.proxy.getClientWorld().playSound(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ, "satscapesimukraft:welcome", 1.0f, 1.0f, false); } else if (guibutton.id == 3) //hardcore { // ModSimukraft.states.runMod = 1; ModSimukraft.states.gameModeNumber = 2; ModSimukraft.proxy.getClientWorld().playSound(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ, "satscapesimukraft:welcome", 1.0f, 1.0f, false); } ModSimukraft.states.saveStates(); this.running = false; mc.currentScreen = null; mc.setIngameFocus(); } }
January 10, 201510 yr Author Sorry, I didn't mean to come across as rude, it's just demoralizing seeing my thread fall to the bottom of the page unanswered. The GUI should open as soon as a world is created. Ah, I've just realised, the GUI is opened with this code: public static void resetAndLoadNewWorld() { Side side = cpw.mods.fml.common.FMLCommonHandler.instance().getEffectiveSide(); log.info("RESETTING and loading world on "+side.toString()+" SIDE"); ModSimukraft.theBuildings.clear(); ModSimukraft.theCourierPoints.clear(); ModSimukraft.theCourierTasks.clear(); ModSimukraft.theMiningBoxes.clear(); ModSimukraft.theFarmingBoxes.clear(); ModSimukraft.theFolks.clear(); ModSimukraft.theRelationships.clear(); File f=new File(ModSimukraft.getSavesDataFolder() + "settings.sk2"); if (!f.exists()) { f=new File(ModSimukraft.getSavesDataFolder() + "settings.suk"); } if (f.exists()) { ModSimukraft.states.loadStates(); try { ModSimukraft.setGameModeFromNumber(ModSimukraft.states.gameModeNumber); } catch (Exception e) { ModSimukraft.setGameModeFromNumber(0); } } else { ModSimukraft.states = new GameStates(); ModSimukraft.states.saveStates(); } if (ModSimukraft.states == null) { new File(ModSimukraft.getSavesDataFolder() + "settings.sk2").delete(); ModSimukraft.states = new GameStates(); ModSimukraft.states.saveStates(); ModSimukraft.sendChat("Your Sim-U-Kraft settings file was corrupted, I had to make a new one"); } if (ModSimukraft.states.gameModeNumber == -1) { if (runModui == null) { GuiRunMod runModui = new GuiRunMod(); Minecraft.getMinecraft().displayGuiScreen(runModui); } return; } if (ModSimukraft.states.gameModeNumber >= 0) { ModSimukraft.proxy.ranStartup = true; } ModSimukraft.sendChat("Welcome to Sim-U-Kraft " + ModSimukraft.version); ModSimukraft.theFolks.clear(); Building.initialiseAllBuildings(); //load ALL buildings off disk and init them Building.loadAllBuildings(); //load buildings in this world CourierTask.loadCourierTasksAndPoints(); MiningBox.loadMiningBoxes(); FarmingBox.loadFarmingBoxes(); //PathBox.loadPathBoxes(); FolkData.loadAndSpawnFolks(); Relationship.loadRelationships(); ModSimukraft.updateCheck(); ModSimukraft.isDay = ModSimukraft.isDayTime(); Building.checkTennants(); ModSimukraft.proxy.ranStartup = true; } However, this function is only executed when a packet is successfully sent and received, telling the game to run it. I have absolutely no idea if my packet code works. So I guess I will post it all here: PacketHandler.java package info.satscape.simukraft.common; import info.satscape.simukraft.common.CommonProxy.V3; import info.satscape.simukraft.packets.SimukraftPacket; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import net.minecraft.client.Minecraft; import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; public class PacketHandler implements IMessageHandler<SimukraftPacket, IMessage> { public PacketHandler() { } @Override public IMessage onMessage(SimukraftPacket message, MessageContext ctx) { try { String par1 = ""; String cmd = message.cmd; String val = ""; World world = null; Side side = cpw.mods.fml.common.FMLCommonHandler.instance().getEffectiveSide(); String sside = "none"; if (side == Side.SERVER) { sside = "Server"; // CLINET GUI > SERVER, a building is being built, so load it server side if(cmd.contentEquals("loadbuilding")) { Building.loadAllBuildings(); // Client side Windmill is requesting Colour meta value }/*else if (cmd.contentEquals("requestMeta")) { //world=MinecraftServer.getServer().worldServerForDimension(Integer.parseInt(val)); V3 v3=new V3(par1); TileEntityWindmill te=(TileEntityWindmill) world.getTileEntity(v3.x.intValue(),v3.y.intValue(),v3.z.intValue()); if (te !=null) { //te.sendMetaToClient(); } else { ModSimukraft.log.warning("TEwindmill was null at "+v3.toString()); } }*/ } else if (side == Side.CLIENT) { sside = "Client"; world = Minecraft.getMinecraft().theWorld; /// SERVER > CLIENT windmill announcing it's meta value for the colour of the sails. /*if (cmd.contentEquals("announceMeta")) { V3 v3=new V3(par1); TileEntityWindmill te=(TileEntityWindmill) world.getTileEntity(v3.x.intValue(),v3.y.intValue(),v3.z.intValue()); if (te !=null) { te.meta=Integer.parseInt(val); } else { ModSimukraft.log.warning("***TEwindmill was null at "+v3.toString()); } */ /// SERVER > CLIENT folks position update (every 10 or so seconds for each folk) } else if (cmd.contentEquals("updateFolkPosition")) { FolkData folk=FolkData.getFolkByName(par1); V3 newpos=new V3(val); if (folk !=null && newpos !=null) { folk.serverToClientLocationUpdate(newpos); } /// SERVER > CLIENT - player has changed worlds, so reset and load in new SUK data } else if (cmd.contentEquals("gamereset")) { ModSimukraft.resetAndLoadNewWorld(); // still bugs with this } ModSimukraft.log.info("PacketHandler: "+sside + "-side PACKET RECIEVED: " + cmd); } catch (Exception e) { e.printStackTrace(); return message; } return null; } /*@Override public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) { if (packet.channel.equals("SUKMain")) { DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data)); try { String par1 = ByteBufUtils.readUTF(); String cmd = ByteBufUtils.readUTF(); String val = ByteBufUtils.readUTF(); World world = null; Side side = cpw.mods.fml.common.FMLCommonHandler.instance().getEffectiveSide(); String sside = "none"; if (side == Side.SERVER) { sside = "Server"; // CLINET GUI > SERVER, a building is being built, so load it server side if(cmd.contentEquals("loadbuilding")) { Building.loadAllBuildings(); // Client side Windmill is requesting Colour meta value }else if (cmd.contentEquals("requestMeta")) { world=MinecraftServer.getServer().worldServerForDimension(Integer.parseInt(val)); V3 v3=new V3(par1); TileEntityWindmill te=(TileEntityWindmill) world.getTileEntity(v3.x.intValue(),v3.y.intValue(),v3.z.intValue()); if (te !=null) { te.sendMetaToClient(); } else { ModSimukraft.log.warning("TEwindmill was null at "+v3.toString()); } } } else if (side == Side.CLIENT) { sside = "Client"; world = Minecraft.getMinecraft().theWorld; /// SERVER > CLIENT windmill announcing it's meta value for the colour of the sails. if (cmd.contentEquals("announceMeta")) { V3 v3=new V3(par1); TileEntityWindmill te=(TileEntityWindmill) world.getTileEntity(v3.x.intValue(),v3.y.intValue(),v3.z.intValue()); if (te !=null) { te.meta=Integer.parseInt(val); } else { ModSimukraft.log.warning("***TEwindmill was null at "+v3.toString()); } /// SERVER > CLIENT folks position update (every 10 or so seconds for each folk) } else if (cmd.contentEquals("updateFolkPosition")) { FolkData folk=FolkData.getFolkByName(par1); V3 newpos=new V3(val); if (folk !=null && newpos !=null) { folk.serverToClientLocationUpdate(newpos); } /// SERVER > CLIENT - player has changed worlds, so reset and load in new SUK data } else if (cmd.contentEquals("gamereset")) { ModSimukraft.resetAndLoadNewWorld(); // still bugs with this } } ModSimukraft.log.info("PacketHandler: "+sside + "-side PACKET RECIEVED: " + par1 + " - " + cmd + " = " + val); } catch (Exception e) { e.printStackTrace(); return; } } } public static Packet250CustomPayload makePacket(String par1, String cmd, String val) { ByteArrayOutputStream bos = new ByteArrayOutputStream(; DataOutputStream outputStream = new DataOutputStream(bos); try { outputStream.writeUTF(par1); outputStream.writeUTF(cmd); outputStream.writeUTF(val); } catch (Exception ex) { ex.printStackTrace(); } Packet250CustomPayload packet = new Packet250CustomPayload(); packet.channel = "SUKMain"; packet.data = bos.toByteArray(); packet.length = bos.size(); ModSimukraft.log.info("PacketHandler: Packet sent: "+par1+" "+cmd+" "+val); return packet; }*/ } CommonTickHandler.java package info.satscape.simukraft.common; import info.satscape.simukraft.client.Gui.GuiRunMod; import info.satscape.simukraft.common.CommonProxy.V3; import info.satscape.simukraft.packets.SimukraftPacket; import io.netty.buffer.ByteBuf; import java.io.File; import java.util.ArrayList; import java.util.EnumSet; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.server.FMLServerHandler; public class CommonTickHandler { private World serverWorld = null; Long lastSecondTickAt = 0l; Long lastMinuteTickAt = 0l; GuiRunMod runModui = null; String currentWorld = ""; Minecraft mc = Minecraft.getMinecraft(); long lastReset = 0; //public static final PacketPipeline packetPipeline = new PacketPipeline(); public static final SimpleNetworkWrapper INSTANCE = NetworkRegistry.INSTANCE.newSimpleChannel("SUKMain"); public void onTickInGame() { if (mc.currentScreen != null) { if (mc.currentScreen.toString().toLowerCase().contains("guimainmenu")) { ModSimukraft.log.info("CommTH: in Gui Main menu"); } } if (ModSimukraft.states.gameModeNumber == 10) { ModSimukraft.proxy.ranStartup = true; return; } Long now = System.currentTimeMillis(); if (serverWorld != null) { //fire onUpdate() for each folkData FolkData.triggerAllUpdates(); //handle day-night-day transitions ModSimukraft.dayTransitionHandler(); //if a farm needs upgarding, incrementally upgrade it if (ModSimukraft.farmToUpgrade != null) { ModSimukraft.upgradeFarm(); } if (ModSimukraft.demolishBlocks.size() > 0) //and demolishing buildings { ModSimukraft.demolishBlocks(); } } // ***** ONCE A SECOND if (now - lastSecondTickAt > 1000) { if (serverWorld == null) { try { //this is a crazy way to delay running stuff until things have spawned! :-) //Also, this won't work in MC1.7+ as there's no ModLoader class in Forge any more...good luck with that! for (World w : MinecraftServer.getServer().worldServers) { if (w.loadedEntityList.size() > 0) { serverWorld = w; currentWorld = ModSimukraft.getSavesDataFolder(); ModSimukraft.log.info("CommTH: Startup - set serverWorld/currentWorld"); ModSimukraft.resetAndLoadNewWorld(); INSTANCE.registerMessage(PacketHandler.class, SimukraftPacket.class, 0, Side.SERVER); INSTANCE.sendToServer(new SimukraftPacket()); break; } } } catch (Exception e) { serverWorld = null; //will exception until first player has spawned! } } else //used to detect world change - Still a bug with this, not unloading world when player switches via main menu { if (!currentWorld.contentEquals(ModSimukraft.getSavesDataFolder())) { if (now - lastReset >30000) { ModSimukraft.log.info("currentWorld="+currentWorld+" getSaves="+ModSimukraft.getSavesDataFolder()); currentWorld = ModSimukraft.getSavesDataFolder(); ModSimukraft.proxy.ranStartup = false; ModSimukraft.resetAndLoadNewWorld(); //PacketPipeline.sendPacketToAllPlayers(packetPipeline.encode("", "gamereset", "") /*PacketHandler.makePacket("", "gamereset", "")*/); INSTANCE.registerMessage(PacketHandler.class, SimukraftPacket.class, 0, Side.SERVER); INSTANCE.sendToServer(new SimukraftPacket()); } } //STOP THE RAIN MOD - Implemented this when I had a world where it rained ALL THE TIME! if (serverWorld.isRaining() && serverWorld.getWorldInfo().getRainTime() > 1 && ModSimukraft.configStopRain == true) { serverWorld.getWorldInfo().setRainTime(2); //setting to 1 or 0 doesn't work every time. } } // ONCE A SECOND EVERY SECOND lastSecondTickAt = now; } // ***** ONCE A MINUTE if (serverWorld != null && System.currentTimeMillis() - lastMinuteTickAt > 60000) { if (lastMinuteTickAt > 0) { Long start = System.currentTimeMillis(); FolkData.generateNewFolk(serverWorld); ModSimukraft.states.saveStates(); Building.checkTennants(); Building.saveAllBuildings(); CourierTask.saveCourierTasksAndPoints(); MiningBox.saveMiningBoxes(); FarmingBox.saveFarmingBoxes(); Relationship.saveRelationships(); //PathBox.savePathBoxes(); ModSimukraft.log.info("CTH: Saved game data in " + (System.currentTimeMillis() - start) + " ms"); } lastMinuteTickAt = now; } } public void resetSimUKraft() { //this resets everything first, if the player has switched worlds, gets hit several times due to weird MC GUI switching, // so lastReset stops it from running more than once every 30 seconds. if (System.currentTimeMillis() - lastReset > 30000) { lastReset = System.currentTimeMillis(); Side side = cpw.mods.fml.common.FMLCommonHandler.instance().getEffectiveSide(); ModSimukraft.log.info(side.toString()+"-side CommTH: resetSimUKraft()"); } } /** runs when a world has loaded, so we can set everything up */ private void startingWorld() { if (!ModSimukraft.proxy.ranStartup) { // TODO: no longer used } } //////////////////////////////////////////////// public void tickStart(EnumSet<TickEvent.Type> type, Object... tickData) { } public void tickEnd(EnumSet<TickEvent.Type> type, Object... tickData) { if (type.equals(EnumSet.of(TickEvent.Type.SERVER))) { onTickInGame(); } if (type.equals(EnumSet.of(TickEvent.Type.WORLD))) { System.out.println("WorldLoad event tick"); } } public EnumSet<TickEvent.Type> ticks() { return EnumSet.of(TickEvent.Type.SERVER, TickEvent.Type.WORLD); //add more types? } public String getLabel() { return "CommonTickHandler"; } public CommonTickHandler() { } /*public static class Handler implements IMessageHandler<CommonTickHandler, IMessage> { /** * This gets called when the packet is read and received. */ /*@Override public IMessage onMessage(CommonTickHandler message, MessageContext ctx) { return null; } }*/ } SimukraftPacket.java package info.satscape.simukraft.packets; import io.netty.buffer.ByteBuf; import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; public class SimukraftPacket implements IMessage{ //enum Type{GameReset, }; public static String par1; public static String cmd = ""; public static String folkName = ""; @Override public void fromBytes(ByteBuf buf) { cmd = ByteBufUtils.readUTF8String(buf); } @Override public void toBytes(ByteBuf buf) { ByteBufUtils.writeUTF8String(buf, cmd); //ByteBufUtils.writeUTF8String(buf, folkName); } }
January 10, 201510 yr Author Thank you! I updated the ticking functions(in the CommonTickHandler and ClientTickHandler), and part of the GUI shows up (HUD from the main mod file) however, the GUI buttons still do not show themselves. There's no error log for me to refer to, so I cannot work out why this is happening.
January 10, 201510 yr Author I added some system prints into the gui rendering file, and the functions are not executed at all.
January 10, 201510 yr Author Ok, so I added more system output points in the ticking functions, and for some reason the server isn't ticking. I don't see anything wrong with this code - hell, I got it off of a 1.7 modding tutorial, there shouldn't be anything wrong with it... @EventHandler public void init(FMLInitializationEvent event) { FMLCommonHandler.instance().bus().register(this); } @SubscribeEvent public void tick(WorldTickEvent event) { System.out.println("WorldLoad event tick"); } @SubscribeEvent public void tick(ServerTickEvent event) { System.out.println("Server event tick"); onTickInGame(); }
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.