15.2 实体生成 & RayTraceResultJS & ItemStackJS及其他
本节内容:实体生成,RayTraceResultJS ,ItemStackJS,InventoryJS,PlayerStatsJS
一、实体生成
实体生成较为简单,你需要先新建一个实体,然后设置属性,再在合适的时间生成它即可
以下代码会在玩家在聊天栏发送内容时在玩家位置生成一个火球
onEvent("player.chat", event => {
let p = event.player;
// 新建实体
var entity = event.world.createEntity('minecraft:fireball');
// 设置实体NBT
entity.mergeFullNBT('{ExplosionPower:2}');
// 设置坐标
entity.setPosition(p.x, p.y, p.z);
// 生成实体,没有这一行实体是不会生成的
entity.spawn();
})
createEntity的返回值为EntityJS,所以绝大多数15.1中的东西都是可以应用于实体生成的,这里就不再赘述了。
二、RayTraceResultJS
RayTraceResultJS 会返回玩家所看的方向、方块、实体等内容。
属性 | 功能 | 返回值 |
---|---|---|
fromEntity | 返回"视线"的来源 | EntityJS |
type | 返回玩家看到的内容类型 | 字符串[1] |
distance | 返回目标距离玩家距离 | 浮点型 |
hitX | 返回"视线"目标的X坐标 | 浮点型 |
hitY | 返回"视线"目标的Y坐标 | 浮点型 |
hitZ | 返回"视线"目标的Z坐标 | 浮点型 |
block | 返回视线目标方块 | BlockContainerJS |
facing | 返回视线的方向 | Direction |
entity[2] | 返回视线目标实体 | EntityJS |
[1]:该值可以为"block"、"entity"和"miss"
[2]:因为KubeJS的特性,有关实体的内容仅在客户端侧可用且距离不得大于玩家的攻击距离。
值得注意的是,绝大多数的属性在玩家没有面向对象时均为null,也就是说在使用RayTraceResultJS时,必须先判断其值是否为null或者利用type来判断类型(否则你得到一堆报错)
以下例子为指南针添加了一个实用功能:返回其右键点击的方块id和属性并生成对应/setblock指令供玩家复制
onEvent('item.right_click', event => {
let player = event.player;
let target = player.rayTrace(1000);
if(target.type == "block" && player.mainHandItem.id == "minecraft:compass"){
let prop = target.block.properties.toString();
// 把信息告诉玩家
player.tell(`你刚才看的方块是:${target.block.id},距离当前位置${player.getDistance(target.hitX, target.hitY, target.hitZ).toFixed(1)}格,方块属性:${prop}`);
// 复制指令(TextJS)
player.tell(Text.of("[点此复制/setblock指令]").bold().click(`copy:/setblock ~ ~ ~ ${target.block}`));
// 为物品添加冷却
// player.addItemCooldown("minecraft:compass", 1000);
}
})
三、ItemStackJS
1、属性
属性 | 功能 | 返回值 |
---|---|---|
id | 返回该物品组的id | 字符串 |
tags | 返回该物品组的tags | Collection tags |
count | 设置/返回该物品组中物品数量 | int |
block | 返回当前物品是否为方块 | 布尔值 |
nbt | 返回当前物品组的nbt | CompoundTag |
nbtString | 返回字符串形式的nbt | 字符串 |
name | 返回当前物品组的名称 | Text |
enchantments | 返回当前物品组的附魔 | MapJS |
harvestSpeed | 返回当前物品组的破坏速度 | 浮点型 |
itemGroup | 返回当前物品组在创造物品栏的位置 | 字符串 |
vanillaPredicate | 获取当前物品谓词(?) | Predicate |
empty | 返回当前物品组是否为空 | 布尔值 |
2、函数
函数 | 功能 | 返回值 |
---|---|---|
hasTag(tag) | 判断物品是否有指定tag | 布尔值 |
withCount(整形 数量) | 返回一个指定数量的物品组 | ItemStackJS |
hasNBT() | 判断是否具有NBT | 布尔值 |
removeNBT() | 移除物品的NBT | void |
withNBT(CompoundTag nbt) | 返回具有指定NBT的物品组 | ItemStackJS |
withName(Text 名称) | 返回一个具有指定名称的物品组 | ItemStackJS |
strongEquals(any) | 将当前物品组与给定内容对比(同时比较数量等) | 布尔值 |
hasEnchantment(字符串 附魔ID, 整形 等级) | 判断当前物品组是否有给定的附魔 | 布尔值 |
enchant(字符串 附魔ID, 整形 等级) | 返回一个添加了指定附魔的物品组 | ItemStackJS |
enchant(MapJS 附魔内容) | 返回一个添加了指定附魔的物品组 | ItemStackJS |
ignoreNBT() | 返回忽略的NBT的原料(配方相关) | IngredientJS |
weakNBT() | 返回部分忽略的NBT的原料(配方相关) | IngredientJS |
areItemsEqual(ItemStackJS 对比对象) | 将当前物品组与给定物品组对比 | 布尔值 |
isNBTEqual(ItemStackJS 对比对象) | 将当前物品组与给定物品组的NBT对比 | 布尔值 |
getHarvestLevel(ToolType 工具类型, nullable PlayerJS 玩家, nullable BlockContainerJS 方块) | 返回其挖掘等级 | 整形 |
getHarvestSpeed(nullable BlockContainerJS 方块) | 返回其挖掘速度 | 浮点型 |
四、InventoryJS
你可以使用InventoryJS来快捷地操作玩家物品栏
函数 | 功能 | 返回值 |
---|---|---|
get(int 格子编号) | 返回指定格子的物品 | ItemStackJS |
set(int 格子编号,ItemStackJS 物品) | 设置指定格子的物品 | void |
clear() | 清空玩家背包 | void |
clear(ItemStackJS 物品) | 清空玩家背包中指定物品 | void |
find() | 返回玩家背包中有物品的格子编号[3] | 整形 |
find(ItemStackJS 物品) | 返回玩家背包中有指定物品的格子编号[3] | 整形 |
count() | 返回物品背包中物品总数[4] | 整形 |
count(ItemStackJS 物品) | 返回玩家背包中指定物品数[4] | 整形 |
[3] 当无该物品时会返回 -1,有则为最小编号
[4] 当无物品时会返回 0
下图是玩家物品栏格子编号(图源:Minecraft Wiki)
五、PlayerStatsJS
PlayerStatsJS 允许你操作玩家的统计信息中的数据
函数 | 功能 | 返回值 |
---|---|---|
get(命名空间) | 返回玩家指定项的统计信息 | 整形 |
set(命名空间, 整形 值) | 设置玩家指定项的统计信息 | void |
add(命名空间, 整形 值) | 为玩家指定项的统计信息添加值 | void |
getBlocksMined(命名空间) | 返回玩家破坏指定方块的统计信息的值 | 整形 |
getItemsCrafted(命名空间) | 返回玩家合成指定物品的统计信息的值 | 整形 |
getItemsUsed(命名空间) | 返回玩家使用指定物品的统计信息的值 | 整形 |
getItemsBroken(命名空间) | 返回玩家用坏指定物品的统计信息的值 | 整形 |
getItemsPickedUp(命名空间) | 返回玩家捡起指定物品的统计信息的值 | 整形 |
getItemsDropped(命名空间) | 返回玩家丢弃指定物品的统计信息的值 | 整形 |
getKilled(命名空间) | 返回玩家杀死指定生物的统计信息的值 | 整形 |
getKilledBy(命名空间) | 返回玩家被指定生物杀死的统计信息的值 | 整形 |