This commit is contained in:
2024-08-05 10:12:32 +02:00
parent ba384d79d8
commit 61c5a0e489
20 changed files with 1035 additions and 189 deletions

View File

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