Before Format Wars

This commit is contained in:
2024-08-29 10:45:07 +02:00
parent 35af9ffc97
commit 545e47a9f3
20 changed files with 1243 additions and 399 deletions

View File

@@ -208,9 +208,298 @@
} }
] ]
}, },
"commands": ["/scriptevent cc:StartLevel1"] "commands": ["/scriptevent cc:startLevel1"]
} }
] ]
},
{
"scene_tag": "suki_afterlevel_1_1",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.suki"
}
]
},
"text": {
"rawtext": [
{
"translate": "suki.afterlevel.1.1.text",
"with": ["\n"]
}
]
},
"buttons": [
{
"name": {
"rawtext": [
{
"translate": "suki.afterlevel.1.1.button"
}
]
},
"commands": ["/dialogue open @e[tag=suki1] @initiator suki_afterlevel_1_2"]
}
]
},
{
"scene_tag": "suki_afterlevel_1_2",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.suki"
}
]
},
"text": {
"rawtext": [
{
"translate": "suki.afterlevel.1.2.text",
"with": ["\n"]
}
]
},
"buttons": [
{
"name": {
"rawtext": [
{
"translate": "suki.afterlevel.1.2.button"
}
]
},
"commands": ["/dialogue open @e[tag=suki1] @initiator suki_afterlevel_1_3"]
}
]
},
{
"scene_tag": "suki_afterlevel_1_3",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.suki"
}
]
},
"text": {
"rawtext": [
{
"translate": "suki.afterlevel.1.3.text",
"with": ["\n"]
}
]
},
"buttons": [
{
"name": {
"rawtext": [
{
"translate": "suki.afterlevel.1.3.button"
}
]
},
"commands": ["/scriptevent cc:afterLevel1"]
}
]
},
{
"scene_tag": "suki_afterlevel_2_1_intermezzo",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.suki"
}
]
},
"text": {
"rawtext": [
{
"translate": "suki.afterlevel.2.1.intermezzo.1.text",
"with": ["\n"]
}
]
},
"buttons": [
{
"name": {
"rawtext": [
{
"translate": "suki.afterlevel.2.1.intermezzo.1.text"
}
]
},
"commands": ["/scriptevent cc:level2Intermezzo"]
}
]
},
{
"scene_tag": "suki_afterlevel_2_1",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.suki"
}
]
},
"text": {
"rawtext": [
{
"translate": "suki.afterlevel.2.1.text",
"with": ["\n"]
}
]
},
"buttons": [
{
"name": {
"rawtext": [
{
"translate": "suki.afterlevel.2.1.button"
}
]
},
"commands": ["/dialogue open @e[tag=suki1] @initiator suki_afterlevel_2_2"]
}
]
},
{
"scene_tag": "suki_afterlevel_2_2",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.suki"
}
]
},
"text": {
"rawtext": [
{
"translate": "suki.afterlevel.2.2.text",
"with": ["\n"]
}
]
},
"buttons": [
{
"name": {
"rawtext": [
{
"translate": "suki.afterlevel.2.2.button"
}
]
},
"commands": ["/dialogue open @e[tag=suki1] @initiator suki_afterlevel_2_3"]
}
]
},
{
"scene_tag": "suki_afterlevel_2_3",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.suki"
}
]
},
"text": {
"rawtext": [
{
"translate": "suki.afterlevel.2.3.text",
"with": ["\n"]
}
]
},
"buttons": [
{
"name": {
"rawtext": [
{
"translate": "suki.afterlevel.2.3.button"
}
]
},
"commands": ["/scriptevent cc:afterLevel2"]
}
]
},
{
"scene_tag": "suki_afterlevel_3_1",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.suki"
}
]
},
"text": {
"rawtext": [
{
"translate": "suki.afterlevel.3.1.text",
"with": ["\n"]
}
]
},
"buttons": [
{
"name": {
"rawtext": [
{
"translate": "suki.afterlevel.3.1.button"
}
]
},
"commands": ["/scriptevent cc:afterLevel3"]
}
]
},
{
"scene_tag": "bilal_end_1",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.bilal"
}
]
},
"text": {
"rawtext": [
{
"translate": "bilal.end.1.text",
"with": ["\n"]
}
]
},
"buttons": [
{
"name": {
"rawtext": [
{
"translate": "bilal.end.1.button"
}
]
},
"commands": ["/dialogue change @e[tag=bilal1] @initiator bilal_end_2"]
}
]
},
{
"scene_tag": "bilal_end_2",
"npc_name": {
"rawtext": [
{
"translate": "npc.name.bilal"
}
]
},
"text": {
"rawtext": [
{
"translate": "bilal.end.2.text",
"with": ["\n"]
}
]
},
"buttons": []
} }
] ]
} }

View File

@@ -13,7 +13,8 @@ const behavior_pack_authors = ["Me and my cat"];
// === Optional variables // === Optional variables
const exportWorldFolderPath = ""; const exportWorldFolderPath =
"/Users/Bram/AppData/Local/Packages/Microsoft.MinecraftEducationEdition_8wekyb3d8bbwe/LocalState/games/com.mojang/minecraftWorlds/cH+wZocbAQA=";
// === END CONFIGURABLE VARIABLES // === END CONFIGURABLE VARIABLES
@@ -27,6 +28,7 @@ const zip = require("gulp-zip");
const fs = require("fs"); const fs = require("fs");
const rename = require("gulp-rename"); const rename = require("gulp-rename");
const crypto = require("crypto"); const crypto = require("crypto");
var argv = require("yargs").argv;
var readLineSync = import("readline-sync"); var readLineSync = import("readline-sync");
var NBT = import("nbtify"); var NBT = import("nbtify");
@@ -40,6 +42,13 @@ const storeVersionMojangRoot =
const mcdir = isStoreVersion ? storeVersionMojangRoot : regularVersionMojangRoot; const mcdir = isStoreVersion ? storeVersionMojangRoot : regularVersionMojangRoot;
const addEducationJson = argv.addEducation || false;
const educationFileTemplate = "./education.json";
const parameterWorldName = argv.worldname || argv.worldName || bpfoldername;
const releaseVersion = argv.production || false;
function clean_build(callbackFunction) { function clean_build(callbackFunction) {
del(["build/behavior_packs/", "build/resource_packs/"]).then( del(["build/behavior_packs/", "build/resource_packs/"]).then(
(value) => { (value) => {
@@ -327,7 +336,7 @@ hasZipped = false;
function rename_zip_to_mcworld(cb) { function rename_zip_to_mcworld(cb) {
gulp gulp
.src(["export/export.zip"]) .src(["export/export.zip"])
.pipe(rename(bpfoldername + ".mcworld")) .pipe(rename(parameterWorldName + ".mcworld"))
.pipe(gulp.dest("export/")); .pipe(gulp.dest("export/"));
cb(); cb();
} }
@@ -357,7 +366,7 @@ function add_version_to_world_name(cb) {
} }
function copy_build_resource_pack_to_export_folder(cb) { function copy_build_resource_pack_to_export_folder(cb) {
gulp return gulp
.src(["build/resource_packs/**/**"]) .src(["build/resource_packs/**/**"])
.pipe(gulp.dest("export/" + bpfoldername + "/resource_packs/" + bpfoldername)); .pipe(gulp.dest("export/" + bpfoldername + "/resource_packs/" + bpfoldername));
console.log( console.log(
@@ -368,14 +377,12 @@ function copy_build_resource_pack_to_export_folder(cb) {
"/resource_packs/" + "/resource_packs/" +
bpfoldername bpfoldername
); );
cb();
} }
function copy_build_behavior_pack_to_export_folder(cb) { function copy_build_behavior_pack_to_export_folder(cb) {
gulp return gulp
.src(["build/behavior_packs/**/**"]) .src(["build/behavior_packs/**/**"])
.pipe(gulp.dest("export/" + bpfoldername + "/behavior_packs/" + bpfoldername)); .pipe(gulp.dest("export/" + bpfoldername + "/behavior_packs/" + bpfoldername));
cb();
} }
function copy_world_to_export_folder(cb) { function copy_world_to_export_folder(cb) {
@@ -423,20 +430,36 @@ function get_worlds_paths_and_names(cb) {
} }
async function nbt_rename_world(cb) { async function nbt_rename_world(cb) {
if (releaseVersion) {
console.log("Release Version, skipping renaming of level.dat");
cb();
} else {
const NBT = await import("nbtify"); const NBT = await import("nbtify");
const { readFile, writeFile } = await import("fs/promises"); const { readFile, writeFile } = await import("fs/promises");
const buffer = await readFile("export/" + bpfoldername + "/level.dat"); const buffer = await readFile("export/" + bpfoldername + "/level.dat");
const data = await NBT.read(buffer); const data = await NBT.read(buffer);
let oldLevelName = data.data.LevelName; let oldLevelName = data.data.LevelName;
let newName = bpfoldername + " " + get_version(); let newName = bpfoldername + " " + get_version();
data.data.LevelName = newName; data.data.LevelName = newName;
const result = await NBT.write(data); const result = await NBT.write(data);
await writeFile("export/" + bpfoldername + "/level.dat", result); await writeFile("export/" + bpfoldername + "/level.dat", result);
console.log("Renamed " + oldLevelName + " to " + newName); console.log("Renamed " + oldLevelName + " to " + newName);
cb(); cb();
} }
}
function export_header(cb) {
console.log("Exporting World");
console.log("Is Production: " + releaseVersion);
console.log("World Name: " + parameterWorldName);
console.log("Add Education Json: " + addEducationJson);
cb();
}
function levelnametxt_rename(cb) { function levelnametxt_rename(cb) {
if (!releaseVersion) {
const { readFile, writeFile } = import("fs/promises"); const { readFile, writeFile } = import("fs/promises");
const levelNameFilePath = "export/" + bpfoldername + "/levelname.txt"; const levelNameFilePath = "export/" + bpfoldername + "/levelname.txt";
let levelName = fs.readFileSync(levelNameFilePath, "utf8"); let levelName = fs.readFileSync(levelNameFilePath, "utf8");
@@ -444,9 +467,23 @@ function levelnametxt_rename(cb) {
fs.writeFileSync(levelNameFilePath, newName); fs.writeFileSync(levelNameFilePath, newName);
console.log("Renamed " + levelName + " to " + newName); console.log("Renamed " + levelName + " to " + newName);
cb(); cb();
} else {
console.log("Release Version, skipping renaming of levelname.txt");
cb();
}
} }
// Setup functions function add_education_json_file(cb) {
if (addEducationJson) {
if (fs.existsSync(educationFileTemplate)) {
return gulp.src([educationFileTemplate]).pipe(gulp.dest("export/" + bpfoldername));
} else {
throw new Error("The file " + educationFileTemplate + " does not exist. But was specified to be added.");
}
} else {
cb();
}
}
function setup_behaviour_pack(cb) { function setup_behaviour_pack(cb) {
const manifestPath = "behavior_packs/manifest.json"; const manifestPath = "behavior_packs/manifest.json";
@@ -521,6 +558,17 @@ function get_uuid_for_type(cb, type) {
let get_behaviour_pack_uuid = (cb) => get_uuid_for_type(cb, "behaviour_pack"); let get_behaviour_pack_uuid = (cb) => get_uuid_for_type(cb, "behaviour_pack");
let get_resource_pack_uuid = (cb) => get_uuid_for_type(cb, "resource_pack"); let get_resource_pack_uuid = (cb) => get_uuid_for_type(cb, "resource_pack");
function help(cb) {
//Print help like what paramenters it takes
console.log("Help");
console.log("Parameters:");
console.log("addEducationJson: boolean");
console.log("worldName: string");
console.log("production: boolean");
cb();
}
exports.clean_build = clean_build; exports.clean_build = clean_build;
exports.copy_behavior_packs = copy_behavior_packs; exports.copy_behavior_packs = copy_behavior_packs;
exports.copy_resource_packs = copy_resource_packs; exports.copy_resource_packs = copy_resource_packs;
@@ -550,12 +598,14 @@ exports.compile_world = gulp.series(
); );
exports.zip = gulp.series(zip_world, rename_zip_to_mcworld); exports.zip = gulp.series(zip_world, rename_zip_to_mcworld);
exports.export = gulp.series( exports.export = gulp.series(
export_header,
clean_export, clean_export,
copy_world_to_export_folder, copy_world_to_export_folder,
build, build,
gulp.parallel(copy_build_behavior_pack_to_export_folder, copy_build_resource_pack_to_export_folder), gulp.parallel(copy_build_behavior_pack_to_export_folder, copy_build_resource_pack_to_export_folder),
levelnametxt_rename, levelnametxt_rename,
nbt_rename_world, nbt_rename_world,
add_education_json_file,
zip_world, zip_world,
rename_zip_to_mcworld rename_zip_to_mcworld
); );

750
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,8 @@
"nbtify": "^1.85.0", "nbtify": "^1.85.0",
"readline-sync": "^1.4.10", "readline-sync": "^1.4.10",
"source-map": "^0.7.4", "source-map": "^0.7.4",
"typescript": "^4.4.3" "typescript": "^4.4.3",
"yargs": "^17.7.2"
}, },
"scripts": { "scripts": {
"enablemcloopback": "CheckNetIsolation.exe LoopbackExempt -a -p=S-1-15-2-1958404141-86561845-1752920682-3514627264-368642714-62675701-733520436", "enablemcloopback": "CheckNetIsolation.exe LoopbackExempt -a -p=S-1-15-2-1958404141-86561845-1752920682-3514627264-368642714-62675701-733520436",

View File

@@ -9,6 +9,10 @@ message.enter.airlock=Enter the Airlock
message.follow.path.temple=Follow the path and talk to §6Bakker Bilal message.follow.path.temple=Follow the path and talk to §6Bakker Bilal
message.goto.temple=Go to the Temple and talk to §2Veteraan Suki message.goto.temple=Go to the Temple and talk to §2Veteraan Suki
message.goto.door=Go the Temple Door
message.goto.bilal=Go to Bakker §6Bakker Bilal
message.goto.level1=Go to Level 1 message.goto.level1=Go to Level 1
message.goto.level2=Go to Level 2 message.goto.level2=Go to Level 2
message.goto.level3=Go to Level 3 message.goto.level3=Go to Level 3
@@ -49,6 +53,7 @@ message.incorrect=§cIncorrect!§b
message.talkto.ramses=Talk to §dRamses message.talkto.ramses=Talk to §dRamses
message.talkto.chanel=Talk to §9Chanel message.talkto.chanel=Talk to §9Chanel
message.talkto.suki=Talk to §2Veteraan Suki
## Intro messages ## Intro messages
message.intro.started=Crack the Vault! message.intro.started=Crack the Vault!
@@ -130,3 +135,34 @@ suki.greeting.1.button=Zal ik doen!
suki.greeting.2.text=Je moet de agent door het parcours laten wandelen. Pas op, je mag niet boven lava gaan anders zal de agent doodgaan! Veel succes! suki.greeting.2.text=Je moet de agent door het parcours laten wandelen. Pas op, je mag niet boven lava gaan anders zal de agent doodgaan! Veel succes!
suki.greeting.2.button=Oké! suki.greeting.2.button=Oké!
suki.afterlevel.1.1.text=Goed gedaan! De agent is nu terug bij ons. Ga terug naar het leerplatform. Maar eerst: een weetje! Wist je dat de koralen hun kleur te danken hebben aan de algen die erin zitten? Die algen kunnen niet tegen een snelle stijging van watertemperatuur. Als de temperatuur stijgt, worden de algen afgestoten en verbleekt en sterft het koraal.
suki.afterlevel.1.1.button=Oké!
suki.afterlevel.1.2.text=Goed gedaan, de agent is vrij en terug bij ons! Nu moeten we het dode koraal vervangen door gezond koraal om de oceaan te redden. Dan zijn we weer een stap dichterbij hier ontsnappen.
suki.afterlevel.1.2.button=Hoe dan?
suki.afterlevel.1.3.text=Gebruik enkelvoudige en meervoudige selecties om de dode koralen te vervangen door levende koralen! Voor het eerste level moet je het volgende programmeren: Als de Agent op een blok rood dood koraal stap, dan plaatst hij een blok levend rood koraal.
suki.afterlevel.1.3.button=OK!
suki.afterlevel.2.1.intermezzo.1.text=Goed zo! Voor het tweede level wordt het terug een stuk moeilijker. Als de Agent op dood geel koraal stapt, dan plaats hij geel koraal. Anders als de Agent op dood rood koraal stapt, dan plaats bij rood koraal. Anders draait hij een toertje rond zijn as. (TODO)
suki.afterlevel.2.1.intermezzo.1.button=Ik Probeer!
suki.afterlevel.2.1.text=Goed gedaan! Je hebt het tweede level voltooid. Ga terug naar het leerplatform en vul de vraag in. Dan kan je starten met de deur te openen. Maar eerst nog een weetje! Wist je dat klimaatverandering de grootste bedreiging is voor koraalriffen? Daardoor stijgt de temperatuur en wordt het water zuurder. Daarnaast vormt ook overbevissing, vervuiling end e afvoer van landbouwgiffen een bedreiging.
suki.afterlevel.2.1.button=Wat Jammer!
suki.afterlevel.2.2.text=Ik heb even kunnen rondkijken en heb de uit knop van de deur gevonden! Hij is aan het einde van het parcours rechts in de tempel. Je zal de agent moeten sturen om dit te activeren!
suki.afterlevel.2.2.button=Hoe dan?
suki.afterlevel.2.3.text=Ik heb alvast wat code gemaakt om het door het parcours te geraken. Ik vrees dat ik niet zo een goede programmeur ben als jij. Er zitten nog wat bugs in. Kan jij deze oplossen en de agent bij de lever krijgen?
suki.afterlevel.2.3.button=Tuurlijk!
suki.afterlevel.3.1.text=Je hebt de deur open gekregen! We en de agent zijn vrij. Ga naar Bakker bilal om deze missie af te sluiten.
suki.afterlevel.3.1.button=Geweldig!
bilal.end.1.text=Je kan terug naar het leerplatform gaan. Dit was de laatste opdracht. Maar eerst; nog een weetje. Wist je dat men denkt dat op het einde van deze eeuw, meer dan 90 procent van alle koraalriffen verloren zullen gaan? Probeer dus jouw uitstoot te verminderen en zo de koralen te helpen.
bilal.end.1.button=Ja hé!
bilal.end.2.text=Bedankt om deze wereld een beetje beter te maken! You Rock!

View File

@@ -12,6 +12,7 @@ class AbstractAgentTrackMission extends Level {
constructor( constructor(
levelid: string, levelid: string,
agentStartPositon: Vector3, agentStartPositon: Vector3,
agentStartFacing: Vector3,
agentEndPosition: Vector3, agentEndPosition: Vector3,
startLevelCommandBlockPos: Vector3 startLevelCommandBlockPos: Vector3
) { ) {
@@ -20,7 +21,7 @@ class AbstractAgentTrackMission extends Level {
pupeteer.sendWorldMessage(`%message.${levelid}.started`); pupeteer.sendWorldMessage(`%message.${levelid}.started`);
pupeteer.setTitleTimed(`%message.${levelid}.name`, 2.5); pupeteer.setTitleTimed(`%message.${levelid}.name`, 2.5);
startLevel(startLevelCommandBlockPos); startLevel(startLevelCommandBlockPos);
teleportAgent(agentStartPositon); teleportAgent(agentStartPositon, agentStartFacing);
}, },
() => { () => {
pupeteer.setActionBar(`%message.${levelid}.make`); pupeteer.setActionBar(`%message.${levelid}.make`);

View File

@@ -1,6 +1,7 @@
import { MolangVariableMap, Vector3, world } from "@minecraft/server"; import { MolangVariableMap, Vector3, world } from "@minecraft/server";
import { Vector3Add } from "../utils/vectorUtils"; import { Vector3Add } from "../utils/vectorUtils";
import { TrailType } from "./trailTypes"; import { TrailType } from "./trailTypes";
import { PARTICLES, spawnParticle } from "../utils/particleUtils";
class TrailPoint { class TrailPoint {
postion: Vector3; postion: Vector3;
@@ -15,9 +16,7 @@ class TrailPoint {
// let spawnPosition: Vector3 = Vector3Add(this.postion, { x: 0.5, y: 0.5, z: 0.5 }); // let spawnPosition: Vector3 = Vector3Add(this.postion, { x: 0.5, y: 0.5, z: 0.5 });
let spawnPosition: Vector3 = this.postion; let spawnPosition: Vector3 = this.postion;
try { try {
world spawnParticle(spawnPosition, PARTICLES.balloon_gas_particle, new MolangVariableMap());
.getDimension("overworld")
.spawnParticle("minecraft:balloon_gas_particle", spawnPosition, new MolangVariableMap());
} catch (e) {} } catch (e) {}
} }
} }
@@ -40,19 +39,14 @@ class Trail {
addPoint(point: TrailPoint) { addPoint(point: TrailPoint) {
this.points.push(point); this.points.push(point);
//this could be a one liner, this.calculatedLength = this.points.length;
let maxlength: number = 0;
this.points.forEach((point) => {
if (point.index > maxlength) {
maxlength = point.index;
}
});
this.calculatedLength = maxlength;
} }
fromTrail(trail: TrailType) { fromTrail(trail: TrailType) {
let currentIndex = 0;
trail.points.forEach((point) => { trail.points.forEach((point) => {
this.addPoint(new TrailPoint(point.position, point.index)); this.addPoint(new TrailPoint(point.position, currentIndex));
currentIndex++;
}); });
} }
@@ -63,17 +57,19 @@ class Trail {
let pointsPerInterval = this.wrapIndex > 0 ? this.calculatedLength / this.wrapIndex : 0; let pointsPerInterval = this.wrapIndex > 0 ? this.calculatedLength / this.wrapIndex : 0;
this.points this.points
.filter((point) => { .filter((point) => {
return ( if (this.wrapIndex > 0) {
point.index === this.currentPoint || return point.index % this.wrapIndex == this.currentPoint;
(this.wrapIndex > 0 && point.index % pointsPerInterval === this.currentPoint) } else {
); return point.index == this.currentPoint;
}
}) })
.forEach((point) => { .forEach((point) => {
point.spawn(); point.spawn();
}); });
this.currentPoint++; this.currentPoint++;
if (this.currentPoint >= this.calculatedLength) { let actualLength = this.wrapIndex > 0 ? this.wrapIndex : this.calculatedLength;
if (this.currentPoint >= actualLength) {
this.currentPoint = 0; this.currentPoint = 0;
} }
} else { } else {

View File

@@ -1,5 +1,5 @@
import { Entity, Vector3, world } from "@minecraft/server"; import { Entity, Vector3, world } from "@minecraft/server";
import { Vector3ToString, vector3 } from "./vectorUtils"; import { Vector3Add, Vector3ToString, vector3 } from "./vectorUtils";
import { mindKeeper } from "../../main"; import { mindKeeper } from "../../main";
//Make a facing with vector3 //Make a facing with vector3
@@ -11,10 +11,11 @@ function teleportAgent(position: Vector3, facing: Vector3 = vector3(0, 0, 0)): v
.getDimension("overworld") .getDimension("overworld")
.runCommand(`/execute as @a run tp @e[type=agent] ${position.x} ${position.y} ${position.z}`); .runCommand(`/execute as @a run tp @e[type=agent] ${position.x} ${position.y} ${position.z}`);
} else { } else {
let facing2 = Vector3Add(position, facing);
world world
.getDimension("overworld") .getDimension("overworld")
.runCommand( .runCommand(
`/execute as @a run tp @e[type=agent] ${position.x} ${position.y} ${position.z} facing ${facing.x} ${facing.y} ${facing.z}` `/execute as @a run tp @e[type=agent] ${position.x} ${position.y} ${position.z} facing ${facing2.x} ${facing2.y} ${facing2.z}`
); );
} }
} }

View File

@@ -222,6 +222,12 @@ function spawnParticle(
return; return;
} }
map.setVector3("variable.direction", vector3(0, 0, 0)); map.setVector3("variable.direction", vector3(0, 0, 0));
// map.setFloat("Variable.r", 2);
map.setColorRGB("variable.color", {
red: 1,
green: 1,
blue: 1,
});
const dimension = world.getDimension("overworld"); const dimension = world.getDimension("overworld");
if (dimension) { if (dimension) {

View File

@@ -0,0 +1,89 @@
import { ClonePos } from "./Commandeer/animations/animation";
import { vector3 } from "./Commandeer/utils/vectorUtils";
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 FrontAirLockOpenFrames: ClonePos[] = [
{
point1: vector3(2476, 9, 94),
point2: vector3(2474, 7, 94),
},
{
point1: vector3(2476, 5, 94),
point2: vector3(2474, 3, 94),
},
{
point1: vector3(2476, 1, 94),
point2: vector3(2474, -1, 94),
},
{
point1: vector3(2476, -3, 94),
point2: vector3(2474, -5, 94),
},
];
const BackAirLockOpenFrames: ClonePos[] = [
{
point1: vector3(2472, 9, 100),
point2: vector3(2472, 7, 102),
},
{
point1: vector3(2472, 5, 100),
point2: vector3(2472, 3, 102),
},
{
point1: vector3(2472, 1, 100),
point2: vector3(2472, -1, 102),
},
{
point1: vector3(2472, -3, 100),
point2: vector3(2472, -5, 102),
},
];
const AirLockWaterFrames: ClonePos[] = [
{
point1: vector3(2473, 11, 95),
point2: vector3(2477, 11, 103),
},
{
point1: vector3(2473, 12, 95),
point2: vector3(2477, 12, 103),
},
{
point1: vector3(2473, 13, 95),
point2: vector3(2477, 13, 103),
},
{
point1: vector3(2473, 14, 95),
point2: vector3(2477, 14, 103),
},
];
export { glassBreakingFrames, FrontAirLockOpenFrames, BackAirLockOpenFrames, AirLockWaterFrames };

View File

@@ -30,9 +30,9 @@ let currentBlockSequence: string[] = [];
let currentBlockSeuqenceIndex: number[] = []; let currentBlockSeuqenceIndex: number[] = [];
const blockCycle: string[] = [ const blockCycle: string[] = [
MinecraftBlockTypes.RedstoneBlock, // MinecraftBlockTypes.RedstoneBlock,
MinecraftBlockTypes.GoldBlock, // MinecraftBlockTypes.GoldBlock,
MinecraftBlockTypes.DiamondBlock, // MinecraftBlockTypes.DiamondBlock,
MinecraftBlockTypes.EmeraldBlock, MinecraftBlockTypes.EmeraldBlock,
MinecraftBlockTypes.LapisBlock, MinecraftBlockTypes.LapisBlock,
]; ];

View File

@@ -5,11 +5,14 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
const Level1CommandBlockPos: Vector3 = vector3(2439, 0, 36); const Level1CommandBlockPos: Vector3 = vector3(2439, 0, 36);
const level1StartPosition: Vector3 = vector3(2451, -2, 57); const level1StartPosition: Vector3 = vector3(2451, -2, 57);
//Agent faces negative z
const level1AgentFacing: Vector3 = vector3(0, 0, -1);
const Level1EndPosition: Vector3 = vector3(2451, -2, 41); const Level1EndPosition: Vector3 = vector3(2451, -2, 41);
let mission1part1: AbstractAgentTrackMission = new AbstractAgentTrackMission( let mission1part1: AbstractAgentTrackMission = new AbstractAgentTrackMission(
"mission1part1", "mission1part1",
level1StartPosition, level1StartPosition,
level1AgentFacing,
Level1EndPosition, Level1EndPosition,
Level1CommandBlockPos Level1CommandBlockPos
); );

View File

@@ -5,6 +5,7 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
const Level2CommandBlockPos: Vector3 = vector3(2439, 0, 35); const Level2CommandBlockPos: Vector3 = vector3(2439, 0, 35);
const level2StartPosition: Vector3 = vector3(2446, -2, 40); const level2StartPosition: Vector3 = vector3(2446, -2, 40);
const level2AgentFacing: Vector3 = vector3(1, 0, 0);
const Level2EndPosition: Vector3 = vector3(2446, -2, 30); const Level2EndPosition: Vector3 = vector3(2446, -2, 30);
const level2ResetCommandBlockPos: Vector3 = vector3(56, 68, 211); const level2ResetCommandBlockPos: Vector3 = vector3(56, 68, 211);
@@ -12,6 +13,7 @@ const level2ResetCommandBlockPos: Vector3 = vector3(56, 68, 211);
let mission1part2: AbstractAgentTrackMission = new AbstractAgentTrackMission( let mission1part2: AbstractAgentTrackMission = new AbstractAgentTrackMission(
"mission1part2", "mission1part2",
level2StartPosition, level2StartPosition,
level2AgentFacing,
Level2EndPosition, Level2EndPosition,
Level2CommandBlockPos Level2CommandBlockPos
); );

View File

@@ -3,6 +3,7 @@ import AbstractAgentTrackMission from "../../Commandeer/level/abstractTrackFollo
import { vector3 } from "../../Commandeer/utils/vectorUtils"; import { vector3 } from "../../Commandeer/utils/vectorUtils";
const Level3CommandBlockPos: Vector3 = vector3(2439, 0, 34); const Level3CommandBlockPos: Vector3 = vector3(2439, 0, 34);
const level3AgentFacing: Vector3 = vector3(0, 0, -1);
const level3StartPosition: Vector3 = vector3(2447, -2, 30); const level3StartPosition: Vector3 = vector3(2447, -2, 30);
const level3EndPosition: Vector3 = vector3(2451, -2, 18); const level3EndPosition: Vector3 = vector3(2451, -2, 18);
@@ -11,6 +12,7 @@ const level3ResetCommandBlockPos: Vector3 = vector3(56, 68, 211);
let mission1part3: AbstractAgentTrackMission = new AbstractAgentTrackMission( let mission1part3: AbstractAgentTrackMission = new AbstractAgentTrackMission(
"mission1part3", "mission1part3",
level3StartPosition, level3StartPosition,
level3AgentFacing,
level3EndPosition, level3EndPosition,
Level3CommandBlockPos Level3CommandBlockPos
); );

View File

@@ -12,6 +12,7 @@ import { startLevel } from "../../Commandeer/utils/levelUtils";
const mission2part1CommandBlockPos: Vector3 = vector3(2460, -1, 4); const mission2part1CommandBlockPos: Vector3 = vector3(2460, -1, 4);
const mission2part1StartPosition: Vector3 = vector3(2455, -1, 11); const mission2part1StartPosition: Vector3 = vector3(2455, -1, 11);
const mission2Part1AgentFacing: Vector3 = vector3(1, 0, 0);
const mission2part1EndPosition: Vector3 = vector3(2465, -1, 11); const mission2part1EndPosition: Vector3 = vector3(2465, -1, 11);
const mission2part1ResetCommandBlockPos: Vector3 = vector3(2456, -1, 4); const mission2part1ResetCommandBlockPos: Vector3 = vector3(2456, -1, 4);
@@ -20,7 +21,7 @@ const mission2part1: Level = new Level(
pupeteer.sendWorldMessage("%message.mission2part1.started"); pupeteer.sendWorldMessage("%message.mission2part1.started");
pupeteer.setTitleTimed("%message.mission2part1.name", 2.5); pupeteer.setTitleTimed("%message.mission2part1.name", 2.5);
startLevel(mission2part1CommandBlockPos); startLevel(mission2part1CommandBlockPos);
teleportAgent(mission2part1StartPosition); teleportAgent(mission2part1StartPosition, mission2Part1AgentFacing);
startLevel(mission2part1ResetCommandBlockPos); startLevel(mission2part1ResetCommandBlockPos);
}, },
() => { () => {

View File

@@ -12,6 +12,7 @@ import { startLevel } from "../../Commandeer/utils/levelUtils";
const mission2part2CommandBlockPos: Vector3 = vector3(2461, -1, 4); const mission2part2CommandBlockPos: Vector3 = vector3(2461, -1, 4);
const mission2part2StartPosition: Vector3 = vector3(2467, -1, 11); const mission2part2StartPosition: Vector3 = vector3(2467, -1, 11);
const mission2Part1AgentFacing: Vector3 = vector3(1, 0, 0);
const mission2part2EndPosition: Vector3 = vector3(2481, -1, 11); const mission2part2EndPosition: Vector3 = vector3(2481, -1, 11);
const mission2part2ResetCommandBlockPos: Vector3 = vector3(2457, -1, 4); const mission2part2ResetCommandBlockPos: Vector3 = vector3(2457, -1, 4);
@@ -20,7 +21,7 @@ const mission2part2: Level = new Level(
pupeteer.sendWorldMessage("%message.mission2part2.started"); pupeteer.sendWorldMessage("%message.mission2part2.started");
pupeteer.setTitleTimed("%message.mission2part2.name", 2.5); pupeteer.setTitleTimed("%message.mission2part2.name", 2.5);
startLevel(mission2part2CommandBlockPos); startLevel(mission2part2CommandBlockPos);
teleportAgent(mission2part2StartPosition); teleportAgent(mission2part2StartPosition, mission2Part1AgentFacing);
startLevel(mission2part2ResetCommandBlockPos); startLevel(mission2part2ResetCommandBlockPos);
}, },
() => { () => {

View File

@@ -5,11 +5,13 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
const Level1CommandBlockPos: Vector3 = vector3(2495, -1, 26); const Level1CommandBlockPos: Vector3 = vector3(2495, -1, 26);
const level1StartPosition: Vector3 = vector3(2488, -2, 7); const level1StartPosition: Vector3 = vector3(2488, -2, 7);
const level1AgentFacing: Vector3 = vector3(0, 0, 1);
const Level1EndPosition: Vector3 = vector3(2488, -2, 22); const Level1EndPosition: Vector3 = vector3(2488, -2, 22);
let mission3part1: AbstractAgentTrackMission = new AbstractAgentTrackMission( let mission3part1: AbstractAgentTrackMission = new AbstractAgentTrackMission(
"mission3part1", "mission3part1",
level1StartPosition, level1StartPosition,
level1AgentFacing,
Level1EndPosition, Level1EndPosition,
Level1CommandBlockPos Level1CommandBlockPos
); );

View File

@@ -5,11 +5,13 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
const Level1CommandBlockPos: Vector3 = vector3(2495, -1, 27); const Level1CommandBlockPos: Vector3 = vector3(2495, -1, 27);
const level1StartPosition: Vector3 = vector3(2492, -2, 26); const level1StartPosition: Vector3 = vector3(2492, -2, 26);
const level1AgentFacing: Vector3 = vector3(0, 0, 1);
const Level1EndPosition: Vector3 = vector3(2484, -2, 32); const Level1EndPosition: Vector3 = vector3(2484, -2, 32);
let mission3part2: AbstractAgentTrackMission = new AbstractAgentTrackMission( let mission3part2: AbstractAgentTrackMission = new AbstractAgentTrackMission(
"mission3part2", "mission3part2",
level1StartPosition, level1StartPosition,
level1AgentFacing,
Level1EndPosition, Level1EndPosition,
Level1CommandBlockPos Level1CommandBlockPos
); );

View File

@@ -5,11 +5,13 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
const Level1CommandBlockPos: Vector3 = vector3(2495, -1, 28); const Level1CommandBlockPos: Vector3 = vector3(2495, -1, 28);
const level1StartPosition: Vector3 = vector3(2487, -2, 36); const level1StartPosition: Vector3 = vector3(2487, -2, 36);
const level1AgentFacing: Vector3 = vector3(1, 0, 0);
const Level1EndPosition: Vector3 = vector3(2488, -2, 57); const Level1EndPosition: Vector3 = vector3(2488, -2, 57);
let mission3part2: AbstractAgentTrackMission = new AbstractAgentTrackMission( let mission3part2: AbstractAgentTrackMission = new AbstractAgentTrackMission(
"mission3part2", "mission3part2",
level1StartPosition, level1StartPosition,
level1AgentFacing,
Level1EndPosition, Level1EndPosition,
Level1CommandBlockPos Level1CommandBlockPos
); );

View File

@@ -7,12 +7,19 @@ import {
Dimension, Dimension,
TicksPerSecond, TicksPerSecond,
BlockVolume, BlockVolume,
ScriptEventCommandMessageAfterEvent,
} from "@minecraft/server"; } from "@minecraft/server";
import { Mindkeeper, StoreType } from "./Commandeer/mindKeeper"; import { Mindkeeper, StoreType } from "./Commandeer/mindKeeper";
import Pupeteer from "./Commandeer/pupeteer"; import Pupeteer from "./Commandeer/pupeteer";
import { Vector3Add, Vector3ToCommandString, Vector3ToFancyString, vector3 } from "./Commandeer/utils/vectorUtils"; import {
Vector3Add,
Vector3Subtract,
Vector3ToCommandString,
Vector3ToFancyString,
vector3,
} from "./Commandeer/utils/vectorUtils";
import { delay } from "./Commandeer/utils/waitUtil"; import { delay } from "./Commandeer/utils/waitUtil";
import { PARTICLES, spawnParticle } from "./Commandeer/utils/particleUtils"; import { ParticleColumn, PARTICLES, spawnParticle } from "./Commandeer/utils/particleUtils";
import { TrailMaker } from "./Commandeer/trail/trailMaker"; import { TrailMaker } from "./Commandeer/trail/trailMaker";
import * as CCTrigger from "./Commandeer/Trigger/CCTrigger"; import * as CCTrigger from "./Commandeer/Trigger/CCTrigger";
import { Commands } from "./Commandeer/command/command"; import { Commands } from "./Commandeer/command/command";
@@ -41,7 +48,14 @@ import {
SetFrame, SetFrame,
} from "./Commandeer/animations/animation"; } from "./Commandeer/animations/animation";
import { doNothingStupidTSIWantFilesNotAGiantAssMainFile } from "./triggers"; import { doNothingStupidTSIWantFilesNotAGiantAssMainFile } from "./triggers";
import { clearWall, fillWall, Wall } from "./Commandeer/utils/levelUtils"; import { clearWall, fillWall, startLevel, Wall } from "./Commandeer/utils/levelUtils";
import { drawArrow } from "./Commandeer/utils/arrow";
import {
glassBreakingFrames,
AirLockWaterFrames,
FrontAirLockOpenFrames,
BackAirLockOpenFrames,
} from "./animationFrames";
// import { loadTriggers } from "./triggers"; // import { loadTriggers } from "./triggers";
const mindKeeper = new Mindkeeper(world); const mindKeeper = new Mindkeeper(world);
@@ -50,7 +64,9 @@ const triggerManager = new CCTrigger.Manager(mindKeeper);
const CURRENT_LEVEL = "currentLevel"; const CURRENT_LEVEL = "currentLevel";
const AGENT_ID = "agentid"; const AGENT_ID = "agentid";
const PREFIX = "!"; const PREFIX = "!";
export { mindKeeper, CURRENT_LEVEL, triggerManager }; let DEVELOPER_MODE = true;
export { mindKeeper, CURRENT_LEVEL, triggerManager, PREFIX, DEVELOPER_MODE };
// loadTriggers(); // loadTriggers();
// loadCommands(); // loadCommands();
@@ -64,14 +80,14 @@ async function resetLightPath() {
} }
let introToGlassBreakTimer: number = 0; let introToGlassBreakTimer: number = 0;
const glassBreakTime = 5 * TicksPerSecond; const glassBreakTime = 1 * TicksPerSecond;
let isIntroToLevel1Sqeuence = false; let isIntroToLevel1Sqeuence = false;
let introTrail: Trail = new Trail("introTrail", 2, 4); let introTrail: Trail = new Trail("introTrail", 2, 25 / 5);
introTrail.fromTrail(startTrail); introTrail.fromTrail(startTrail);
let introToLevelTrail = new Trail("introToLevelTrail", 2, 2); let introToLevelTrail = new Trail("introToLevelTrail", 2, 74 / 2);
introToLevelTrail.fromTrail(IntroToLevel1Trail); introToLevelTrail.fromTrail(IntroToLevel1Trail);
//fill 2466 0 48 2469 -1 48 //fill 2466 0 48 2469 -1 48
@@ -81,10 +97,16 @@ let bilalBlock: Wall = {
}; };
// spawn a sphere of particle // spawn a sphere of particle
let prevCurrentLevel: number = 0;
const DEVELOPER_MODE = true; let isBreaking: boolean = false;
let airlockParticles = new ParticleColumn(vector3(2475.5, 10, 92), 2, 2, 3, 0.5, PARTICLES.point);
let level1Particles = new ParticleColumn(vector3(2455, -1, 49), 1.1, 2, 4, 0.7, PARTICLES.balloon_gas_particle);
airlockParticles.generatePoints();
let tickCounter = 0; let tickCounter = 0;
system.runInterval(async () => { system.runInterval(() => {
tickCounter++; tickCounter++;
if (mindKeeper.initialised) { if (mindKeeper.initialised) {
trailMaker.Update(); trailMaker.Update();
@@ -93,11 +115,18 @@ system.runInterval(async () => {
} }
const currentLevel = mindKeeper.get(CURRENT_LEVEL); const currentLevel = mindKeeper.get(CURRENT_LEVEL);
if (prevCurrentLevel != currentLevel) {
world.sendMessage("Current level: " + currentLevel);
prevCurrentLevel = mindKeeper.get(CURRENT_LEVEL) as number;
}
switch (currentLevel) { switch (currentLevel) {
case 0: case 0:
// Show goto airlock text // Show goto airlock text
Pupeteer.setActionBar("%message.goto.airlock"); Pupeteer.setActionBar("%message.goto.airlock");
introTrail.spawnNext(); introTrail.spawnNext();
drawArrow(vector3(2478, 37, 89));
airlockParticles.update();
airlockParticles.draw();
break; break;
case 1: case 1:
Pupeteer.setActionBar("%message.enter.airlock"); Pupeteer.setActionBar("%message.enter.airlock");
@@ -110,25 +139,25 @@ system.runInterval(async () => {
levelIntro.update(); levelIntro.update();
break; break;
case 4: case 4:
(async () => {
if (!isIntroToLevel1Sqeuence) { if (!isIntroToLevel1Sqeuence) {
isIntroToLevel1Sqeuence = true; isIntroToLevel1Sqeuence = true;
// world.sendMessage("Intro to level1 sequence start"); // world.sendMessage("Intro to level1 sequence start");
await lightUpPath(); await lightUpPath();
await randomExplosions(); await randomExplosions();
blowUpDoor(); blowUpDoor();
mindKeeper.increment(CURRENT_LEVEL);
triggerAlarm(); triggerAlarm();
mindKeeper.increment(CURRENT_LEVEL);
} }
})();
break; break;
case 5: case 5:
introToGlassBreakTimer++;
// world.sendMessage("Glass break timer: " + introToGlassBreakTimer);
if (introToGlassBreakTimer > glassBreakTime) {
introToGlassBreakTimer = 0;
mindKeeper.increment(CURRENT_LEVEL); mindKeeper.increment(CURRENT_LEVEL);
} break;
case 6: case 6:
// Show Goto Level 1 // Show Goto Level 1
if (isBreaking == false) {
isBreaking = true;
if (glassWindowState == GlassWindowState.Fixed) { if (glassWindowState == GlassWindowState.Fixed) {
glassWindowState = GlassWindowState.Broken; glassWindowState = GlassWindowState.Broken;
system.run(async () => { system.run(async () => {
@@ -138,9 +167,9 @@ system.runInterval(async () => {
await delay(10); await delay(10);
await breakGlassWindow(); await breakGlassWindow();
mindKeeper.increment(CURRENT_LEVEL); mindKeeper.increment(CURRENT_LEVEL);
setNPCDialog("chanel1", "chanel_goto_temple");
}); });
} }
}
break; break;
case 7: case 7:
introToLevelTrail.spawnNext(); introToLevelTrail.spawnNext();
@@ -152,33 +181,62 @@ system.runInterval(async () => {
//Talk to Suki //Talk to Suki
break; break;
case 9: case 9:
mission1part1.update(); level1Particles.update();
level1Particles.draw();
Pupeteer.setActionBar("%message.goto.level1");
break; break;
case 10: case 10:
mission1part2.update(); mission1part1.update();
break; break;
case 11: case 11:
mission1part3.update(); mission1part2.update();
break; break;
case 12: case 12:
Pupeteer.setActionBar("%message.goto.level2"); mission1part3.update();
//Agent is back with player
break;
case 13: case 13:
mission2part1.update(); setNPCDialog("suki1", "suki_afterlevel_1_1");
Pupeteer.setActionBar("%message.talkto.suki");
break; break;
case 14: case 14:
mission2part2.update(); mission2part1.update();
break; break;
case 15: case 15:
mission3part1.update(); //Talk to suki
break; setNPCDialog("suki1", "suki_afterlevel_2_1_intermezzo");
case 15: Pupeteer.setActionBar("%message.talkto.suki");
mission3part2.update();
break; break;
case 16: case 16:
mission3part3.update(); mission2part2.update();
break; break;
case 17: case 17:
Pupeteer.setActionBar("Goto the door"); // Mission 2 is complete
setNPCDialog("suki1", "suki_afterlevel_2_1");
Pupeteer.setActionBar("%message.talkto.suki");
break;
case 18:
mission3part1.update();
break;
case 19:
mission3part2.update();
break;
case 20:
mission3part3.update();
break;
case 21:
//talk to suki
setNPCDialog("suki1", "suki_afterlevel_3_1");
setNPCDialog("bilal1", "bilal_end_1");
Pupeteer.setActionBar("%message.talkto.suki");
break;
case 22:
Pupeteer.setActionBar("%message.goto.door");
//wait for player to enter trigger
break;
case 23:
Pupeteer.setActionBar("%message.goto.bilal");
setNPCDialog("bilal1", "bilal_end_1");
break; break;
} }
} }
@@ -287,6 +345,9 @@ world.afterEvents.chatSend.subscribe(async (event: ChatSendAfterEvent) => {
mission2part1.reset(); mission2part1.reset();
mission2part2.reset(); mission2part2.reset();
//Set redstone block
startLevel(vector3(2456, -1, 4));
startLevel(vector3(2457, -1, 4));
//Reset the combination to a random squence //Reset the combination to a random squence
@@ -299,7 +360,10 @@ world.afterEvents.chatSend.subscribe(async (event: ChatSendAfterEvent) => {
fillWall(bilalBlock, MinecraftBlockTypes.Barrier); fillWall(bilalBlock, MinecraftBlockTypes.Barrier);
openDoor();
isIntroToLevel1Sqeuence = false; isIntroToLevel1Sqeuence = false;
isBreaking = false;
} }
}); });
@@ -329,14 +393,33 @@ system.afterEvents.scriptEventReceive.subscribe((event) => {
} }
} }
if (event.id == "cc:startLevel1") { checkNpcResponse(event, "cc:startLevel1", 8);
if (mindKeeper.get(CURRENT_LEVEL) == 8) { checkNpcResponse(event, "cc:afterLevel1", 13);
checkNpcResponse(event, "cc:level2Intermezzo", 15);
checkNpcResponse(event, "cc:afterLevel2", 17);
checkNpcResponse(event, "cc:afterLevel3", 21);
});
function checkNpcResponse(event: ScriptEventCommandMessageAfterEvent, id: string, level: number) {
if (event.id == id) {
if (mindKeeper.get(CURRENT_LEVEL) == level) {
mindKeeper.increment(CURRENT_LEVEL); mindKeeper.increment(CURRENT_LEVEL);
} }
} }
if (event.id == "cc:afterLevel1") {
} }
triggerManager.RegisterFunctionTrigger("tp", (event) => {
// end center pos /setblock 2490 -12 118
// start center pos /setblock 2489 10 118
let pos = vector3(2489, 10, 118);
let endPos = vector3(2490, -12, 118);
world.sendMessage(Vector3ToFancyString(Vector3Subtract(endPos, pos)));
//Find offset and tp player to end pos + offset so its seamless
let playerPos = event.player.location;
let offset = Vector3Subtract(endPos, playerPos);
let finalPos = Vector3Add(pos, offset);
event.player.teleport(finalPos);
}); });
Commands.register(PREFIX, "fien", (arg) => { Commands.register(PREFIX, "fien", (arg) => {
@@ -361,6 +444,7 @@ Commands.register(PREFIX, "info", (arg) => {
}); });
Commands.register(PREFIX, "kboom", (arg) => { Commands.register(PREFIX, "kboom", (arg) => {
if (DEVELOPER_MODE) {
(async () => { (async () => {
for (let i = 0; i < 10; i++) { for (let i = 0; i < 10; i++) {
randomExplosions(); randomExplosions();
@@ -368,6 +452,7 @@ Commands.register(PREFIX, "kboom", (arg) => {
} }
blowUpDoor(); blowUpDoor();
})(); })();
}
}); });
let openDoor = () => { let openDoor = () => {
@@ -392,6 +477,7 @@ Commands.register(PREFIX, "restore", (arg) => {
enum GlassWindowState { enum GlassWindowState {
Broken, Broken,
Fixed, Fixed,
Fucked,
} }
enum AirLockState { enum AirLockState {
@@ -419,91 +505,6 @@ const glassWindowClonePos: ClonePos = {
point2: vector3(2470, 11, 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 FrontAirLockOpenFrames: ClonePos[] = [
{
point1: vector3(2476, 9, 94),
point2: vector3(2474, 7, 94),
},
{
point1: vector3(2476, 5, 94),
point2: vector3(2474, 3, 94),
},
{
point1: vector3(2476, 1, 94),
point2: vector3(2474, -1, 94),
},
{
point1: vector3(2476, -3, 94),
point2: vector3(2474, -5, 94),
},
];
const BackAirLockOpenFrames: ClonePos[] = [
{
point1: vector3(2472, 9, 100),
point2: vector3(2472, 7, 102),
},
{
point1: vector3(2472, 5, 100),
point2: vector3(2472, 3, 102),
},
{
point1: vector3(2472, 1, 100),
point2: vector3(2472, -1, 102),
},
{
point1: vector3(2472, -3, 100),
point2: vector3(2472, -5, 102),
},
];
const AirLockWaterFrames: ClonePos[] = [
{
point1: vector3(2473, 11, 95),
point2: vector3(2477, 11, 103),
},
{
point1: vector3(2473, 12, 95),
point2: vector3(2477, 12, 103),
},
{
point1: vector3(2473, 13, 95),
point2: vector3(2477, 13, 103),
},
{
point1: vector3(2473, 14, 95),
point2: vector3(2477, 14, 103),
},
];
Commands.register(PREFIX, "breakGlass", (arg) => { Commands.register(PREFIX, "breakGlass", (arg) => {
breakGlassWindow(); breakGlassWindow();
glassWindowState = GlassWindowState.Broken; glassWindowState = GlassWindowState.Broken;
@@ -514,11 +515,12 @@ Commands.register(PREFIX, "restoreGlass", (arg) => {
}); });
async function breakGlassWindow() { async function breakGlassWindow() {
playAnimation(glassBreakingFrames, 5, false, doorRoot); await playAnimation(glassBreakingFrames, 5, false, doorRoot);
glassWindowState = GlassWindowState.Broken; glassWindowState = GlassWindowState.Broken;
} }
async function restoreGlassWindow(force: boolean = false) { async function restoreGlassWindow(force: boolean = false) {
playAnimation(glassBreakingFrames, 5, true, doorRoot, force); playAnimation(glassBreakingFrames, 5, true, doorRoot, force);
glassWindowState = GlassWindowState.Fixed;
} }
async function CycleAirLockWater(fill: boolean, delayTime: number) { async function CycleAirLockWater(fill: boolean, delayTime: number) {
@@ -567,12 +569,19 @@ triggerManager.RegisterFunctionTrigger("FrontAirLockOutside", async (event) => {
triggerManager.RegisterFunctionTrigger("TempleFrontDoor", async (event) => { triggerManager.RegisterFunctionTrigger("TempleFrontDoor", async (event) => {
if (mindKeeper.get(CURRENT_LEVEL) == 8) { if (mindKeeper.get(CURRENT_LEVEL) == 8) {
mindKeeper.increment(CURRENT_LEVEL);
closeDoor(); closeDoor();
} }
if (mindKeeper.get(CURRENT_LEVEL) == 15) { if (mindKeeper.get(CURRENT_LEVEL) == 22) {
openDoor(); openDoor();
mindKeeper.increment(CURRENT_LEVEL);
}
});
triggerManager.RegisterFunctionTrigger("level1start", async (event) => {
// This is after the player talks to suki
if (mindKeeper.get(CURRENT_LEVEL) == 9) {
mindKeeper.increment(CURRENT_LEVEL);
} }
}); });
@@ -647,7 +656,8 @@ let PlayFrontDoorCloseAnimation = async () => playAnimation(FrontAirLockOpenFram
let SetBackDoorClosed = () => SetFrame(BackAirLockOpenFrames[0], backDoorRoot); let SetBackDoorClosed = () => SetFrame(BackAirLockOpenFrames[0], backDoorRoot);
let SetBackDoorOpen = () => SetFrame(BackAirLockOpenFrames[BackAirLockOpenFrames.length - 1], backDoorRoot); let SetBackDoorOpen = () => SetFrame(BackAirLockOpenFrames[BackAirLockOpenFrames.length - 1], backDoorRoot);
let PlayBackDoorOpenAnimation = async () => playAnimation(BackAirLockOpenFrames, frameDuration, false, backDoorRoot); let PlayBackDoorOpenAnimation = async () => playAnimation(BackAirLockOpenFrames, frameDuration, false, backDoorRoot);
let PlayBackDoorCloseAnimation = async () => playAnimation(BackAirLockOpenFrames, frameDuration, true, backDoorRoot); let PlayBackDoorCloseAnimation = async () =>
playAnimation(BackAirLockOpenFrames, frameDuration, true, backDoorRoot, true);
let FillAirlockWater = async () => CycleAirLockWater(true, frameDuration / 1.5); let FillAirlockWater = async () => CycleAirLockWater(true, frameDuration / 1.5);
let EmptyAirlockWater = async () => { let EmptyAirlockWater = async () => {