📄
XPlus KubeJS Tutorial v1 (zh_cn)
  • 前言
    • 本文更新日志
  • 一、一切的开始
    • 1.1 常用指令
    • 1.2 文件结构
    • 1.3 脚本基础
    • 1.4 事件列表
  • 二、配方
    • 2.1 新建配方及物品表示
    • 2.2 配方的修改和删除
    • 2.3 非标准配方修改
  • 三、自定义修改初步
    • 3 标签
    • 4 自定义Loot Table
    • 5 自定义流体
    • 6 自定义世界生成
    • 7 添加方块
    • 10:自定义窗口标题和logo
  • 四、事件初步
    • 8 聊天事件
    • 9 计划重启
  • 五、针对其他模组的修改
    • 11.1 JEI信息修改
    • 11.2 REI信息修改
    • 11.3 FTB Quest相关修改
    • 11.4 KubeJs内置游戏阶段 (类似于GameStage)
  • 六、拓展模组简介
    • 12.1 KubeJS Create
    • 12.2 KubeJS Blood Magic
    • 12.3 KubeJS Mekanism
    • 12.4 KubeJS UI
    • 12.5 KubeJS Termal
    • 12.7 便捷战利品表修改(LootJS Forge)
    • 12.8 LootJS战利品表修改实例
  • 七、游戏内容修改进阶
    • 13 自定义物品和物品ToolTip
    • 14 方块和物品属性修改
  • 八、事件进阶
    • 15.0 事件列表
    • 15.1 玩家&实体事件,信息获取及操作
    • 15.2 实体生成 & RayTraceResultJS & ItemStackJS及其他
    • 15.3 方块信息获取及操作
    • 15.4 WorldJS 和 ServerJS
    • 15.5 本章例子
    • 15.6 测试用例
  • 九、杂项
    • 16 网络包和Painter API
    • 17 本地化相关
    • 18.1 熔炼之镐
    • 18.2 罐头示例(包含物品注册, 配方添加, 玩家交互和persistentData的使用)
    • 19 Forge事件监听
  • 十、1.18.2的变化和介绍
    • 20 1.18.2中的变化和功能
    • 20.1 ProbeJS
    • 20.2 组件(Component)的使用
    • 20.3 格式变化
      • 20.3.1 世界生成
      • 20.3.2 方块 / 物品注册
      • 20.3.3 事件
      • 20.3.4 global[] 的使用
    • 20.4 命令注册
    • 20.5 反射与Java access
由 GitBook 提供支持
在本页
  • 一、Forge事件
  • 二、内容注册中的部分事件
  • 三、存储数据

这有帮助吗?

在GitHub上编辑
  1. 十、1.18.2的变化和介绍
  2. 20.3 格式变化

20.3.4 global[] 的使用


global[] 可以允许你在不重启游戏的情况下重新加载部分Startup阶段的脚本,或用于储存信息等。

一、Forge事件

以1.16.5中的Forge事件为例,其可改写为

// 使用global改写前
onForgeEvent("net.minecraftforge.event.entity.player.PlayerEvent$PlayerChangedDimensionEvent", event=>{
    event.player.sendStatusMessage("你来到了" + event.getTo().getLocation(), false)
})


// 使用global改写后
onForgeEvent('net.minecraftforge.event.entity.player.PlayerEvent$PlayerChangedDimensionEvent', event => {
    global['test_id'](event);
});

global['test_id'] = (event) => {
    event.player.sendStatusMessage("你来到了" + event.getTo().getLocation(), false)
}

改写后,你可以修改 global['test_id']的内容来在不重启游戏的情况下重新加载Forge事件内容,你可以使用 /kubejs reload startup_scripts 来重载该函数。

二、内容注册中的部分事件

类似地,部分内容注册中的事件也可以使用global改写(例如第七章 自定义方块中使用到的RandomTickEvent ):

// 使用global改写前
onEvent('block.registry', event => {
  event.create('test_block_randomTickEvent').displayName('Test Block randomTickEvent').randomTick(randomTickEvent => {
        randomTickEvent.block.set('minecraft:dirt');
      })
  })
})

// 使用global改写后
onEvent('block.registry', event => {
  event.create('test_block_randomTickEvent').displayName('Test Block randomTickEvent').randomTick(randomTickEvent => {
        global['test_id'](event);
      })
  })
})

global['test_id'] = (event) => {
    randomTickEvent.block.set('minecraft:dirt');
}

与之类似的还有食用食物的ItemFoodEatenEvent等,在此就不再赘述了。

三、存储数据

以下以存储玩家登入信息为例:

global['login_info'] = {}

// 获取格式化时间
var getFormattedTime = function(date){
    let currYear = date.getFullYear();
    let currMonth = date.getMonth() + 1;
    let currDay = date.getDate();
    let currHour = date.getHours();
    let currMinutes = date.getMinutes();
    let currSeconds = date.getSeconds();
    
    currMonth = (currMonth > 9) ? currMonth:"0" + currMonth;
    currDay = (currDay > 9) ? currDay:"0" + currDay;
    currHour = (currHour > 9) ? currHour:"0" + currHour;
    currMinutes = (currMinutes > 9) ? currMinutes:"0" + currMinutes;
    currSeconds = (currSeconds > 9) ? currSeconds:"0" + currSeconds;

    return `${currYear}-${currMonth}-${currDay} ${currHour}:${currMinutes}:${currSeconds}`;
}

// 玩家登入时记录信息
onEvent('player.logged_in',event => {
    let date = getFormattedTime(new Date());
    let p = event.player;
    global['login_info'][event.player.profile.name] = {time : date, pos: {x : p.x, y : p.y, z : p.z, dim : p.level.dimension}};
})

// 玩家退出时记录信息
onEvent('player.logged_out',event => {
    global['login_info'][event.player.profile.name] = null;
})

// 聊天信息获取
onEvent('player.chat',event => {
    let input = event.message.trim();
    if(input.substring(0,8) == "gameinfo"){
        // 传入登入信息对象
        event.server.scheduleInTicks(1, global['login_info'], function (callback) {
            let playerID = input.substring(9,);
            if(callback.data[playerID] == undefined){
                event.player.tell(Component.gold('====查询结果===='))
                event.player.tell(Component.red("未查询到该玩家在线信息!"));
                return;
            }
            let info = callback.data[playerID];
            let playerTime = info.time;
            let pos = info.pos;
            event.player.tell(Component.gold('====查询结果===='));
            event.player.tell(`玩家id:${playerID}\n登入时间:${playerTime}\n登入坐标:x = ${pos.x}, y = ${pos.y}, z = ${pos.z}\n登入维度:${pos.dim}`);
        })
        
    }
})

效果:

上一页20.3.3 事件下一页20.4 命令注册

这有帮助吗?