Before Format Wars
This commit is contained in:
@@ -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": []
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
98
gulpfile.js
98
gulpfile.js
@@ -13,7 +13,8 @@ const behavior_pack_authors = ["Me and my cat"];
|
||||
|
||||
// === Optional variables
|
||||
|
||||
const exportWorldFolderPath = "";
|
||||
const exportWorldFolderPath =
|
||||
"/Users/Bram/AppData/Local/Packages/Microsoft.MinecraftEducationEdition_8wekyb3d8bbwe/LocalState/games/com.mojang/minecraftWorlds/cH+wZocbAQA=";
|
||||
|
||||
// === END CONFIGURABLE VARIABLES
|
||||
|
||||
@@ -27,6 +28,7 @@ const zip = require("gulp-zip");
|
||||
const fs = require("fs");
|
||||
const rename = require("gulp-rename");
|
||||
const crypto = require("crypto");
|
||||
var argv = require("yargs").argv;
|
||||
|
||||
var readLineSync = import("readline-sync");
|
||||
var NBT = import("nbtify");
|
||||
@@ -40,6 +42,13 @@ const storeVersionMojangRoot =
|
||||
|
||||
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) {
|
||||
del(["build/behavior_packs/", "build/resource_packs/"]).then(
|
||||
(value) => {
|
||||
@@ -327,7 +336,7 @@ hasZipped = false;
|
||||
function rename_zip_to_mcworld(cb) {
|
||||
gulp
|
||||
.src(["export/export.zip"])
|
||||
.pipe(rename(bpfoldername + ".mcworld"))
|
||||
.pipe(rename(parameterWorldName + ".mcworld"))
|
||||
.pipe(gulp.dest("export/"));
|
||||
cb();
|
||||
}
|
||||
@@ -357,7 +366,7 @@ function add_version_to_world_name(cb) {
|
||||
}
|
||||
|
||||
function copy_build_resource_pack_to_export_folder(cb) {
|
||||
gulp
|
||||
return gulp
|
||||
.src(["build/resource_packs/**/**"])
|
||||
.pipe(gulp.dest("export/" + bpfoldername + "/resource_packs/" + bpfoldername));
|
||||
console.log(
|
||||
@@ -368,14 +377,12 @@ function copy_build_resource_pack_to_export_folder(cb) {
|
||||
"/resource_packs/" +
|
||||
bpfoldername
|
||||
);
|
||||
cb();
|
||||
}
|
||||
|
||||
function copy_build_behavior_pack_to_export_folder(cb) {
|
||||
gulp
|
||||
return gulp
|
||||
.src(["build/behavior_packs/**/**"])
|
||||
.pipe(gulp.dest("export/" + bpfoldername + "/behavior_packs/" + bpfoldername));
|
||||
cb();
|
||||
}
|
||||
|
||||
function copy_world_to_export_folder(cb) {
|
||||
@@ -423,30 +430,60 @@ function get_worlds_paths_and_names(cb) {
|
||||
}
|
||||
|
||||
async function nbt_rename_world(cb) {
|
||||
const NBT = await import("nbtify");
|
||||
const { readFile, writeFile } = await import("fs/promises");
|
||||
const buffer = await readFile("export/" + bpfoldername + "/level.dat");
|
||||
const data = await NBT.read(buffer);
|
||||
let oldLevelName = data.data.LevelName;
|
||||
let newName = bpfoldername + " " + get_version();
|
||||
data.data.LevelName = newName;
|
||||
const result = await NBT.write(data);
|
||||
await writeFile("export/" + bpfoldername + "/level.dat", result);
|
||||
console.log("Renamed " + oldLevelName + " to " + newName);
|
||||
if (releaseVersion) {
|
||||
console.log("Release Version, skipping renaming of level.dat");
|
||||
cb();
|
||||
} else {
|
||||
const NBT = await import("nbtify");
|
||||
const { readFile, writeFile } = await import("fs/promises");
|
||||
const buffer = await readFile("export/" + bpfoldername + "/level.dat");
|
||||
const data = await NBT.read(buffer);
|
||||
|
||||
let oldLevelName = data.data.LevelName;
|
||||
let newName = bpfoldername + " " + get_version();
|
||||
data.data.LevelName = newName;
|
||||
|
||||
const result = await NBT.write(data);
|
||||
await writeFile("export/" + bpfoldername + "/level.dat", result);
|
||||
console.log("Renamed " + oldLevelName + " to " + newName);
|
||||
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) {
|
||||
const { readFile, writeFile } = import("fs/promises");
|
||||
const levelNameFilePath = "export/" + bpfoldername + "/levelname.txt";
|
||||
let levelName = fs.readFileSync(levelNameFilePath, "utf8");
|
||||
let newName = bpfoldername + " " + get_version();
|
||||
fs.writeFileSync(levelNameFilePath, newName);
|
||||
console.log("Renamed " + levelName + " to " + newName);
|
||||
cb();
|
||||
if (!releaseVersion) {
|
||||
const { readFile, writeFile } = import("fs/promises");
|
||||
const levelNameFilePath = "export/" + bpfoldername + "/levelname.txt";
|
||||
let levelName = fs.readFileSync(levelNameFilePath, "utf8");
|
||||
let newName = bpfoldername + " " + get_version();
|
||||
fs.writeFileSync(levelNameFilePath, newName);
|
||||
console.log("Renamed " + levelName + " to " + newName);
|
||||
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) {
|
||||
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_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.copy_behavior_packs = copy_behavior_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.export = gulp.series(
|
||||
export_header,
|
||||
clean_export,
|
||||
copy_world_to_export_folder,
|
||||
build,
|
||||
gulp.parallel(copy_build_behavior_pack_to_export_folder, copy_build_resource_pack_to_export_folder),
|
||||
levelnametxt_rename,
|
||||
nbt_rename_world,
|
||||
add_education_json_file,
|
||||
zip_world,
|
||||
rename_zip_to_mcworld
|
||||
);
|
||||
|
||||
750
package-lock.json
generated
750
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -16,7 +16,8 @@
|
||||
"nbtify": "^1.85.0",
|
||||
"readline-sync": "^1.4.10",
|
||||
"source-map": "^0.7.4",
|
||||
"typescript": "^4.4.3"
|
||||
"typescript": "^4.4.3",
|
||||
"yargs": "^17.7.2"
|
||||
},
|
||||
"scripts": {
|
||||
"enablemcloopback": "CheckNetIsolation.exe LoopbackExempt -a -p=S-1-15-2-1958404141-86561845-1752920682-3514627264-368642714-62675701-733520436",
|
||||
|
||||
@@ -9,6 +9,10 @@ message.enter.airlock=Enter the Airlock
|
||||
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.door=Go the Temple Door
|
||||
|
||||
message.goto.bilal=Go to Bakker §6Bakker Bilal
|
||||
|
||||
message.goto.level1=Go to Level 1
|
||||
message.goto.level2=Go to Level 2
|
||||
message.goto.level3=Go to Level 3
|
||||
@@ -49,6 +53,7 @@ message.incorrect=§cIncorrect!§b
|
||||
|
||||
message.talkto.ramses=Talk to §dRamses
|
||||
message.talkto.chanel=Talk to §9Chanel
|
||||
message.talkto.suki=Talk to §2Veteraan Suki
|
||||
|
||||
## Intro messages
|
||||
message.intro.started=Crack the Vault!
|
||||
@@ -129,4 +134,35 @@ suki.greeting.1.text=Oeps, je hebt de val geactiveerd. We zitten nu vast in deze
|
||||
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.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!
|
||||
@@ -12,6 +12,7 @@ class AbstractAgentTrackMission extends Level {
|
||||
constructor(
|
||||
levelid: string,
|
||||
agentStartPositon: Vector3,
|
||||
agentStartFacing: Vector3,
|
||||
agentEndPosition: Vector3,
|
||||
startLevelCommandBlockPos: Vector3
|
||||
) {
|
||||
@@ -20,7 +21,7 @@ class AbstractAgentTrackMission extends Level {
|
||||
pupeteer.sendWorldMessage(`%message.${levelid}.started`);
|
||||
pupeteer.setTitleTimed(`%message.${levelid}.name`, 2.5);
|
||||
startLevel(startLevelCommandBlockPos);
|
||||
teleportAgent(agentStartPositon);
|
||||
teleportAgent(agentStartPositon, agentStartFacing);
|
||||
},
|
||||
() => {
|
||||
pupeteer.setActionBar(`%message.${levelid}.make`);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { MolangVariableMap, Vector3, world } from "@minecraft/server";
|
||||
import { Vector3Add } from "../utils/vectorUtils";
|
||||
import { TrailType } from "./trailTypes";
|
||||
import { PARTICLES, spawnParticle } from "../utils/particleUtils";
|
||||
|
||||
class TrailPoint {
|
||||
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 = this.postion;
|
||||
try {
|
||||
world
|
||||
.getDimension("overworld")
|
||||
.spawnParticle("minecraft:balloon_gas_particle", spawnPosition, new MolangVariableMap());
|
||||
spawnParticle(spawnPosition, PARTICLES.balloon_gas_particle, new MolangVariableMap());
|
||||
} catch (e) {}
|
||||
}
|
||||
}
|
||||
@@ -40,19 +39,14 @@ class Trail {
|
||||
addPoint(point: TrailPoint) {
|
||||
this.points.push(point);
|
||||
|
||||
//this could be a one liner,
|
||||
let maxlength: number = 0;
|
||||
this.points.forEach((point) => {
|
||||
if (point.index > maxlength) {
|
||||
maxlength = point.index;
|
||||
}
|
||||
});
|
||||
this.calculatedLength = maxlength;
|
||||
this.calculatedLength = this.points.length;
|
||||
}
|
||||
|
||||
fromTrail(trail: TrailType) {
|
||||
let currentIndex = 0;
|
||||
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;
|
||||
this.points
|
||||
.filter((point) => {
|
||||
return (
|
||||
point.index === this.currentPoint ||
|
||||
(this.wrapIndex > 0 && point.index % pointsPerInterval === this.currentPoint)
|
||||
);
|
||||
if (this.wrapIndex > 0) {
|
||||
return point.index % this.wrapIndex == this.currentPoint;
|
||||
} else {
|
||||
return point.index == this.currentPoint;
|
||||
}
|
||||
})
|
||||
.forEach((point) => {
|
||||
point.spawn();
|
||||
});
|
||||
|
||||
this.currentPoint++;
|
||||
if (this.currentPoint >= this.calculatedLength) {
|
||||
let actualLength = this.wrapIndex > 0 ? this.wrapIndex : this.calculatedLength;
|
||||
if (this.currentPoint >= actualLength) {
|
||||
this.currentPoint = 0;
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Entity, Vector3, world } from "@minecraft/server";
|
||||
import { Vector3ToString, vector3 } from "./vectorUtils";
|
||||
import { Vector3Add, Vector3ToString, vector3 } from "./vectorUtils";
|
||||
import { mindKeeper } from "../../main";
|
||||
|
||||
//Make a facing with vector3
|
||||
@@ -11,10 +11,11 @@ function teleportAgent(position: Vector3, facing: Vector3 = vector3(0, 0, 0)): v
|
||||
.getDimension("overworld")
|
||||
.runCommand(`/execute as @a run tp @e[type=agent] ${position.x} ${position.y} ${position.z}`);
|
||||
} else {
|
||||
let facing2 = Vector3Add(position, facing);
|
||||
world
|
||||
.getDimension("overworld")
|
||||
.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}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,6 +222,12 @@ function spawnParticle(
|
||||
return;
|
||||
}
|
||||
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");
|
||||
if (dimension) {
|
||||
|
||||
89
scripts/animationFrames.ts
Normal file
89
scripts/animationFrames.ts
Normal 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 };
|
||||
@@ -30,9 +30,9 @@ let currentBlockSequence: string[] = [];
|
||||
let currentBlockSeuqenceIndex: number[] = [];
|
||||
|
||||
const blockCycle: string[] = [
|
||||
MinecraftBlockTypes.RedstoneBlock,
|
||||
MinecraftBlockTypes.GoldBlock,
|
||||
MinecraftBlockTypes.DiamondBlock,
|
||||
// MinecraftBlockTypes.RedstoneBlock,
|
||||
// MinecraftBlockTypes.GoldBlock,
|
||||
// MinecraftBlockTypes.DiamondBlock,
|
||||
MinecraftBlockTypes.EmeraldBlock,
|
||||
MinecraftBlockTypes.LapisBlock,
|
||||
];
|
||||
|
||||
@@ -5,11 +5,14 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
|
||||
const Level1CommandBlockPos: Vector3 = vector3(2439, 0, 36);
|
||||
|
||||
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);
|
||||
|
||||
let mission1part1: AbstractAgentTrackMission = new AbstractAgentTrackMission(
|
||||
"mission1part1",
|
||||
level1StartPosition,
|
||||
level1AgentFacing,
|
||||
Level1EndPosition,
|
||||
Level1CommandBlockPos
|
||||
);
|
||||
|
||||
@@ -5,6 +5,7 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
|
||||
const Level2CommandBlockPos: Vector3 = vector3(2439, 0, 35);
|
||||
|
||||
const level2StartPosition: Vector3 = vector3(2446, -2, 40);
|
||||
const level2AgentFacing: Vector3 = vector3(1, 0, 0);
|
||||
const Level2EndPosition: Vector3 = vector3(2446, -2, 30);
|
||||
|
||||
const level2ResetCommandBlockPos: Vector3 = vector3(56, 68, 211);
|
||||
@@ -12,6 +13,7 @@ const level2ResetCommandBlockPos: Vector3 = vector3(56, 68, 211);
|
||||
let mission1part2: AbstractAgentTrackMission = new AbstractAgentTrackMission(
|
||||
"mission1part2",
|
||||
level2StartPosition,
|
||||
level2AgentFacing,
|
||||
Level2EndPosition,
|
||||
Level2CommandBlockPos
|
||||
);
|
||||
|
||||
@@ -3,6 +3,7 @@ import AbstractAgentTrackMission from "../../Commandeer/level/abstractTrackFollo
|
||||
import { vector3 } from "../../Commandeer/utils/vectorUtils";
|
||||
|
||||
const Level3CommandBlockPos: Vector3 = vector3(2439, 0, 34);
|
||||
const level3AgentFacing: Vector3 = vector3(0, 0, -1);
|
||||
const level3StartPosition: Vector3 = vector3(2447, -2, 30);
|
||||
const level3EndPosition: Vector3 = vector3(2451, -2, 18);
|
||||
|
||||
@@ -11,6 +12,7 @@ const level3ResetCommandBlockPos: Vector3 = vector3(56, 68, 211);
|
||||
let mission1part3: AbstractAgentTrackMission = new AbstractAgentTrackMission(
|
||||
"mission1part3",
|
||||
level3StartPosition,
|
||||
level3AgentFacing,
|
||||
level3EndPosition,
|
||||
Level3CommandBlockPos
|
||||
);
|
||||
|
||||
@@ -12,6 +12,7 @@ import { startLevel } from "../../Commandeer/utils/levelUtils";
|
||||
const mission2part1CommandBlockPos: Vector3 = vector3(2460, -1, 4);
|
||||
|
||||
const mission2part1StartPosition: Vector3 = vector3(2455, -1, 11);
|
||||
const mission2Part1AgentFacing: Vector3 = vector3(1, 0, 0);
|
||||
const mission2part1EndPosition: Vector3 = vector3(2465, -1, 11);
|
||||
|
||||
const mission2part1ResetCommandBlockPos: Vector3 = vector3(2456, -1, 4);
|
||||
@@ -20,7 +21,7 @@ const mission2part1: Level = new Level(
|
||||
pupeteer.sendWorldMessage("%message.mission2part1.started");
|
||||
pupeteer.setTitleTimed("%message.mission2part1.name", 2.5);
|
||||
startLevel(mission2part1CommandBlockPos);
|
||||
teleportAgent(mission2part1StartPosition);
|
||||
teleportAgent(mission2part1StartPosition, mission2Part1AgentFacing);
|
||||
startLevel(mission2part1ResetCommandBlockPos);
|
||||
},
|
||||
() => {
|
||||
|
||||
@@ -12,6 +12,7 @@ import { startLevel } from "../../Commandeer/utils/levelUtils";
|
||||
const mission2part2CommandBlockPos: Vector3 = vector3(2461, -1, 4);
|
||||
|
||||
const mission2part2StartPosition: Vector3 = vector3(2467, -1, 11);
|
||||
const mission2Part1AgentFacing: Vector3 = vector3(1, 0, 0);
|
||||
const mission2part2EndPosition: Vector3 = vector3(2481, -1, 11);
|
||||
|
||||
const mission2part2ResetCommandBlockPos: Vector3 = vector3(2457, -1, 4);
|
||||
@@ -20,7 +21,7 @@ const mission2part2: Level = new Level(
|
||||
pupeteer.sendWorldMessage("%message.mission2part2.started");
|
||||
pupeteer.setTitleTimed("%message.mission2part2.name", 2.5);
|
||||
startLevel(mission2part2CommandBlockPos);
|
||||
teleportAgent(mission2part2StartPosition);
|
||||
teleportAgent(mission2part2StartPosition, mission2Part1AgentFacing);
|
||||
startLevel(mission2part2ResetCommandBlockPos);
|
||||
},
|
||||
() => {
|
||||
|
||||
@@ -5,11 +5,13 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
|
||||
const Level1CommandBlockPos: Vector3 = vector3(2495, -1, 26);
|
||||
|
||||
const level1StartPosition: Vector3 = vector3(2488, -2, 7);
|
||||
const level1AgentFacing: Vector3 = vector3(0, 0, 1);
|
||||
const Level1EndPosition: Vector3 = vector3(2488, -2, 22);
|
||||
|
||||
let mission3part1: AbstractAgentTrackMission = new AbstractAgentTrackMission(
|
||||
"mission3part1",
|
||||
level1StartPosition,
|
||||
level1AgentFacing,
|
||||
Level1EndPosition,
|
||||
Level1CommandBlockPos
|
||||
);
|
||||
|
||||
@@ -5,11 +5,13 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
|
||||
const Level1CommandBlockPos: Vector3 = vector3(2495, -1, 27);
|
||||
|
||||
const level1StartPosition: Vector3 = vector3(2492, -2, 26);
|
||||
const level1AgentFacing: Vector3 = vector3(0, 0, 1);
|
||||
const Level1EndPosition: Vector3 = vector3(2484, -2, 32);
|
||||
|
||||
let mission3part2: AbstractAgentTrackMission = new AbstractAgentTrackMission(
|
||||
"mission3part2",
|
||||
level1StartPosition,
|
||||
level1AgentFacing,
|
||||
Level1EndPosition,
|
||||
Level1CommandBlockPos
|
||||
);
|
||||
|
||||
@@ -5,11 +5,13 @@ import { vector3 } from "../../Commandeer/utils/vectorUtils";
|
||||
const Level1CommandBlockPos: Vector3 = vector3(2495, -1, 28);
|
||||
|
||||
const level1StartPosition: Vector3 = vector3(2487, -2, 36);
|
||||
const level1AgentFacing: Vector3 = vector3(1, 0, 0);
|
||||
const Level1EndPosition: Vector3 = vector3(2488, -2, 57);
|
||||
|
||||
let mission3part2: AbstractAgentTrackMission = new AbstractAgentTrackMission(
|
||||
"mission3part2",
|
||||
level1StartPosition,
|
||||
level1AgentFacing,
|
||||
Level1EndPosition,
|
||||
Level1CommandBlockPos
|
||||
);
|
||||
|
||||
304
scripts/main.ts
304
scripts/main.ts
@@ -7,12 +7,19 @@ import {
|
||||
Dimension,
|
||||
TicksPerSecond,
|
||||
BlockVolume,
|
||||
ScriptEventCommandMessageAfterEvent,
|
||||
} from "@minecraft/server";
|
||||
import { Mindkeeper, StoreType } from "./Commandeer/mindKeeper";
|
||||
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 { PARTICLES, spawnParticle } from "./Commandeer/utils/particleUtils";
|
||||
import { ParticleColumn, 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";
|
||||
@@ -41,7 +48,14 @@ import {
|
||||
SetFrame,
|
||||
} from "./Commandeer/animations/animation";
|
||||
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";
|
||||
|
||||
const mindKeeper = new Mindkeeper(world);
|
||||
@@ -50,7 +64,9 @@ const triggerManager = new CCTrigger.Manager(mindKeeper);
|
||||
const CURRENT_LEVEL = "currentLevel";
|
||||
const AGENT_ID = "agentid";
|
||||
const PREFIX = "!";
|
||||
export { mindKeeper, CURRENT_LEVEL, triggerManager };
|
||||
let DEVELOPER_MODE = true;
|
||||
|
||||
export { mindKeeper, CURRENT_LEVEL, triggerManager, PREFIX, DEVELOPER_MODE };
|
||||
|
||||
// loadTriggers();
|
||||
// loadCommands();
|
||||
@@ -64,14 +80,14 @@ async function resetLightPath() {
|
||||
}
|
||||
|
||||
let introToGlassBreakTimer: number = 0;
|
||||
const glassBreakTime = 5 * TicksPerSecond;
|
||||
const glassBreakTime = 1 * TicksPerSecond;
|
||||
|
||||
let isIntroToLevel1Sqeuence = false;
|
||||
|
||||
let introTrail: Trail = new Trail("introTrail", 2, 4);
|
||||
let introTrail: Trail = new Trail("introTrail", 2, 25 / 5);
|
||||
introTrail.fromTrail(startTrail);
|
||||
|
||||
let introToLevelTrail = new Trail("introToLevelTrail", 2, 2);
|
||||
let introToLevelTrail = new Trail("introToLevelTrail", 2, 74 / 2);
|
||||
introToLevelTrail.fromTrail(IntroToLevel1Trail);
|
||||
|
||||
//fill 2466 0 48 2469 -1 48
|
||||
@@ -81,10 +97,16 @@ let bilalBlock: Wall = {
|
||||
};
|
||||
|
||||
// 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;
|
||||
system.runInterval(async () => {
|
||||
system.runInterval(() => {
|
||||
tickCounter++;
|
||||
if (mindKeeper.initialised) {
|
||||
trailMaker.Update();
|
||||
@@ -93,11 +115,18 @@ system.runInterval(async () => {
|
||||
}
|
||||
|
||||
const currentLevel = mindKeeper.get(CURRENT_LEVEL);
|
||||
if (prevCurrentLevel != currentLevel) {
|
||||
world.sendMessage("Current level: " + currentLevel);
|
||||
prevCurrentLevel = mindKeeper.get(CURRENT_LEVEL) as number;
|
||||
}
|
||||
switch (currentLevel) {
|
||||
case 0:
|
||||
// Show goto airlock text
|
||||
Pupeteer.setActionBar("%message.goto.airlock");
|
||||
introTrail.spawnNext();
|
||||
drawArrow(vector3(2478, 37, 89));
|
||||
airlockParticles.update();
|
||||
airlockParticles.draw();
|
||||
break;
|
||||
case 1:
|
||||
Pupeteer.setActionBar("%message.enter.airlock");
|
||||
@@ -110,36 +139,36 @@ system.runInterval(async () => {
|
||||
levelIntro.update();
|
||||
break;
|
||||
case 4:
|
||||
if (!isIntroToLevel1Sqeuence) {
|
||||
isIntroToLevel1Sqeuence = true;
|
||||
// world.sendMessage("Intro to level1 sequence start");
|
||||
await lightUpPath();
|
||||
await randomExplosions();
|
||||
blowUpDoor();
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
triggerAlarm();
|
||||
}
|
||||
(async () => {
|
||||
if (!isIntroToLevel1Sqeuence) {
|
||||
isIntroToLevel1Sqeuence = true;
|
||||
// world.sendMessage("Intro to level1 sequence start");
|
||||
await lightUpPath();
|
||||
await randomExplosions();
|
||||
blowUpDoor();
|
||||
triggerAlarm();
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
}
|
||||
})();
|
||||
break;
|
||||
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:
|
||||
// Show Goto Level 1
|
||||
if (glassWindowState == GlassWindowState.Fixed) {
|
||||
glassWindowState = GlassWindowState.Broken;
|
||||
system.run(async () => {
|
||||
if (DEVELOPER_MODE) {
|
||||
world.sendMessage("Breaking glass");
|
||||
}
|
||||
await delay(10);
|
||||
await breakGlassWindow();
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
setNPCDialog("chanel1", "chanel_goto_temple");
|
||||
});
|
||||
if (isBreaking == false) {
|
||||
isBreaking = true;
|
||||
if (glassWindowState == GlassWindowState.Fixed) {
|
||||
glassWindowState = GlassWindowState.Broken;
|
||||
system.run(async () => {
|
||||
if (DEVELOPER_MODE) {
|
||||
world.sendMessage("Breaking glass");
|
||||
}
|
||||
await delay(10);
|
||||
await breakGlassWindow();
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
});
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 7:
|
||||
@@ -152,33 +181,62 @@ system.runInterval(async () => {
|
||||
//Talk to Suki
|
||||
break;
|
||||
case 9:
|
||||
mission1part1.update();
|
||||
level1Particles.update();
|
||||
level1Particles.draw();
|
||||
Pupeteer.setActionBar("%message.goto.level1");
|
||||
break;
|
||||
case 10:
|
||||
mission1part2.update();
|
||||
mission1part1.update();
|
||||
break;
|
||||
case 11:
|
||||
mission1part3.update();
|
||||
mission1part2.update();
|
||||
break;
|
||||
case 12:
|
||||
Pupeteer.setActionBar("%message.goto.level2");
|
||||
mission1part3.update();
|
||||
//Agent is back with player
|
||||
break;
|
||||
case 13:
|
||||
mission2part1.update();
|
||||
setNPCDialog("suki1", "suki_afterlevel_1_1");
|
||||
Pupeteer.setActionBar("%message.talkto.suki");
|
||||
break;
|
||||
case 14:
|
||||
mission2part2.update();
|
||||
mission2part1.update();
|
||||
break;
|
||||
case 15:
|
||||
mission3part1.update();
|
||||
break;
|
||||
case 15:
|
||||
mission3part2.update();
|
||||
//Talk to suki
|
||||
setNPCDialog("suki1", "suki_afterlevel_2_1_intermezzo");
|
||||
Pupeteer.setActionBar("%message.talkto.suki");
|
||||
break;
|
||||
case 16:
|
||||
mission3part3.update();
|
||||
mission2part2.update();
|
||||
break;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -287,6 +345,9 @@ world.afterEvents.chatSend.subscribe(async (event: ChatSendAfterEvent) => {
|
||||
|
||||
mission2part1.reset();
|
||||
mission2part2.reset();
|
||||
//Set redstone block
|
||||
startLevel(vector3(2456, -1, 4));
|
||||
startLevel(vector3(2457, -1, 4));
|
||||
|
||||
//Reset the combination to a random squence
|
||||
|
||||
@@ -299,7 +360,10 @@ world.afterEvents.chatSend.subscribe(async (event: ChatSendAfterEvent) => {
|
||||
|
||||
fillWall(bilalBlock, MinecraftBlockTypes.Barrier);
|
||||
|
||||
openDoor();
|
||||
|
||||
isIntroToLevel1Sqeuence = false;
|
||||
isBreaking = false;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -329,14 +393,33 @@ system.afterEvents.scriptEventReceive.subscribe((event) => {
|
||||
}
|
||||
}
|
||||
|
||||
if (event.id == "cc:startLevel1") {
|
||||
if (mindKeeper.get(CURRENT_LEVEL) == 8) {
|
||||
checkNpcResponse(event, "cc:startLevel1", 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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) => {
|
||||
@@ -361,13 +444,15 @@ Commands.register(PREFIX, "info", (arg) => {
|
||||
});
|
||||
|
||||
Commands.register(PREFIX, "kboom", (arg) => {
|
||||
(async () => {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
randomExplosions();
|
||||
await delay(1);
|
||||
}
|
||||
blowUpDoor();
|
||||
})();
|
||||
if (DEVELOPER_MODE) {
|
||||
(async () => {
|
||||
for (let i = 0; i < 10; i++) {
|
||||
randomExplosions();
|
||||
await delay(1);
|
||||
}
|
||||
blowUpDoor();
|
||||
})();
|
||||
}
|
||||
});
|
||||
|
||||
let openDoor = () => {
|
||||
@@ -392,6 +477,7 @@ Commands.register(PREFIX, "restore", (arg) => {
|
||||
enum GlassWindowState {
|
||||
Broken,
|
||||
Fixed,
|
||||
Fucked,
|
||||
}
|
||||
|
||||
enum AirLockState {
|
||||
@@ -419,91 +505,6 @@ const glassWindowClonePos: ClonePos = {
|
||||
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) => {
|
||||
breakGlassWindow();
|
||||
glassWindowState = GlassWindowState.Broken;
|
||||
@@ -514,11 +515,12 @@ Commands.register(PREFIX, "restoreGlass", (arg) => {
|
||||
});
|
||||
|
||||
async function breakGlassWindow() {
|
||||
playAnimation(glassBreakingFrames, 5, false, doorRoot);
|
||||
await playAnimation(glassBreakingFrames, 5, false, doorRoot);
|
||||
glassWindowState = GlassWindowState.Broken;
|
||||
}
|
||||
async function restoreGlassWindow(force: boolean = false) {
|
||||
playAnimation(glassBreakingFrames, 5, true, doorRoot, force);
|
||||
glassWindowState = GlassWindowState.Fixed;
|
||||
}
|
||||
|
||||
async function CycleAirLockWater(fill: boolean, delayTime: number) {
|
||||
@@ -567,12 +569,19 @@ triggerManager.RegisterFunctionTrigger("FrontAirLockOutside", async (event) => {
|
||||
|
||||
triggerManager.RegisterFunctionTrigger("TempleFrontDoor", async (event) => {
|
||||
if (mindKeeper.get(CURRENT_LEVEL) == 8) {
|
||||
mindKeeper.increment(CURRENT_LEVEL);
|
||||
closeDoor();
|
||||
}
|
||||
|
||||
if (mindKeeper.get(CURRENT_LEVEL) == 15) {
|
||||
if (mindKeeper.get(CURRENT_LEVEL) == 22) {
|
||||
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 SetBackDoorOpen = () => SetFrame(BackAirLockOpenFrames[BackAirLockOpenFrames.length - 1], 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 EmptyAirlockWater = async () => {
|
||||
|
||||
Reference in New Issue
Block a user