
tancfire
Members-
Posts
8 -
Joined
-
Last visited
Everything posted by tancfire
-
It works ! Thanks you very muck ! Now, my code is: My packet: public class AllianceOfferMessage implements IMessage{ private String kingdomName; public AllianceOfferMessage() { } public AllianceOfferMessage(String kingdomName) { this.kingdomName = kingdomName; } @Override public void fromBytes(ByteBuf buf) { kingdomName = ByteBufUtils.readUTF8String(buf); } @Override public void toBytes(ByteBuf buf) { ByteBufUtils.writeUTF8String(buf, kingdomName); } public static class Handler implements IMessageHandler<AllianceOfferMessage, IMessage> { @Override @SideOnly(Side.CLIENT) public IMessage onMessage(AllianceOfferMessage message, MessageContext ctx) { EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; Minecraft.getMinecraft().displayGuiScreen(new GuiAllianceOffer(player,player.getEntityWorld(),player.getPosition().getX(),player.getPosition().getY(),player.getPosition().getZ(), message.kingdomName)); return null; } } } Note: To use "Minecraft::displayGuiScreen", i had to put "@SideOnly(Side.CLIENT) My GUI: public GuiAllianceOffer(EntityPlayer player, World world, int x, int y, int z, String kingdomName) { this.x = x; this.y = y; this.z = z; this.player = player; this.world = world; xSize = 185; ySize = 137; this.kingdomName = kingdomName; } @Override public void updateScreen() { super.updateScreen(); } @Override protected void keyTyped(char typedChar, int keyCode) throws IOException { super.keyTyped(typedChar, keyCode); } @Override public void initGui() { boutonAccept = new GuiButton(1, 0, 0, 50,20,"Accept"); boutonRefuse = new GuiButton(2,0,0,50,20, "Refuse"); buttonList.add(boutonAccept); buttonList.add(boutonRefuse); } @Override public void drawScreen(int mouseX, int mouseY, float renderPartialTicks) { int x = (this.width - xSize) / 2; int y = (this.height - ySize) / 2; boutonRefuse.xPosition = x+xSize-55; boutonRefuse.yPosition = y+ySize-25; boutonAccept.xPosition = x+5; boutonAccept.yPosition = y+ySize-25; this.mc.getTextureManager().bindTexture(backgroundimage); drawTexturedModalRect(x, y, 0, 0, xSize, ySize); drawCenteredString(this.fontRendererObj, "The kingdom of "+kingdomName, x+(xSize/2), y+5, -1); drawCenteredString(this.fontRendererObj, "offer you an alliance", x+(xSize/2), y+20, -1); boutonAccept.drawButton(mc, mouseX, mouseY); boutonRefuse.drawButton(mc, mouseX, mouseY); } @Override protected void actionPerformed(GuiButton button) throws IOException { if(button==this.boutonAccept) { //KingdomAgeMod.network.sendToServer(new RenameKingdomMessage(player.getEntityData().getInteger("id_kingdom"),this.editKingdomName.getText())); this.player.closeScreen(); //On ferme la fenêtre du GUI. } else if (button==this.boutonRefuse) { //KingdomAgeMod.network.sendToServer(new DeleteKingdomMessage(player.getEntityData().getInteger("id_kingdom"),x,y,z)); this.player.closeScreen(); } } @Override public boolean doesGuiPauseGame() { return false; } } Here, I put a new parameter "kingdomName" in the gui's constructor.
-
Ok, but how i "take" the string from the packet, to put it in my GUI ?
-
Hello everyone, I have a big problem. I try to get data from server, to put it in a text box, in a GUI, on client side. To open the gui on the current player, it's an other player who type a command. I used a packet to do it. This part works fine. BUT, i can't send a data string from server to the GUI. Here my code: The Command: public class OfferAllianceCommand extends BaseCommand { public OfferAllianceCommand() { super("offerAlliance", 2); } @Override public String getCommandUsage(ICommandSender sender) { return "/offerAlliance <kingdom> <kingdomTarget>"; } @Override public int compareTo(Object arg0) { return 0; } @Override public boolean canCommandSenderUse(ICommandSender sender) { return true; } @Override public List addTabCompletionOptions(ICommandSender sender, String[] args,BlockPos pos) { return null; } @Override public boolean isUsernameIndex(String[] args, int index) { return false; } @Override public void onExecute(ICommandSender sender, String[] args) { String kingdomName = args[0]; String kingdomTargetName = args[1]; KingdomAgeSavedData kt = KingdomAgeSavedData.forWorld(sender.getEntityWorld()); Kingdom kingdom = kt.getKingdomByName(kingdomName); Kingdom kingdomTarget = kt.getKingdomByName(kingdomTargetName); if(isKingdomExist(sender, kingdom, kingdomName) // si le royaume existe && isOwnKingdom(sender, kingdom, sender.getName()) //si le joueur en est le roi && isKingdomExist(sender, kingdomTarget, kingdomTargetName) //si le royaume cible existe && isConnected(sender, kingdom.getOwner())){ //Et le joueur cible est connecté System.out.println("Joueur qui envoit l'offre: "+sender.getName()); EntityPlayerMP playerTarget = MinecraftServer.getServer().getConfigurationManager().getPlayerByUsername(kingdomTarget.getOwner()); playerTarget.getEntityData().setString("allianceOffer", kingdomName); System.out.println("Kingdom of alliance: "+playerTarget.getEntityData().getString("allianceOffer")); KingdomAgeMod.network.sendTo(new AllianceOfferMessage(), playerTarget); //playerTarget.openGui(KingdomAgeMod.instance, GUIs.ALLIANCE_OFFER.ordinal(), sender.getEntityWorld(), playerTarget.getPosition().getX(), playerTarget.getPosition().getY(),playerTarget.getPosition().getZ()); //FMLNetworkHandler.openGui(playerTarget, KingdomAgeMod.instance, GUIs.ALLIANCE_OFFER.ordinal(), playerTarget.getEntityWorld(), playerTarget.getPosition().getX(), playerTarget.getPosition().getY(),playerTarget.getPosition().getZ()); } } } The packet: public class AllianceOfferMessage implements IMessage{ /*private int x; private int y; private int z;*/ public AllianceOfferMessage() { } /*public AllianceOfferMessage(int x, int y, int z) { this.x = x; this.y = y; this.z = z; }*/ @Override public void fromBytes(ByteBuf buf) { /*x = ByteBufUtils.readVarInt(buf, 5); y = ByteBufUtils.readVarInt(buf, 5); z = ByteBufUtils.readVarInt(buf, 5);*/ } @Override public void toBytes(ByteBuf buf) { /*ByteBufUtils.writeVarInt(buf, x, 5); ByteBufUtils.writeVarInt(buf, y, 5); ByteBufUtils.writeVarInt(buf, z, 5);*/ } public static class Handler implements IMessageHandler<AllianceOfferMessage, IMessage> { @Override public IMessage onMessage(AllianceOfferMessage message, MessageContext ctx) { EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; System.out.println("Joueur qui reçoit l'offre: "+player.getName()); player.openGui(KingdomAgeMod.instance, GUIs.ALLIANCE_OFFER.ordinal(), player.getEntityWorld(), player.getPosition().getX(), player.getPosition().getY(),player.getPosition().getZ()); return null; } } } The GUI: public class GuiAllianceOffer extends GuiScreen{ private int x, y, z; private EntityPlayer player; private World world; private int xSize, ySize; private GuiButton boutonAccept; private GuiButton boutonRefuse; private String kingdomName; private ResourceLocation backgroundimage = new ResourceLocation(KingdomAgeMod.MODID.toLowerCase() + ":" + "textures/client/gui/guikingdomerrename.png"); public GuiAllianceOffer(EntityPlayer player, World world, int x, int y, int z) { this.x = x; this.y = y; this.z = z; this.player = player; this.world = world; xSize = 185; ySize = 137; kingdomName = player.getEntityData().getString("allianceOffer"); } @Override public void updateScreen() { super.updateScreen(); } @Override protected void keyTyped(char typedChar, int keyCode) throws IOException { super.keyTyped(typedChar, keyCode); } @Override public void initGui() { boutonAccept = new GuiButton(1, 0, 0, 50,20,"Accept"); boutonRefuse = new GuiButton(2,0,0,50,20, "Refuse"); buttonList.add(boutonAccept); buttonList.add(boutonRefuse); } @Override public void drawScreen(int mouseX, int mouseY, float renderPartialTicks) { int x = (this.width - xSize) / 2; int y = (this.height - ySize) / 2; boutonRefuse.xPosition = x+xSize-55; boutonRefuse.yPosition = y+ySize-25; boutonAccept.xPosition = x+5; boutonAccept.yPosition = y+ySize-25; System.out.println("Kingdom of alliance2: "+kingdomName); this.mc.getTextureManager().bindTexture(backgroundimage); drawTexturedModalRect(x, y, 0, 0, xSize, ySize); drawCenteredString(this.fontRendererObj, "The kingdom of "+kingdomName, x+(xSize/2), y+5, -1); drawCenteredString(this.fontRendererObj, "offer you an alliance", x+(xSize/2), y+20, -1); boutonAccept.drawButton(mc, mouseX, mouseY); boutonRefuse.drawButton(mc, mouseX, mouseY); } @Override protected void actionPerformed(GuiButton button) throws IOException { if(button==this.boutonAccept) { //KingdomAgeMod.network.sendToServer(new RenameKingdomMessage(player.getEntityData().getInteger("id_kingdom"),this.editKingdomName.getText())); this.player.closeScreen(); //On ferme la fenêtre du GUI. } else if (button==this.boutonRefuse) { //KingdomAgeMod.network.sendToServer(new DeleteKingdomMessage(player.getEntityData().getInteger("id_kingdom"),x,y,z)); this.player.closeScreen(); } } @Override public boolean doesGuiPauseGame() { return false; } } I try to put NBTag to the player on server side, and get it on the client side, but it's not working. I have no idea how to do it, so a little help will be appreciate ^^ Also, sorry for my english, it's not my native language.
-
[Solved][1.8]Error when I send a chat message to all players
tancfire replied to tancfire's topic in Modder Support
Hi everyone ! I come back to send the solution: The KingdomAgeMod.class (the main class): @EventHandler public void preinit(FMLPreInitializationEvent event) { System.out.println("Pré-initialisation du mod Kingdom Age ..."); //A french message //Here, the code i added: network = NetworkRegistry.INSTANCE.newSimpleChannel("KingdomAgeChannel"); //We add a channel network.registerMessage(CreateKingdomMessage.Handler.class, CreateKingdomMessage.class, 0, Side.SERVER); //Here, we register the type of the message we send In my gui class: @Override protected void actionPerformed(GuiButton button) throws IOException { if(button==this.boutonValider) { KingdomAgeMod.network.sendToServer(new CreateKingdomMessage(this.editKingdomName.getText())); // We send the message to the server this.player.closeScreen(); //We close the GUI } } CreateKingdomMessage.class: public class CreateKingdomMessage implements IMessage{ private String text; public CreateKingdomMessage() { } public CreateKingdomMessage(String message) { this.text = message; } @Override public void fromBytes(ByteBuf buf) { text = ByteBufUtils.readUTF8String(buf); } @Override public void toBytes(ByteBuf buf) { ByteBufUtils.writeUTF8String(buf, text); } public static class Handler implements IMessageHandler<CreateKingdomMessage, IMessage> { @Override public IMessage onMessage(CreateKingdomMessage message, MessageContext ctx) { EntityPlayerMP player = ctx.getServerHandler().playerEntity; System.out.println(String.format("Le joueur %s a demandé la création du royaume %s", player.getName(), message.text)); MinecraftServer.getServer().getConfigurationManager().sendChatMsg(new ChatComponentText("The kingdom of "+message.text+" was created by "+player.getName()+".")); return null; } } } So, thanks to everyone who helped me ! ^^ I will advance my mod (with a friend), and i expect to reach the beta version before September ! I will probably create a new topic to show you this mod ^^. -
[Solved][1.8]Error when I send a chat message to all players
tancfire replied to tancfire's topic in Modder Support
Yes, it's what i understand, i just don't express it correctly ^^'. I will send the code here when i will solve this problem . -
[Solved][1.8]Error when I send a chat message to all players
tancfire replied to tancfire's topic in Modder Support
I don't really know what kind of packet use .... I suppose packet link to the chatMessage, because i wanted to send it to the server, and on the server, send it to all clients. And i will go to read some tutorials on packets, don't worry. I just wanted to know if a simple method/event will be used ..... Anyways, thanks you a lot . -
[Solved][1.8]Error when I send a chat message to all players
tancfire replied to tancfire's topic in Modder Support
Ok, thanks a lot, i will test it ! I have just a question: How can i catch the packet on server ? -
Hi everyone ! I have a big problem to send a chat message to all players connected on a server. The code works perfectly when i send a chat message to the current player, but not when i send it to all players. Here my code (in a GuiScreen subclass), to send it to all players: @Override protected void actionPerformed(GuiButton button) throws IOException { if(button==this.boutonValider) { MinecraftServer.getServer().getConfigurationManager().sendChatMsg(new ChatComponentText("The kingdom of "+editKingdomName.getText()+" was created.")); mc.thePlayer.closeScreen(); } } So, in SP mode, i have no problem, the chat message is displayed correctly. But, in multiplayer mode, when i'm connected with the first player: The message don't appear. When i'm connected with the second player: i'm kicked out of the server with this error: [11:24:14] [Netty Server IO #4/ERROR] [FML]: NetworkDispatcher exception java.io.IOException: An existing connection was forcibly closed by the remote host I try others methods, but i didn't succes to send this chat message to all players. I read some classes in the forge source, and i find the method i used, actually. ps: sorry for my english, i'm french .