本帖最后由 的风格好 于 2019-6-23 17:40 编辑
如题,有一个仅在服务端安装的mod,需要为EntityPlayerMP 调用 sendMessage,发送信息。如何获取EntityPlayerMP的语言环境,在服务器本地化信息?
项目中写过这样一段代码,在idea Debug模式runServer情况下,能正常工作,但在相同版本的forge服务器下,会出现“java.lang.NoSuchFieldException: language”
Forge 版本 :forge-1.12.2-14.23.5.2768
复制代码
部分EntityPlayerMP的代码
复制代码
如题,有一个仅在服务端安装的mod,需要为EntityPlayerMP 调用 sendMessage,发送信息。如何获取EntityPlayerMP的语言环境,在服务器本地化信息?
项目中写过这样一段代码,在idea Debug模式runServer情况下,能正常工作,但在相同版本的forge服务器下,会出现“java.lang.NoSuchFieldException: language”
Forge 版本 :forge-1.12.2-14.23.5.2768
- private static String getLangType(EntityPlayerMP player) {
- String langType;
- try
- {
- Field playerLangField = player.getClass().getDeclaredField("language");
- playerLangField.setAccessible(true);
- langType = (String)playerLangField.get(player);
- }
- catch(Exception e)
- {
- langType = "en_us";
- e.printStackTrace();
- }
- return langType;
- }
部分EntityPlayerMP的代码
- package net.minecraft.entity.player;
- public class EntityPlayerMP extends EntityPlayer implements IContainerListener
- {
- private static final Logger LOGGER = LogManager.getLogger();
- private String language = "en_US";
- /** The NetServerHandler assigned to this player by the ServerConfigurationManager. */
- public NetHandlerPlayServer connection;
- /** Reference to the MinecraftServer object. */
- ........
- }
找到原因了,因为minecraft代码被混淆,所以"language"实际对应的字段名为“field_71148_cg”。
复制代码
- private static String getLangType(EntityPlayerMP player) {
- String langType;
- try
- {
- Field playerLangField = EntityPlayerMP.class.getDeclaredField("field_71148_cg");
- playerLangField.setAccessible(true);
- langType = (String)playerLangField.get(player);
- }
- catch(Exception e)
- {
- langType="en_us";
- e.printStackTrace();
- }
- return langType;
- }
的风格好 发表于 2019-6-23 17:35
找到原因了,因为minecraft代码被混淆,所以"language"实际对应的字段名为“field_71148_cg”。
...
请教一下 楼主 在服务端是如何进行获取相应语言的本地化文本的