You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

KubeJS中PlayerChatDecorateEventJS向容器插入ItemStack遇阻求助

问题分析与解决

报错原因

你遇到的Target position ... is not a container错误,核心是**player.runCommand()的执行上下文和手动执行命令存在差异**:

  • 手动执行命令时,你处于容器所在区块已加载、维度匹配的状态,命令能直接定位到目标容器;
  • 但通过代码调用player.runCommand()时,大概率是这两个问题导致报错:
    1. 区块未加载PlayerChatDecorateEventJS触发时,目标容器所在区块可能未被服务器激活加载(比如玩家离目标位置过远),服务器无法识别该位置的容器;
    2. 维度上下文冲突:虽然命令里写了execute in minecraft:overworld,但player.runCommand()默认以玩家当前所在维度为执行基础,可能导致坐标被错误解析到玩家所在维度,而非目标主世界。

替代方案:直接操作BlockEntity库存

放弃命令调用,直接通过KubeJS API获取容器的BlockEntity来操作库存,这是更可靠的方式:

// 基于你已有的变量:book(ItemStack), copyx/copyy/copyz(整数), player(Player)
// 1. 获取目标维度的世界实例(这里是主世界,可按需调整)
const targetWorld = Level.get('minecraft:overworld');
// 2. 创建目标位置的BlockPos对象
const targetPos = new BlockPos(copyx, copyy, copyz);
// 3. 获取对应位置的BlockEntity
const blockEntity = targetWorld.getBlockEntity(targetPos);

// 4. 判断是否为容器类型并操作库存
if (blockEntity && blockEntity instanceof ContainerBlockEntity) {
    const inventory = blockEntity.getInventory();
    // 方式1:自动找空位添加物品(推荐,不会覆盖已有物品)
    inventory.addItem(book);
    // 方式2:指定槽位设置物品(比如槽位0,会覆盖原有物品)
    // inventory.setItem(0, book);
} else {
    console.log("目标位置不是容器或BlockEntity不存在");
}

额外优化

如果需要确保目标区块已加载,可以在获取BlockEntity前添加加载逻辑:

targetWorld.getChunkAt(targetPos).load();

这种方式直接通过服务器层面操作容器,不依赖玩家权限或命令执行上下文,完全规避了命令调用的各种上下文问题。

内容的提问来源于stack exchange,提问作者FabianButHere

火山引擎 最新活动