Files
Reeks2Missie6/scripts/main.ts
Bram Verhulst 67af73c6b5 Init
2024-07-04 14:42:38 +02:00

224 lines
6.7 KiB
TypeScript

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);
}
});