From 67e3f6fecc929c66d4a61236705412ec23e85592 Mon Sep 17 00:00:00 2001 From: ForestOfLight Date: Mon, 10 Mar 2025 23:16:42 -0700 Subject: [PATCH] Add and remove structure with outline --- README.md | 73 ++++++------------ example_help.png | Bin 83916 -> 0 bytes manifest.json | 20 +++-- scripts/classes/Outliner.js | 82 ++++++++++++++++++++ scripts/classes/Structure.js | 77 +++++++++++++++++++ scripts/classes/StructureCollection.js | 39 ++++++++++ scripts/commands/struct.js | 42 +++++++++++ scripts/config.js | 8 ++ scripts/lib/Vector.js | 69 +++++++++++++++++ scripts/main.js | 99 +------------------------ scripts/utils.js | 13 ++++ structures/Everything.mcstructure | Bin 0 -> 130545 bytes 12 files changed, 369 insertions(+), 153 deletions(-) delete mode 100644 example_help.png create mode 100644 scripts/classes/Outliner.js create mode 100644 scripts/classes/Structure.js create mode 100644 scripts/classes/StructureCollection.js create mode 100644 scripts/commands/struct.js create mode 100644 scripts/config.js create mode 100644 scripts/lib/Vector.js create mode 100644 scripts/utils.js create mode 100644 structures/Everything.mcstructure diff --git a/README.md b/README.md index 36b2827..1573aa2 100644 --- a/README.md +++ b/README.md @@ -2,71 +2,42 @@ Canopy Extension Example Icon -

Canopy Extension Example

+

StrucTool

-[![Codacy Quality](https://app.codacy.com/project/badge/Grade/10040a714ad84a2f912d4dae9d3f6e57)](https://app.codacy.com/gh/ForestOfLight/Canopy-Extension-Example/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) +[![Codacy Quality](https://app.codacy.com/project/badge/Grade/10040a714ad84a2f912d4dae9d3f6e57)](https://app.codacy.com/gh/ForestOfLight/StrucTool/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) [![Minecraft - Version](https://img.shields.io/badge/Minecraft-v1.21.60_(Bedrock)-brightgreen)](https://feedback.minecraft.net/hc/en-us/sections/360001186971-Release-Changelogs) -[![GitHub License](https://img.shields.io/github/license/forestoflight/canopy-extension-example)](LICENSE) +[![GitHub License](https://img.shields.io/github/license/forestoflight/structool)](LICENSE) [![Discord](https://badgen.net/discord/members/9KGche8fxm?icon=discord&label=Discord&list=what)](https://discord.gg/9KGche8fxm) --- -Extensions?! In a behavior pack?! Yep! This repo contains an example pack designed to teach you how to create your own extensions for **Canopy**. All extensions must be added to the same world as **Canopy** (the dependencies in the `manifest.json` should ensure that). +Intro paragraph. -## How this example pack functions ingame +> [!IMPORTANT] +> This addon is a **Canopy Extension**, which means **Canopy** must be installed in your world for it to work. +> [Download **Canopy** here!](https://github.com/ForestOfLight/Canopy) -What **Canopy** handles: +## Usage -**`./canopy [true/false]`** -**Canopy** will automatically include the names of your rules in the `./canopy` command. +All commands are prefixed with `./`. Do `./help` for more information. -**`./help`** -**Canopy** will automatically include a Rules and a Commands help page for your extension. +**Usage: `./struct add `** +Adds a new structure. -![Help Page](./example_help.png) +**Usage: `./struct remove `** +Removes a structure. -What the extension handles: +## Roadmap -**`./example [message]`** -This command sends a message to the chat. It also has a default message if no message is provided. (Alias: `./ex`) - -**`commandExample`** -This rule will enable the `./example` command. - -**`exampleRule`** -This rule will enable a message in chat when you push a button. - -## How to create an extension - -1. Clone this repo. - ```sh - git clone https://github.com/ForestOfLight/canopy-extension-example.git - ``` -2. Remove all files that are not the `pack_icon.png`, the `manifest.json` file, or in the `scripts/` folder. -3. Rename the folder to your extension's name. - ```sh - mv canopy-extension-example your-extension-name - ``` -4. Open the folder in your favorite code editor. -5. Edit the `manifest.json` file to match your extension's information. -6. Replace the `pack_icon.png` with your extension's icon. -7. Edit the `main.js` file to add your extension's functionality. - -> [!TIP] -> Most information about how to code a **Canopy Extension** can be found in the `main.js` file. - -## How to use an extension - -1. Add the extension pack to the same world as the **Canopy** RP & BP. -2. Profit. - -**Canopy** will automatically detect the extension and load it! - -## How does this work? - -**Canopy** and its extensions all communicate using scriptevents! The vanilla `/scriptevent` command allows for sending strings to Behavior Packs and the `ScriptEventCommandMessage` event allows for recieving them. **Canopy** uses [MCBE-IPC](https://https://github.com/OmniacDev/MCBE-IPC), a library that streamlines the process of sending and recieving scriptevents. -**Canopy Extensions** use these to communicate with **Canopy** when new rules and commands are added. **Canopy** uses these as well to get rule data, set rule data, and call command callbacks from extensions. +- [ ] Add new structures by pasting a string +- [ ] Make a viewable material list +- [ ] structuraMode & holoprintMode rules for ease of use +- [ ] Make automatic material grabbing from inventories +- [ ] structure placement (ghost and solid) +- [ ] easyPlace rule +- [ ] more litematica features! +- [ ] send structure as a scriptevent so that other addons can use it ## Issues & Suggestions diff --git a/example_help.png b/example_help.png deleted file mode 100644 index 4889a69a03380dee0ed3ae42a78604125a518a69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83916 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

Pqb$$M$k(a2zIlMm8e7 zTWp+5HZhEtdE+_wDqTx_;rdGFpT@4asp<(^7ia?{LHPws*8`3=Xzi5q50SGLTE8w0 zw3U*fDiU=NS+KfoIJS@_s#2^R?&W*&)+x_pzNV5)wgT9xx~dBj={Tj?R|C)8R$C7C z|BYi`LDj8S@1*){hW$kJWE?8nBUI}eBD@^vjN0;%N5p#R6`|&jEdb&*AK<2VqzqO! zluXwQbqPJn7*Fu=fHEkd(;6KhH83Br)!eDFfs&DsI5b}P7+z^_$tPQqfBzdEvZcQR ze|+N?l}C~b96$6AMb@xQ})S=rh;hF0%ZhBkR2dd%mPFfPIpbA&vz#}MUN=NYdgvGr^ev*nysi&{j+l^NYVDhkhv3>QeKF| zx;*Vo4$nSfhTWo)ZVJZ(3k{&oU4Z;7O0E+slL}aDO!MY+lVM7=7fRcE3l#f{TvcvA zY-l(VD{|4sxW;qHf@52Ruz#5Bu#$j3()&?d2g_v8(93 zhI8G~f72(m@OeeBkmLEQ@1^Gd;A^RDDoJ}(8*ekHw53DFru}P|uI6+3a+f1l%@t;^ z?SA1z=Gq!0ZXWK?5&i+0>^KeT?z@e3PO6w-{?_FnZb#6UIV z(IJ8*R3$$P=%d-0ANK6rb=|b5qA$;hB_|$mqJHfuLqYGjy&x!6<*r}A4e2shw8~@=aqL`TZQ~Y zBXqlC*L%iL$wL{UQZsN@RgfG}y^+#YwN29!y z;$Ct=eP`&7551mk$Qj=?wzb8yP+j_-PZt#PEthpF-#3eWStZq?vRsPj&I^m8fmb!W ze`fa$P_DFoIuVTf>PgUY9#M3qjoZx-=!Vsxfr_AkBy;s0OmL8Z#A$9d5AOC_+0Tdh z%;5WOZZQczMoNTMs)NJ75_P~Ut?_g>xs1nOXs;(OTo@RdL!8XxBmV|ImTJA--kREO z>}!QuQgsDiomrZ2XMY@k4VcoE){(w$ZV^KOwfDX>iz7)fu7`s15&d{~jW|Zz7o>xL zIvU|&xAGPcwH4p8BR1%~n?ZVgup;vnDDip o6}{;qi#fx|%rDMHz~_DA|D?vL9hA!c3j7$HH~J<2-1WQv4GVNY?EnA( diff --git a/manifest.json b/manifest.json index c4b9575..ffc6aa4 100644 --- a/manifest.json +++ b/manifest.json @@ -1,9 +1,9 @@ { "format_version": 2, "header": { - "name": "Canopy Extension Example", - "description": "Example extension for §l§aCanopy§r by §aForestOfLight§r.", - "uuid": "e4e844d5-f45b-4623-82a7-534d44bb4c6f", + "name": "StrucTool", + "description": "Survival building extension for §l§aCanopy§r by §aForestOfLight§r.", + "uuid": "8c0c0153-d8b9-482a-889f-aef922b8fe58", "min_engine_version": [1, 21, 60], "version": [1, 0, 0] }, @@ -11,7 +11,7 @@ { "description": "Behavior Pack Module", "type": "data", - "uuid": "1ce9eab8-0d4a-4e40-a899-575791a1b40d", + "uuid": "f4d52ae1-2c26-4938-b8c2-7e455d495620", "version": [1, 0, 0] }, { @@ -19,7 +19,7 @@ "type": "script", "language": "javascript", "entry": "scripts/main.js", - "uuid": "839a937e-b4f9-4484-84a4-0db984822f25", + "uuid": "8bb9a1e4-0531-4b93-8ade-3880bfe1e2fc", "version": [1, 0, 0] } ], @@ -28,6 +28,10 @@ "module_name": "@minecraft/server", "version": "1.18.0-beta" }, + { + "module_name": "@minecraft/server-ui", + "version": "1.4.0-beta" + }, { "uuid": "bcf34368-ed0c-4cf7-938e-582cccf9950d", // Canopy RP "version": [1, 0, 2] @@ -36,5 +40,9 @@ "uuid": "7f6b23df-a583-476b-b0e4-87457e65f7c0", // Canopy BP "version": [1, 3, 8] } - ] + ], + "metadata": { + "authors": [ "ForestOfLight" ], + "license": "MIT" + } } diff --git a/scripts/classes/Outliner.js b/scripts/classes/Outliner.js new file mode 100644 index 0000000..18d2a61 --- /dev/null +++ b/scripts/classes/Outliner.js @@ -0,0 +1,82 @@ +import { MolangVariableMap, system, world } from "@minecraft/server"; +import { Vector } from "../lib/Vector"; + +const drawFrequency = 8; +const drawParticle = "minecraft:villager_happy"; + +export class Outliner { + dimension; + min = new Vector(); + max = new Vector(); + #shouldDraw = true; + + #drawParticles = []; + #runner = null; + + constructor(dimension, min, max) { + this.dimension = world.getDimension(dimension); + this.min = new Vector(min.x, min.y, min.z); + this.max = new Vector(max.x, max.y, max.z); + } + + startDraw() { + this.#shouldDraw = true; + this.#runner = system.runInterval(() => this.draw(), drawFrequency); + } + + stopDraw() { + system.clearRun(this.#runner); + this.shouldDraw = false; + } + + draw() { + if (!this.#shouldDraw) return; + this.#drawParticles.length = 0; + this.#drawParticles.push(...this.getCubiodParticleLocations()); + + for (const [particleType, location] of this.#drawParticles) { + try { + this.dimension.spawnParticle(particleType, location); + } catch { + /* pass */ + } + } + } + + getCubiodParticleLocations() { + const vertices = [ + new Vector(this.min.x, this.min.y, this.min.z), + new Vector(this.max.x, this.min.y, this.min.z), + new Vector(this.min.x, this.max.y, this.min.z), + new Vector(this.max.x, this.max.y, this.min.z), + new Vector(this.min.x, this.min.y, this.max.z), + new Vector(this.max.x, this.min.y, this.max.z), + new Vector(this.min.x, this.max.y, this.max.z), + new Vector(this.max.x, this.max.y, this.max.z) + ]; + const edges = [ + [0, 1], + [0, 2], + [0, 4], + [1, 3], + [1, 5], + [2, 3], + [2, 6], + [3, 7], + [4, 5], + [4, 6], + [5, 7], + [6, 7] + ]; + const edgePoints = []; + for (const edge of edges) { + const [startVertex, endVertex] = [vertices[edge[0]], vertices[edge[1]]]; + const resolution = Math.min(Math.floor(endVertex.subtract(startVertex).length), 16); + for (let i = 1; i < resolution; i++) { + const t = i / resolution; + edgePoints.push(startVertex.lerp(endVertex, t)); + } + } + return vertices.concat(edgePoints).map((v) => [drawParticle, v]); + } +} \ No newline at end of file diff --git a/scripts/classes/Structure.js b/scripts/classes/Structure.js new file mode 100644 index 0000000..ba35f29 --- /dev/null +++ b/scripts/classes/Structure.js @@ -0,0 +1,77 @@ +import { MinecraftDimensionTypes, world } from "@minecraft/server"; +import { Outliner } from "./Outliner"; + +export class Structure { + #structure; + #options = { + isPlaced: false, + dimensionId: MinecraftDimensionTypes.overworld, + location: { x: 0, y: 0, z: 0 }, + rotation: 0, + mirror: false + }; + + constructor(structureName) { + this.name = structureName; + this.#structure = world.structureManager.get(structureName); + this.#options = this.loadOptions(); + } + + loadOptions() { + try { + return JSON.parse(world.getDynamicProperty(`structOptions:${this.name}`)); + } catch (e) { + world.setDynamicProperty(`structOptions:${this.name}`, JSON.stringify(this.#options)); + } + return this.#options; + } + + updateOptions() { + world.setDynamicProperty(`structOptions:${this.name}`, JSON.stringify(this.#options)); + } + + getName() { + return this.name; + } + + getStructure() { + return this.#structure; + } + + getOutlineLimits() { + if (!this.#options.isPlaced) + throw new Error(`[StrucTool] Structure '${this.name}' is not placed.`); + return { + min: { + x: this.#options.location.x, + y: this.#options.location.y, + z: this.#options.location.z + }, + max: { + x: this.#options.location.x + this.#structure.size.x, + y: this.#options.location.y + this.#structure.size.y, + z: this.#options.location.z + this.#structure.size.z + } + } + } + + place(dimensionId, location) { + this.#options = { + isPlaced: true, + dimensionId, + location: { x: Math.floor(location.x), y: Math.floor(location.y), z: Math.floor(location.z) }, + }; + this.updateOptions(); + this.outliner = new Outliner(dimensionId, this.getOutlineLimits().min, this.getOutlineLimits().max); + this.outliner.startDraw(); + } + + remove() { + if (!this.#options.isPlaced) + throw new Error(`[StrucTool] Structure '${this.name}' is not placed.`); + this.#options.isPlaced = false; + this.updateOptions(); + this.outliner.stopDraw(); + delete this.outliner; + } +} \ No newline at end of file diff --git a/scripts/classes/StructureCollection.js b/scripts/classes/StructureCollection.js new file mode 100644 index 0000000..cbd578a --- /dev/null +++ b/scripts/classes/StructureCollection.js @@ -0,0 +1,39 @@ +import { world } from '@minecraft/server'; +import { Structure } from './Structure'; + +class StructureCollection { + #structures; + + constructor() { + this.#structures = {}; + } + + add(name) { + const struct = world.structureManager.get(name); + this.#structures[name] = new Structure(name, struct); + } + + get(name) { + const structure = this.#structures[name]; + if (!structure) { + throw new Error(`Structure ${name} not found.`); + } + return structure; + } + + remove(name) { + const struct = this.get(name); + struct.remove(); + delete this.#structures[name]; + } + + place(name, dimensionId, location) { + const struct = this.get(name); + if (!struct) { + throw new Error(`Structure ${name} not found.`); + } + struct.place(dimensionId, location); + } +} + +export const structureCollection = new StructureCollection(); \ No newline at end of file diff --git a/scripts/commands/struct.js b/scripts/commands/struct.js new file mode 100644 index 0000000..3ce064b --- /dev/null +++ b/scripts/commands/struct.js @@ -0,0 +1,42 @@ +import { Command } from '../lib/canopy/CanopyExtension'; +import { extension } from '../config'; +import { structureCollection } from '../classes/StructureCollection'; + +const structCmd = new Command({ + name: 'struct', + description: { text: 'Manages current StrucTool structures.' }, + usage: 'struct', + callback: structCommand, + args: [ + { type: 'string', name: 'option' }, + { type: 'string', name: 'name' } + ] +}); +extension.addCommand(structCmd); + +function structCommand(sender, args) { + const { option, name, structure } = args; + switch (option) { + case 'add': + addStructure(sender, name, structure); + break; + case 'remove': + removeStructure(sender, name); + break; + case 'place': + structureCollection.place(name, sender.dimension.id, sender.location); + break; + default: + structCmd.sendUsage(sender); + } +} + +function addStructure(sender, name, filename) { + structureCollection.add(name, filename); + sender.sendMessage({ text: `Added structure '${name}'` }); +} + +function removeStructure(sender, name) { + structureCollection.remove(name); + sender.sendMessage({ text: `Removed structure '${name}'` }); +} \ No newline at end of file diff --git a/scripts/config.js b/scripts/config.js new file mode 100644 index 0000000..39efd76 --- /dev/null +++ b/scripts/config.js @@ -0,0 +1,8 @@ +import { CanopyExtension } from './lib/canopy/CanopyExtension'; + +export const extension = new CanopyExtension({ + author: 'ForestOfLight', + name: 'StrucTool', + description: 'Survival building extension for §l§aCanopy§r!', + version: '1.0.0' +}); \ No newline at end of file diff --git a/scripts/lib/Vector.js b/scripts/lib/Vector.js new file mode 100644 index 0000000..85fe960 --- /dev/null +++ b/scripts/lib/Vector.js @@ -0,0 +1,69 @@ +/** + * Part of ItemStack Database by @gameza_src + * Unknown author + */ +const isVec3Symbol = Symbol("isVec3"); +export function Vector(x = 0, y = 0, z = 0) { + if (new.target) { + this.x = Number(x); + this.y = Number(y); + this.z = Number(z); + } else {return { x: Number(x), y: Number(y), z: Number(z), __proto__: Vector.prototype };} +} +Vector.magnitude = function magnitude(vec) { return Math.sqrt(vec.x * vec.x + vec.y * vec.y + vec.z * vec.z); } +Vector.normalize = function normalize(vec) { const l = Vector.magnitude(vec); return { x: vec.x / l, y: vec.y / l, z: vec.z / l, __proto__: Vector.prototype }; } +Vector.cross = function crossProduct(a, b) { return { x: a.y * b.z - a.z * b.y, y: a.x * b.z - a.z * b.x, z: a.x * b.y - a.y * b.x, __proto__: Vector.prototype }; } +Vector.dot = function dot(a, b) { return a.x * b.x + a.y * b.y + a.z * b.z; } +Vector.angleBetween = function angleBetween(a, b) { return Math.acos(Vector.dot(a, b) / (Vector.magnitude(a) * Vector.magnitude(b))); } +Vector.subtract = function subtract(a, b) { return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z, __proto__: Vector.prototype } }; +Vector.add = function add(a, b) { return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z, __proto__: Vector.prototype } }; +Vector.multiply = function multiply(vec, num) { + if (typeof num == "number") return { x: vec.x * num, y: vec.y * num, z: vec.z * num, __proto__: Vector.prototype }; + return { x: vec.x * num.x, y: vec.y * num.y, z: vec.z * num.z, __proto__: Vector.prototype }; +} +Vector.isVec3 = function isVec3(vec) { return vec[isVec3Symbol] === true; } +Vector.floor = function floor(vec) { return { x: Math.floor(vec.x), y: Math.floor(vec.y), z: Math.floor(vec.z), __proto__: Vector.prototype }; } +Vector.projection = function projection(a, b) { return Vector.multiply(b, Vector.dot(a, b) / ((b.x * b.x + b.y * b.y + b.z * b.z) ** 2)); } +Vector.rejection = function rejection(a, b) { return Vector.subtract(a, Vector.projection(a, b)); } +Vector.reflect = function reflect(v, n) { return Vector.subtract(v, Vector.multiply(n, 2 * Vector.dot(v, n))); } +Vector.lerp = function lerp(a, b, t) { return Vector.multiply(a, 1 - t).add(Vector.multiply(b, t)); } +Vector.distance = function distance(a, b) { return Vector.magnitude(Vector.subtract(a, b)); } +Vector.from = function from(object) { + if (Vector.isVec3(object)) return object; + if (Array.isArray(object)) return new Vector(object[0], object[1], object[2]); + const { x = 0, y = 0, z = 0 } = object ?? {}; + return { x: Number(x), y: Number(y), z: Number(z), __proto__: Vector.prototype }; +} +Vector.sort = function sort(vec1, vec2) { + const [x1, x2] = vec1.x < vec2.x ? [vec1.x, vec2.x] : [vec2.x, vec1.x]; + const [y1, y2] = vec1.y < vec2.y ? [vec1.y, vec2.y] : [vec2.y, vec1.y]; + const [z1, z2] = vec1.z < vec2.z ? [vec1.z, vec2.z] : [vec2.z, vec1.z]; + return [{ x: x1, y: y1, z: z1, __proto__: Vector.prototype }, { x: x2, y: y2, z: z2, __proto__: Vector.prototype }]; +} +Vector.up = { x: 0, y: 1, z: 0, __proto__: Vector.prototype }; +Vector.down = { x: 0, y: -1, z: 0, __proto__: Vector.prototype }; +Vector.right = { x: 1, y: 0, z: 0, __proto__: Vector.prototype }; +Vector.left = { x: -1, y: 0, z: 0, __proto__: Vector.prototype }; +Vector.forward = { x: 0, y: 0, z: 1, __proto__: Vector.prototype }; +Vector.backward = { x: 0, y: 0, z: -1, __proto__: Vector.prototype }; +Vector.zero = { x: 0, y: 0, z: 0, __proto__: Vector.prototype }; +Vector.prototype = { + distance(vec) { return Vector.distance(this, vec); }, + lerp(vec, t) { return Vector.lerp(this, vec, t); }, + projection(vec) { return Vector.projection(this, vec); }, + reflect(vec) { return Vector.reflect(this, vec); }, + rejection(vec) { return Vector.rejection(this, vec); }, + cross(vec) { return Vector.cross(this, vec); }, + dot(vec) { return Vector.dot(this, vec); }, + floor() { return Vector.floor(this); }, + add(vec) { return Vector.add(this, vec); }, + subtract(vec) { return Vector.subtract(this, vec); }, + multiply(num) { return Vector.multiply(this, num); }, + get length() { return Vector.magnitude(this); }, + get normalized() { return Vector.normalize(this); }, + x: 0, + y: 0, + z: 0, + [isVec3Symbol]: true, + toString() { return `<${this.x}, ${this.y}, ${this.z}>`; } +} \ No newline at end of file diff --git a/scripts/main.js b/scripts/main.js index 9646470..f03bc75 100644 --- a/scripts/main.js +++ b/scripts/main.js @@ -1,97 +1,4 @@ -import { CanopyExtension, Command, Rule } from './lib/canopy/CanopyExtension'; -import { world } from '@minecraft/server'; +// Rules -/** - * Create a new CanopyExtension instance to define your extension. - */ -const extension = new CanopyExtension({ - author: 'YourName', - name: 'ExampleExtension', - description: 'Example extension for §l§aCanopy§r!', - version: '1.0.0' -}); - -// -------------------------------------------- - -/** - * Adding a new Rule: - */ -const exampleRule = new Rule({ - identifier: 'exampleRule', // The name of the rule - description: { text: 'An example rule that prints a message in chat when you hit a button.' }, // Shows up in the help command. Must be a RawMessage type (translatable!). - // Optional: - contingentRules: [], // Rules that will be enabled when this rule is enabled - independentRules: [], // Rules that will be disabled when this rule is enabled - onEnableCallback: () => world.afterEvents.buttonPush.subscribe(onButtonPush), // Function to run when the rule is enabled (also runs when the extension is loaded, if the rule is already enabled) - onDisableCallback: () => world.afterEvents.buttonPush.unsubscribe(onButtonPush) // Function to run when the rule is disabled -}); -extension.addRule(exampleRule); - -// use the rule to control your code flow -function onButtonPush(event) { - if (!exampleRule.getValue()) - return; - if (event.source === undefined) // Always check for undefined entities and players. Simulated players always show up as undefined in events. - return; - event.source.sendMessage('§aYou pushed a button!'); -} - -// -------------------------------------------- - -/** - * Making a second new rule which we can use to enable the example command: - * (This is not required to make a new command, but it is helpful to allow admins to disable your commands.) - */ -const commandExampleRule = new Rule({ - identifier: 'commandExample', - description: { text: 'Enables the example command.' } // Shows up in the help command. RawMessage type. -}); -extension.addRule(commandExampleRule); - -/** - * Adding a new Command: - */ -const exampleCommand = new Command({ - name: 'example', // The name of the command - description: { text: 'An example command that prints your message in chat.' }, // Shows up in the help command. RawMessage type. - usage: 'example [message]', // The usage of the command that shows up in the help command & when used incorrectly - callback: exampleCommandCallback, // The function to run when the command is executed - // Optional: - args: [ - { type: 'string|number', name: 'message' } // The arguments that the command takes. 'string|number' means it can be either a string or a number - ], - contingentRules: ['commandExample'], // Rules that must be true for the command to be enabled - adminOnly: false, // Whether the command can only be run by admins (users with the 'CanopyAdmin' tag) - helpEntries: [ // Additional help entries that show up in the help command - { usage: `example`, description: { text: `Run the example command with the default message.` } } // Description is a RawMessage type. - ], - helpHidden: false // Whether the command should be hidden from the help command. -}); -extension.addCommand(exampleCommand); - -/** - * Adding a command alias: - * This is essentially just adding a new command that runs the same function as the original command and hiding its help. - */ -const exampleCommandAlias = new Command({ - name: 'ex', - description: { text: 'An alias for the example command.' }, - usage: 'ex [message]', - callback: exampleCommandCallback, - args: [ - { type: 'string|number', name: 'message' } - ], - contingentRules: ['commandExample'], - helpHidden: true -}); -extension.addCommand(exampleCommandAlias); - -// now you can define the function that will be called when the command is executed -function exampleCommandCallback(sender, args) { - let { message } = args; - if (message === null) - message = 'Hello, world!'; - if (!isNaN(parseFloat(message)) && isFinite(message)) - message = message.toString(); - sender.sendMessage(`§aYou ran the example command with the message: §7${message}`); -} +// Commands +import './commands/struct.js'; diff --git a/scripts/utils.js b/scripts/utils.js new file mode 100644 index 0000000..6cf2187 --- /dev/null +++ b/scripts/utils.js @@ -0,0 +1,13 @@ +import { FormCancelationReason } from '@minecraft/server-ui'; + +export async function forceShow(player, form, timeout = Infinity) { + const startTick = system.currentTick; + while ((system.currentTick - startTick) < timeout) { + const response = await form.show(player); + if (startTick + 1 === system.currentTick && response.cancelationReason === FormCancelationReason.UserBusy) + player.sendMessage({ translate: 'commands.canopy.menu.busy' }); + if (response.cancelationReason !== FormCancelationReason.UserBusy) + return response; + } + throw new Error({ translate: 'commands.canopy.menu.timeout', with: [String(timeout)] }); +}; \ No newline at end of file diff --git a/structures/Everything.mcstructure b/structures/Everything.mcstructure new file mode 100644 index 0000000000000000000000000000000000000000..5eb8d95c36bdd1cf0c4445917ddc4ff298d3010e GIT binary patch literal 130545 zcmeHQ2YB4Zv0jR#SX5nOJBee*>D4+?E@`$US+)|%RxG8L3wQ^T2#<#ga3_jR^5XQ~ zd+)vX-h1!K>;2`u^xli#KMNc%I0B2s9YEVU=;N;=?+!D&v%9miv$M0)LX2(|^R}~W zw5vx<$F=O{h!A3GOt{vS=IAJXKNFzW3xVk=;kKPlt=)0VsV!ozVb_+bRN8nDtoq@Xm7XTLm7XiBfs{b%!nEO7} zo!Wjkum`vp*b7_&Tng+1?h4!u*bf{4E(0zH4gz-vt^f`Jhk<(l_XO?*+#9$La9`kl z!2N*-01pJJz=Hq-m;-7+9Wa4;U;&`AEdun<0v-%30S#aoXaY9S0v-Z5fD5#N4sZlm z0geKzz?Hy5frkMP2mTIt1aPeN{i{%?M*@!m9t}JOcr5TZ;PJo{0A6R3^Du*C@kHQB zz>|Te08a&;20R^j2JlSaS-`V_=K#+Io(DW1cmeQ2;6=cTftLU;1zrZc9C!urO5jz% ztAW=5uLWKQydHQ1@J8TGz?*@$0B;4}2D}}32k=hdUBJ76_W-I^VHkfO=DtsLr#Alr@I~NDz?Xrq0AB^Z z27Dd(2JlVbTfn!0?*QKgz6X3C_1pW*7Z{UA` z9{~Rg{2%Z`;77oZfu8_B1%3wn9QXzBOW;?)uYunHzXg5={2urN@JHZJz@LG?0DlGk z23!q@5&QrffKgx!7zZ{2!`SC}oy-33^??cWg-KxQ8hD)s&rQH)U<P6AE_t_Pd~oC=%{05=702HYID1;G2lF#g_8 z|Gy>V*3Wa-#%HL_Z-x5Y+V2au!Ru{-+X1%+&IWb>6<`LK1$F}G0Otbd0p|mE0PYCf z3Ai(G7vKWmLf|4`7qA=H16&O31ug+D1@-}V1?~py2Mz$20ha>@fx81&0Ed9Xz&(I_ z0`~&$4crH~FK|EL{=fr(2Le^#L4X0w0X3iwn7}-+01RWF=XJg|_Q@j3w1~Ejqf4@| z@L9ijFrHlk8o)9@E@>NR0S^Hjzy;bs2RH((07rpU;7Z`3z{7xt1AhlR0=NpGIq8wW zqku;Pj{zPFJPvp~@C4wAz>|O{15W{-3fvNS8t`=B8Nf3Es^_!t`fT7iz;l7;0lY5^ zz*DeyAj<-jX|R|2mBUJbkkcrEZc;Pt>8fHwkf z0^SU~1$Zm)HsI~RJAiir?*iTpya#wM@IK)Ezz2X20v`fC415ImDDW}h=_zdt_;B&y|fiD1G1il1(8TbnDRp4vD*MV;U-vqt|d>i-woyK|LMQ}7heAx_#fa0!2bgO2mBDA=YHhB{@8#0iU0ajy#5UMIq(bMm%y)p zUjx4Zehd5#_&x9k;E%wcfIkC&0sad74Y(R0MkBxmU=$bw#(|B%1TYEE4(K$1pKBF1 z`DNO?PGw8#7hAxeko0-K@Ba(hr#q%Njov=YKhycW`#kAc;=!NkeirwNDvGW6ZyT^3 zI1V@-H~}~jpfNylI0-lzxE`>G_fEm73A4RBlFcEIg{vwLGg7=Q1|p`X{+ zL%xK5p4EMZ#veiV`)S|n((1mZeg9bh{F>_Xq(^mlliuz9F0Jq4p6%L2^cg)v`kH>H z?NATYYa1>Ytt^^(m;OAP8Ed7|i`!G~0%QM$@84OyNxIS@R zdM|D*ou&NLz7NNLe+N7QxC(eA@F)O3*BCDKc|RJ3Sn&1#WAOW9{c=sM;ct3< zJYJswJP~*j@MPdAz*B*z0Z#|;Bc9>E((l(+JQD@$)}QK`R8Fe*v+yCkUWNKR5_lBw zXy7rxV}Zv3j|ZLr#L>ypSB}N+l1!eB|DFRp7kD1#xQ(FeV*c_`D>~7 zhiBd!hCZ&UBlY{wqr=lHq3rv^B?DF87>3WN&ws)1|6j!Gmw+z=Ujgt_;ux2~F!XU% z9jX6+6&=0Q{lhudRefU^KBIpBHNXFV9k1U2z6pE_z)y)|Tn59?$5nNt{{L-s^iuy1 z=U9*H8-vEw$I-mDzDNE3J3amXyQS_QntAWq+Ar6uTx8>Xuk7zb)8DDRIpif6bnv_U zS4yCiKq-Mz0;L2>36v5jB~VJBlt3wgQUav}N(qz_C?!xzpp-xmc1WE~%5-255 zN}!a$a7cg-$WTqYuftL6vX-R;N(qz_C?!xzpp-xmc1WE~% z5-255N}!ZLDS=V~r36X|loBW36v5jB~VJBlt3wgQUav}N(qz_ zC?!xzpp-xmc1WE~%5-25*rv#=Zh1qOdZOe40anxFjOo-i!rrS2_Vq{$Gwi~u1 zMmBoCRK)mZvDauc_E>J)Xx2=8Uu+l?do2gQj%*hDnnyZ~rs)`S4U;JCb1!NxIIHp_ z_o7bQZraOs$0dUM++D^TKAFUC7aMJ>xgbWS@cShVt1kbb4=!ogb4EjqY{&2W8VzH? zbaor9wqZ5J$TZ%&+-WTuO)BbE`m58ve15mxY&$ldA!1k9h7%AwR5KjTiUW2V-yf$dZGL$BlRi%G{_PvzzB8(QdGiv-?lkKoWB7dq zLc7dd={D@>R&mgF+D2oyZ8z%nN|TN=y(~Yl+FlhmibG3QbKf3%esoeCYCC3gp}i>o z+!XwIz&J|pOpS@d#)3<~iqUCt7=pQce%>|PuQ@a#P@#J?t%r2XeS1#F=M~gybV6{s zY!Y>I-fE)P*-dwny4@+_)@TB=<{0zsJDAP7=~QdZDtcLCa#~n*>Z0?O>0D1Fd`nDE zh?dbX+ierSfx6LYw5PU+xrSX^s&+s5J_Iy5CYoqsP6=$lyIx&r7_K|LQQ+^k=}wM| z8g>71v9f5jO@TTbF&%3D?PB{#m(HoIL~h&Z)Y=`#tV*^ar4vCi@=>+D+A_z4YaB_U zyM@s;EGM9qPz?R*jEM!uSWO^vI^*gtqjN7-AJQ?L_LWtVkrN7MWSi);Tr^CTx@UFH zYKzhBV#Tzax?Qb9AJnLAsbv#5@d6jb;xtwnbgAl`W1%nPU6C^x7wDI2(`+xI_ZGwK zhKyOEj80~ZimA$t8HbkLu-rum&%nrcG1zi%B|c0GW5T;aP^G$MJ4Mv!6eho-c*Ir+ z>I0fP|0d!UDvHNVnb3UwMq}1RmvCX7bcn+sdz6an<6gwKy(ZMJ(H{y9%{H zjZ}<6x&iMS1@hsls1Ad%Y8&~_N_=`XYDUd6a#yLG#e+M|g+~6PCo&6JPHnN!O1Lf9 zX!%#-MAom0XzI12q-M`y0alDc<4sZwhlq`1JIhAHANF}$Zr5iGvtl?{!&T=^tZJ(Z zF#iLCdvr=f>{+b(tY&out6*vMVkKv{OwR&NFm<_NsX5lNYd4Ew#3dJKmO`q;Mdz!R z!uj|*rVu`SKAV$@rVut(&Eo;5& ze7*S0!0oDN#kP69!1FeeZ*N+(9LrrM_p_PQi!{6IHPW1YR(lGY3BIFkh-$rE^g8~A zsPdZypO1&A;+S2@p*%!2K2EIh!VFREH(?Ve@IDPuy|+m17I^uFsOD4Hpz|HWLsaWY z(cK^!qDo`W*xRQWsyh4IEJIZ1?i9vM`5~(PCPXv@u3=TZQ`Q`E8J+T-!Iqgx>uByk z@*PjDhS6LKBNGx9;Cy$n>v__9@+9V7#p3%n7CdurP)yk|=ffZ#4AmE(ic z^*!kzTM6h+9_Jez#LaVXRARbsFZ+c0bC+PqEo8Q>mszB*Xflbf(rn0OZIx!xjmWIh z53oawA39*bw zyk^_Tr)V2RtK+l~Fc=?Tm9cPR2>I&dL~B|!tc694>f9)fiQ1~s%%`T~2;?%&oQRE~ zs>?ZvZKGH<8x4CUpK5LtHUdr-aw^*>EoSm57_I*)G&7fO3u5H*&WD&X#4qD`g8$!Y zAnq}rlBr`UxpJ4Wm{DDpPy}ugL^NTbuCQ_Ej%v>l^Ww{2#&vG@>a3$lQam?-H4PLcf(zpI@rLr_QPzQzACXcJC%$6!Vp0lX#D(War4+>Jcs2+NV!@Yg{*X-^u5?@mCx__s z>LM0ih%Ci91|HER2XKqR`Qr1uTgC4!j&tLU~sPsXWqd6P+xbx z{=i=szT7DG)WEv108l_f||b#RcdT6LWr(6t1+MVP;B)o2G>Ge z?-23gA2OoB+8qfRlGY_TDry}Zk&jIwz*|n2-X^h#v-b8vW3{#D=14c_<_R>pp%Vm0 z^)Je-BTJCy?OIbJhs>0G@dJ<1@O1YxEfqv?kxH#+&6SQX=wP&_U# zf8EN`V#x0!;2Hf{HP<0wnyw&>ZqELIsGu(#+i|UTp+JV#gKVvVX;7F-o|dn z8Hj~CZfZ+6u*p*@nw-|?%V;bc*+MeNow}R9D#%1Xz8B1dv&Py8u$gW0(2&PhY8lPC z#Pdq)-eh5MC8)_Pv*4oVVv6G8A41V2A1^U=>l`NncW5^*yg+VY@OgnupbEMPhy1AT z0-3=i^did($7Tp+|*jA=Sa;! z^-^4sWopO^S9H;$;+9FwIJ>Bgd^1(9hH zNr@lRqM-~O)1sgeHKs*J88D_rK^-fmMM4=SrbQtoLQIo}GB`|&hAJ*hi-0;LOqYZr z8cd6XGMH71LP{u^77caaDi77^j`)N23XksZj(cSweg-;e`Xd9W6fKg0l2VssprfHt zGEh_Ml?-&$+9d-arH;u!Cq>g_qNLO}87Qf=P6je+-II-wLIY(Wq|`$h=%i?)43yM5 ziJvq==IfT(4j18mW@Du;(s({i2WgN<(LEXzlsZS_c@15oK}D%!G@e)M77YSQoucu4 ziZ0QjpwuB66jZuH<8igl&?BJG6&eJTIzr?56y2afL9G+EvK;}$b+C+DIvOGM=`?+i zN+3lWq&~0I1*uPKXo6H4N6oXEEyngP?kv!C{E{bSe(8(aJ~f;qDukl@Kt{b+hzG*Pd% zEE9QDDIXp@GNe-Xyn*rS|qQijisnL1kjvvz>R0VN8EEsBlU?L6bL70GU zFcII%rGwmbRmGK%XxntKJ&wyfjG!Jd$H>PiMlU}0dCEIc>LyvP(FnHyo=J-h?sg^>0prQAsKs0`XJ z$ZH_-29)Q@i=j-jTyB(k*TA08YHoyi*YJ*?=SG^#S>EfD8)e=zy64ar4F~yR&`oL$ zV>M9GTE4*S=aY%@$3YZ26}dK8WwwYqDm7!J2|yYpPio4$j?qL#p>^epmG_I zouF!6ke!-(q0kpS#ma$u^DtZZdx=@&tLKqS1!quOcId*x{dApH9rqNdjA|aeDidbA z)Hl}itrAV=0=)}#6Po?8*Ls-n;X$c{DEog$K{Qt6AqJvg%gj+ zMj9{*9q~qY!&q(wV=UoeUXM%<@)5lNtsq&ZaYG~n4#s#_D?YfhWX{<~(;ne`ns(dN z3j2*jmo0W0OLT6Y@zOGTbcv)HJGyjIOdMS@O2bB%h=w_%OG;_P=n_$zF1l2d28%9{ z6f;GijM6yKC8IJ)bZMv!kqlH6=7%m7rT>&9P|rxz4KC}gBPUZJGK8Vm{P(I2+$3z((JNr= zI=E|Ci#nh38n_~cPw3odO$jz}p;wFSYY1B5pyu_Tv+X5ZSK62l3Y<_$e%ui^i{Y+n zx@)g4WIBVH%k_9jfiJn1RQZKvH`bmZ4p;ewB?KC?`q~;lw(n5sH1Trs`wS)uP)naI-S5S;tL8L1{)$LIO+v36z83 zAUkIANaIQm!N9P}LTYPM&MNi_BC^6&+3o6l$7ve1uq$U%b$pNxMv0dUd8ZrI8jSFH z+(I4Jlx1m?gMPCxkJ4c5$cu-Q5{e8=SWo@sQ`o3V%|doV}ckI~dKFSwth=*$1@L0DNSM~Vv63c~@He0^$D7z-I zl}DzdkqLo$VF3hn+F-D!v32Y4R02qTW;N%nrZtCwtkO(e?%k;d85D8-8dE0O9Y1_) zyJ6eQiNiHv8sodh?Ph3ljhrZOU!1*C#dKgg(sJ;0@+OS>Rs%WQRh5kl`Zi8Lu3|r% zR@!0l*6PhMJq0`vA#Q`zEf?30x?KKi3q{HtH`KKqYhfYHz~Lhuy#$6QYudp`^BHI{ zl`;tu?oA9(x>8tSl5tN{r`fgP$PP6eqs=GHUgf`4;F7-<4*ZbkMo!izbl-71b1=JW z-rEV?F1iTmGIq?CNj7TOOM2LjZpGZ~eWzMCu^~h?O<=*bRoz(iwxa7eNK%VbY#XJs z_WVxdgf(<6ZhH3#)DgDhE z4}_Q;S*@;^l$;$_d*0+dVdqMocU7;s@+dU-oBKZbJjn8G-L5-654wEoHOLv62VpJ; z-wU5NS>FMl2U*@1Jl}gBRJja%w|m}X{Y+qakmXY>W~bH)Z1w6QmeqkmLRgo#zV(;o zd;v;oQ%^Ic6L3sda?R+NxtP ze;v$w`Wt?_w)9Djkd-OlfJ&8jW0R^%pwAn)Yh0?yi!9{1XPk1x;pQx5*)tL6YsU!H zEG3LOXkkj?(r;vzn|BPB36f7e(sy*cOjzQ7*IZRDQn(>6EkEQLz#^e1d0qdGGaNUq zcdT&fo6yo+T64IaC+wGceq^l$8DHnknTSgcSIip4qOl(qt2c`y>;ac71=(YrV4Z35fyRgGHUJga&=145%fyx>f zg$+BrgHM+t?+JLm5~>)=(6my;dot10B=)_Wr7FV1bSd*7s-Oq>hGmf@-6%XJ1C`S^ zP5UV)_qs-&$4ML{g6#^ltCe+&$-QcUI6d1o!lid+NYKcdrSw&lTySHGwQC^0B}&N@b~AKyE73VA^)VT$H1u0^84|C=*(ik7!CZ6pm;wGmsq4st_G5 z0viQxxm|`wHGY}TJ3@@lGbmHS<9sg917j2y06@N$vm zM9ohGrl!UN8A7LUP~X976y}Q?j82fHZBR14ND|2KZjWywL?%rRktJZWW+B=Gn+Hgf z7!H^OUfiwXCp?six^1>Cp71DdGCyan##7v0>1H6;cr3DQO?kaFp5gXJu;A8sj_;s( zN!c|X;`OTgDcLn1wk687V2YBlx(b5J&GUQ6NLuYyRmX@8Sc5O`uH^gp-jLxjU_-%a$|I8b^d? ztCe&S3GbTzLE@fTCe(+|B7RRnFKegHtej!DOKUyIo0Z~^E#`(!C?i*hu4zP-=;T&` z_o|*grUncW3nWnE`dEg=1RY^?GpRb{Ujl zOuGz9a!tDoO0c(GlIU@T<{Kw)Jt34Wb;jZ|UES{B_yNUYv53jZ<8Tdb_`bA^>G&56 zef>Ldxt)t`v_{WlwN22QY_=McZzN1reHD33%;Ts>ktHVj2_@$CDg_p{I?JskE8GL? z-A7Cy!&@1F%12gU-?48)n9xQq<`96%dH?vFV4X?8)gC1;W&=U9 zrpva!ws_lLrZL~s;y4w6;BOa>7IHR{v89!5A`7!_Kj@Pc_h)$Z3Y5#_7H<=(TdnRc zRPmhr9#cG{ZZ|5Plk8i4vf)w0!4{Oi%3j2+g$6rF)b9>CUx>$(*4>ZdvB^PcyKDQr zip!@SZf%8~H;WaPv;^vlOOoM~#DtrAI9Ifaess(i=A9h~6<)f#Pw zOp19MxlKVJp@g||n-c9s$CTw=4|Wrxy<)Fd-6jMMvuZM{JH`UmM!eY)jNx4m{Y$BOorgtwc}$l( z-sWA8=K!0ziybUJ!;h`DtJroJjPN$;9*Dhuo5!8e4p~^Bh^HgAyjzpW4pv?TVLti# zM(=zFi44LfjhV&bw z?K+uo++t}@5}x6uXvs^=s~S&nRju*$NGu};O4`8U>xMaF8L5ndC%89oyYN0lE)V#J zT*TW*v(t07z((;ug+ba_sv?0$Z3*5=7Y=WlVRegV?%FD&uhV}>NFyRE1 zN+=9p7s!q9hSdlYG$%a7YtUYSe~eZJN03`FRK1ubqMuaZVBM13uOiCaG?CkX4aMWI z3S=J;!Bdh6^8P?Y3j~4PS^7IXfC>9Zrx7qBMnO4Vw@1vkYlImF;VLa2p zPOEL%Nb2I*xNEm16_zAFo`4K-R7rMb%kM=MoP}B zY^PO0icgQ^0bhV?ZiQX)kf7eUu|j9@?!~jz^(MW*-^lZXFlc|B)06Z9XTRMJrGct@ zpX&@8^-<|5J;OpxL@@??1ykFALa$HW@yl2E7uT@s3B(G-IQ)9BvJaK!Ly?T&>$H&7>ijjY?8kxba0g$V*8ObkKwva0{#F3ED38 zQXm*dEq4OxRF|-(Oj^-#7gwhl$%3Cl@(W%$qMe?*RMGwTfyhWfH4fPDGXeB04zcOw zK2?;5>lUJ^k^fXdjZbR{aYqWz7+(v^J+f%#)GWs_`+u@w9AWdib}%|0M??adUsH2Q zBOyJ$8A&Cr(7=(qsAM+CgEAT9Mb7eW8>b~)m}tR>i#g??P^;YY>?MZGfhbpTDxoSA zZA3v}KX@thZ}5y5;fZ-2MUzaY8w@lk6=f8dW}VbwUz$X^0XlBNjP6cdx!)Js!pt}e`UPPyEhi)XrY|H&+-B_BudGO)c!l~G01Fjc@G}6AG ziyg*%Ys7<^WV#5(GH+gd+9{9??+5V^@ikuhnJomrd6D;Xc2YsPwcwA{x}A{Vmh?J8 z_UQ8}Wykiydl8moW1&ccctqb>$lX-k0lY4Zxk)0=L9Yu}J`}piV4(ZfLD0N`{R}ee z&ezWfvo3tOZSSRcSr@ik%zo0Ab?57+I9wOLx@LmH{EdjLX3Wnc#SgSfXz{|4i~CG0 zEMiv46o7IG{-%p-YD-Cay-zKfoGp=eD$ldzHjFUV1^%G$T{%5Of`s5}18MJe4~i*B zm@~LM{HBa>=_QlNU><~ciWNN=X{BjB2x+ywJqYC#Bb*P7^CMknAUk$2CKI|YH+MXLCix(vhE&3%+)U8_e^;WOM?Vs4tg`58OQSKmR#`!;xJ4xGu!8vT zwN7Ap6~v1-ly7UT11I0QDu@$bX?ylmL5#TYd<&`|PTV{wh($CpCN@c-+0t%o$C>7& z(-hgsVUDsI*i%jz=-COXFHhv7Ili6=1>uur+)`SN@dZ zqy={lyEAVTXCfLM89Xod(B!O~o*g11Rk@VTovO5wbEoQ0Cu#XHA`+mR(sJ0S;g(L$ zeC&LZifOz4x`ciW~b^TNZ~2~Y5P$ry^T3-{#Rx^iF&NjfEB z0aJ8S@1u0>LV2*-te6iMSO|Ao#3BwfIK-x4ETavtXxU$f$c3QacA~Y%zq|GfJZ|&*e zUII)~fhtdUklVQn2pojVOZPY@FREOZdpAC$anzQQZX5u_6IQb)y_;fRkk1j(t7d~5 zBwa#V3{^#a2PmteuMI#ok5Qlq<H4TDnm(s!-$@f7t!A`qRJ7q zB|}Mn$A~INR2HJYXGE1FYCJYcP@kxBL}ei=%`%^;azssLD5?&LA$-i*j@)8;9jd)r`4{Q8W;PJv)0R(GqO>5 zm&$r(*R(ja*l8@8&Mu9*gmz+OCbr)d!ZkD`D>Jb@uMn=GrCFJYoox!?8k(Y&nb;Yr z5U!Y#d|S0L6K??)(VL`=;LYa=i>@NLhSqLnHg+y7M8cstT$zp4Dur+j?d8gBtnMj< zYiLkcX4g+Qg%)>ZcKviyXp&cE*H1TvHhU#uZCS*~361(n!s4?CuFUFBSe+KZbvjtU zR1%i2MR483xMtH$as{$c?7}rcW+P%n#90rU8J}$0Nb;E$7bA&)vwM;5yYF?Y_gX44 zosp;IcV^Q;lGnJmZ3QExvzfp)f=Y$KMv#S zrK_)&Y$wHT{{(8P9FJpd7Hf}4f)irDS;JOd`a1M@MlW{Gm-IHHsS(Z6Y#)~UCcLr7 zDZ@;={qxV9b(gq4c4A2XoY)3|aCY1F(qU`a6avE8+c6s#`Iq!(*ffSeF9b zh!rSyE?MsaoxuteJL#-v>GbrsvbOl?AjXWvXh@8|4}*xAo#Le^2= zOhR|(?2gzakI#gbMtw60{hPBpV&_hu39b72W)eCyXX9P_J`-BJ_st~qV9v&S`+X*4 zO7_hpbXm^sP>pyp!TV+s`Y31P_YnM=khR)3lQ1M;Hh$Blb>-xlzhfJgsK!VrSlc>nm+R&i0gZQzt^eHY~l_uR2ln*>Z*V~M>rzFF*t zk#^9r7Z6e>zXm_eW#$TuUATkCv8do5jl%?`_u<$*Bs0!B{WS&W#K|;UoY`mX+ z-OBDweObyLdWUB#u{LVNV3#xNl-OfYB0N`Pat+>qn<}x;k2-r!Y;#}~TvThrHWOnT z#bJ4JgQ`sbq@X5Hjb^=r#1?!lOAFXuv+8DH9TF}2J>83i;XW70h>l`o2J3SyK;8C)wp3?>@kt8|3oof1EgA9KFmmoH>t$Wx5;1 zhAs52H1K6X&KRY4tY-Mm7sQ4W#1$rPyT&^IpuAb&3Imx^wv*FBer-2hr85@%DL)ZVr@SBzs6G~4EagUDGSzOXAYD&!vrDVPH19Wbz#EyuBO{BXO# z8!}k^5RxY!z=?9|Nyug3n9I0l!Jo=7XTd+@`BTPlG#)pD$PPzeMRJ8jdu12oM(H82 z^(b&}QIM18GJ{+~G$!|xgtm*LLB%egpLcP~75Q^-DM~d_g!? zX-<+>l$nLmm7wV9P|C8`3M0phi;tQ(lwe-o+>3l)ZPIHaI8nL(p#MnF{@dhxXi>^S zEZ;?c+kfy1zpu!5#_%9)8;_*)w2_P@S9;%@dEoKeF2Cmec@UG1zj=*=35Pnh8muBY z=IBXiIx3PJy!1D+-eQ)lE%~HIC&WGJdP=)VOD$}v8=baIeU+4>j3qyS{)7%0{Oy-r z3VU-`F5ZCRQwFqs%O4s+Pi2i6nCRHYjUCHbWiGDcG9M{k=D~^uGLN4HF#|joJSryZZcDeSbHF+L~GY?mZNP^93{KpB=kFgT=}LyVG98xm4*k+UosD3z}eo1O0wQ zcO5O>Lo4({l;?!@3O!FR6h6JNrZk5YrHR$*1D3`Uwr**H4MoT%R$C5O8tp)2*S@X}GN8R_?n7v=^LA9>}^aL1q< zairIch;)*xfnV_sCbFlk(xsCNw4S_>q^9XyJd=7v*VfZ?F3Knc`1OA1@d>?%5hrH& lHaQnB1Rw9;)XAYkw7OzDje6B~EbK1Gl{1x{+{Hv&{6B(WVvYa+ literal 0 HcmV?d00001