@LirxOwO 虾头栗子,看我keybindjs仓库去

忆然
-
[原创][KubeJS][Mod]如何在1.21.1NeoForge编写一个KubeJS的附属Mod -
[原创][KubeJS][Mod]如何在1.21.1NeoForge编写一个KubeJS的附属Mod呜呜,我当时写keybindjs找extra怎么写找了半天
苦呀西 -
[原创][KubeJS][Mod]如何在1.21.1NeoForge编写一个KubeJS的附属Mod怎么没介绍event的extra怎么写
-
[原创][Mod]基于opengl取色的hsv色盘屏幕俺寻思能行.jpg
-
养老向的物品抽奖机:虚空草莓呜,硬编码名称
-
[原创][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 7][BrokenClassFilter]关于Nashorn在kjs中的应用前言
ClassFilter是kjs的一个保护机制,笔者在这里不建议进行对ClassFilter动手脚
此篇仅以替换kjs的ClassFilter为例子展示Nashorn在kjs的使用
本文使用:CC-BY-NC-SA 4.0协议
因为1.21.1的kubejs ban了反射,因此只能在nashorn里面进行操作
Nashorn比较复杂,这次就仅展示成品let $KubeJS = Java.loadClass("dev.latvian.mods.kubejs.KubeJS") let $ServerLifecycleHooks = Java.loadClass("net.neoforged.neoforge.server.ServerLifecycleHooks") /**@type {$MinecraftServer_} */ let Server = $ServerLifecycleHooks.getCurrentServer() //所有的scriptmanager获取 let ServerScriptMagager = Server.getServerResources().managers().kjs$getServerScriptManager() let ClientScriptMagager = $KubeJS.getClientScriptManager() let StartupScriptMagager = $KubeJS.getStartupScriptManager() let $ScriptEngineManager = Java.loadClass("javax.script.ScriptEngineManager") let Nashorn = new $ScriptEngineManager().getEngineFactories()[0].getScriptEngine() Nashorn.eval(` var Clazz = Java.type("java.lang.Class") var ClassFilter = Java.type("dev.latvian.mods.kubejs.plugin.ClassFilter") var HashSet = Java.type("java.util.HashSet") var ArrayList = Java.type("java.util.ArrayList") var ScriptManager$Clazz = Clazz.forName("dev.latvian.mods.kubejs.script.ScriptManager") var ScriptManager$classFilter$Field = ScriptManager$Clazz.getDeclaredField("classFilter") var ClassFilter$Clazz = Clazz.forName("dev.latvian.mods.kubejs.plugin.ClassFilter") var ClassFilter$denyStrong$Field = ClassFilter$Clazz.getDeclaredField("denyStrong") var ClassFilter$denyWeak$Field = ClassFilter$Clazz.getDeclaredField("denyWeak") ScriptManager$classFilter$Field.setAccessible(true) ClassFilter$denyStrong$Field.setAccessible(true) ClassFilter$denyWeak$Field.setAccessible(true) var unlock=function(ScriptMagager){ var ClassFilter = ScriptManager$classFilter$Field.get(ScriptMagager) ClassFilter$denyStrong$Field.set(ClassFilter,new HashSet()) ClassFilter$denyWeak$Field.set(ClassFilter,new ArrayList()) } `) //参数传入scriptmanager即可爆破classfilter Nashorn.invokeFunction("unlock",ServerScriptMagager) let $File = Java.loadClass("java.io.File")
-
[原创]使用kjs进行文件的删除本文使用:CC-BY-NC-SA 4.0协议
因为kjs的JsonIO并未限制文件名称的后缀
因此这个操作并不安全kubejs的jsonio可以将第二个参数填入空字符串来删除文件
JsonIO.write('kubejs/assets/test.nbt', "")
如此便删除了.minecraft/kubejs/assets
里面的test.nbt
文件 -
[原创?][KJS6][EE.JS]较为方便地为矿物提供注册与通用配方修改的轮子你的mod加载器和版本的tag呢(
-
[原创][KubeJS 6][BrokenClassFilter]关于反射的应用场景与使用实例的论述@不是椰浆 彳亍,我去塞一个
-
强制加载并渲染特定区块@Mafuyu 区块强制加载有用(点头
-
强制加载并渲染特定区块前排瞻仰伟大的真冬女神,真是太有用了(爱你)
-
【典型案例】崩溃求解答@半梦 你紫菜吧
-
在这测试一下各种功能我测!
-
已经,没有modding的理由了不modding,那就铜丝你
-
使用数据包修改模组插入的野生作物、植被或生物生成抢沙发
️,再摸摸半梦
-
[原创][KubeJS 6][BrokenClassFilter]关于反射的应用场景与使用实例的论述@mihono 这部分也是在最顶上拆出来的,应该,不用吧
-
[原创][KubeJS 6][BrokenClassFilter]关于反射的应用场景与使用实例的论述@mihono 下面的用上我感觉比较难看,我按我觉得好看的来的
-
[原创][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就被我们优雅(雾)的处理掉了
-
怎么没有板式斑块在壁画发图片不就行了()