This commit is contained in:
2024-08-21 16:15:22 +02:00
parent cd5f473460
commit 35af9ffc97
38 changed files with 1122 additions and 1090 deletions

View File

@@ -10,9 +10,9 @@ import {
} from "@minecraft/server";
import { Mindkeeper, StoreType } from "./Commandeer/mindKeeper";
import Pupeteer from "./Commandeer/pupeteer";
import { Vector3ToCommandString, Vector3ToFancyString, vector3 } from "./Commandeer/utils/vectorUtils";
import { Vector3Add, Vector3ToCommandString, Vector3ToFancyString, vector3 } from "./Commandeer/utils/vectorUtils";
import { delay } from "./Commandeer/utils/waitUtil";
import { spawnParticle } from "./Commandeer/utils/particleUtils";
import { PARTICLES, spawnParticle } from "./Commandeer/utils/particleUtils";
import { TrailMaker } from "./Commandeer/trail/trailMaker";
import * as CCTrigger from "./Commandeer/Trigger/CCTrigger";
import { Commands } from "./Commandeer/command/command";
@@ -20,10 +20,28 @@ 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 { MinecraftBlockTypes } from "./vanilla-data/mojang-block";
import mission1part1 from "./levels/mission1/mission1part1";
import mission1part2 from "./levels/mission1/mission1part2";
import mission1part3 from "./levels/mission1/mission1part3";
import mission2part1 from "./levels/mission2/mission2part1";
import { mission2part1Conditions } from "./levelConditions/mission2part1Conditions";
import mission2part2 from "./levels/mission2/mission2part2";
import { mission2part2Conditions } from "./levelConditions/mission2part2Conditions";
import Chalk from "./Commandeer/chalk";
import mission3part1 from "./levels/mission3/mission3part1";
import mission3part2 from "./levels/mission3/mission3part2";
import mission3part3 from "./levels/mission3/mission3part3";
import { runEntityEventOnTag, setNPCDialog } from "./Commandeer/utils/entityUtils";
import {
animationPlaying,
ClonePos,
playAnimation,
setAmimationPlaying,
SetFrame,
} from "./Commandeer/animations/animation";
import { doNothingStupidTSIWantFilesNotAGiantAssMainFile } from "./triggers";
import { clearWall, fillWall, Wall } from "./Commandeer/utils/levelUtils";
// import { loadTriggers } from "./triggers";
const mindKeeper = new Mindkeeper(world);
@@ -46,7 +64,7 @@ async function resetLightPath() {
}
let introToGlassBreakTimer: number = 0;
const glassBreakTime = 2 * TicksPerSecond;
const glassBreakTime = 5 * TicksPerSecond;
let isIntroToLevel1Sqeuence = false;
@@ -56,6 +74,14 @@ introTrail.fromTrail(startTrail);
let introToLevelTrail = new Trail("introToLevelTrail", 2, 2);
introToLevelTrail.fromTrail(IntroToLevel1Trail);
//fill 2466 0 48 2469 -1 48
let bilalBlock: Wall = {
startPos: vector3(2466, 0, 48),
endPos: vector3(2469, -1, 48),
};
// spawn a sphere of particle
const DEVELOPER_MODE = true;
let tickCounter = 0;
system.runInterval(async () => {
@@ -70,59 +96,89 @@ system.runInterval(async () => {
switch (currentLevel) {
case 0:
// Show goto airlock text
Pupeteer.setActionBar("Go to the airlock");
Pupeteer.setActionBar("%message.goto.airlock");
introTrail.spawnNext();
break;
case 1:
Pupeteer.setActionBar("Enter the airlock");
// Show Enter airlock text
Pupeteer.setActionBar("%message.enter.airlock");
break;
case 2:
levelIntro.update();
Pupeteer.setActionBar("%message.talkto.chanel");
//Wait for the scriptevent cc:startIntro
break;
case 3:
levelIntro.update();
break;
case 4:
if (!isIntroToLevel1Sqeuence) {
isIntroToLevel1Sqeuence = true;
world.sendMessage("Intro to level1 sequence start");
// world.sendMessage("Intro to level1 sequence start");
await lightUpPath();
await randomExplosions();
blowUpDoor();
mindKeeper.increment(CURRENT_LEVEL);
triggerAlarm();
}
break;
case 4:
case 5:
introToGlassBreakTimer++;
world.sendMessage("Glass break timer: " + introToGlassBreakTimer);
// world.sendMessage("Glass break timer: " + introToGlassBreakTimer);
if (introToGlassBreakTimer > glassBreakTime) {
introToGlassBreakTimer = 0;
mindKeeper.increment(CURRENT_LEVEL);
}
case 4:
case 6:
// Show Goto Level 1
if (glassWindowState == GlassWindowState.Fixed) {
glassWindowState = GlassWindowState.Broken;
system.run(async () => {
world.sendMessage("Breaking glass");
if (DEVELOPER_MODE) {
world.sendMessage("Breaking glass");
}
await delay(10);
breakGlassWindow();
await breakGlassWindow();
mindKeeper.increment(CURRENT_LEVEL);
setNPCDialog("chanel1", "chanel_goto_temple");
});
}
break;
case 5:
introToLevelTrail.spawnNext();
Pupeteer.setActionBar("Follow the path to the temple");
break;
case 6:
level1.update();
break;
case 7:
level2.update();
introToLevelTrail.spawnNext();
Pupeteer.setActionBar("%message.follow.path.temple");
//Talk to Bilal
break;
case 8:
level3.update();
Pupeteer.setActionBar("%message.goto.temple");
//Talk to Suki
break;
case 9:
mission1part1.update();
break;
case 10:
mission1part2.update();
break;
case 11:
mission1part3.update();
break;
case 12:
Pupeteer.setActionBar("%message.goto.level2");
case 13:
mission2part1.update();
break;
case 14:
mission2part2.update();
break;
case 15:
mission3part1.update();
break;
case 15:
mission3part2.update();
break;
case 16:
mission3part3.update();
break;
case 17:
Pupeteer.setActionBar("Goto the door");
break;
}
}
@@ -146,7 +202,9 @@ async function lightUpPath() {
// let pos2 = vector3(2468, 9, 105);
}
//iojediojaiw
let triggerAlarm = () => runEntityEventOnTag("alarmLights", "cc:add_rotating");
let resetAlarm = () => runEntityEventOnTag("alarmLights", "cc:remove_rotating");
world.afterEvents.worldInitialize.subscribe(() => {
mindKeeper.registerStore(CURRENT_LEVEL, StoreType.number);
@@ -156,6 +214,8 @@ world.afterEvents.worldInitialize.subscribe(() => {
mindKeeper.registerToWorld();
triggerManager.Load();
doNothingStupidTSIWantFilesNotAGiantAssMainFile();
// loadCommands();
});
@@ -190,11 +250,15 @@ let doorSize = vector3(7, 7, 7);
///clone 2463 -30 81 2470 -23 87 2463 10 81
function blowUpDoor() {
world.sendMessage("Blowing up door");
if (DEVELOPER_MODE) {
world.sendMessage("Blowing up door");
}
world.getDimension("overworld").runCommand("/clone 2463 -10 81 2470 -3 87 2463 10 81");
}
function restoreDoor() {
world.sendMessage("Restoring door");
if (DEVELOPER_MODE) {
world.sendMessage("Restoring door");
}
world.getDimension("overworld").runCommandAsync("/clone 2463 -30 81 2470 -23 87 2463 10 81");
}
@@ -217,11 +281,24 @@ world.afterEvents.chatSend.subscribe(async (event: ChatSendAfterEvent) => {
resetLightPath();
levelIntro.reset();
level1.reset();
level2.reset();
mission1part1.reset();
mission1part2.reset();
mission1part3.reset();
mission2part1.reset();
mission2part2.reset();
//Reset the combination to a random squence
resetAlarm();
deactivateAirlockLights();
setNPCDialog("chanel1", "chanel_greeting_1");
setNPCDialog("bilal1", "bilal_greeting_1");
setNPCDialog("suki1", "suki_greeting_1");
fillWall(bilalBlock, MinecraftBlockTypes.Barrier);
isIntroToLevel1Sqeuence = false;
}
});
@@ -229,20 +306,88 @@ world.afterEvents.chatSend.subscribe(async (event: ChatSendAfterEvent) => {
system.afterEvents.scriptEventReceive.subscribe((event) => {
if (event.id == "cc:getId") {
let id = event.message;
world.sendMessage("Script got the id " + id);
if (DEVELOPER_MODE) {
world.sendMessage("Script got the id " + id);
}
mindKeeper.set(AGENT_ID, id);
}
if (event.id == "cc:startIntro") {
if (mindKeeper.get(CURRENT_LEVEL) == 2) {
mindKeeper.increment(CURRENT_LEVEL);
} else {
if (DEVELOPER_MODE) {
world.sendMessage("Intro already started?");
}
}
}
if (event.id == "cc:startTemple") {
if (mindKeeper.get(CURRENT_LEVEL) == 7) {
mindKeeper.increment(CURRENT_LEVEL);
fillWall(bilalBlock, MinecraftBlockTypes.Air);
}
}
if (event.id == "cc:startLevel1") {
if (mindKeeper.get(CURRENT_LEVEL) == 8) {
mindKeeper.increment(CURRENT_LEVEL);
}
}
if (event.id == "cc:afterLevel1") {
}
});
class ClonePos {
point1: Vector3;
point2: Vector3;
Commands.register(PREFIX, "fien", (arg) => {
system.run(() => {
arg.player.teleport(vector3(2468, 11, 114));
});
});
constructor(point1: Vector3, point2: Vector3) {
this.point1 = point1;
this.point2 = point2;
Commands.register(PREFIX, "openDoor", () => openDoor());
Commands.register(PREFIX, "closeDoor", () => closeDoor());
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.3");
world.sendMessage("Engine is running, duh :)");
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();
})();
});
let openDoor = () => {
runEntityEventOnTag("door", "cc:add_open");
if (DEVELOPER_MODE) {
world.sendMessage("Opening door");
}
}
};
let closeDoor = () => {
runEntityEventOnTag("door", "cc:remove_open");
if (DEVELOPER_MODE) {
world.sendMessage("Closing door");
}
};
Commands.register(PREFIX, "restore", (arg) => {
restoreDoor();
});
//#region Airlock
enum GlassWindowState {
Broken,
@@ -302,24 +447,6 @@ const glassBreakingFrames: ClonePos[] = [
},
];
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),
@@ -377,12 +504,29 @@ const AirLockWaterFrames: ClonePos[] = [
},
];
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);
}
async function CycleAirLockWater(fill: boolean, delayTime: number) {
if (animationPlaying) {
world.sendMessage("Animation already playing");
return;
}
animationPlaying = true;
setAmimationPlaying(true);
let frameCount = AirLockWaterFrames.length;
for (let i = 0; i < frameCount; i++) {
@@ -395,7 +539,7 @@ async function CycleAirLockWater(fill: boolean, delayTime: number) {
);
await delay(delayTime);
}
animationPlaying = false;
setAmimationPlaying(false);
}
let frontAirlockState: AirLockState = AirLockState.Closed;
@@ -408,7 +552,9 @@ let chamberState: AirLockChamberState = AirLockChamberState.Full;
//Front door opens
triggerManager.RegisterFunctionTrigger("FrontAirLockOutside", async (event) => {
if (chamberState == AirLockChamberState.Empty) {
world.sendMessage("Filling airlock");
if (DEVELOPER_MODE) {
world.sendMessage("Filling airlock");
}
await FillAirlockWater();
chamberState = AirLockChamberState.Full;
}
@@ -420,8 +566,13 @@ triggerManager.RegisterFunctionTrigger("FrontAirLockOutside", async (event) => {
});
triggerManager.RegisterFunctionTrigger("TempleFrontDoor", async (event) => {
if (mindKeeper.get(CURRENT_LEVEL) == 5) {
if (mindKeeper.get(CURRENT_LEVEL) == 8) {
mindKeeper.increment(CURRENT_LEVEL);
closeDoor();
}
if (mindKeeper.get(CURRENT_LEVEL) == 15) {
openDoor();
}
});
@@ -435,8 +586,10 @@ triggerManager.RegisterFunctionTrigger("FrontAirLockInside", async (event) => {
frontAirlockState = AirLockState.Closed;
}
if (chamberState == AirLockChamberState.Full) {
await delay(7);
activateAirlockLights();
await delay(50);
await EmptyAirlockWater();
deactivateAirlockLights();
chamberState = AirLockChamberState.Empty;
}
@@ -458,38 +611,10 @@ triggerManager.RegisterFunctionTrigger("BackAirLockOutside", async (event) => {
}
});
// function loadCommands() {
Commands.register(PREFIX, "fien", (arg) => {
system.run(() => {
arg.player.teleport(vector3(2468, 11, 114));
});
});
//#endregion Airlock
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", (arg) => {
restoreDoor();
});
let activateAirlockLights = () => runEntityEventOnTag("airlockLights", "cc:add_rotating");
let deactivateAirlockLights = () => runEntityEventOnTag("airlockLights", "cc:remove_rotating");
function resetAirLock() {
SetFrontDoorClosed();
@@ -540,54 +665,3 @@ triggerManager.RegisterFunctionTrigger("closeBackDoor", (event) => PlayBackDoorC
triggerManager.RegisterFunctionTrigger("fillAirlock", (event) => FillAirlockWater());
triggerManager.RegisterFunctionTrigger("emptyAirlock", (event) => EmptyAirlockWater());
async function SetFrame(frame: ClonePos, destination: Vector3) {
await world
.getDimension("overworld")
.runCommandAsync(
`/clone ${Vector3ToCommandString(frame.point1)} ${Vector3ToCommandString(frame.point2)} ${Vector3ToCommandString(
destination
)}`
);
}
let animationPlaying = false;
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;
if (!force) {
animationPlaying = true;
}
for (let i = 0; i < frameCount; i++) {
let frame = reverse ? frames[frameCount - i - 1] : frames[i];
await world
.getDimension("overworld")
.runCommandAsync(
`/clone ${Vector3ToCommandString(frame.point1)} ${Vector3ToCommandString(
frame.point2
)} ${Vector3ToCommandString(destination)}`
);
await delay(delayTime);
}
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);
}
});