战利品修饰器

战利品修饰器只是描述了如何修改战利品表。你写好一个修饰器,还需要注册它,确定它会影响那些战利品表后才会生效!如何注册见后面的章节!

ILootModifier(战利品修饰器)(crafttweaker.api.loot.modifiers.ILootModifier) 是一个函数式接口,他有两个参数:

  • loots as List<IItemStack> 已经由战利品表抽奖出的结果

  • currentContext as LootContext 战利品表抽奖的当前背景

这个函数需要返回一个 List<IItemStack> 来确定实际的战利品表抽奖结果。

你可以对这个 List 进行删改,然后依旧返回这个 List。亦或是返回一个新的 List 从而完全接管这个战利品表。

// 这个修饰符由于直接返回了 loot list,而并没有修改,所以实际上没啥用
(loots, currentContext) => loots

(loots, currentContext) => {
    // 给 loot list 添加了铁锭
    // 相当于给战利品表抽奖结果额外添加了一个铁锭
    loots.add(<item:minecraft:iron_ingot>);
    return loots;
}

// 直接忽略原来的战利品抽奖结果,使实际上的抽奖结果固定为一个铁锭
// 数组可以自动转型为 List,这是没有问题的
(loots, currentContext) => [<item:minecraft:iron_ingot>]

CommonLootModifiers

写 lambda 表达式可能有些麻烦,CrT 提供了 CommonLootModifiers 工具类来快速构建所需的战利品修饰器。

导入

使用前最好先导入它:

import crafttweaker.api.loot.modifiers.CommonLootModifiers;

可用条件

LootContext

LootContext 包含了当前战利品表的当前背景,他有这些 Getter。注意不是有些 Getter 返回的可能是 null。这也很好理解,对于方块掉落时的战利品抽奖,你不可能获取表示实体伤害类型的 DamageSource。

Name
Type
Description

blockState

当前破坏的方块状态

damageSource

造成当前实体死亡的伤害类型

directKillerEntity

杀死当前实体的直接实体,如果玩家用箭射死一个实体,这个 Getter 返回的是箭

explosionRadius

float

造成方块破坏或实体死亡的爆炸的半径

killerEntity

杀死这个实体的实体,注意会杀死实体的不只有玩家

lastDamagePlayer

最后一次对该实体造成伤害的玩家

lootTableId

当时的战利品表 ID

lootingModifier

int

当时的战利品表修饰符 ID

luck

float

玩家的幸运值

origin

Gets the origin, or location, of the loot roll, if present; null otherwise.

thisEntity

当前实体

tileEntity

当前破坏方块内部的 TileEntity

tool

破坏方块所用的工具

world

当前世界

random

进行战利品表抽奖用的随机数生成器

例子

最后更新于

这有帮助吗?