108 lines
3.4 KiB
TypeScript
108 lines
3.4 KiB
TypeScript
import { Vector3, world } from "@minecraft/server";
|
|
import Level from "../Commandeer/level/level";
|
|
import { vector3 } from "../Commandeer/utils/vectorUtils";
|
|
import { levelIntroConditions } from "../levelConditions/levelIntro";
|
|
import { CURRENT_LEVEL, mindKeeper } from "../main";
|
|
import Pupeteer from "../Commandeer/pupeteer";
|
|
import { MinecraftBlockTypes } from "../vanilla-data/mojang-block";
|
|
|
|
// const levelIntroCommandBlockPos: Vector3 = vector3(58, 66, 276);
|
|
// const levelIntroStartPosition: Vector3 = vector3(28, 70, 269);
|
|
// const levelIntroEndPosition: Vector3 = vector3(39, 70, 269);
|
|
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),
|
|
];
|
|
|
|
const currentBlockSequence: string[] = [];
|
|
|
|
const blockCycle: string[] = [
|
|
// MinecraftBlockTypes.RedstoneBlock,
|
|
// MinecraftBlockTypes.GoldBlock,
|
|
// MinecraftBlockTypes.DiamondBlock,
|
|
MinecraftBlockTypes.EmeraldBlock,
|
|
MinecraftBlockTypes.LapisBlock,
|
|
];
|
|
|
|
const buttonPressed: boolean[] = buttonPositions.map(() => false);
|
|
|
|
const levelIntro: Level = new Level(
|
|
() => {
|
|
Pupeteer.sendWorldMessage("%message.intro.started");
|
|
Pupeteer.setTitleTimed("%message.intro.started", 2.5);
|
|
// startLevel(levelIntroCommandBlockPos);
|
|
// teleportAgent(levelIntroStartPosition);
|
|
blockPositions.forEach((pos) => {
|
|
const block = world.getDimension("overworld").getBlock(pos);
|
|
const index = blockPositions.indexOf(pos);
|
|
const blockType = block!.type;
|
|
currentBlockSequence[index] = blockType.id;
|
|
});
|
|
},
|
|
() => {
|
|
Pupeteer.setActionBar("%message.intro.make");
|
|
|
|
buttonPositions.forEach((pos) => {
|
|
const block = world.getDimension("overworld").getBlock(pos);
|
|
if (!block) return;
|
|
const index = buttonPositions.indexOf(pos);
|
|
const prevState = buttonPressed[index];
|
|
const currentState = block!.getRedstonePower()! > 0;
|
|
|
|
if (currentState && !prevState) {
|
|
buttonPressed[index] = true;
|
|
//NextBlock
|
|
const nextBlock = currentBlockSequence[index];
|
|
let nextIndex = blockCycle.indexOf(nextBlock);
|
|
nextIndex = (nextIndex + 1) % blockCycle.length;
|
|
currentBlockSequence[index] = blockCycle[nextIndex];
|
|
//Update the block
|
|
const blockPos = blockPositions[index];
|
|
world.getDimension("overworld").getBlock(blockPos)!.setType(blockCycle[nextIndex]);
|
|
}
|
|
|
|
if (!currentState && prevState) {
|
|
buttonPressed[index] = false;
|
|
}
|
|
});
|
|
},
|
|
() => {
|
|
Pupeteer.clearActionBar();
|
|
world.sendMessage("%message.intro.done");
|
|
Pupeteer.setTitleTimed("%message.intro.done", 2.5);
|
|
|
|
mindKeeper.increment(CURRENT_LEVEL);
|
|
},
|
|
() => {
|
|
let isComplete = true;
|
|
levelIntroConditions.conditions.forEach((condition) => {
|
|
const blockInworld = world.getDimension("overworld").getBlock(condition.position);
|
|
if (blockInworld?.type.id !== condition.block) {
|
|
isComplete = false;
|
|
}
|
|
});
|
|
if (isComplete) {
|
|
return true;
|
|
}
|
|
return false;
|
|
},
|
|
() => {
|
|
blockPositions.forEach((pos) => {
|
|
const block = world.getDimension("overworld").getBlock(pos);
|
|
const randomBlock = blockCycle[Math.floor(Math.random() * blockCycle.length)];
|
|
block!.setType(randomBlock);
|
|
});
|
|
}
|
|
);
|
|
|
|
export default levelIntro;
|