diff --git a/examplemods/astar.js b/examplemods/astar.js deleted file mode 100644 index 4cfd6e7..0000000 --- a/examplemods/astar.js +++ /dev/null @@ -1,174 +0,0 @@ -(function AStarPathfinding() { - ModAPI.meta.title("A* Pathfinding Bot"); - ModAPI.meta.description("Use #move to instruct the bot to move somewhere. Use #stop to terminate the job."); - ModAPI.meta.credits("By ZXMushroom63"); - - ModAPI.require("player"); - ModAPI.require("world"); - - var tessellator = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.minecraft.client.renderer.Tessellator", "getInstance")](); - var worldRenderer = tessellator.$getWorldRenderer(); - var glStateManagerSetColor = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager", "color")]; - var glStateManagerEnableBlend = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager", "enableBlend")]; - var glStateManagerDisableBlend = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager", "disableBlend")]; - var glStateManagerdisableTex2d = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager", "disableTexture2D")]; - var glStateManagerenableTex2d = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager", "enableTexture2D")]; - var glStateManagerdisableDepth = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager", "disableDepth")]; - var glStateManagerenableDepth = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager", "enableDepth")]; - var glStateManagerSetBlend = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager", "blendFunc")]; - var glStateManagerDepthMask = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager", "depthMask")]; - var eaglercraftGPUSetLineWidth = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU", "glLineWidth")]; - var positionVertexFormat = ModAPI.reflect.getClassByName("DefaultVertexFormats").staticVariables.POSITION; - globalThis.drawLine = function drawLine(positions, color) { - glStateManagerSetBlend(770, 771); - glStateManagerEnableBlend(); - eaglercraftGPUSetLineWidth(2); - glStateManagerdisableTex2d(); - glStateManagerdisableDepth(); - glStateManagerDepthMask(0); - - var renderManager = ModAPI.mc.getRenderManager(); - - glStateManagerSetColor(color.r, color.b, color.g, color.a); - - worldRenderer.$begin(3, positionVertexFormat); - positions.forEach(pos => { - worldRenderer.$pos(pos.x - renderManager.renderPosX, pos.y - renderManager.renderPosY, pos.z - renderManager.renderPosZ).$endVertex(); - }); - tessellator.$draw(); - - glStateManagerenableTex2d(); - glStateManagerDepthMask(1); - glStateManagerenableDepth(); - glStateManagerDisableBlend(); - } - - var blockBreakCostMultiplier = 2; - const costMap = Object.fromEntries(Object.keys(ModAPI.blocks).flatMap(x => { - ModAPI.blocks[x].readableId = x; - return [[x, (Math.floor(ModAPI.blocks[x].blockHardness * 10 * blockBreakCostMultiplier) + 1) || 99999]]; //Block hardness is in decimals, unbreakable blocks are negative one, and base movement cost is 1. -1 + 1 = 0, and 0 || 99999 is 99999 - })); - - var makeBlockPos = ModAPI.reflect.getClassById("net.minecraft.util.BlockPos").constructors.find(x => x.length === 3); - - function shouldPause(x, y, z) { - return !ModAPI.world.isAreaLoaded0(makeBlockPos(x, y, z), 2); - } - - globalThis.APNode = class APNode { - constructor(x, y, z, g, h, parent = null) { - this.x = x; - this.y = y; - this.z = z; - this.g = g; - this.h = h; - this.f = g + h; - this.parent = parent; - } - } - - function heuristic(a, b) { - return Math.abs(a.x - b.x) + Math.abs(a.y - b.y) + Math.abs(a.z - b.z); - } - - function getNeighbors(node) { - const neighbors = []; - const directions = [ - [1, 0, 0], [-1, 0, 0], - [0, 1, 0], [0, -1, 0], - [0, 0, 1], [0, 0, -1] - ]; - - for (const [dx, dy, dz] of directions) { - const x = node.x + dx; - const y = node.y + dy; - const z = node.z + dz; - - if (ModAPI.world.isBlockLoaded(makeBlockPos(Math.round(x), Math.round(y), Math.round(z)))) { - neighbors.push(new APNode(x, y, z, 0, 0)); - } - } - return neighbors; - } - - function lookupCost(x, y, z) { - var block = ModAPI.world.getBlockState(makeBlockPos(Math.round(x), Math.round(y), Math.round(z))).block; - return costMap[block.readableId]; - } - - globalThis.aStar = function* aStar(start, goal) { - const openSet = []; - const closedSet = new Set(); - openSet.push(start); - - while (openSet.length > 0) { - let current = openSet.reduce((prev, curr) => (prev.f < curr.f ? prev : curr)); - - if (current.x === goal.x && current.y === goal.y && current.z === goal.z) { - const path = []; - while (current) { - path.push([current.x, current.y, current.z]); - current = current.parent; - } - yield* path.reverse(); - return; - } - - openSet.splice(openSet.indexOf(current), 1); - closedSet.add(`${current.x},${current.y},${current.z}`); - - for (const neighbor of getNeighbors(current)) { - if (closedSet.has(`${neighbor.x},${neighbor.y},${neighbor.z}`)) { - continue; - } - - const tentativeG = current.g + lookupCost(neighbor.x, neighbor.y, neighbor.z); - - if (!openSet.some(node => node.x === neighbor.x && node.y === neighbor.y && node.z === neighbor.z)) { - neighbor.g = tentativeG; - neighbor.h = heuristic(neighbor, goal); - neighbor.f = neighbor.g + neighbor.h; - neighbor.parent = current; - openSet.push(neighbor); - } else { - const existingNode = openSet.find(node => node.x === neighbor.x && node.y === neighbor.y && node.z === neighbor.z); - if (tentativeG < existingNode.g) { - existingNode.g = tentativeG; - existingNode.f = existingNode.g + existingNode.h; - existingNode.parent = current; - } - } - } - - yield [current.x, current.y, current.z]; - } - - return []; - } -})(); -var start = new APNode(-24, 73, 1, 0, 0); -var goal = new APNode(-30, 73, 1, 0, 0); -var pathGenerator = aStar(start, goal); -var positions = []; -var rendererPositions = []; -var timer = 0; -ModAPI.addEventListener("update", ()=>{ - timer++; - if (timer > 20) { - timer = 0; - } else { - return; - } - if (positions.length > 0 && shouldPause(...positions[positions.length - 1])) { - return; - } - var nextPos = pathGenerator.next(); - if (nextPos.value && nextPos.value.length === 3) { - positions.push(nextPos.value); - rendererPositions.push({x: nextPos.value[0] + 0.5, y: nextPos.value[1] + 0.5, z: nextPos.value[2] + 0.5}); - } -}); - -ModAPI.addEventListener("render", () => { - drawLine(rendererPositions, { r: 1, g: 0, b: 0, a: 0.5 }) -}); \ No newline at end of file diff --git a/examplemods/defunct/advanced_vclip.js b/examplemods/defunct/advanced_vclip.js deleted file mode 100644 index 252686b..0000000 --- a/examplemods/defunct/advanced_vclip.js +++ /dev/null @@ -1,80 +0,0 @@ -//NOT FUNCTIONAL -ModAPI.meta.title("Advanced VClip Exploit"); -ModAPI.meta.description("Use .vclip to vertically phase through blocks with custom packet handling."); -ModAPI.meta.credits("By radmanplays"); - -// Custom syntax error function -function syntaxError() { - ModAPI.displayToChat("[AdvancedVClip] Syntax error: Usage is .vclip "); -} - -ModAPI.require("player"); -ModAPI.addEventListener("sendchatmessage", (ev) => { - var msg = ev.message.toLowerCase(); - if (msg.startsWith(".vclip")) { - ev.preventDefault == true; - - var args = msg.split(" "); - if (args.length != 2) { - syntaxError(); - return; - } - - var offset = parseFloat(args[1]); - if (isNaN(offset)) { - syntaxError(); - return; - } - - var packetsRequired = Math.ceil(Math.abs(offset / 10)); - if (packetsRequired > 20) { - packetsRequired = 1; // Limit to avoid server kicking for too many packets - } - - var player = ModAPI.player; - var ridingEntity = player.ridingEntity; - - if (ridingEntity != null) { - // Player is riding an entity - for (var packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - // Simulate entity movement - ridingEntity.posY += offset / packetsRequired; // Move a fraction of the total offset - ModAPI.network.addToSendQueue({ - "action": "RIDING_JUMP", // Simulate a riding jump action - "entityId": ridingEntity.getEntityId(), - }); - } - - // Final move - ridingEntity.posY += offset / packetsRequired; - ModAPI.network.addToSendQueue({ - "action": "RIDING_JUMP", - "entityId": ridingEntity.getEntityId(), - }); - - } else { - // Player is not riding any entity - for (var packetNumber = 0; packetNumber < (packetsRequired - 1); packetNumber++) { - ModAPI.network.addToSendQueue({ - "x": player.posX, - "y": player.posY, - "z": player.posZ, - "onGround": true - }); - } - - // Final move - ModAPI.network.addToSendQueue({ - "x": player.posX, - "y": player.posY + offset, - "z": player.posZ, - "onGround": true - }); - - // Set the player’s final position - player.setPosition(player.posX, player.posY + offset, player.posZ); - } - - ModAPI.displayToChat("[AdvancedVClip] VClipped " + offset + " blocks."); - } -}); diff --git a/examplemods/defunct/blocklook.js b/examplemods/defunct/blocklook.js deleted file mode 100644 index a3b2930..0000000 --- a/examplemods/defunct/blocklook.js +++ /dev/null @@ -1,98 +0,0 @@ -//WIP Blocklook plugin -//Causes call stack implosions occasionally, not sure why. -//Use with caution -ModAPI.meta.title("BlockLook"); -ModAPI.meta.credits("Made with ❤️ by ZXMushroom63"); -ModAPI.meta.icon("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAPlJREFUOE+Fk7EVwjAMRM8TQJEmS0DBBtAwBEtQwBBkCBqGoIEhsgFNGrKDeOdEjuw4Rk1eLN33WbIdAEEmROJl51yuDFyVtFgrVVTKZwEqfAnQAjiPm+dcRQAVfkchnRCg33sCYn0ABLsd0NeTiACFfAC8DSQLoFS6AUDQFQCFDBX7GhHMAPIE3HFqNkGHOhZWAvSuAFC/jlvbkIv/q9AUADdz4Ad8g3xwHHvtBBPNwhEUMHYuAuwArJgoAU5mZm3iIAAAuO2CAwLM4GcOyKeLHIC5cBc2A2gGWA8reiOjMdqGLz2cv1c5GdzkKHmZWhccpEJr0xbn6n64M6oBwREDxAAAAABJRU5ErkJggg=="); -ModAPI.meta.description("EaglerForge port of the bukkit BlockLook plugin by GeorgeNotFound. Use /blocklook in a single-player world to toggle the plugin."); -ModAPI.dedicatedServer.appendCode(function () { - var worldMethodMap = ModAPI.reflect.getClassById("net.minecraft.world.World").methods; - var rayTraceMethod = worldMethodMap[Object.keys(worldMethodMap).filter(key => { - return key.startsWith("rayTraceBlocks") && worldMethodMap[key].method.length === 4; - })].method; - var blockTypesList = []; - ModAPI.addEventListener("serverstart", () => { - blockTypesList = Object.keys(ModAPI.blocks).filter(key => { - var blockType = ModAPI.blocks[key]; - if (!blockType) { - return false; - } - return blockType.fullBlock && !blockType.needsRandomTick; - }); - }); - function getPlayerEntitiesAndTheirWorld() { - var out = []; - ModAPI.server.worldServers.forEach(x => { - var list = x.playerEntities; - var size = list.size(); - for (let i = 0; i < size; i++) { - const playerEntity = list.get(i); - if (playerEntity) { - out.push({ - world: x, - player: playerEntity - }); - } - } - }); - return out; - }; - var active = false; - ModAPI.addEventListener("processcommand", (event) => { - if (event.command.toLowerCase().startsWith("/blocklook")) { - active = !active; - console.log(blockTypesList); - var playerEntities = getPlayerEntitiesAndTheirWorld(); - playerEntities.forEach(pair => { - pair.player.addChatMessage( - ModAPI.reflect.getClassById("net.minecraft.util.ChatComponentText").constructors[0](ModAPI.util.str( - "[BlockLook] Toggled to " + (active ? "on" : "off") - )) - ) - }); - event.preventDefault = true; - } - }); - var t = 0; - ModAPI.addEventListener("tick", () => { - t++; - if (t > 5) { - t = 0; - } else { - return; - } - if (!active) { - return; - } - if (blockTypesList.length < 1) { - return; - } - var playerEntities = getPlayerEntitiesAndTheirWorld(); - playerEntities.forEach(pair => { - var start = pair.player.getPositionEyes(1).getRef(); - var lookVector = pair.player.getLookVec(); - lookVector.xCoord *= 50; - lookVector.yCoord *= 50; - lookVector.zCoord *= 50; - lookVector.addVector(start.$xCoord, start.$yCoord, start.$zCoord); - var hitResult = rayTraceMethod(pair.world.getRef(), start, lookVector.getRef(), 0); - if (hitResult) { - if (ModAPI.util.unstr(hitResult.$typeOfHit.$name5) !== "BLOCK") { - return console.log("Non block collision detected.") - } - var blockPos = hitResult.$blockPos; - if (!pair.world.isBlockLoaded(blockPos)) { - return console.log("[BlockLook] Block is not loaded!"); - } - var blockType = blockTypesList[Math.floor(Math.random() * blockTypesList.length)]; - blockType = ModAPI.blocks[blockType]; - if (!blockType.fullBlock || blockType.needsRandomTick) { - return; - } - //console.log("[BlockLook] " + ModAPI.util.unstr(blockType.unlocalizedName.getRef())); - var block = blockType.getDefaultState(); - pair.world.setBlockState(blockPos, block.getRef(), 2); - } - }); - }) -}); \ No newline at end of file diff --git a/examplemods/lib.lcrender.js b/examplemods/lib.lcrender.js deleted file mode 100644 index 005835f..0000000 --- a/examplemods/lib.lcrender.js +++ /dev/null @@ -1,188 +0,0 @@ -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."); -(async function LibRender() { - var BreakingFour = ModAPI.reflect.getClassByName("BreakingFour").constructors[0]; - var BakedQuad = ModAPI.reflect.getClassByName("BakedQuad").constructors[0]; - var EnumFacing = ModAPI.reflect.getClassByName("EnumFacing"); - function createBreakingFour(sprite$) { - var sprite = ModAPI.util.wrap(sprite$); - var vertexData = ModAPI.array.int(28); // 7 integers per vertex, 4 vertices - var vertexDataInternal = vertexData.data; - - var vertexDataWithNormals = ModAPI.array.int(32); // 8 integers per vertex, 4 vertices - var normalDataInternal = vertexDataWithNormals.data; - - var vertices = [ - [0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0] - ]; - - var uvs = [ - [0, 0], [1, 0], [1, 1], [0, 1] - ]; - - for (let i = 0; i < 4; i++) { - let j = i * 7; - vertexDataInternal[j] = ModAPI.hooks.methods.jl_Float_floatToIntBits(vertices[i][0]); - vertexDataInternal[j + 1] = ModAPI.hooks.methods.jl_Float_floatToIntBits(vertices[i][1]); - vertexDataInternal[j + 2] = ModAPI.hooks.methods.jl_Float_floatToIntBits(vertices[i][2]); - vertexDataInternal[j + 3] = rgbToInt(255, 0, 0); // Color (red) - vertexDataInternal[j + 4] = ModAPI.hooks.methods.jl_Float_floatToIntBits(sprite.getInterpolatedU(uvs[i][0] * 16)); - vertexDataInternal[j + 5] = ModAPI.hooks.methods.jl_Float_floatToIntBits(sprite.getInterpolatedV(uvs[i][1] * 16)); - vertexDataInternal[j + 6] = 0; // Normal - - let k = i * 8; - normalDataInternal[k] = vertexDataInternal[j]; - normalDataInternal[k + 1] = vertexDataInternal[j + 1]; - normalDataInternal[k + 2] = vertexDataInternal[j + 2]; - normalDataInternal[k + 3] = vertexDataInternal[j + 3]; - normalDataInternal[k + 4] = vertexDataInternal[j + 4]; - normalDataInternal[k + 5] = vertexDataInternal[j + 5]; - normalDataInternal[k + 6] = vertexDataInternal[j + 6]; - normalDataInternal[k + 7] = 0; - } - - var baseQuad = BakedQuad(vertexData, vertexDataWithNormals, -1, EnumFacing.staticVariables.NORTH); - return BreakingFour(baseQuad, sprite$); - } - function waitUntilPropertyExists(obj, prop) { - return new Promise((res, rej) => { - var timer = setInterval(() => { - if (obj[prop]) { - clearInterval(timer); - res(); - } - }, 50); - }); - } - function rgbToInt(red, green, blue) { - return (red << 16) | (green << 8) | blue; - } - function rgbaToInt(red, green, blue, alpha) { - return (alpha << 24) | (red << 16) | (green << 8) | blue; - } - 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 recursiveAssign(target, patch) { - var keys = Object.keys(patch); - keys.forEach(k => { - if (typeof patch[k] === "object" && patch[k]) { - recursiveAssign(target[k], patch[k]); - } else if (typeof patch[k] === "number") { - target[k] = patch[k]; - } - }); - } - function cloneBaseModel(baseModel, newTexture, texName) { - var sprite = eaglerTextureAtlasSprite(imageDataToLaxImgData(newTexture), ModAPI.util.str(texName)); - var newBaseModelBuilder = ModAPI.reflect.getClassByName("SimpleBakedModel$Builder").constructors[0](0, 0, ModAPI.reflect.getClassByName("ItemCameraTransforms").constructors.find(x => x.length === 0)()); - newBaseModelBuilder.$builderTexture = sprite; - ModAPI.hooks.methods.nmcrm_SimpleBakedModel$Builder_addGeneralQuad(newBaseModelBuilder, createBreakingFour(sprite)); - var newBaseModel = ModAPI.hooks.methods.nmcrm_SimpleBakedModel$Builder_makeBakedModel(newBaseModelBuilder); - //newBaseModel.$generalQuads = baseModel.$generalQuads.$clone(); - //newBaseModel.$faceQuads = baseModel.$faceQuads.$clone(); - //var cameraTransformsId = ModAPI.util.getNearestProperty(newBaseModel, "$cameraTransforms"); - //recursiveAssign(newBaseModel[cameraTransformsId], baseModel[cameraTransformsId]); - return newBaseModel; - } - - ModAPI.events.newEvent("lib:libcustomrender:loaded"); - await waitUntilPropertyExists(ModAPI.minecraft, "renderItem"); - 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 === 4); - 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]), null); - alias.initSprite(1, 1, 0, 0, 0); - return atlas; - }; - - /** - * @type {ImageData} - */ - function imageDataToLaxImgData(imageData) { - const { data, width, height } = imageData; - const intArray = []; - - for (let i = 0; i < data.length; i += 4) { - const red = data[i]; - const green = data[i + 1]; - const blue = data[i + 2]; - const alpha = data[i + 3]; - intArray.push(rgbaToInt(red, green, blue, alpha)); - } - - return makeLax1dudeImageData(width, height, ModAPI.array.int(intArray), 1); - } - 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 ImageData."); - } - 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] = { - lore: actualLoreStr, - identifier: loreString, - model: cloneBaseModel(baseModel.getRef(), textureBuffer, loreString) - } - return LibCustomRender.map[loreString].model; - } - - // 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]; - ModAPI.hooks.methods[methodName] = function (...args) { - var item = args[1]; - var lore = item ? getLore(item) : ""; - if (!item) { - return original.apply(this, args); - } - var overrides = Object.values(LibCustomRender.map); - for (let i = 0; i < overrides.length; i++) { - const override = overrides[i]; - if (lore === override.lore) { - return override.model; - } - } - return original.apply(this, args); - } - - ModAPI.events.callEvent("lib:libcustomrender:loaded", {}); - globalThis.LibCustomRender = LibCustomRender; -})(); -//LibCustomRender.addRetextureRule("mymod:test_item_1", new ImageData(1, 1)); - -// const imageData = new ImageData(16, 16); -// for (let i = 0; i < imageData.data.length; i += 4) { -// imageData.data[i] = Math.floor(Math.random() * 256); -// imageData.data[i + 1] = Math.floor(Math.random() * 256); -// imageData.data[i + 2] = Math.floor(Math.random() * 256); -// imageData.data[i + 3] = 255; -// } -// LibCustomRender.addRetextureRule("mymod:test_item_1", imageData); \ No newline at end of file diff --git a/examplemods/mobnpcspawner.js b/examplemods/mobnpcspawner.js deleted file mode 100644 index 292b965..0000000 --- a/examplemods/mobnpcspawner.js +++ /dev/null @@ -1,48 +0,0 @@ -(() => { - PluginAPI.dedicatedServer.appendCode(function () { - PluginAPI.addEventListener("processcommand", (event) => { - // Check if the sender is a player - if (!ModAPI.reflect.getClassById("net.minecraft.entity.player.EntityPlayerMP").instanceOf(event.sender.getRef())) { return; } - - // Check if the command is "/spawnsheep" - if (event.command.toLowerCase().startsWith("/spawnsheep")) { - const world = event.sender.getServerForPlayer(); - const senderPos = event.sender.getPosition(); - - // Create a sheep entity - const EntitySheepClass = ModAPI.reflect.getClassById("net.minecraft.entity.passive.EntitySheep"); - const sheep = EntitySheepClass.constructors[0](world.getRef()); - - // Set sheep's position to player's position - sheep.$setLocationAndAngles(senderPos.getX(), senderPos.getY(), senderPos.getZ(), senderPos.rotationYaw, senderPos.rotationPitch); - - // Disable AI (no AI behavior) - //sheep.$setNoAI(1) - - // Disable gravity - //sheep.$noGravity = 1; - - // Make sheep invincible - //sheep.$invulnerable = 1 - - if (globalThis.AsyncSink) { //If we can, start the AsyncSink debugger to see filesystem requests - AsyncSink.startDebuggingFS(); - } - - // Add the sheep to the world - ModAPI.promisify(ModAPI.hooks.methods.nmw_World_spawnEntityInWorld)(world.getRef(), sheep).then(result => { - // Notify the player that the sheep has been spawned - const ChatComponentTextClass = ModAPI.reflect.getClassById("net.minecraft.util.ChatComponentText"); - event.sender.addChatMessage(ChatComponentTextClass.constructors[0](ModAPI.util.str("A special sheep has been spawned!"))); - - if (globalThis.AsyncSink) { //Stop debugging when we are done, otherwise the console will get filled up. - AsyncSink.stopDebuggingFS(); - } - }); - - // Prevent the command from executing further - event.preventDefault = true; - } - }); - }); -})(); diff --git a/examplemods/npcspawner.js b/examplemods/npcspawner.js deleted file mode 100644 index b2b8a1e..0000000 --- a/examplemods/npcspawner.js +++ /dev/null @@ -1,47 +0,0 @@ -(() => { - PluginAPI.dedicatedServer.appendCode(function () { - PluginAPI.addEventListener("processcommand", (event) => { - if (!ModAPI.reflect.getClassById("net.minecraft.entity.player.EntityPlayerMP").instanceOf(event.sender.getRef())) { return; } - - if (event.command.toLowerCase().startsWith("/spawnnpc2")) { - AsyncSink.startDebuggingFS(); - const world = event.sender.getServerForPlayer(); - const senderPos = event.sender.getPosition(); - - // Create a fake player GameProfile - const GameProfileClass = ModAPI.reflect.getClassById("net.lax1dude.eaglercraft.v1_8.mojang.authlib.GameProfile"); - var UUID = ModAPI.hooks.methods[ModAPI.util.getMethodFromPackage("net.lax1dude.eaglercraft.v1_8.EaglercraftUUID", "randomUUID")](); - - //Not using UUID to make patching easier for now - - const fakeProfile = GameProfileClass.constructors[1](null, ModAPI.util.str("Steve")); - - // Get the PlayerInteractionManager class - const PlayerInteractionManagerClass = ModAPI.reflect.getClassById("net.minecraft.server.management.ItemInWorldManager"); - const playerInteractionManager = PlayerInteractionManagerClass.constructors[0](world.getRef()); - - // Get the EntityPlayerMP class to spawn the fake player - const EntityPlayerMPClass = ModAPI.reflect.getClassById("net.minecraft.entity.player.EntityPlayerMP"); - ModAPI.promisify(EntityPlayerMPClass.constructors[0])(ModAPI.server.getRef(), world.getRef(), fakeProfile, playerInteractionManager).then(result => { - console.log(result); - var fakePlayer = ModAPI.util.wrap(result); - - // Set the fake player position to be near the command sender - console.log(senderPos); - fakePlayer.setPosition(senderPos.getX(), senderPos.getY(), senderPos.getZ()); - - // Add the fake player to the world - world.spawnEntityInWorld(fakePlayer.getRef()); - - // Notify the player that the fake player has been spawned - const ChatComponentTextClass = ModAPI.reflect.getClassById("net.minecraft.util.ChatComponentText"); - event.sender.addChatMessage(ChatComponentTextClass.constructors[0](ModAPI.util.str("Fake Steve has been spawned!"))); - }); - - - // Prevent the command from executing further - event.preventDefault = true; - } - }); - }); -})(); diff --git a/examplemods/setblocktest.js b/examplemods/setblocktest.js deleted file mode 100644 index 25b08b0..0000000 --- a/examplemods/setblocktest.js +++ /dev/null @@ -1,13 +0,0 @@ -//Test to make sure I can set a block -ModAPI.dedicatedServer.appendCode(function () { - var blockPosConstructor = ModAPI.reflect.getClassById("net.minecraft.util.BlockPos").constructors.find((x) => { return x.length === 3 }); - ModAPI.addEventListener("processcommand", (event) => { - if (event.command.toLowerCase().startsWith("/testcmd")) { - var blockPos = blockPosConstructor(0, 0, 0); - var blockType = ModAPI.blocks["dirt"]; //blockType - var block = blockType.getDefaultState().getRef(); - event.sender.getServerForPlayer().setBlockState(blockPos, block, 3); - event.preventDefault = true; - } - }); -}); \ No newline at end of file diff --git a/examplemods/threadtesting.js b/examplemods/threadtesting.js deleted file mode 100644 index 2a2d811..0000000 --- a/examplemods/threadtesting.js +++ /dev/null @@ -1,68 +0,0 @@ -//SUCCESS - While there is no TeaVM thread actively running, I am able to run an asynchronous function, and get a result. -ModAPI.hooks._teavm.$rt_startThread(() => { - return ModAPI.hooks.methods.nlevi_PlatformRuntime_downloadRemoteURI(ModAPI.util.str("data:text/plain,hi")) -}, function (...args) { console.log(this, args) }) - -// SUCCESS - Runs anywhere, anytime. Might work with async/await, but for now stick to .then() -ModAPI.promisify(ModAPI.hooks.methods.nlevi_PlatformRuntime_downloadRemoteURI)(ModAPI.util.str("data:text/plain,hi")).then(result => { - console.log(result); //Log arraybuffer -}); - - -//WIP - Pausing and resuming client thread -globalThis.suspendTest = function (...args) { - if (!ModAPI.util.isCritical()) { - var thread = ModAPI.hooks._teavm.$rt_nativeThread(); - var javaThread = ModAPI.hooks._teavm.$rt_getThread(); - globalThis.testThread = thread; - console.log("BeforeAnything: ", thread.stack); - thread.suspend(function () { - console.log("Pausing for 10 seconds.", thread.stack); - setTimeout(function () { - console.log("Resuming...", thread.stack); - ModAPI.hooks._teavm.$rt_setThread(javaThread); - thread.resume(); - console.log("After resume: ", thread.stack); - }, 10000); - }); - } - return suspendTest.apply(this, args); -} - - - - - -function jl_Thread_sleep$_asyncCall_$(millis) { - var thread = $rt_nativeThread(); - var javaThread = $rt_getThread(); - var callback = function () { }; - callback.$complete = function (val) { - thread.attribute = val; - $rt_setThread(javaThread); - thread.resume(); - }; - callback.$error = function (e) { - thread.attribute = $rt_exception(e); - $rt_setThread(javaThread); - thread.resume(); - }; - callback = otpp_AsyncCallbackWrapper_create(callback); - thread.suspend(function () { - try { - jl_Thread_sleep0(millis, callback); - } catch ($e) { - callback.$error($rt_exception($e)); - } - }); - return null; -} -function jl_Thread_sleep0($millis, $callback) { - var $current, $handler; - $current = jl_Thread_currentThread(); - $handler = new jl_Thread$SleepHandler; - $handler.$thread = $current; - $handler.$callback = $callback; - $handler.$scheduleId = otp_Platform_schedule($handler, Long_ge($millis, Long_fromInt(2147483647)) ? 2147483647 : Long_lo($millis)); - $current.$interruptHandler = $handler; -} \ No newline at end of file