消耗品优化器

消耗品优化器

在客户端处理进食,确保服务器不会拖慢进食过程。

装备

消耗品优化器!

本模组在处理消耗品(任何食物物品)时,强制执行更多客户端侧的处理。


信息

默认情况下,Minecraft要求用户在消耗物品前等待服务器的响应。虽然这种延迟在低延迟(ping)下几乎察觉不到,但在高延迟下会变得非常明显,并导致玩家卡在食用动画中,直到服务器最终响应。 此优化器确保所有处理均在客户端侧而非服务器侧完成,使物品能够无延迟地消耗,并在应完成的准确游戏刻(tick)内完成。服务器仍然应用物品的效果(例如金苹果提供的吸收或再生效果),而客户端则处理实际的食用过程。

高延迟有时也会在消耗物品时导致同步丢失(desync),迫使服务器为玩家重新开始食用过程。这会进一步拖慢整体消耗物品的流程,并使其感觉不一致。此优化器通过在不需要时取消来自服务器的这些召回(recall),修复了此问题。

演示视频


服务器选择退出

在使用流行反作弊系统(如Grim或Vulkan)的服务器上,消耗品优化器不太可能触发误报。但是,如果你的服务器有关于消耗品优化器导致误报的报告,或者你不希望玩家群体使用此模组,你可以通过一个非常简单的插件选择退出。以下可以找到一些示例代码:

public class ConsumableOptimizerDisable extends JavaPlugin implements PluginMessageListener {

    private static final String S2C_CHANNEL = "consumable_optimizer:disable_payload";
    private static final String C2S_CHANNEL = "consumable_optimizer:handshake_payload";

    @Override
    public void onEnable() {
        this.getServer().getMessenger().registerOutgoingPluginChannel(this, S2C_CHANNEL);
        this.getServer().getMessenger().registerIncomingPluginChannel(this, C2S_CHANNEL, this);
    }

    @Override
    public void onPluginMessageReceived(String channel, Player player, byte[] message) {
        if (channel.equals(C2S_CHANNEL)) {
            Bukkit.getScheduler().runTaskLater(this, () -> {
                if (player.isOnline()) {
                    player.sendPluginMessage(this, S2C_CHANNEL, new byte[0]);
                    getLogger().info("Disabled consumable optimizer for " + player.getName());
                }
            }, 20L);
        }
    }
}

鸣谢