import { world, system, MinecraftBlockTypes, Vector3, MolangVariableMap, ChatSendAfterEvent, Player, Dimension, BlockType, Block, } from "@minecraft/server"; import { Mindkeeper, Store, StoreType } from "./Commandeer/mindKeeper"; import Pupeteer from "./Commandeer/pupeteer"; import Level from "./Commandeer/level/level"; import { leverOn } from "./Commandeer/level/levelTypes"; import { levelIntroConditions } from "./levelConditions/levelIntro"; import { Vector3ToFancyString, Vector3ToString, vector3 } from "./Commandeer/utils/vectorUtils"; import { delay } from "./Commandeer/utils/waitUtil"; import { PARTICLES, ParticleColumn, bedrockParticles, spawnParticle } from "./Commandeer/utils/particleUtils"; import { drawArrow } from "./Commandeer/utils/arrow"; import * as agentUtils from "./Commandeer/utils/agentUtils"; import { level3Conditions } from "./levelConditions/level3"; import { TrailMaker } from "./Commandeer/Makers/trailMaker"; import * as CCTrigger from "./Commandeer/Trigger/CCTrigger"; import { Command, Commands } from "./Commandeer/command/command"; const mindKeeper = new Mindkeeper(world); const pupeteer = new Pupeteer(world); const trailMaker: TrailMaker.Maker = new TrailMaker.Maker(); const triggerManager = new CCTrigger.Manager(mindKeeper); const CURRENT_LEVEL = "currentLevel"; const AGENT_ID = "agentid"; const PREFIX = "!"; export { pupeteer, mindKeeper, CURRENT_LEVEL }; const DEVELOPER_MODE = true; let tickCounter = 0; system.runInterval(() => { tickCounter++; if (mindKeeper.initialised) { trailMaker.Update(); updateIntro(); //run every 4 ticks if (tickCounter % 2 == 0) { triggerManager.Update(); } const currentLevel = mindKeeper.get(CURRENT_LEVEL); switch (currentLevel) { } } }); const buttonPositions: Vector3[] = [ vector3(2471, 11, 106), vector3(2469, 11, 106), vector3(2468, 11, 106), vector3(2464, 11, 106), ]; const blockPositions: Vector3[] = [ vector3(2471, 12, 108), vector3(2469, 12, 108), vector3(2468, 12, 108), vector3(2464, 12, 108), ]; let currentBlockSequence: BlockType[] = []; let currentBlockSeuqenceIndex: number[] = []; triggerManager.RegisterFunctionTrigger("lightPath", (event) => { lightUpPath(); }); //fill 2467 9 87 2468 9 105 redstone_block async function lightUpPath() { let overworld: Dimension = world.getDimension("overworld"); let pos1 = vector3(2467, 9, 87); let pos2 = vector3(2468, 9, 105); for (let z = pos2.z; z >= pos1.z; z--) { overworld.fillBlocks(vector3(pos1.x, pos1.y, z), vector3(pos1.x + 1, pos1.y, z), MinecraftBlockTypes.redstoneBlock); await delay(4); } // let pos2 = vector3(2468, 9, 105); } const blockCycle: BlockType[] = [ MinecraftBlockTypes.redstoneBlock, MinecraftBlockTypes.goldBlock, MinecraftBlockTypes.diamondBlock, MinecraftBlockTypes.emeraldBlock, MinecraftBlockTypes.lapisBlock, ]; let buttonPressed: boolean[] = buttonPositions.map(() => false); function startIntro() { //Determine the current squence blockPositions.forEach((pos) => { let block = world.getDimension("overworld").getBlock(pos); let index = blockPositions.indexOf(pos); let blockType = block!.type; currentBlockSequence[index] = blockType; }); } function updateIntro() { //Check each button if it's pressed buttonPositions.forEach((pos) => { let block = world.getDimension("overworld").getBlock(pos); let index = buttonPositions.indexOf(pos); let prevState = buttonPressed[index]; let currentState = block!.getRedstonePower()! > 0; if (currentState && !prevState) { buttonPressed[index] = true; //NextBlock let nextBlock = currentBlockSequence[index]; let nextIndex = blockCycle.indexOf(nextBlock); nextIndex = (nextIndex + 1) % blockCycle.length; currentBlockSequence[index] = blockCycle[nextIndex]; //Update the block let blockPos = blockPositions[index]; world.getDimension("overworld").getBlock(blockPos)!.setType(blockCycle[nextIndex]); } if (!currentState && prevState) { buttonPressed[index] = false; } }); } world.afterEvents.worldInitialize.subscribe(({ propertyRegistry }) => { mindKeeper.registerStore(CURRENT_LEVEL, StoreType.number); mindKeeper.registerStore(AGENT_ID, StoreType.string); // mindKeeper.set("ShowTriggers", true); triggerManager.RegisterStores(); mindKeeper.registerToWorld(propertyRegistry); triggerManager.Load(); }); world.beforeEvents.itemUseOn.subscribe((event) => { trailMaker.OnItemUse(event); triggerManager.OnItemUse(event); }); function randomExplosions() { let pos1 = vector3(2465, 10, 82); let pos2 = vector3(2471, 18, 90); for (let i = 0; i < 5; i++) { let pos = vector3( pos1.x + Math.random() * (pos2.x - pos1.x), pos1.y + Math.random() * (pos2.y - pos1.y), pos1.z + Math.random() * (pos2.z - pos1.z) ); //create a particle spawnParticle(pos, "minecraft:huge_explosion_emitter", new MolangVariableMap()); } } let originalDoorPos = vector3(2465, 10, 82); let closedDoorPos = vector3(2465, 10, 82); let openDoorPos = vector3(2465, 10, 82); let doorSize = vector3(7, 7, 7); ///clone 2463 -10 81 2470 -3 87 2463 10 81 ///clone 2463 -30 81 2470 -23 87 2463 10 81 function blowUpDoor() { world.getDimension("overworld").runCommand("/clone 2463 -10 81 2470 -3 87 2463 10 81"); } function restoreDoor() { world.getDimension("overworld").runCommand("/clone 2463 -30 81 2470 -23 87 2463 10 81"); } world.afterEvents.chatSend.subscribe((event: ChatSendAfterEvent) => { const command = event.message.split(" ")[0]; trailMaker.OnChat(event); mindKeeper.chatCommands(event); triggerManager.OnChat(event); if (command === "!reset") { world.sendMessage("Resetting"); } }); Commands.register(PREFIX, "info", (arg) => { world.sendMessage("-----------------"); world.sendMessage("Current level: " + mindKeeper.get(CURRENT_LEVEL)); world.sendMessage("Agent ID: " + mindKeeper.get(AGENT_ID)); world.sendMessage("Engine Version: 1.0.2"); world.sendMessage("Engine is running"); world.sendMessage("Active players: " + world.getPlayers().length); world.sendMessage("Current dimension: " + arg.player.dimension.id); world.sendMessage("Current position: " + Vector3ToFancyString(arg.player.location)); world.sendMessage("-----------------"); }); Commands.register(PREFIX, "kboom", (arg) => { (async () => { for (let i = 0; i < 10; i++) { randomExplosions(); await delay(1); } blowUpDoor(); })(); }); Commands.register(PREFIX, "restore", restoreDoor); system.afterEvents.scriptEventReceive.subscribe((event) => { if (event.id == "cc:getId") { let id = event.message; world.sendMessage("Script got the id " + id); mindKeeper.set(AGENT_ID, id); } });