Add Alot
This commit is contained in:
329
scripts/main.ts
329
scripts/main.ts
@@ -5,31 +5,24 @@ import {
|
||||
Vector3,
|
||||
MolangVariableMap,
|
||||
ChatSendAfterEvent,
|
||||
Player,
|
||||
Dimension,
|
||||
BlockType,
|
||||
Block,
|
||||
TicksPerSecond,
|
||||
} from "@minecraft/server";
|
||||
import { Mindkeeper, Store, StoreType } from "./Commandeer/mindKeeper";
|
||||
import { Mindkeeper, 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 {
|
||||
Vector3Add,
|
||||
Vector3ToCommandString,
|
||||
Vector3ToFancyString,
|
||||
Vector3ToString,
|
||||
vector3,
|
||||
} from "./Commandeer/utils/vectorUtils";
|
||||
import { Vector3ToCommandString, Vector3ToFancyString, 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 { spawnParticle } from "./Commandeer/utils/particleUtils";
|
||||
import { TrailMaker } from "./Commandeer/trail/trailMaker";
|
||||
import * as CCTrigger from "./Commandeer/Trigger/CCTrigger";
|
||||
import { Command, Commands } from "./Commandeer/command/command";
|
||||
import { Commands } from "./Commandeer/command/command";
|
||||
import levelIntro from "./levels/levelIntro";
|
||||
import { Trail } from "./Commandeer/trail/trailEngine";
|
||||
import { startTrail } from "./trails/startTrail";
|
||||
import { IntroToLevel1Trail } from "./trails/IntroToLevel1Trail";
|
||||
import level1 from "./levels/level1/mission1";
|
||||
import level2 from "./levels/level1/mission2";
|
||||
import level3 from "./levels/level1/mission3";
|
||||
// import { loadTriggers } from "./triggers";
|
||||
|
||||
const mindKeeper = new Mindkeeper(world);
|
||||
@@ -51,40 +44,89 @@ async function resetLightPath() {
|
||||
world.getDimension("overworld").runCommand("/fill 2467 9 87 2468 9 105 air");
|
||||
}
|
||||
|
||||
let introToGlassBreakTimer: number = 0;
|
||||
const glassBreakTime = 2 * TicksPerSecond;
|
||||
|
||||
let isIntroToLevel1Sqeuence = false;
|
||||
|
||||
let introTrail: Trail = new Trail("introTrail", 2, 4);
|
||||
introTrail.fromTrail(startTrail);
|
||||
|
||||
let introToLevelTrail = new Trail("introToLevelTrail", 2, 2);
|
||||
introToLevelTrail.fromTrail(IntroToLevel1Trail);
|
||||
|
||||
const DEVELOPER_MODE = true;
|
||||
let tickCounter = 0;
|
||||
system.runInterval(() => {
|
||||
system.runInterval(async () => {
|
||||
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) {
|
||||
case 0:
|
||||
// Show goto airlock text
|
||||
Pupeteer.setActionBar("Go to the airlock");
|
||||
introTrail.spawnNext();
|
||||
break;
|
||||
case 1:
|
||||
Pupeteer.setActionBar("Enter the airlock");
|
||||
// Show Enter airlock text
|
||||
break;
|
||||
case 2:
|
||||
levelIntro.update();
|
||||
break;
|
||||
case 3:
|
||||
if (!isIntroToLevel1Sqeuence) {
|
||||
isIntroToLevel1Sqeuence = true;
|
||||
world.sendMessage("Intro to level1 sequence start");
|
||||
await lightUpPath();
|
||||
await randomExplosions();
|
||||
blowUpDoor();
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
introToGlassBreakTimer++;
|
||||
world.sendMessage("Glass break timer: " + introToGlassBreakTimer);
|
||||
if (introToGlassBreakTimer > glassBreakTime) {
|
||||
introToGlassBreakTimer = 0;
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
}
|
||||
case 4:
|
||||
// Show Goto Level 1
|
||||
if (glassWindowState == GlassWindowState.Fixed) {
|
||||
glassWindowState = GlassWindowState.Broken;
|
||||
system.run(async () => {
|
||||
world.sendMessage("Breaking glass");
|
||||
await delay(10);
|
||||
breakGlassWindow();
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
introToLevelTrail.spawnNext();
|
||||
Pupeteer.setActionBar("Follow the path to the temple");
|
||||
break;
|
||||
case 6:
|
||||
level1.update();
|
||||
break;
|
||||
case 7:
|
||||
level2.update();
|
||||
break;
|
||||
case 8:
|
||||
level3.update();
|
||||
break;
|
||||
case 9:
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
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();
|
||||
});
|
||||
@@ -102,55 +144,6 @@ async function lightUpPath() {
|
||||
// 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);
|
||||
if (!block) return;
|
||||
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);
|
||||
@@ -167,7 +160,7 @@ world.beforeEvents.itemUseOn.subscribe((event) => {
|
||||
triggerManager.OnItemUse(event);
|
||||
});
|
||||
|
||||
function randomExplosions() {
|
||||
async function randomExplosions() {
|
||||
let pos1 = vector3(2465, 10, 82);
|
||||
let pos2 = vector3(2471, 18, 90);
|
||||
|
||||
@@ -201,7 +194,7 @@ function restoreDoor() {
|
||||
world.getDimension("overworld").runCommandAsync("/clone 2463 -30 81 2470 -23 87 2463 10 81");
|
||||
}
|
||||
|
||||
world.afterEvents.chatSend.subscribe((event: ChatSendAfterEvent) => {
|
||||
world.afterEvents.chatSend.subscribe(async (event: ChatSendAfterEvent) => {
|
||||
const command = event.message.split(" ")[0];
|
||||
|
||||
trailMaker.OnChat(event);
|
||||
@@ -210,6 +203,22 @@ world.afterEvents.chatSend.subscribe((event: ChatSendAfterEvent) => {
|
||||
|
||||
if (command === "!reset") {
|
||||
world.sendMessage("Resetting");
|
||||
|
||||
mindKeeper.set(CURRENT_LEVEL, 0);
|
||||
|
||||
restoreDoor();
|
||||
resetAirLock();
|
||||
restoreGlassWindow(true);
|
||||
|
||||
resetLightPath();
|
||||
|
||||
levelIntro.reset();
|
||||
level1.reset();
|
||||
level2.reset();
|
||||
|
||||
//Reset the combination to a random squence
|
||||
|
||||
isIntroToLevel1Sqeuence = false;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -231,6 +240,82 @@ class ClonePos {
|
||||
}
|
||||
}
|
||||
|
||||
enum GlassWindowState {
|
||||
Broken,
|
||||
Fixed,
|
||||
}
|
||||
|
||||
enum AirLockState {
|
||||
Open,
|
||||
Closed,
|
||||
}
|
||||
|
||||
enum AirLockChamberState {
|
||||
Full,
|
||||
Empty,
|
||||
}
|
||||
|
||||
enum ExplosiveDoorState {
|
||||
Closed,
|
||||
Open,
|
||||
}
|
||||
|
||||
let glassWindowState: GlassWindowState = GlassWindowState.Fixed;
|
||||
let explosiveDoorState: ExplosiveDoorState = ExplosiveDoorState.Closed;
|
||||
|
||||
const doorRoot: Vector3 = vector3(2465, 11, 94);
|
||||
|
||||
const glassWindowClonePos: ClonePos = {
|
||||
point1: vector3(2465, 14, 94),
|
||||
point2: vector3(2470, 11, 94),
|
||||
};
|
||||
|
||||
const glassBreakingFrames: ClonePos[] = [
|
||||
///fill 2465 7 94 2470 4 94
|
||||
{
|
||||
point1: vector3(2465, 7, 94),
|
||||
point2: vector3(2470, 4, 94),
|
||||
},
|
||||
//fill 2465 0 94 2470 -3 94
|
||||
{
|
||||
point1: vector3(2465, 0, 94),
|
||||
point2: vector3(2470, -3, 94),
|
||||
},
|
||||
{
|
||||
//fill 2465 -7 94 2470 -10 94
|
||||
point1: vector3(2465, -7, 94),
|
||||
point2: vector3(2470, -10, 94),
|
||||
},
|
||||
//fill 2465 -14 94 2470 -17 94
|
||||
{
|
||||
point1: vector3(2465, -14, 94),
|
||||
point2: vector3(2470, -17, 94),
|
||||
},
|
||||
//fill 2465 -21 94 2470 -24 94
|
||||
{
|
||||
point1: vector3(2465, -21, 94),
|
||||
point2: vector3(2470, -24, 94),
|
||||
},
|
||||
];
|
||||
|
||||
const crackedGlass: string = "cc:cracked_glass";
|
||||
Commands.register(PREFIX, "breakGlass", (arg) => {
|
||||
breakGlassWindow();
|
||||
glassWindowState = GlassWindowState.Broken;
|
||||
});
|
||||
Commands.register(PREFIX, "restoreGlass", (arg) => {
|
||||
restoreGlassWindow();
|
||||
glassWindowState = GlassWindowState.Fixed;
|
||||
});
|
||||
|
||||
async function breakGlassWindow() {
|
||||
playAnimation(glassBreakingFrames, 5, false, doorRoot);
|
||||
glassWindowState = GlassWindowState.Broken;
|
||||
}
|
||||
async function restoreGlassWindow(force: boolean = false) {
|
||||
playAnimation(glassBreakingFrames, 5, true, doorRoot, force);
|
||||
}
|
||||
|
||||
const FrontAirLockOpenFrames: ClonePos[] = [
|
||||
{
|
||||
point1: vector3(2476, 9, 94),
|
||||
@@ -309,16 +394,6 @@ async function CycleAirLockWater(fill: boolean, delayTime: number) {
|
||||
animationPlaying = false;
|
||||
}
|
||||
|
||||
enum AirLockState {
|
||||
Open,
|
||||
Closed,
|
||||
}
|
||||
|
||||
enum AirLockChamberState {
|
||||
Full,
|
||||
Empty,
|
||||
}
|
||||
|
||||
let frontAirlockState: AirLockState = AirLockState.Closed;
|
||||
let backAirlockState: AirLockState = AirLockState.Closed;
|
||||
|
||||
@@ -340,6 +415,12 @@ triggerManager.RegisterFunctionTrigger("FrontAirLockOutside", async (event) => {
|
||||
}
|
||||
});
|
||||
|
||||
triggerManager.RegisterFunctionTrigger("TempleFrontDoor", async (event) => {
|
||||
if (mindKeeper.get(CURRENT_LEVEL) == 5) {
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
}
|
||||
});
|
||||
|
||||
//Player enters FrontAirLockInside
|
||||
//Front door closes
|
||||
//Water drains
|
||||
@@ -406,7 +487,7 @@ Commands.register(PREFIX, "restore", (arg) => {
|
||||
restoreDoor();
|
||||
});
|
||||
|
||||
Commands.register(PREFIX, "resetAirlock", (arg) => {
|
||||
function resetAirLock() {
|
||||
SetFrontDoorClosed();
|
||||
SetBackDoorClosed();
|
||||
FillAirlockWater();
|
||||
@@ -414,8 +495,10 @@ Commands.register(PREFIX, "resetAirlock", (arg) => {
|
||||
frontAirlockState = AirLockState.Closed;
|
||||
backAirlockState = AirLockState.Closed;
|
||||
chamberState = AirLockChamberState.Full;
|
||||
});
|
||||
// }
|
||||
glassWindowState = GlassWindowState.Fixed;
|
||||
}
|
||||
|
||||
Commands.register(PREFIX, "resetAirlock", (arg) => resetAirLock);
|
||||
|
||||
let frontDoorRoot: Vector3 = vector3(2474, 11, 94);
|
||||
let backDoorRoot: Vector3 = vector3(2472, 11, 100);
|
||||
@@ -424,7 +507,12 @@ const frameDuration = 7;
|
||||
|
||||
let SetFrontDoorClosed = () => SetFrame(FrontAirLockOpenFrames[0], frontDoorRoot);
|
||||
let SetFrontDoorOpen = () => SetFrame(FrontAirLockOpenFrames[FrontAirLockOpenFrames.length - 1], frontDoorRoot);
|
||||
let PlayFrontDoorOpenAnimation = async () => playAnimation(FrontAirLockOpenFrames, frameDuration, false, frontDoorRoot);
|
||||
let PlayFrontDoorOpenAnimation = async () => {
|
||||
playAnimation(FrontAirLockOpenFrames, frameDuration, false, frontDoorRoot);
|
||||
if (mindKeeper.get(CURRENT_LEVEL) == 0) {
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
}
|
||||
};
|
||||
let PlayFrontDoorCloseAnimation = async () => playAnimation(FrontAirLockOpenFrames, frameDuration, true, frontDoorRoot);
|
||||
|
||||
let SetBackDoorClosed = () => SetFrame(BackAirLockOpenFrames[0], backDoorRoot);
|
||||
@@ -433,7 +521,12 @@ let PlayBackDoorOpenAnimation = async () => playAnimation(BackAirLockOpenFrames,
|
||||
let PlayBackDoorCloseAnimation = async () => playAnimation(BackAirLockOpenFrames, frameDuration, true, backDoorRoot);
|
||||
|
||||
let FillAirlockWater = async () => CycleAirLockWater(true, frameDuration / 1.5);
|
||||
let EmptyAirlockWater = async () => CycleAirLockWater(false, frameDuration / 1.5);
|
||||
let EmptyAirlockWater = async () => {
|
||||
await CycleAirLockWater(false, frameDuration / 1.5);
|
||||
if (mindKeeper.get(CURRENT_LEVEL) == 1) {
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
}
|
||||
};
|
||||
|
||||
triggerManager.RegisterFunctionTrigger("openFrontDoor", (event) => PlayFrontDoorOpenAnimation());
|
||||
triggerManager.RegisterFunctionTrigger("closeFrontDoor", (event) => PlayFrontDoorCloseAnimation());
|
||||
@@ -455,13 +548,21 @@ async function SetFrame(frame: ClonePos, destination: Vector3) {
|
||||
}
|
||||
|
||||
let animationPlaying = false;
|
||||
async function playAnimation(frames: ClonePos[], delayTime: number, reverse: boolean, destination: Vector3) {
|
||||
if (animationPlaying) {
|
||||
async function playAnimation(
|
||||
frames: ClonePos[],
|
||||
delayTime: number,
|
||||
reverse: boolean,
|
||||
destination: Vector3,
|
||||
force: boolean = false
|
||||
) {
|
||||
if (animationPlaying && !force) {
|
||||
world.sendMessage("Animation already playing");
|
||||
return;
|
||||
}
|
||||
let frameCount = frames.length;
|
||||
animationPlaying = true;
|
||||
if (!force) {
|
||||
animationPlaying = true;
|
||||
}
|
||||
|
||||
for (let i = 0; i < frameCount; i++) {
|
||||
let frame = reverse ? frames[frameCount - i - 1] : frames[i];
|
||||
@@ -474,5 +575,15 @@ async function playAnimation(frames: ClonePos[], delayTime: number, reverse: boo
|
||||
);
|
||||
await delay(delayTime);
|
||||
}
|
||||
animationPlaying = false;
|
||||
if (!force) {
|
||||
animationPlaying = false;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user