feat: Add cracked glass block and texture
Added the cracked glass block and its corresponding texture to the resource packs. Also made changes to the maker.ts file to include a save operation. Additionally, added a new behavior pack for the cracked glass block with specific properties. Updated the vectorUtils.ts file to include a new function for converting a Vector3 object to a command string. Finally, made changes to the triggers.ts file to register new triggers and update existing ones.
This commit is contained in:
283
scripts/main.ts
283
scripts/main.ts
@@ -15,24 +15,41 @@ import Pupeteer from "./Commandeer/pupeteer";
|
||||
import Level from "./Commandeer/level/level";
|
||||
import { leverOn } from "./Commandeer/level/levelTypes";
|
||||
import { levelIntroConditions } from "./levelConditions/levelIntro";
|
||||
import { Vector3ToFancyString, Vector3ToString, vector3 } from "./Commandeer/utils/vectorUtils";
|
||||
import {
|
||||
Vector3Add,
|
||||
Vector3ToCommandString,
|
||||
Vector3ToFancyString,
|
||||
Vector3ToString,
|
||||
vector3,
|
||||
} from "./Commandeer/utils/vectorUtils";
|
||||
import { delay } from "./Commandeer/utils/waitUtil";
|
||||
import { PARTICLES, ParticleColumn, bedrockParticles, spawnParticle } from "./Commandeer/utils/particleUtils";
|
||||
import { drawArrow } from "./Commandeer/utils/arrow";
|
||||
import * as agentUtils from "./Commandeer/utils/agentUtils";
|
||||
import { level3Conditions } from "./levelConditions/level3";
|
||||
import { TrailMaker } from "./Commandeer/Makers/trailMaker";
|
||||
import { TrailMaker } from "./Commandeer/trail/trailMaker";
|
||||
import * as CCTrigger from "./Commandeer/Trigger/CCTrigger";
|
||||
import { Command, Commands } from "./Commandeer/command/command";
|
||||
// import { loadTriggers } from "./triggers";
|
||||
|
||||
const mindKeeper = new Mindkeeper(world);
|
||||
const pupeteer = new Pupeteer(world);
|
||||
const trailMaker: TrailMaker.Maker = new TrailMaker.Maker();
|
||||
const triggerManager = new CCTrigger.Manager(mindKeeper);
|
||||
const CURRENT_LEVEL = "currentLevel";
|
||||
const AGENT_ID = "agentid";
|
||||
const PREFIX = "!";
|
||||
export { pupeteer, mindKeeper, CURRENT_LEVEL };
|
||||
export { mindKeeper, CURRENT_LEVEL, triggerManager };
|
||||
|
||||
// loadTriggers();
|
||||
// loadCommands();
|
||||
|
||||
triggerManager.RegisterFunctionTrigger("resetPath", (event) => {
|
||||
resetLightPath();
|
||||
});
|
||||
|
||||
async function resetLightPath() {
|
||||
world.getDimension("overworld").runCommand("/fill 2467 9 87 2468 9 105 air");
|
||||
}
|
||||
|
||||
const DEVELOPER_MODE = true;
|
||||
let tickCounter = 0;
|
||||
@@ -111,6 +128,7 @@ function updateIntro() {
|
||||
|
||||
buttonPositions.forEach((pos) => {
|
||||
let block = world.getDimension("overworld").getBlock(pos);
|
||||
if (!block) return;
|
||||
let index = buttonPositions.indexOf(pos);
|
||||
let prevState = buttonPressed[index];
|
||||
let currentState = block!.getRedstonePower()! > 0;
|
||||
@@ -141,6 +159,7 @@ world.afterEvents.worldInitialize.subscribe(({ propertyRegistry }) => {
|
||||
mindKeeper.registerToWorld(propertyRegistry);
|
||||
|
||||
triggerManager.Load();
|
||||
// loadCommands();
|
||||
});
|
||||
|
||||
world.beforeEvents.itemUseOn.subscribe((event) => {
|
||||
@@ -159,7 +178,9 @@ function randomExplosions() {
|
||||
pos1.z + Math.random() * (pos2.z - pos1.z)
|
||||
);
|
||||
//create a particle
|
||||
spawnParticle(pos, "minecraft:huge_explosion_emitter", new MolangVariableMap());
|
||||
system.run(() => {
|
||||
spawnParticle(pos, "minecraft:huge_explosion_emitter", new MolangVariableMap());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,10 +193,12 @@ let doorSize = vector3(7, 7, 7);
|
||||
///clone 2463 -30 81 2470 -23 87 2463 10 81
|
||||
|
||||
function blowUpDoor() {
|
||||
world.sendMessage("Blowing up door");
|
||||
world.getDimension("overworld").runCommand("/clone 2463 -10 81 2470 -3 87 2463 10 81");
|
||||
}
|
||||
function restoreDoor() {
|
||||
world.getDimension("overworld").runCommand("/clone 2463 -30 81 2470 -23 87 2463 10 81");
|
||||
world.sendMessage("Restoring door");
|
||||
world.getDimension("overworld").runCommandAsync("/clone 2463 -30 81 2470 -23 87 2463 10 81");
|
||||
}
|
||||
|
||||
world.afterEvents.chatSend.subscribe((event: ChatSendAfterEvent) => {
|
||||
@@ -190,6 +213,173 @@ world.afterEvents.chatSend.subscribe((event: ChatSendAfterEvent) => {
|
||||
}
|
||||
});
|
||||
|
||||
system.afterEvents.scriptEventReceive.subscribe((event) => {
|
||||
if (event.id == "cc:getId") {
|
||||
let id = event.message;
|
||||
world.sendMessage("Script got the id " + id);
|
||||
mindKeeper.set(AGENT_ID, id);
|
||||
}
|
||||
});
|
||||
|
||||
class ClonePos {
|
||||
point1: Vector3;
|
||||
point2: Vector3;
|
||||
|
||||
constructor(point1: Vector3, point2: Vector3) {
|
||||
this.point1 = point1;
|
||||
this.point2 = point2;
|
||||
}
|
||||
}
|
||||
|
||||
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),
|
||||
},
|
||||
];
|
||||
|
||||
async function CycleAirLockWater(fill: boolean, delayTime: number) {
|
||||
if (animationPlaying) {
|
||||
world.sendMessage("Animation already playing");
|
||||
return;
|
||||
}
|
||||
animationPlaying = true;
|
||||
let frameCount = AirLockWaterFrames.length;
|
||||
|
||||
for (let i = 0; i < frameCount; i++) {
|
||||
let frame = fill ? AirLockWaterFrames[i] : AirLockWaterFrames[frameCount - i - 1];
|
||||
let blockToFill = fill ? "minecraft:water" : "minecraft:air";
|
||||
await world
|
||||
.getDimension("overworld")
|
||||
.runCommandAsync(
|
||||
`/fill ${Vector3ToCommandString(frame.point1)} ${Vector3ToCommandString(frame.point2)} ${blockToFill}`
|
||||
);
|
||||
await delay(delayTime);
|
||||
}
|
||||
animationPlaying = false;
|
||||
}
|
||||
|
||||
enum AirLockState {
|
||||
Open,
|
||||
Closed,
|
||||
}
|
||||
|
||||
enum AirLockChamberState {
|
||||
Full,
|
||||
Empty,
|
||||
}
|
||||
|
||||
let frontAirlockState: AirLockState = AirLockState.Closed;
|
||||
let backAirlockState: AirLockState = AirLockState.Closed;
|
||||
|
||||
let chamberState: AirLockChamberState = AirLockChamberState.Full;
|
||||
|
||||
//The airlock sequence is
|
||||
//Player enters FrontAirLockOutside
|
||||
//Front door opens
|
||||
triggerManager.RegisterFunctionTrigger("FrontAirLockOutside", async (event) => {
|
||||
if (chamberState == AirLockChamberState.Empty) {
|
||||
world.sendMessage("Filling airlock");
|
||||
await FillAirlockWater();
|
||||
chamberState = AirLockChamberState.Full;
|
||||
}
|
||||
|
||||
if (frontAirlockState == AirLockState.Closed) {
|
||||
await PlayFrontDoorOpenAnimation();
|
||||
frontAirlockState = AirLockState.Open;
|
||||
}
|
||||
});
|
||||
|
||||
//Player enters FrontAirLockInside
|
||||
//Front door closes
|
||||
//Water drains
|
||||
//Back door opens
|
||||
triggerManager.RegisterFunctionTrigger("FrontAirLockInside", async (event) => {
|
||||
if (frontAirlockState == AirLockState.Open) {
|
||||
await PlayFrontDoorCloseAnimation();
|
||||
frontAirlockState = AirLockState.Closed;
|
||||
}
|
||||
if (chamberState == AirLockChamberState.Full) {
|
||||
await delay(7);
|
||||
await EmptyAirlockWater();
|
||||
chamberState = AirLockChamberState.Empty;
|
||||
}
|
||||
|
||||
if (backAirlockState == AirLockState.Closed) {
|
||||
await delay(7);
|
||||
await PlayBackDoorOpenAnimation();
|
||||
backAirlockState = AirLockState.Open;
|
||||
}
|
||||
});
|
||||
|
||||
//Player enters BackAirLockOutside
|
||||
//Back door closes
|
||||
|
||||
triggerManager.RegisterFunctionTrigger("BackAirLockOutside", async (event) => {
|
||||
if (backAirlockState == AirLockState.Open) {
|
||||
world.sendMessage("Closing back door");
|
||||
await PlayBackDoorCloseAnimation();
|
||||
backAirlockState = AirLockState.Closed;
|
||||
}
|
||||
});
|
||||
|
||||
// function loadCommands() {
|
||||
Commands.register(PREFIX, "fien", (arg) => {
|
||||
system.run(() => {
|
||||
arg.player.teleport(vector3(2468, 11, 114));
|
||||
});
|
||||
});
|
||||
|
||||
Commands.register(PREFIX, "info", (arg) => {
|
||||
world.sendMessage("-----------------");
|
||||
world.sendMessage("Current level: " + mindKeeper.get(CURRENT_LEVEL));
|
||||
@@ -212,12 +402,77 @@ Commands.register(PREFIX, "kboom", (arg) => {
|
||||
})();
|
||||
});
|
||||
|
||||
Commands.register(PREFIX, "restore", restoreDoor);
|
||||
|
||||
system.afterEvents.scriptEventReceive.subscribe((event) => {
|
||||
if (event.id == "cc:getId") {
|
||||
let id = event.message;
|
||||
world.sendMessage("Script got the id " + id);
|
||||
mindKeeper.set(AGENT_ID, id);
|
||||
}
|
||||
Commands.register(PREFIX, "restore", (arg) => {
|
||||
restoreDoor();
|
||||
});
|
||||
|
||||
Commands.register(PREFIX, "resetAirlock", (arg) => {
|
||||
SetFrontDoorClosed();
|
||||
SetBackDoorClosed();
|
||||
FillAirlockWater();
|
||||
|
||||
frontAirlockState = AirLockState.Closed;
|
||||
backAirlockState = AirLockState.Closed;
|
||||
chamberState = AirLockChamberState.Full;
|
||||
});
|
||||
// }
|
||||
|
||||
let frontDoorRoot: Vector3 = vector3(2474, 11, 94);
|
||||
let backDoorRoot: Vector3 = vector3(2472, 11, 100);
|
||||
|
||||
const frameDuration = 7;
|
||||
|
||||
let SetFrontDoorClosed = () => SetFrame(FrontAirLockOpenFrames[0], frontDoorRoot);
|
||||
let SetFrontDoorOpen = () => SetFrame(FrontAirLockOpenFrames[FrontAirLockOpenFrames.length - 1], frontDoorRoot);
|
||||
let PlayFrontDoorOpenAnimation = async () => playAnimation(FrontAirLockOpenFrames, frameDuration, false, frontDoorRoot);
|
||||
let PlayFrontDoorCloseAnimation = async () => playAnimation(FrontAirLockOpenFrames, frameDuration, true, frontDoorRoot);
|
||||
|
||||
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 FillAirlockWater = async () => CycleAirLockWater(true, frameDuration / 1.5);
|
||||
let EmptyAirlockWater = async () => CycleAirLockWater(false, frameDuration / 1.5);
|
||||
|
||||
triggerManager.RegisterFunctionTrigger("openFrontDoor", (event) => PlayFrontDoorOpenAnimation());
|
||||
triggerManager.RegisterFunctionTrigger("closeFrontDoor", (event) => PlayFrontDoorCloseAnimation());
|
||||
|
||||
triggerManager.RegisterFunctionTrigger("openBackDoor", (event) => PlayBackDoorOpenAnimation());
|
||||
triggerManager.RegisterFunctionTrigger("closeBackDoor", (event) => PlayBackDoorCloseAnimation());
|
||||
|
||||
triggerManager.RegisterFunctionTrigger("fillAirlock", (event) => FillAirlockWater());
|
||||
triggerManager.RegisterFunctionTrigger("emptyAirlock", (event) => EmptyAirlockWater());
|
||||
|
||||
async function SetFrame(frame: ClonePos, destination: Vector3) {
|
||||
await world
|
||||
.getDimension("overworld")
|
||||
.runCommandAsync(
|
||||
`/clone ${Vector3ToCommandString(frame.point1)} ${Vector3ToCommandString(frame.point2)} ${Vector3ToCommandString(
|
||||
destination
|
||||
)}`
|
||||
);
|
||||
}
|
||||
|
||||
let animationPlaying = false;
|
||||
async function playAnimation(frames: ClonePos[], delayTime: number, reverse: boolean, destination: Vector3) {
|
||||
if (animationPlaying) {
|
||||
world.sendMessage("Animation already playing");
|
||||
return;
|
||||
}
|
||||
let frameCount = frames.length;
|
||||
animationPlaying = true;
|
||||
|
||||
for (let i = 0; i < frameCount; i++) {
|
||||
let frame = reverse ? frames[frameCount - i - 1] : frames[i];
|
||||
await world
|
||||
.getDimension("overworld")
|
||||
.runCommandAsync(
|
||||
`/clone ${Vector3ToCommandString(frame.point1)} ${Vector3ToCommandString(
|
||||
frame.point2
|
||||
)} ${Vector3ToCommandString(destination)}`
|
||||
);
|
||||
await delay(delayTime);
|
||||
}
|
||||
animationPlaying = false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user