快进我的世界客户端(forge mod)
Fast forward minecraft client (forge mod)
我想创建一种方法(比如使用锻造 mod)来加速 minecraft 客户端(就像在整个游戏中一样)。游戏从白天到晚上需要 20 分钟,假设在 GUI 中有一个 "advance" 按钮(就锻造 mod 而言)。我正在尝试改变速度,例如,如果按下 "advance" 按钮,白天和黑夜之间只有 5 分钟,它会使播放器的速度加倍,这样一切看起来都在快进就像在 DVD 上一样。
我进行了研究,似乎唯一的方法就是 mod 玩游戏或使用插件或其他东西。
P.S。我是 运行 Minecraft Linux。
改变时间的速度和前进必须分开进行。
当日速度(节拍率)
一天的速度是根据ticks
的量来计算的,这是一个控制时间的大循环。 ticks
也控制着游戏中的一切。当 tick 数量增加或重置时,游戏的各个方面都会向前移动一点,包括生物、物体和玩家统计数据。根据 Minecraft Wiki,Minecraft 运行s 固定为 20 t/s(ticks per second),也就是 1 t/0.05 秒;游戏中的一天恰好持续 24000 个刻度,或实时 20 分钟。由于这个循环是直接编入 Minecraft 的代码中的,所以改变 tick rate 真的会搞砸游戏。如果您在计算机无法处理时将滴答率设置得太快,您将获得 classic [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 更改(一次) ,所以要小心加速游戏。
这样的东西会起作用(从 here 中检索和编辑):
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();
}
}
}
记得包括所有进口商品。如果您 运行 在 运行 之前或期间遇到任何错误,请发表评论。
注意: 这只会改变 client 端的 tick rate,所以它会在没有服务器的情况下引起问题正确的方法。
玩家移动
由于玩家的移动略微基于刻度,并且您已经更改了 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 class 和按钮之后,您所要做的就是在您的 GUI 中这样调用它 class
//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));
}
}
}
我想创建一种方法(比如使用锻造 mod)来加速 minecraft 客户端(就像在整个游戏中一样)。游戏从白天到晚上需要 20 分钟,假设在 GUI 中有一个 "advance" 按钮(就锻造 mod 而言)。我正在尝试改变速度,例如,如果按下 "advance" 按钮,白天和黑夜之间只有 5 分钟,它会使播放器的速度加倍,这样一切看起来都在快进就像在 DVD 上一样。
我进行了研究,似乎唯一的方法就是 mod 玩游戏或使用插件或其他东西。
P.S。我是 运行 Minecraft Linux。
改变时间的速度和前进必须分开进行。
当日速度(节拍率)
一天的速度是根据ticks
的量来计算的,这是一个控制时间的大循环。 ticks
也控制着游戏中的一切。当 tick 数量增加或重置时,游戏的各个方面都会向前移动一点,包括生物、物体和玩家统计数据。根据 Minecraft Wiki,Minecraft 运行s 固定为 20 t/s(ticks per second),也就是 1 t/0.05 秒;游戏中的一天恰好持续 24000 个刻度,或实时 20 分钟。由于这个循环是直接编入 Minecraft 的代码中的,所以改变 tick rate 真的会搞砸游戏。如果您在计算机无法处理时将滴答率设置得太快,您将获得 classic [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 更改(一次) ,所以要小心加速游戏。
这样的东西会起作用(从 here 中检索和编辑):
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();
}
}
}
记得包括所有进口商品。如果您 运行 在 运行 之前或期间遇到任何错误,请发表评论。 注意: 这只会改变 client 端的 tick rate,所以它会在没有服务器的情况下引起问题正确的方法。
玩家移动
由于玩家的移动略微基于刻度,并且您已经更改了 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 class 和按钮之后,您所要做的就是在您的 GUI 中这样调用它 class
//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));
}
}
}