(LootJS Wiki 已经非常详尽,本节仅做翻译 + 细微调整)
LootJS是一个KubeJS的附属mod,能够让你更加便捷地修改战利品表,掉落战利品时执行事件等
mod链接:Github Curseforge,许可:LGPL-3.0
由于战利品表是在服务端侧被处理的,所以显然你应该把它放到kubejs\server_scripts
文件夹下
你可以通过/reload
命令来重载LootJS的修改内容
推荐先阅读15章来了解物品的效果内容和实体,玩家修改内容
下面这张图展示了游戏掉落物品的过程
LootJS添加了一个KubeJS事件lootjs
来修改战利品表,也就是这样:
下面是一个基础的例子,使苦力怕有30%的概率掉落烈焰棒
每一个战利品表修改都应至少有一个战利品表事件
函数enableLogging()
会将修改过的战利品表打印到控制台便于排查问题
函数.disableLootModification(战利品表)
会锁定指定战利品表以防修改
LootJS提供了一些返回LootActionsBuilder
对象的函数,这使修改掉落条件和掉落物成为可能。
[1]以下是可用的战利品表类型(LootJS)的值
[2]:你可以使用形如@modid
来移除指定mod的全局战利品表修改,使用形如examplemod:example_loot_change
的战利品表ID来移除指定战利品表,此外,该函数仅对全局战利品表生效,不能阻止mod直接将其物品添加到战利品表中
战利品表事件用于修改战利品表的掉落物或为其添加不同效果。每一个战利品表修饰器都至少包含一个战利品表事件
thenAdd(物品) 可以向当前战利品表修饰器中添加物品
thenRemove(物品) 将移除战利品表在所有符合给定条件的物品
thenReplace(被替换物品, 替换物品) 将战利品表中符号条件的物品全部替换为给定物品
thenModify(物品, 回调) 对于当前随机池的所有符合条件的物品,一个回调将被调用。LootJS会把该物品传给回调来修改它并返回该物品。记住一定要有返回语句。
在这个例子中,下雨时实体的掉落物品数量将翻倍
thenExplode(范围, 是否损坏方块, 是否引火) 可以在掉落战利品时生成一个爆炸,而掉落物不会被炸毁。范围可以是任何数字而后两个参数(是否损坏方块, 是否引火)应为布尔值
thenLightningStrike(是否破坏方块) 可以在掉落战利品时生成一个闪电。同样,物品不会被破坏。
thenApply(回调) 可以在掉落战利品时进行回调,非常有意思的一个功能。
可用函数(推荐先阅读15章)见文末LootContextJS
除了战利品表事件,你还可以为战利品表掉落添加条件限制
值得注意的是,这些条件仅对新增的战利品修饰器生效
matchLoot(物品, 可选 是否全部比对) 可以在符合条件的物品掉落时执行修改。是否全部比对的默认值为false,当为true时,当前战利品池中所有的战利品必须符合条件才能执行修改
matchMainHand(IngredientJS 物品) 当玩家主手手持指定物品时才执行修改。
matchOffHand(IngredientJS 物品) 当玩家副手手持指定物品时才执行修改。
survivesExplosion() 可以防止修改的掉落物被爆炸破坏
**timeCheck(period, min, max)***和 timeCheck(min, max) 使修改内容在符合指定游戏刻条件下才能生效
*当前游戏时间除以period值所得的余数来与value匹配。(若period被设置为100,value被设置为1,则时间为1/101/201……时通过),min和max则为数值范围(开区间)
weatherCheck(值) 可以为战利品表添加天气条件。其中值的格式:
如果你只使用一个值,则另一个会被忽略
randomChance(浮点型 随机值) 可以概率执行掉落物品修改
randomChanceWithLooting(浮点型 概率, 整形 附魔等级) 可以根据抢夺等级概率调整掉落概率
randomChanceWithEnchantment(字符串 附魔ID, [概率]) 可以根据给定附魔的等级调整概率
biome(...字符串 群系ID) 当所有群系均符合时执行修改。你可以传入群系标签(形如#cold
)来限定群系必须为寒冷群系(见6 自定义世界生成)
anyBiome(...字符串 群系ID) 当任意群系符合时即执行修改。你可以传入群系标签(形如#cold
)来限定群系必须为寒冷群系
anyDimension(...字符串 维度ID) 当任意维度符合时即执行修改。
anyStructure([字符串 结构ID], 布尔值 是否精确匹配) 可以判断战利品掉落于指定结构中。当精确匹配的值为true时,玩家在结构的建筑内才生效;为false时则在结构范围内即可
lightLevel(min, max) 在给定光照强度范围内才执行修改(开区间)
killedByPlayer() 只有被玩家杀死时才执行修改
matchEntity(callback) 可以匹配触发战利品表的实体(如死亡的 / 打开箱子 / 破坏方块的),当条件符合时执行修改
matchDirectKiller(callback) 可以匹配直接击杀目标的实体(例如弓箭实体而不是发射的实体),当条件符合时执行修改
matchPlayer(callback) 可以匹配玩家,当条件符合时执行修改。当玩家杀死了另一个玩家时,将以击杀者作为匹配对象
matchDamageSource(callback) 可以匹配伤害类型,当条件符合时执行修改
distanceToKiller(IntervalJS 距离) 可以检测实体掉落与击杀者之间的距离
hasAnyStage(...字符串 Gamestage) 可以检测玩家是否具有指定Gamestage,当具有任意一个时执行修改
playerPredicate(callback),entityPredicate(callback),killerPredicate(callback),directKillerPredicate(callback) 可以自定义回调函数来匹配玩家,实体,击杀者,直接击杀者,当条件符合时执行修改。注意:该回调必须返回true或false
not(callback) 可以反转战利品表条件
or(callback) 可以同时添加多个条件,当一个条件为真时即通过
and(callback) 可以同时添加多个条件,当所有条件为真时即通过
IntervalJS可以用来表示两个数字之间的范围。注意:以下所有范围均为开区间
EntityPredicateBuilderJS 可以用条件限制实体以判断是否执行修改,以下返回值均为EntityPredicateBuilderJS
[1]:提供EntityPredicateBuilderJS
例子:
DamageSourcePredicateBuilderJS 用条件来限制伤害类型以判断是否执行修改
[2]:提供DamageSourcePredicateBuilderJS
[5]:见 本章 常用函数 部分
[6]:为null的例子:骷髅射杀苦力怕
[7]:如果不是则为0
[8]:例如
函数 | 功能 |
---|---|
格式 | 描述 | 返回值 |
---|---|---|
函数 | 描述 |
---|---|
函数 | 描述 |
---|---|
函数 | 描述 | 返回值 |
---|---|---|
addBlockLootModifier(命名空间)
为方块添加新的战利品表修饰器
addEntityLootModifier(命名空间)
为实体添加新的战利品表修饰器
addLootTableModifier(命名空间ID)
为给定战利品表添加新的修饰器
addLootTypeModifier(战利品表类型)
为给定战利品表类型[1]添加新的修饰器
getGlobalModifiers()
返回包含所有战利品表修饰器的列表
removeGlobalModifier(值)[2]
移除给定的战利品表修饰器
Interval.between(min, max)
返回最小最大值之间的范围 (min, max)
IntervalJS
Interval.min(min)
返回只限制了最小值的范围 (min,+∞)
IntervalJS
Interval.max(max)
返回只限制了最大值的范围 (-∞,max)
IntervalJS
函数
描述
返回值
matches(值)
检测值是否在范围内
布尔值
matchesSqr(值)
检测值是否在范围内
布尔值
anyType(...类型)
判断实体是否有给定标签(输入示例:#skeletons
)
isOnFire(布尔值 条件真假)
判断实体是否着火
isCrouching(布尔值 条件真假)
判断实体是否正在潜行
isSprinting(布尔值 条件真假)
判断实体是否正在疾跑
isSwimming(布尔值 条件真假)
判断实体是否正在游泳
isBaby(布尔值 条件真假)
判断实体是否为幼年状态
isInWater(布尔值 条件真假)
判断实体是否在水里
isMonster(布尔值 条件真假)
判断实体是否为敌对生物
isCreature(布尔值 条件真假)
判断实体是否为友好生物
isOnGround(布尔值 条件真假)
判断实体是否在地上
isUndeadMob(布尔值 条件真假)
判断实体是否为亡灵生物
isArthropodMob(布尔值 条件真假)
判断实体是否为节肢动物
isWaterMob(布尔值 条件真假)
判断实体是否为水生动物
isIllegarMob(布尔值 条件真假)
判断实体是否为掠夺生物
hasEffect(字符串 效果ID, 整形 等级) 和 hasEffect(字符串 效果ID)
判断实体是否具有给定效果
nbt(json)
判断实体是否具有指定nbt
matchMount(回调)
判断实体所骑乘的实体[1]
matchTargetedEntity(回调)
判断实体的目标实体[1]
matchSlot(整形 栏位编号, IngredientJS 物品)
判断实体给定物品栏栏位的物品
anyType(...类型)
判断伤害是否符合类型
isProjectile(布尔值 条件真假)
判断伤害是否为投掷物
isExplosion(布尔值 条件真假)
判断伤害是否为爆炸
doesBypassArmor(布尔值 条件真假)
判断伤害是否无视盔甲
doesBypassInvulnerability(布尔值 条件真假)
判断伤害是否无视隐身效果
doesBypassMagic(布尔值 条件真假)
判断伤害是否为饥饿引起
isFire(布尔值 条件真假)
判断伤害是否为火
isMagic(布尔值 条件真假)
判断伤害是否为饥饿
isLightning(布尔值 条件真假)
判断伤害是否为闪电
matchDirectEntity(回调)
判断直接造成伤害的实体
matchSourceEntity(回调)
判断造成伤害的实体源
getType()
返回战利品类型
LootTypes[5]
getPosition()
返回掉落位置
Vector3d
getEntity()
返回具有当前战利品表的实体(可能为null)
EntityJS
getKillerEntity()
返回杀死对象的实体(可能为null)
EntityJS
getPlayer()
返回杀死对象的玩家(可能为null[6])
PlayerJS
getDamageSource()
返回伤害类型(可能为null[6])
DamageSourceJS
getTool()
返回触发战利品表使用的工具(可能为null)
ItemStackJS
getDestroyedBlock()
返回被破坏的方块(可能为null)
BlockContainerJS
isExploded()
返回战利品表是否被爆炸触发
布尔值
getExplosionRadius()
返回触发的爆炸的半径[7]
整形
getLevel()
返回WorldJS
WorldJS
getServer()
返回ServerJS
ServerJS
getLuck()
返回玩家幸运值
整形
getLooting()
返回LootingModifier
整形
getRandom()
返回范围(?)
Random
addLoot(ItemStackJS 物品)
添加掉落物
void
removeLoot(IngredientJS 物品)
移除掉落物
void
findLoot(IngredientJS 物品)
返回掉落物列表
List
hasLoot(IngredientJS 物品)
返回是否掉落指定物品
布尔值
forEachLoot(Consumer action)
遍历每个物品并给予回调[8]
void