在编程的世界里,我深深爱着 kubejs
。
它就像是一个神奇的魔法工具,为我的游戏模组创作带来了无尽的可能。
每次使用 kubejs 编写代码时,我都感觉像是在开启一场奇妙的冒险。
简洁而强大的语法,让我能够轻松地实现各种创意。
不用再为复杂的底层细节烦恼,只需专注于打造独一无二的游戏体验。kubejs 的社区也超级温暖,大家互相交流、分享经验,就像一个快乐的大家庭。
遇到问题时,总能迅速得到热心的帮助,这种感觉简直太棒了!
我爱 kubejs 的每一处设计,爱它带来的无限乐趣。
无论是自定义物品、添加新方块,还是编写复杂的机制,它都能出色地完成任务。
每一个功能都如同璀璨的星星,点亮了我创作的道路。
kubejs,你是我心中永远的宝藏,我会一直喜欢你,用你创造出更多精彩的模组,让游戏的世界更加丰富多彩
!
忆然
-
我永远喜欢kubejs! -
[模组推荐]在进入游戏的时候从网上获取信息展示本文使用:CC-BY-NC-SA 4.0协议
使用的mod为[YiRanVersionCheck]
实际上就是在推荐我自己的mod
这个mod会在进入游戏的时候访问指定的链接并在聊天栏提示你其中的文本使用实例:

如何使用?
首先你需要开通一个gitee仓库
github也行,但不一定好访问
在里面创建一个纯文本文件建议使用log后缀本文使用的例子为
https://gitee.com/bakayiran/mmrryyhh/blob/master/test.txt本整合包免费发布,私自贩卖不得好死 目前最新版本:§61.0.0-hotfix 当前版本:§6${version} 链接:[[§b§n获取最新信息§r]](https://gitee.com/bakayiran/mmrryyhh/edit/master/test.txt) 若在游玩整合包遇到问题请先在[§b§n百科](https://www.mcmod.cn/)寻求答案 可以灌注下[§b§n作者(B站)](https://www.bilibili.com/)吗OVO文本中的${version}会被替换成config里面的版本
string则会解析为一个可点击,点击打开指定的链接
一行目前只能存在一个可点击文本配置文件:
#在这里填入URL checkUrl = "https://gitee.com/bakayiran/mmrryyhh/blob/master/test.txt" #在这里填入次要URL secondaryCheckUrl = "null" #当前版本 version = "0.1.0"本mod会先尝试从主要链接获取文本,失败则会尝试次要链接
你也可以使用kjs修改配置文件//在Startup,当然你也可以放client ClientEvents.init(event => { let $Config = Java.loadClass("com.yiran.versioncheck.Config") $Config.VERSION.set("0.1.0") $Config.CHECK_URL.set("https://gitee.com/bakayiran/mmrryyhh/blob/master/test.txt") //$Config.CHECK_URL2.set("null") })为什么使用这个mod?
用于告诉整合包玩家目前的整合包版本和现在版本
提供bug反馈链接
用作进入世界的消息提醒
声明整合包免费(倒勾不得好死) -
[原创][KubeJS 6][BrokenClassFilter]关于反射的应用场景与使用实例的论述前言
ClassFilter是kjs的一个保护机制,笔者在这里不建议进行对ClassFilter动手脚
此篇仅以替换kjs的ClassFilter为例子讲解部分java的反射机制在kjs的使用
本文使用:CC-BY-NC-SA 4.0协议
话不多说,先上成品
这是在kjs里面使用反射爆破kjs的classfilter的实例let $ClassFilter = Java.loadClass("dev.latvian.mods.kubejs.util.ClassFilter") let $ServerScriptManager = Java.loadClass("dev.latvian.mods.kubejs.server.ServerScriptManager") let $KubeJS = Java.loadClass("dev.latvian.mods.kubejs.KubeJS") let ScriptManagers = { CLIENT: $KubeJS.getClientScriptManager(), SERVER: $ServerScriptManager.instance, STARTUP: $KubeJS.getStartupScriptManager(), } /**@type {Internal.Class<$JavaWrapper_>} */ let clazz = Java.class /**@type {Internal.Class<$ScriptManager_>} */ let $ScriptManager = clazz.getClassLoader().loadClass("dev.latvian.mods.kubejs.script.ScriptManager") let classFilterField = $ScriptManager.getDeclaredField('classFilter') classFilterField.setAccessible(true) classFilterField.set(ScriptManagers.SERVER, new $ClassFilter())下面进行解析
let $ClassFilter = Java.loadClass("dev.latvian.mods.kubejs.util.ClassFilter")
这一步是为获取新的ClassFilter以获取实例以替换已经完成的构建的ClassFilterlet $ServerScriptManager = Java.loadClass("dev.latvian.mods.kubejs.server.ServerScriptManager")
let $KubeJS = Java.loadClass("dev.latvian.mods.kubejs.KubeJS")
let ScriptManagers = {
CLIENT: $KubeJS.getClientScriptManager(),
SERVER: $ServerScriptManager.instance,
STARTUP: $KubeJS.getStartupScriptManager(),
}
在这步获取了全部的ScriptManagerlet clazz = Java.class
这一步获取了Class<JavaWrapper>实例,在后面用于获取类加载器去加载我们需要的类let $ScriptManager = clazz.getClassLoader().loadClass("dev.latvian.mods.kubejs.script.ScriptManager")
获取Class<ScriptManager>let classFilterField = $ScriptManager.getDeclaredField('classFilter')
获取Class<ScriptManager>的classFilter字段(这是我们需要修改的地方)classFilterField.setAccessible(true)
因为classFilter字段是私有的,我们需要开放他的权限classFilterField.set(ScriptManagers.SERVER, new $ClassFilter())
将set方法的第一个参数的classFilter字符替换为我们的新ClassFilter
(此处仅替换了server的,有其他的需要替换就修改第一个参数)至此,kjs的classfilter就被我们优雅(雾)的处理掉了
-
[1.20.1]强制加载并渲染特定区块前排瞻仰伟大的真冬女神,真是太有用了(爱你)
-
我永远喜欢kubejs!@半梦 喵呜!(逃)
-
[原创?][KJS6][EE.JS]较为方便地为矿物提供注册与通用配方修改的轮子你的mod加载器和版本的tag呢(
-
[原创][KubeJS][持续更新?]在kjs中使用createCustom进行注册物品本文使用:CC-BY-NC-SA 4.0协议
kjs本身提供的物品注册比较有限,在注册某些kjs未提供的item的时候我们就需要用到createCustom
如果有需要的item注册可以在本文下方留言,会考虑更新
createCustom注册model是没有的,也就是你还得去写一份model.json(这部分可以参考原版wiki)
下面是使用createCustom去注册一个弓的例子let $BowItem = Java.loadClass("net.minecraft.world.item.BowItem") let $Item$Properties = Java.loadClass("net.minecraft.world.item.Item$Properties") StartupEvents.registry("item", event => { event.createCustom("modid:item_name", () => { let properties = new $Item$Properties() //修改耐久 为0则无耐久属性 properties.durability(0) //修改最大堆叠数量 properties.stacksTo(1) //修改稀有度 properties.rarity("epic") //创建新的bowitem let item = new $BowItem(properties) //返回新的bowitem进行注册 return item }) }) -
[原创][KubeJS]kubejs获取玩家所处坐标的结构本文使用:CC-BY-NC-SA 4.0协议
直接上代码
在此推荐下来自ZZZank的ProbeJS Legacy
(已经支持1.20.1了(喜))/** * 获取实体坐标的所有结构 * @param {Internal.Entity} entity * @returns {$StructureStart_[]} */ function getAllStructuresAt(entity) { let structureList = [] /**@type {$ServerLevel_} */ let serverLevel = entity.level let entityPos = entity.block.pos /** @type {Internal.Structure[]} */ let structureArray = serverLevel.structureManager().getAllStructuresAt(entityPos).keySet().toArray() for (let structure of structureArray) { let structureStart = serverLevel.structureManager().getStructureAt(entityPos, structure) if (structureStart.isValid()) { structureList.push(structureStart) } } return structureList }