From 753b5858cfd8071c02a4f41276ac7aa0d14a06c7 Mon Sep 17 00:00:00 2001 From: ZXMushroom63 Date: Sun, 29 Sep 2024 18:08:54 +0800 Subject: [PATCH] wip stuff --- examplemods/AsyncSink.js | 1 + examplemods/lib.lcrender.js | 94 +++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 examplemods/lib.lcrender.js diff --git a/examplemods/AsyncSink.js b/examplemods/AsyncSink.js index c57baed..8034f94 100644 --- a/examplemods/AsyncSink.js +++ b/examplemods/AsyncSink.js @@ -149,6 +149,7 @@ ModAPI.meta.credits("By ZXMushroom63"); }; globalThis.AsyncSink = AsyncSink; ModAPI.events.callEvent("lib:asyncsink", {}); + console.log("[AsyncSink] Loaded!"); } runtimeComponent(); ModAPI.dedicatedServer.appendCode(runtimeComponent); diff --git a/examplemods/lib.lcrender.js b/examplemods/lib.lcrender.js new file mode 100644 index 0000000..7d371f2 --- /dev/null +++ b/examplemods/lib.lcrender.js @@ -0,0 +1,94 @@ +ModAPI.meta.title("LibCustomRender"); +ModAPI.meta.credits("By ZXMushroom63"); +ModAPI.meta.icon("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAQdJREFUOE9jZGBg+M9AAWAEGbBl2QmyjPCJsmAgaABbdybc8F+l01EswmsATONXLi4GYSkpBgZ+foY1O3cyuHWuhhuC1QBkjf///QMrFtHWZmD4+BHDEBQDUGzU1ITb8ubqVZyGoBjwsCONQYqXl0FYU5MBpAlsKxRgM+STUwoDhgG66upgZ4IAuiEooRcXx/DpCRuqAU97shg0jYzgfsVpSFwcg5mZGcOedRewGDBhAgPDokUohsBthmoE8U+dOoXdBfHHjoElUQxB03i9oABspnTJNFQXgARB3oAbwsAAdirMRmSNMFdhTQcwQ/BpxGsAzCUwRSCn4gJE5QV8uQxuAFlZEaoJAKrYrAHl38o6AAAAAElFTkSuQmCC"); +ModAPI.meta.description("Library to make retexturing LCI items easier. Requires AsyncSink."); +(function LibRender() { + function getLore(item) { + if (item.$stackTagCompound && item.$stackTagCompound.$hasKey(ModAPI.util.str("display"), 10)) { + var displayTag = item.$stackTagCompound.$getCompoundTag(ModAPI.util.str("display")); + if (displayTag.$hasKey(ModAPI.util.str("Lore"), 9)) { + var loreTag = displayTag.$getTag(ModAPI.util.str("Lore")); + if (loreTag.$tagCount() > 0) { + return ModAPI.util.ustr(loreTag.$getStringTagAt(0)); + } + } + } + } + function cloneBaseModel(baseModel, newTexture) { + var newBaseModelBuilder = ModAPI.reflect.getClassByName("SimpleBakedModel$Builder").constructors[0](0, 0, ModAPI.reflect.getClassByName("ItemCameraTransforms").constructors.find(x => x.length === 0)()); + var textureProp = ModAPI.util.getNearestProperty("$texture", newBaseModel); + } + + ModAPI.events.newEvent("lib:libcustomrender:loaded"); + var ItemRenderer = ModAPI.minecraft.renderItem; + var ItemModelMesher = ItemRenderer.itemModelMesher; + var laxImgDataClass = ModAPI.reflect.getClassByName("ImageData").class; + var makeLax1dudeImageData = ModAPI.reflect.getClassByName("ImageData").constructors.find(x => x.length === 3); + var eaglerTextureAtlasSprite = (imageData, name) => { + var atlas = ModAPI.reflect.getClassByName("EaglerTextureAtlasSprite").constructors[0](ModAPI.util.str(name)); + var alias = ModAPI.util.wrap(atlas); + alias.loadSprite(ModAPI.util.makeArray(laxImgDataClass, [imageData])); + }; + const LibCustomRender = {}; + LibCustomRender.map = {}; + LibCustomRender.addRetextureRule = (loreString, textureBuffer, baseItem) => { + baseItem ||= "paper"; + var actualLoreStr = loreString; + loreString = loreString.replaceAll(":", "_").toLowerCase().replace(/[^a-z_]/g, ''); + if (!(textureBuffer instanceof ImageData)) { + return console.error("Texture for retexture rule is not an ArrayBuffer."); + } + if (!(typeof loreString === "string")) { + return console.error("loreString for retexture rule is not a string."); + } + var baseModel = ItemModelMesher.simpleShapesCache.get(ModAPI.hooks.methods.jl_Integer_valueOf(ItemModelMesher.getIndex(ModAPI.items[baseItem].getRef(), 0))); + LibCustomRender.map[loreString] = { + meta_int: ModAPI.util.hashCode(loreString) % 256, + lore: actualLoreStr, + identifier: loreString, + model: makeModelJSON(loreString) + } + var itemstack = ModAPI.reflect.getClassById("net.minecraft.item.ItemStack").constructors[5](ModAPI.items[baseItem].getRef(), 1, LibCustomRender.map[loreString].meta_int); + LibCustomRender.map[loreString].stack = itemstack; + ItemRenderer.registerItem0(ModAPI.items[baseItem].getRef(), LibCustomRender.map[loreString].meta_int, ModAPI.util.str(loreString)); + } + + // override + // public IBakedModel getItemModel(ItemStack stack) { + // Item item = stack.getItem(); + // In ItemModelMesher.java + + var methods = Object.keys(ModAPI.hooks.methods); + var prefix = ModAPI.util.getMethodFromPackage("net.minecraft.client.renderer.ItemModelMesher", "getItemModel"); + var methodName = methods.find(x => x.startsWith(prefix) && ModAPI.hooks.methods[x].length === 2); + var original = ModAPI.hooks.methods[methodName]; + var testStack = ModAPI.reflect.getClassById("net.minecraft.item.ItemStack").constructors[5](ModAPI.items.paper.getRef(), 1, 0); + ModAPI.hooks.methods[methodName] = function (...args) { + var item = args[1]; + var lore = item ? getLore(item) : ""; + if (!item) { + return original.apply(this, args); + } + var shouldOverride = false; + var overrideItem = null; + var overrideModelT = null; + var overrides = Object.values(LibCustomRender.map); + for (let i = 0; i < overrides.length; i++) { + const override = overrides[i]; + if (lore === override.lore) { + shouldOverride = true; + overrideModelT = override.model; + overrideItem = override.stack; + break; + } + } + if (shouldOverride) { + return overrideModelT; + return original.apply(this, [args[0], overrideItem]); + } + return original.apply(this, args); + } + + ModAPI.events.callEvent("lib:libcustomrender:loaded", {}); + globalThis.LibCustomRender = LibCustomRender; +})(); \ No newline at end of file