mirror of
https://github.com/eaglerforge/EaglerForgeInjector
synced 2025-07-23 06:01:38 -09:00
98 lines
4.4 KiB
JavaScript
98 lines
4.4 KiB
JavaScript
//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);
|
|
}
|
|
});
|
|
})
|
|
}); |