交互限制
基本信息
| 属性 | 值 |
|---|---|
| 涉及事件 | 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.md1.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 为假时,本条目全部功能关闭。
详见 油液检测。