beta a star pathfinding

This commit is contained in:
ZXMushroom63 2024-10-04 18:28:09 +08:00
parent 6954b68426
commit ce8ee396a1

View File

@ -6,19 +6,56 @@
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
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);
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);
}
class APNode {
globalThis.APNode = class APNode {
constructor(x, y, z, g, h, parent = null) {
this.x = x;
this.y = y;
@ -59,7 +96,7 @@
return costMap[block.readableId];
}
function* aStar(start, goal) {
globalThis.aStar = function* aStar(start, goal) {
const openSet = [];
const closedSet = new Set();
openSet.push(start);
@ -108,9 +145,30 @@
return [];
}
const start = new APNode(0, 0, 0, 0, 0);
const goal = new APNode(2, 2, 2, 0, 0);
const pathGenerator = aStar(start, goal);
})();
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 })
});