本篇教程由作者设定未经允许禁止转载。

分享两个简单却实用的事件小技巧。

广告:此教程的替代/补充:EnchantatoPotatweaker

禁用附魔

此禁用方法将重心放在“使用”而非“获得”上,如果你打定主意就是想让某个附魔无法在附魔台中附出来,那么此方法并不适合你。

此方法的弊端也显而易见(玩家:我辛辛苦苦附出来的魔就这么寄了???),各位酌情使用。

如果某个附魔会导致游戏崩溃而且其对应模组没有可以关闭它的配置文件,那么此方法会非常适合。

思路:监听 LivingUpdate 事件(PlayerTick 事件也行,诸位随意),如果玩家的武器/盔甲上有你想禁用的附魔,就替换成移除了此附魔的武器/盔甲。

例子

下面举例禁用了武器的锋利附魔。

import crafttweaker.api.event.living.MCLivingUpdateEvent;
import crafttweaker.api.events.CTEventManager;
import crafttweaker.api.util.MCHand;

CTEventManager.register<MCLivingUpdateEvent>((event) => {//“监听 LivingUpdate 事件”
   var entity = event.entityLiving;
   var world = entity.world;
   if (world.remote || entity.type != <entitytype:minecraft:player>) return;//“玩家”
   var mainhandItem = entity.getHeldItemMainhand().asIItemStack();
   var offhandItem = entity.getHeldItemOffhand().asIItemStack();
   if (mainhandItem.getEnchantmentLevel(<enchantment:minecraft:sharpness>) > 0) {
   //“如果玩家的武器/盔甲上有你想禁用的附魔”
      entity.setHeldItem(MCHand.MAIN_HAND, mainhandItem.removeEnchantment(<enchantment:minecraft:sharpness>));
      //“就替换成移除了此附魔的武器/盔甲”
   }
   if (offhandItem.getEnchantmentLevel(<enchantment:minecraft:sharpness>) > 0) {//副手同理
      entity.setHeldItem(MCHand.OFF_HAND, offhandItem.removeEnchantment(<enchantment:minecraft:sharpness>));
   }
});

衍生:统一附魔

你可以用这种方法统一功能相同的附魔,如 Fish's Undead RisingCyclic 和 Random Enchants 中的生命汲取、生命窃取和吸血。

思路是先全部移除,再一次统一。(模组 config 们总是会自带禁用附魔的 true/false 的吧?就可以少写一点)(比如说 cyclic 的吸血就能关,当然下面并没有关)

脚本

import crafttweaker.api.event.living.MCLivingUpdateEvent;
import crafttweaker.api.events.CTEventManager;
import crafttweaker.api.util.MCHand;
 
CTEventManager.register<MCLivingUpdateEvent>((event) => {
    var entity = event.entityLiving;
    var world = entity.world;
    if (world.remote || entity.type != <entitytype:minecraft:player>) return;
    var mainhandItem = entity.getHeldItemMainhand().asIItemStack();//这里写主手,副手同理,main改成off就行。
   
    var reMainhandLevel = mainhandItem.getEnchantmentLevel(<enchantment:randomenchants:true_lifesteal>);
    var fishMainhandLevel = mainhandItem.getEnchantmentLevel(<enchantment:mod_lavacow:lifesteal>);
    var cyclicMainhandLevel = mainhandItem.getEnchantmentLevel(<enchantment:cyclic:life_leech>);
    if (reMainhandLevel > 0 || fishMainhandLevel > 0 || cyclicMainhandLevel > 0) {
    //因为百科代码块的滑条不够长,就分成仨来写了
    var remover1 = mainhandItem.removeEnchantment(<enchantment:randomenchants:true_lifesteal>);
    var remover2 = remover1.removeEnchantment(<enchantment:mod_lavacow:lifesteal>);
    var remover3 = remover2.removeEnchantment(<enchantment:cyclic:life_leech>);//到此,“全部移除”
    var item = remover3.withEnchantment(<enchantment:cyclic:life_leech>, 1);//“一次统一”
    //附魔等级各位可以自己整点活,这儿就用 1 了。
    entity.setHeldItem(MCHand.MAIN_HAND, item);
   }
});

降低某生物的全局生成率

你是否觉得有些生物即使你在它的 config 里把生成权重降到最低依然生成的很多?(比如 Piggy BankWeeping Angels

那么这个思路就会帮到你。

思路:生成率生成率,不就是个概率嘛,那我们也弄个概率来对之进行调整。监听 EntityJoinWorld 事件,取 0 到 100 之间的随机数,如果这个数比你设定的值(这个值=100 - 你要降低的生物生成率 * 100)要大,或者这个数比你设定的值(这个值= 你要降低的生物生成率 * 100)要小,就取消事件,不让实体加入世界。

例子

下面举例将哭泣天使的全局生物生成率给降低了 80%。

顺便再补一句废话,这种生成率降低方式对刷怪笼也同样生效。

import crafttweaker.api.event.entity.MCEntityJoinWorldEvent;
import crafttweaker.api.events.CTEventManager;

CTEventManager.register<MCEntityJoinWorldEvent>((event) => {//“监听 EntityJoinWorld 事件”
    var entity = event.entity;
    var world = entity.world;
    if (world.remote) return;
    if (entity.removeTag("crt.spawned")) {
        entity.addTag("crt.spawned");
        return;
    }
    entity.addTag("crt.spawned");
    //上面这对tag的操作意义在于:让下面的代码只执行一次。
    //否则,每次你进入你的存档,所有的实体都会被认为是再次加入了世界,再进行下面复杂的操作的话,就会对性能造成非常大的影响。
    //甚至导致存档卡死。
    //entity.removeTag返回的是布尔值,而此方法同时会在if里执行,所以需要再addTag一次。
    //非常好 tag 黑科技,爱来自CrT
    //还有个相关PR可以给诸位看看:https://github.com/CraftTweaker/CraftTweaker/pull/1618
    if (
        entity.type == <entitytype:weeping_angels:weeping_angel> && 
        world.random.nextInt(0, 100) > 20
    ) {//“取 0 到 100 之间的随机数,如果这个数比你设定的值(这个值=100 - 你要降低的生物生成率 * 100)要大”
        event.cancel();//“就取消事件,不让实体加入世界”
    }
});