交互限制

基本信息

属性 值
涉及事件 PlayerEvent.BreakSpeed、EnderTeleportEvent、PlayerInteractEvent
事件优先级 三者均为 EventPriority.LOWEST
聊天提示键 oiltweak.chat.tooDense.use(全身浸没)、oiltweak.chat.tooDense.use.half(半身)
语言文件 assets/oiltweak/lang/en_US.lang + de_DE.lang(各 2 条提示)

挖掘速度减至三分之一

@SubscribeEvent(priority = EventPriority.LOWEST)
public void onBreakSpeed(PlayerEvent.BreakSpeed e) {
    EntityPlayer player = e.entityPlayer;
    if (getInOil(player).halfOfFull()) {
        e.newSpeed = e.originalSpeed <= e.newSpeed ? e.originalSpeed / 3f : e.newSpeed / 3f;
    }
}

取 originalSpeed 与 newSpeed 中较小的那个再除以 3—— 这样无论其他 mod 把挖掘速度提高还是降低, 本 mod 都取较小值再打折,不会因"提高速度"而反被放大。

游泳中的玩家因此挖掘速度降到约 1/3。

末影传送被取消

EntityLivingBase player = e.entityLiving;
if (!(player instanceof EntityPlayer && ((EntityPlayer) player).capabilities.isCreativeMode)
    && getInOil(player).halfOfFull()) {
    e.setCanceled(true);
    e.setResult(Event.Result.DENY);
}

创造模式豁免(用 !(A && B) 写法,即"不是玩家 或 不是创造"都取消)。 同时调用 setCanceled(true) 与 setResult(DENY),双重保险。

注意此方法不判物品——无条件禁止在油中末影传送,连末影珍珠也一并禁止 (与右键的物品黑名单机制无关)。

右键物品被阻止:两条独立规则

if (e.action == PlayerInteractEvent.Action.LEFT_CLICK_BLOCK || !config.isOilDense()) return;
EntityPlayer player = e.entityPlayer;
if (!player.capabilities.isCreativeMode && player.getCurrentEquippedItem() != null) {
    InOil inOil = getInOil(player);
    if (inOil.halfOfFull() && ((inOil == InOil.FULL && !(item.getItem() instanceof ItemBlock))
        || OilTweakAPI.INSTANCE.getItemBlacklistRegistry().isBlacklisted(player, item))) {
        player.addChatComponentMessage(new ChatComponentTranslation(
            inOil == InOil.FULL ? "oiltweak.chat.tooDense.use" : "oiltweak.chat.tooDense.use.half"));
        e.setCanceled(true);
    }
}

前置守卫:左键方块不拦截(LEFT_CLICK_BLOCK 直接返回), 只拦右键与左键空气/实体。创造模式豁免。手持 null 不拦。

内层是 || 连接的两条规则:

规则 条件 效果
A 浸没等级为 FULL 且 手持物不是 ItemBlock 禁止右键
B 手持物命中黑名单 禁止右键

两者的浸没要求都是外层的 inOil.halfOfFull(),即 HALF 与 FULL 都生效。 区别在于:

  • 规则 A 只在 FULL 生效 → 所以半身浸没时仍可用方块类物品(放置方块、开门等);
  • 规则 B 与浸没等级无关,黑名单物品在 HALF 也会被拦——这正是 changelog.md 1.0.2 描述的"部分浸没只会拦少数物品"。

提示文本按浸没等级二选一

inOil == InOil.FULL ? "oiltweak.chat.tooDense.use" : "oiltweak.chat.tooDense.use.half"。

键 en_US de_DE
oiltweak.chat.tooDense.use The oil is so dense you can barely move your arm. You cannot right click any item! Das Öl ist so dicht, dass you kaum einen Arm bewegen kannst. Du kannst so kein Item verwenden!
oiltweak.chat.tooDense.use.half You’re too distracted by your feet being stuck to use this item. Du bist zu sehr von deinen in Öl steckenden Beinen abgelenkt, um dieses Item zu benutzen.

⚠️ 走 FULL 分支时提示说的是"任何物品都不能右键", 但方块类物品其实仍然可以——提示文本与规则 A 的实际范围有出入。

⚠️ 德语两条提示的开头都是英语单词(“Das Öl…” 里的 you、 “Du bist…” 里的 you're)——原文如此,未修正。

所有效果的共同前置

onBreakSpeed / onTeleportAttempt / onRightClick 三个方法开头都有 if (!BuildCraftOilTweak.config.isOilDense()) return;, 即 BuildCraft Energy 不存在或其 isOilDense 为假时,本条目全部功能关闭。 详见 油液检测。

相关条目