Minecraft Fabric mixins 不能在专用服务器上工作但可以在其他地方工作

问题描述

我一直在开发一种允许指南针跟踪玩家的 Fabric mod,这样我就可以在进行 minecraft Manhunt 的同时,将其自定义为我想用它做的任何事情。为此,我使用 Mixin 更改 PlayerEntity 类中的一些方法(以便您右键单击的玩家成为 speedrunner)、minecraftServer 类(以便玩家的最后一个可以跟踪每个维度中的已知位置)、CompassItem class(因此您可以在右键单击它时跟踪 speedrunner)等等。在 LAN 世界中测试 mod 时,mixin 工作得很好。但是,一旦构建它并将其放在我拥有的专用服务器上,mixin 就根本不起作用。我可以说 mod 已被识别和初始化,因为我在控制台中打印的初始化语句中有一个 print 语句,但 mixin 无法正常工作。这是 modid.mixins.json 代码

{
  "required": true,"minVersion": "0.8","package": "net.cubex.manhunt.mixin","compatibilityLevel": "JAVA_8","mixins": [
    "CompassMixin","PlayerMixin","DimensionTypeMixin","minecraftServerMixin","PlayerManagerMixin"
  ],"client": [
  ],"injectors": {
    "defaultRequire": 1
  }
}

这里是 PlayerEntity mixin(忽略我的一些低效,我正在研究它们):

@Mixin(PlayerEntity.class)
public abstract class PlayerMixin {
    
    @Accessor("gameProfile")
    public abstract GameProfile getGameProfile();
    
    public ActionResult interact(PlayerEntity player,Hand hand) {
        
        System.out.println("test1");
        
        if(player.getEntityWorld().isClient()) return ActionResult.FAIL;
        
        if(Main.trackedplayer != "0") return ActionResult.FAIL;
        
        Main.trackedplayer = getGameProfile().getName();
        Main.currentServer = player.getServer();
        
        player.getEntityWorld().playSound(null,player.getBlockPos(),SoundEvents.ITEM_LODESTONE_COMPASS_LOCK,SoundCategory.PLAYERS,1,1);
        
        for(ServerPlayerEntity p : player.getServer().getPlayerManager().getPlayerList()) {
            
            if(p.getName().asstring() != Main.trackedplayer) p.sendSystemMessage(Texts.toText(new Message() {
                
                @Override
                public String getString() {
                    
                    return "The compass is ready to track " + Main.trackedplayer + ". Right click the compass to start tracking.";
                }
            }),UUID.randomUUID());
            else p.sendSystemMessage(Texts.toText(new Message() {
                
                @Override
                public String getString() {
                    
                    return "The compass is ready to track you.";
                }
            }),UUID.randomUUID());
            
            ItemStack s = new ItemStack(Items.COMPASS);
            s.addEnchantment(Enchantments.VANISHING_CURSE,1);
            s.getTag().put("LodestonePos",NbtHelper.fromBlockPos(player.getEntityWorld().getPlayerByUuid(getGameProfile().getId()).getBlockPos()));
            s.getTag().putBoolean("LodestoneTracked",false);
            
            int dimensionId = 0;
            if(player.getEntityWorld().getPlayerByUuid(getGameProfile().getId()).getEntityWorld().getDimension() == DimensionTypeMixin.Nether()) dimensionId = -1;
            else if(player.getEntityWorld().getPlayerByUuid(getGameProfile().getId()).getEntityWorld().getDimension() == DimensionTypeMixin.End()) dimensionId = 1;
            
            s.getTag().putInt("LodestoneDimension",dimensionId);
            if(p.getName().asstring() != Main.trackedplayer) p.inventory.insertStack(s);
        }
        
        return ActionResult.PASS;
    }
}

如果你看,你可以在方法的开头看到一个打印语句,这样我就可以知道该方法是否正在执行。在 LAN 世界中,右键单击玩家会调用方法,在控制台中打印语句“test1”,并设置指南针。但是,在专用服务器上,控制台中没有显示打印语句,也没有设置罗盘。我使用的其他 mixin 都没有。

我做错了吗?如果是这样,我应该如何修复它?谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...