问题描述
我一直在开发一种允许指南针跟踪玩家的 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 (将#修改为@)