mirror of
https://github.com/eaglerforge/EaglerForgeInjector
synced 2025-07-24 22:51:18 -09:00
Delete defunc mods
This commit is contained in:
parent
6b58c28696
commit
1df8f7bb9a
@ -1,174 +0,0 @@
|
|||||||
(function AStarPathfinding() {
|
|
||||||
ModAPI.meta.title("A* Pathfinding Bot");
|
|
||||||
ModAPI.meta.description("Use #move <x> <y> <z> 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 })
|
|
||||||
});
|
|
@ -1,80 +0,0 @@
|
|||||||
//NOT FUNCTIONAL
|
|
||||||
ModAPI.meta.title("Advanced VClip Exploit");
|
|
||||||
ModAPI.meta.description("Use .vclip <offset> 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 <offset>");
|
|
||||||
}
|
|
||||||
|
|
||||||
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.");
|
|
||||||
}
|
|
||||||
});
|
|
@ -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);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})
|
|
||||||
});
|
|
@ -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);
|
|
@ -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;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})();
|
|
@ -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;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})();
|
|
@ -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;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
@ -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;
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user