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

忆然
-
我永远喜欢kubejs! -
[1.20.1]强制加载并渲染特定区块前排瞻仰伟大的真冬女神,真是太有用了(爱你)
-
[原创][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就被我们优雅(雾)的处理掉了
-
我永远喜欢kubejs!@半梦 喵呜!(逃)
-
[原创?][KJS6][EE.JS]较为方便地为矿物提供注册与通用配方修改的轮子你的mod加载器和版本的tag呢(