快进的Minecraft客户端(伪造mod)

时间:2016-02-19 15:05:12

标签: java minecraft minecraft-forge

我想创建一种方法(比如使用forge mod)来加速我的Minecraft客户端(就像在整个游戏中一样)。从白天到晚上,游戏需要20分钟才能完成,并且可以说这是一个"提前" GUI中的按钮(就伪造模式而言)。我试图改变速度,以便如果"提前"按下按钮,例如,白天和黑夜之间只有5分钟,它使播放器的速度加倍,因此所有内容看起来像是在DVD上快速转发。

我已经做过研究,似乎做这样的事情的唯一方法是通过修改游戏或使用插件或其他东西。

P.S。我在Linux上运行Minecraft。

1 个答案:

答案 0 :(得分:3)

改变时间和前进的速度必须单独完成。

一天的速度(蜱虫率)

一天的速度取决于ticks的数量,这是一个控制时间的大循环。 ticks也可以控制游戏中的所有内容。当蜱的数量增加或重置时,游戏的各个方面向前移动一点点,包括怪物,物体和玩家统计数据。根据{{​​3}},Minecraft以固定的20 t / s(每秒刻度)运行,这也意味着1 t / 0.05秒;游戏中的一天持续24000个刻度,或实时20分钟。由于此循环直接编程为Minecraft的代码,因此更改滴答率可能会使游戏陷入困境。如果您的计算机无法处理滴答速度太快,您将获得经典[Server thread/WARN]: Can't keep up! Did the system time change, or is the server overloaded? Running Xms behind, skipping Y tick(s)然后可能崩溃,因为系统时间实际上是DID更改(一次),所以要小心加快游戏的速度。

这样的东西可行(从Minecraft Wiki中检索和编辑):

public class ChangeTickRate implements IFMLLoadingPlugin, IFMLCallHook {
    // Stored client-side tickrate (default at 20TPS)
    private Field clientTimer = null;
    @SideOnly(Side.CLIENT)
    public static void updateClientTickrate(float tickrate) {
        Minecraft mc = Minecraft.getMinecraft();
        if(mc == null) return; // Oops! Try again!
        try {
            if(clientTimer == null) {
                for(Field f : mc.getClass().getDeclaredFields()) {
                    if(f.getType() == Timer.class) {
                        clientTimer = f;
                        clientTimer.setAccessible(true);
                        break;
                    }
                }
            }
            clientTimer.set(mc, new Timer(tickrate));
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}

请记住包含所有导入。如果您在运行之前或运行时遇到任何错误,请注释。 注意: 这只会更改客户端端口的滴答率,因此如果没有正确的方法,它会导致服务器出现问题。

玩家移动

由于玩家的移动稍微基于蜱,并且你已经改变了TPS,所以最好只给他们一个无限的快速药水:

int PotionAmp = 1; //base amplifier of the effect
while(FastForwardEnabled){
    player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 0, 1));  
}

这会隐藏气泡效果并使用标准效果级别或放大器。如果你想要更多地控制玩家的速度,那么试试这样的东西(可能是一个覆盖):

//play around with this number
private static final float FFSpeed = 0.2f
@Override //probably
public boolean onTickInGame(float f, Minecraft minecraft){
    minecraft.thePlayer.speedOnGround=0.02f;
    return true; //tell it that this is handled
}

结论

现在,在您创建了自己的GUI类和按钮之后,您所要做的就是在GUI类中调用它

//see https://bedrockminer.jimdo.com/modding-tutorials/advanced-modding/gui-screen/ for some reference
private static boolean FastForwardEnabled = false;
protected void actionPerformed(GuiButton button) throws IOException {
    if (button == AdvanceButton) { //Example GUI Button used as an enable/disable
        FastForwardEnabled = !FastForwardEnabled;
        while (FastForwardEnabled){
            //Example value used; increases game speed 2x
            ChangeTickRate.updateClientTickrate(40);
            player.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 0, 1));
        }
    }
}