info/KubeJS/code/other #99
Replies: 3 comments 1 reply
-
/**
* @type {Internal.Field}
*/
let soundEngineField;
/**
* @type {Internal.Field}
*/
let instanceToChannelField;
function initReflection() {
let SoundManager = Java.loadClass("net.minecraft.client.sounds.SoundManager");
let SoundEngine = Java.loadClass("net.minecraft.client.sounds.SoundEngine");
soundEngineField = SoundManager.__javaObject__.getDeclaredField("f_120349_");
soundEngineField.setAccessible(true);
instanceToChannelField = SoundEngine.__javaObject__.getDeclaredField("f_120226_");
instanceToChannelField.setAccessible(true);
}
initReflection();
ClientEvents.tick(event => {
let soundManager = Client.soundManager;
let engine = soundEngineField.get(soundManager);
let instanceToChannel = instanceToChannelField.get(engine);
});获取私有属性方法。 |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
功能:实现了通过lang.json来动态的为物品添加tooltip(可以添加复数tooltip)
example: code: let lang = "kubejs/assets/kubejs/lang/" + Client.languageManager.selected.toString() + ".json"
let json = JsonIO.read(lang)
json = JsonIO.toObject(json)
ItemEvents.tooltip(event=>{
json.forEach(element =>{
//根据langkey组织物品id
if (element.includes("item.") && element.includes("tooltip"))
{
//获取modid
let modid = element.split('.')[1]
//将id和langkey组织到1个列表,以便于addAdvanced的内部函数可以访问到langkey
let itemID = modid + ":" + element.split('.')[2]
let itemElement = [itemID,element]
event.addAdvanced(itemElement[0],(item,advance,text)=>{
for (let i = 1; i < itemElement.length; i++) {
const element = itemElement[i];
text.add(i,Text.translate(element))
}
})
}
})
}) |
Beta Was this translation helpful? Give feedback.
0 replies
-
|
功能:利用1.20.1反射的特性实现切换玩家shader的功能 /**
* 切换shader(旁观附身其他生物会清除当前的shader,但是退出实体后还会重新添加被清除的shader)
* @param {$Player[] | $Player} players 玩家对象 可以是多人也可以是单人
* @param {String} path shader的资源路径 比如"minecraft:shaders/post/creeper.json" 如果要清除所有的shader传"reset" 默认为reset
*/
function toggleShader (players, path) {
path = path === undefined ? 'reset' : path
if (Array.isArray(players)) {
players.forEach(p => {
p.sendData('toggleShader', { path: path })
})
} else {
players.sendData('toggleShader', { path: path })
}
},client_script: const { $ResourceLocation } = require("packages/net/minecraft/resources/$ResourceLocation")
const { $CameraType } = require("packages/net/minecraft/client/$CameraType")
let shaderArr = []
NetworkEvents.dataReceived('toggleShader', event => {
let { data } = event
let path = data.path
shaderArr = []
if (path !== 'reset') {
shaderArr.push(Utils.id(path))
}
if (shaderArr !== null && shaderArr.length === 0) {
//清除当前所有的shader
Client.gameRenderer.shutdownEffect()
} else if (shaderArr !== null && shaderArr.length > 0) {
shaderArr.forEach(id => {
try {
getPrivateMethod(Client.gameRenderer, 'm_109128_', $ResourceLocation, id)
} catch (error) {
console.error(`加载后处理器失败: ${error}`)
return
}
})
}
})
let cameraTypeInfo = $CameraType.FIRST_PERSON
//标记 当玩家附身实体时设置为false
let flag = true
ClientEvents.tick(event => {
let cameraType = Client.options.cameraType
//玩家附身实体 清空视角状态 方便玩家退出实体附身后添加shader
if (flag && cameraTypeInfo === cameraType && shaderArr !== null && shaderArr.length > 0 && !Client.player.controlledCamera) {
flag = false
cameraTypeInfo = null
}
//玩家无附身实体且在切换视角的时候触发
if (cameraTypeInfo !== cameraType && shaderArr !== null && shaderArr.length > 0 && Client.player.controlledCamera) {
shaderArr.forEach(id => {
try {
getPrivateMethod(Client.gameRenderer, 'm_109128_', $ResourceLocation, id)
} catch (error) {
console.error(`加载后处理器失败: ${error}`)
return
}
})
cameraTypeInfo = cameraType
flag = true
}
})
/**
* 反射方法(适用于方法为private的情况)
* @param {any} object 对象实例,由构造函数或者其他方式获取的对象实例而非Class对象
* @param {String} methodName 方法名
* @param {Array | any} argsClass 参数Class数组
* @param {Array | any} args 参数值数组
* @returns {any} 方法的返回值当然也可能没有返回值
*/
function getPrivateMethod (object, methodName, argsClass, args) {
let method = argsClass !== undefined ? object.class.getMethod(methodName, argsClass) : object.class.getMethod(methodName)
return argsClass !== undefined ? method.invoke(object, args) : method.invoke(object)
}, |
Beta Was this translation helpful? Give feedback.
1 reply
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
info/KubeJS/code/other
一个包含 Minecraft 开发文档的网站。
https://docs.mihono.cn/zh/info/KubeJS/code/other
Beta Was this translation helpful? Give feedback.
All reactions