Posted November 16, 20168 yr I have a problem when using /getplayerpos command in the server, it can't get all players name and make game crash. package stevekung.mods.indicatorutils.command; import java.util.List; import javax.annotation.Nullable; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.command.WrongUsageException; import net.minecraft.server.MinecraftServer; import net.minecraft.util.math.BlockPos; import stevekung.mods.indicatorutils.IndicatorUtils; import stevekung.mods.indicatorutils.PlayerPositionHandler; public class CommandGetPlayerPosition extends CommandBase { @Override public int getRequiredPermissionLevel() { return 0; } @Override public String getCommandUsage(ICommandSender sender) { return "/" + this.getCommandName(); } @Override public String getCommandName() { return "getplayerpos"; } @Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { if (args.length < 1) { throw new WrongUsageException("commands.getplayerpos.fail", new Object[] { this.getCommandUsage(sender) }); } else { IndicatorUtils.NETWORK.sendToServer(new PlayerPositionHandler(args[0])); } } @Override public List<String> getTabCompletionOptions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos pos) { return CommandBase.getListOfStringsMatchingLastWord(args, server.getAllUsernames()); } @Override public boolean isUsernameIndex(String[] args, int index) { return index == 0; } }
November 16, 20168 yr Always post the crash report and/or FML log (logs/fml-client-latest.log or logs/fml-server-latest.log) when asking for help with a crash. It's not safe to use MinecraftServer in a client command, all interaction between the client and server must be handled through packets. Forge's documentation explains sides here and networking here. Why is this even a client command? If you need data from the server and your mod is on the server, use a server command. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
November 16, 20168 yr Author My mod is in client side only. Because I only use in the realm server. Crash report ---- Minecraft Crash Report ---- // Uh... Did I do that? Time: 16/11/2559, 14:40 น. Description: Updating screen events java.lang.NullPointerException: Updating screen events at stevekung.mods.indicatorutils.command.CommandGetPlayerPosition.getTabCompletionOptions(CommandGetPlayerPosition.java:58) at net.minecraft.command.CommandHandler.getTabCompletionOptions(CommandHandler.java:195) at stevekung.mods.indicatorutils.utils.ClientCommandHandlerIU.autoComplete(ClientCommandHandlerIU.java:101) at net.minecraft.util.TabCompleter.requestCompletions(TabCompleter.java:70) at net.minecraft.util.TabCompleter.complete(TabCompleter.java:52) at net.minecraft.client.gui.GuiChat$ChatTabCompleter.complete(GuiChat.java:279) at net.minecraft.client.gui.GuiChat.keyTyped(GuiChat.java:89) at net.minecraft.client.gui.GuiScreen.handleKeyboardInput(GuiScreen.java:645) at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:593) at net.minecraft.client.Minecraft.runTick(Minecraft.java:1797) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1118) at net.minecraft.client.Minecraft.run(Minecraft.java:406) at net.minecraft.client.main.Main.main(Main.java:118) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) at GradleStart.main(GradleStart.java:26) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Thread: Client thread Stacktrace: at stevekung.mods.indicatorutils.command.CommandGetPlayerPosition.getTabCompletionOptions(CommandGetPlayerPosition.java:58) at net.minecraft.command.CommandHandler.getTabCompletionOptions(CommandHandler.java:195) at stevekung.mods.indicatorutils.utils.ClientCommandHandlerIU.autoComplete(ClientCommandHandlerIU.java:101) at net.minecraft.util.TabCompleter.requestCompletions(TabCompleter.java:70) at net.minecraft.util.TabCompleter.complete(TabCompleter.java:52) at net.minecraft.client.gui.GuiChat$ChatTabCompleter.complete(GuiChat.java:279) at net.minecraft.client.gui.GuiChat.keyTyped(GuiChat.java:89) at net.minecraft.client.gui.GuiScreen.handleKeyboardInput(GuiScreen.java:645) at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:593) -- Affected screen -- Details: Screen name: net.minecraft.client.gui.GuiChat -- Affected level -- Details: Level name: MpServer All players: 2 total; [EntityPlayerSP['Player904'/142324, l='MpServer', x=509.56, y=4.00, z=-1076.48], EntityOtherPlayerMP['Player383'/173, l='MpServer', x=516.40, y=4.00, z=-1080.89]] Chunk stats: MultiplayerChunkCache: 289, 289 Level seed: 0 Level generator: ID 01 - flat, ver 0. Features enabled: false Level generator options: Level spawn location: World: (521,4,-1067), Chunk: (at 9,0,5 in 32,-67; contains blocks 512,0,-1072 to 527,255,-1057), Region: (1,-3; contains chunks 32,-96 to 63,-65, blocks 512,0,-1536 to 1023,255,-1025) Level time: 33949 game time, 33949 day time Level dimension: 0 Level storage version: 0x00000 - Unknown? Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false) Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: false Forced entities: 50 total; [EntityPlayerSP['Player904'/142324, l='MpServer', x=509.56, y=4.00, z=-1076.48], EntitySlime['Slime'/144647, l='MpServer', x=430.38, y=4.00, z=-1151.43], EntitySlime['Slime'/173066, l='MpServer', x=476.46, y=4.92, z=-1128.36], EntityPig['Pig'/24, l='MpServer', x=438.24, y=4.00, z=-1085.67], EntityPig['Pig'/26, l='MpServer', x=437.78, y=4.00, z=-1096.43], EntityPig['Pig'/27, l='MpServer', x=438.08, y=4.00, z=-1084.70], EntitySheep['Sheep'/28, l='MpServer', x=441.78, y=4.00, z=-1080.60], EntityCow['Cow'/29, l='MpServer', x=459.61, y=4.00, z=-1097.50], EntityChicken['Chicken'/30, l='MpServer', x=462.16, y=4.00, z=-1077.77], EntitySheep['Sheep'/31, l='MpServer', x=457.74, y=4.00, z=-1003.82], EntityHorse['Horse'/34, l='MpServer', x=467.16, y=4.00, z=-1089.90], EntitySlime['Slime'/46243, l='MpServer', x=437.92, y=4.12, z=-1141.22], EntitySheep['Sheep'/35, l='MpServer', x=477.29, y=4.00, z=-1077.64], EntityChicken['Chicken'/36, l='MpServer', x=466.15, y=4.00, z=-1079.63], EntityItem['item.item.egg'/37, l='MpServer', x=466.24, y=4.00, z=-1079.62], EntityChicken['Chicken'/38, l='MpServer', x=465.37, y=4.00, z=-1026.11], EntitySlime['Slime'/71462, l='MpServer', x=449.81, y=4.75, z=-1059.12], EntityItem['item.item.egg'/39, l='MpServer', x=465.86, y=4.00, z=-1026.24], EntityChicken['Chicken'/40, l='MpServer', x=472.56, y=4.00, z=-1016.77], EntityItem['item.item.egg'/41, l='MpServer', x=473.06, y=4.00, z=-1016.19], EntitySlime['Slime'/39850, l='MpServer', x=466.46, y=4.17, z=-1120.37], EntityChicken['Chicken'/42, l='MpServer', x=466.80, y=4.00, z=-1006.87], EntityOtherPlayerMP['Player383'/173, l='MpServer', x=516.40, y=4.00, z=-1080.89], EntitySheep['Sheep'/48, l='MpServer', x=487.60, y=4.00, z=-1106.87], EntitySlime['Slime'/151986, l='MpServer', x=523.29, y=4.00, z=-1126.96], EntitySheep['Sheep'/51, l='MpServer', x=496.76, y=4.00, z=-1114.16], EntityCow['Cow'/55, l='MpServer', x=514.43, y=4.00, z=-1131.99], EntitySlime['Slime'/41787, l='MpServer', x=458.82, y=4.80, z=-1135.11], EntitySlime['Slime'/187454, l='MpServer', x=445.50, y=4.00, z=-1052.50], EntitySlime['Slime'/155200, l='MpServer', x=530.52, y=4.00, z=-1128.51], EntityChicken['Chicken'/67, l='MpServer', x=538.22, y=4.00, z=-1139.16], EntityItem['item.item.egg'/68, l='MpServer', x=538.79, y=4.00, z=-1138.96], EntitySlime['Slime'/166086, l='MpServer', x=475.02, y=5.08, z=-1130.33], EntityChicken['Chicken'/69, l='MpServer', x=536.98, y=4.00, z=-1127.98], EntityChicken['Chicken'/70, l='MpServer', x=533.10, y=4.00, z=-1130.03], EntitySlime['Slime'/73030, l='MpServer', x=454.39, y=4.00, z=-1064.97], EntityItem['item.item.egg'/71, l='MpServer', x=533.17, y=4.00, z=-1129.13], EntitySlime['Slime'/166088, l='MpServer', x=477.16, y=4.92, z=-1126.54], EntityChicken['Chicken'/75, l='MpServer', x=558.44, y=4.00, z=-1149.80], EntityCow['Cow'/76, l='MpServer', x=554.75, y=4.00, z=-1153.19], EntityItem['item.item.egg'/182878, l='MpServer', x=537.14, y=4.00, z=-1127.82], EntitySheep['Sheep'/95, l='MpServer', x=575.18, y=4.00, z=-1116.32], EntitySheep['Sheep'/96, l='MpServer', x=568.42, y=4.00, z=-1111.04], EntityChicken['Chicken'/97, l='MpServer', x=563.32, y=4.00, z=-1101.48], EntityChicken['Chicken'/98, l='MpServer', x=571.44, y=4.00, z=-1095.80], EntityItem['item.item.egg'/99, l='MpServer', x=571.77, y=4.00, z=-1095.30], EntityItem['item.item.egg'/100, l='MpServer', x=562.60, y=4.00, z=-1102.18], EntitySlime['Slime'/84968, l='MpServer', x=440.41, y=4.42, z=-1048.33], EntitySlime['Slime'/14316, l='MpServer', x=540.91, y=4.00, z=-1130.91], EntitySlime['Slime'/24047, l='MpServer', x=435.86, y=4.42, z=-1041.54]] Retry entities: 0 total; [] Server brand: fml,forge Server type: Non-integrated multiplayer server Stacktrace: at net.minecraft.client.multiplayer.WorldClient.addWorldInfoToCrashReport(WorldClient.java:451) at net.minecraft.client.Minecraft.addGraphicsAndWorldToCrashReport(Minecraft.java:2779) at net.minecraft.client.Minecraft.run(Minecraft.java:427) at net.minecraft.client.main.Main.main(Main.java:118) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) at GradleStart.main(GradleStart.java:26) -- System Details -- Details: Minecraft Version: 1.10.2 Operating System: Windows 7 (amd64) version 6.1 Java Version: 1.8.0_102, Oracle Corporation Java VM Version: Java HotSpot 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 780960168 bytes (744 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0 FML: MCP 9.32 Powered by Forge 12.18.2.2118 4 mods loaded, 4 mods active States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored UCHIJA mcp{9.19} [Minecraft Coder Pack] (minecraft.jar) UCHIJA FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.10.2-12.18.2.2118.jar) UCHIJA Forge{12.18.2.2118} [Minecraft Forge] (forgeSrc-1.10.2-12.18.2.2118.jar) UCHIJA indicatorutils{2.0.0} [indicator Utils] (bin) Loaded coremods (and transformers): GL info: ' Vendor: 'Intel' Version: '4.3.0 - Build 10.18.14.4432' Renderer: 'Intel® HD Graphics 4600' Launched Version: 1.10.2 LWJGL: 2.9.4 OpenGL: Intel® HD Graphics 4600 GL version 4.3.0 - Build 10.18.14.4432, Intel GL Caps: Using GL 1.3 multitexturing. Using GL 1.3 texture combiners. Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported. Shaders are available because OpenGL 2.1 is supported. VBOs are available because OpenGL 1.5 is supported. Using VBOs: Yes Is Modded: Definitely; Client brand changed to 'fml,forge' Type: Client (map_client.txt) Resource Packs: Current Language: English (US) Profiler Position: N/A (disabled) CPU: 4x Intel® Core i5-4570 CPU @ 3.20GHz What should I do? Write the packet and send it to the server?
November 16, 20168 yr you are using minecraft server on a client side and wondering what did go wrong and i think commands needs to be registered on both sides and cant be client only
November 16, 20168 yr My mod is in client side only. Because I only use in the realm server. What does the PlayerPositionHandler packet do if your mod isn't on the server? java.lang.NullPointerException: Updating screen events at stevekung.mods.indicatorutils.command.CommandGetPlayerPosition.getTabCompletionOptions(CommandGetPlayerPosition.java:58) at net.minecraft.command.CommandHandler.getTabCompletionOptions(CommandHandler.java:195) at stevekung.mods.indicatorutils.utils.ClientCommandHandlerIU.autoComplete(ClientCommandHandlerIU.java:101) at net.minecraft.util.TabCompleter.requestCompletions(TabCompleter.java:70) at net.minecraft.util.TabCompleter.complete(TabCompleter.java:52) You can't use MinecraftServer in a client command. The MinecraftServer argument of ICommand#getTabCompletionOptions will be null for client commands if there's no integrated server running. What should I do? Write the packet and send it to the server? If your mod isn't on the server, you can't create your own packets; you can only send vanilla ones. On the client, you can use NetHandlerPlayClient#getPlayerInfoMap to get a list of players currently on the server. Use Minecraft#getConnection to get the NetHandlerPlayClient instance, but make sure it's not null before you try to use it. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
November 17, 20168 yr Author Thank you! It work perfectly on the server. By the way I looking at GuiPlayerTabOverlay#renderPlayerlist how getPlayerInfoMap works. @Override public List<String> getTabCompletionOptions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos pos) { NetHandlerPlayClient connection = Minecraft.getMinecraft().thePlayer.connection; List<NetworkPlayerInfo> playerInfo = new ArrayList(connection.getPlayerInfoMap()); List<String> playerList = Lists.<String>newArrayList(); for (int i = 0; i < playerInfo.size(); ++i) { if (i < playerInfo.size()) { playerList.add(playerInfo.get(i).getGameProfile().getName()); } } return CommandBase.getListOfStringsMatchingLastWord(args, playerList); } And PlayerPositionHandler only work on LAN world. I'm not sure why. package stevekung.mods.indicatorutils; import io.netty.buffer.ByteBuf; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.WorldServer; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import stevekung.mods.indicatorutils.command.CommandGetPlayerPosition; import stevekung.mods.indicatorutils.utils.JsonMessageUtils; public class PlayerPositionHandler implements IMessage { private String playerName; public PlayerPositionHandler() {} public PlayerPositionHandler(String playerName) { this.playerName = playerName; } @Override public void fromBytes(ByteBuf buf) { this.playerName = ByteBufUtils.readUTF8String(buf); } @Override public void toBytes(ByteBuf buf) { ByteBufUtils.writeUTF8String(buf, this.playerName); } private static EntityPlayerMP getPlayerByUsername(NetHandlerPlayServer server, String playerName) { for (WorldServer worldServer : FMLCommonHandler.instance().getMinecraftServerInstance().worldServers) { for (EntityPlayer player : worldServer.playerEntities) { if (server.playerEntity.getName().equalsIgnoreCase(playerName)) { return server.playerEntity; } } } return null; } public static class PositionMessageHandler implements IMessageHandler<PlayerPositionHandler, IMessage> { @Override public IMessage onMessage(PlayerPositionHandler message, MessageContext ctx) { EntityPlayerMP playerMP = PlayerPositionHandler.getPlayerByUsername(ctx.getServerHandler(), message.playerName); if (playerMP != null) { BlockPos pos = playerMP.getPosition(); CommandGetPlayerPosition.setMessage(new TextComponentTranslation("commands.getplayerpos.success", new Object[] { playerMP.getName(), pos.getX(), pos.getY(), pos.getZ(), playerMP.worldObj.provider.getDimensionType().getName() })); } else { CommandGetPlayerPosition.setMessage(JsonMessageUtils.json("\"text\":\"" + I18n.format("commands.getplayerpos.playernull", message.playerName) + "\",\"color\":\"red\"")); } return null; } } }
November 17, 20168 yr And PlayerPositionHandler only work on LAN world. I'm not sure why. package stevekung.mods.indicatorutils; import io.netty.buffer.ByteBuf; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.WorldServer; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; import stevekung.mods.indicatorutils.command.CommandGetPlayerPosition; import stevekung.mods.indicatorutils.utils.JsonMessageUtils; public class PlayerPositionHandler implements IMessage { private String playerName; public PlayerPositionHandler() {} public PlayerPositionHandler(String playerName) { this.playerName = playerName; } @Override public void fromBytes(ByteBuf buf) { this.playerName = ByteBufUtils.readUTF8String(buf); } @Override public void toBytes(ByteBuf buf) { ByteBufUtils.writeUTF8String(buf, this.playerName); } private static EntityPlayerMP getPlayerByUsername(NetHandlerPlayServer server, String playerName) { for (WorldServer worldServer : FMLCommonHandler.instance().getMinecraftServerInstance().worldServers) { for (EntityPlayer player : worldServer.playerEntities) { if (server.playerEntity.getName().equalsIgnoreCase(playerName)) { return server.playerEntity; } } } return null; } public static class PositionMessageHandler implements IMessageHandler<PlayerPositionHandler, IMessage> { @Override public IMessage onMessage(PlayerPositionHandler message, MessageContext ctx) { EntityPlayerMP playerMP = PlayerPositionHandler.getPlayerByUsername(ctx.getServerHandler(), message.playerName); if (playerMP != null) { BlockPos pos = playerMP.getPosition(); CommandGetPlayerPosition.setMessage(new TextComponentTranslation("commands.getplayerpos.success", new Object[] { playerMP.getName(), pos.getX(), pos.getY(), pos.getZ(), playerMP.worldObj.provider.getDimensionType().getName() })); } else { CommandGetPlayerPosition.setMessage(JsonMessageUtils.json("\"text\":\"" + I18n.format("commands.getplayerpos.playernull", message.playerName) + "\",\"color\":\"red\"")); } return null; } } } Like I said, you can't use your own packets if your mod isn't on the server. When you use the integrated server (for single player/LAN), the server has the same mods as the host client (because it's being run by the host client). When you use the dedicated server, the server has its own set of mods (or none at all). PositionMessageHandler is reaching across logical sides by setting a field in CommandGetPlayerPosition (a class only used by the client) from the server; this is incorrect and will break in a multiplayer session (even if it's LAN). It's also doing this from the server's network thread instead of the server's main thread, which will cause even more problems. Your IMessageHandler must schedule a task to run on the main thread before it can safely interact with normal Minecraft classes, Forge's documentation explains this here. You're also using the client-only I18n class from a server-side IMessageHandler , which would crash the dedicated server. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
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.