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
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

File diff suppressed because it is too large Load Diff

View File

@@ -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",

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.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!

View File

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

View File

@@ -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 {

View File

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

View File

@@ -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) {

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[] = [];
const blockCycle: string[] = [
MinecraftBlockTypes.RedstoneBlock,
MinecraftBlockTypes.GoldBlock,
MinecraftBlockTypes.DiamondBlock,
// MinecraftBlockTypes.RedstoneBlock,
// MinecraftBlockTypes.GoldBlock,
// MinecraftBlockTypes.DiamondBlock,
MinecraftBlockTypes.EmeraldBlock,
MinecraftBlockTypes.LapisBlock,
];

View File

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

View File

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

View File

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

View File

@@ -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);
},
() => {

View File

@@ -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);
},
() => {

View File

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

View File

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

View File

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

View File

@@ -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 () => {