Repository: thebigsmileXD/MagicWE2 Branch: PM4 Commit: 350090296e94 Files: 170 Total size: 1.2 MB Directory structure: gitextract_btsf_fmh/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── feature_request.md │ │ └── todo-list.md │ └── workflows/ │ └── main.yml ├── .gitignore ├── .poggit.yml ├── LICENSE ├── README.md ├── TODO.md ├── phpstan.neon.dist ├── plugin.yml ├── resources/ │ ├── ContentLog__Wednesday__2020_February_19__00_27_24_1.txt │ ├── blockstate_alias_map.json │ ├── blockstaterotate.json │ ├── config.yml │ ├── donator.txt │ ├── door_data.json │ ├── lang/ │ │ ├── ara.ini │ │ ├── cat.ini │ │ ├── ces.ini │ │ ├── chi.ini │ │ ├── dan.ini │ │ ├── deu.ini │ │ ├── ell.ini │ │ ├── eng.ini │ │ ├── epo.ini │ │ ├── esp.ini │ │ ├── est.ini │ │ ├── fre.ini │ │ ├── geo.ini │ │ ├── hin.ini │ │ ├── ind.ini │ │ ├── ita.ini │ │ ├── jpn.ini │ │ ├── kor.ini │ │ ├── lao.ini │ │ ├── lit.ini │ │ ├── mar.ini │ │ ├── mas.ini │ │ ├── nld.ini │ │ ├── nor.ini │ │ ├── pol.ini │ │ ├── por.ini │ │ ├── rom.ini │ │ ├── rus.ini │ │ ├── slo.ini │ │ ├── swa.ini │ │ ├── swe.ini │ │ ├── tgl.ini │ │ ├── tha.ini │ │ └── zho.ini │ ├── parsepoggit.php │ ├── possible_blockstates.json │ └── rotation_flip_data.json └── src/ └── xenialdan/ └── MagicWE2/ ├── API.php ├── EventListener.php ├── Loader.php ├── clipboard/ │ ├── Clipboard.php │ ├── RevertClipboard.php │ └── SingleClipboard.php ├── commands/ │ ├── DonateCommand.php │ ├── HelpCommand.php │ ├── InfoCommand.php │ ├── LanguageCommand.php │ ├── LimitCommand.php │ ├── ReportCommand.php │ ├── SetRangeCommand.php │ ├── TestCommand.php │ ├── VersionCommand.php │ ├── args/ │ │ ├── LanguageArgument.php │ │ ├── MirrorAxisArgument.php │ │ └── RotateAngleArgument.php │ ├── biome/ │ │ ├── BiomeInfoCommand.php │ │ ├── BiomeListCommand.php │ │ └── SetBiomeCommand.php │ ├── brush/ │ │ ├── BrushCommand.php │ │ └── BrushNameCommand.php │ ├── clipboard/ │ │ ├── ClearClipboardCommand.php │ │ ├── CopyCommand.php │ │ ├── Cut2Command.php │ │ ├── CutCommand.php │ │ ├── FlipCommand.php │ │ ├── PasteCommand.php │ │ └── RotateCommand.php │ ├── debug/ │ │ └── PlaceAllBlockstatesCommand.php │ ├── generation/ │ │ └── CylinderCommand.php │ ├── history/ │ │ ├── ClearhistoryCommand.php │ │ ├── RedoCommand.php │ │ └── UndoCommand.php │ ├── region/ │ │ ├── OverlayCommand.php │ │ ├── ReplaceCommand.php │ │ └── SetCommand.php │ ├── selection/ │ │ ├── ChunkCommand.php │ │ ├── HPos1Command.php │ │ ├── HPos2Command.php │ │ ├── Pos1Command.php │ │ ├── Pos2Command.php │ │ └── info/ │ │ ├── CountCommand.php │ │ ├── ListChunksCommand.php │ │ └── SizeCommand.php │ ├── tool/ │ │ ├── DebugCommand.php │ │ ├── FloodCommand.php │ │ ├── ToggledebugCommand.php │ │ ├── TogglewandCommand.php │ │ └── WandCommand.php │ └── utility/ │ ├── CalculateCommand.php │ └── ToggleWailaCommand.php ├── event/ │ ├── MWEEditEvent.php │ ├── MWEEvent.php │ ├── MWESelectionChangeEvent.php │ ├── MWESessionLoadEvent.php │ └── MWESessionSettingChangeEvent.php ├── exception/ │ ├── ActionNotFoundException.php │ ├── ActionRegistryException.php │ ├── BrushException.php │ ├── CalculationException.php │ ├── InvalidBlockStateException.php │ ├── LimitExceededException.php │ ├── SelectionException.php │ ├── SessionException.php │ ├── ShapeNotFoundException.php │ └── ShapeRegistryException.php ├── helper/ │ ├── AsyncChunkManager.php │ ├── BlockEntry.php │ ├── BlockPalette.php │ ├── BlockStatesEntry.php │ ├── BlockStatesParser.php │ ├── Progress.php │ ├── Scoreboard.php │ ├── SessionHelper.php │ ├── StructureStore.php │ └── blockstatesparsertest.log ├── selection/ │ ├── Selection.php │ └── shape/ │ ├── Cone.php │ ├── Cube.php │ ├── Cuboid.php │ ├── Custom.php │ ├── Cylinder.php │ ├── Ellipsoid.php │ ├── Pyramid.php │ ├── Shape.php │ ├── ShapeRegistry.php │ └── Sphere.php ├── session/ │ ├── PluginSession.php │ ├── Session.php │ └── UserSession.php ├── task/ │ ├── AsyncActionTask.php │ ├── AsyncClipboardActionTask.php │ ├── AsyncCopyTask.php │ ├── AsyncCountTask.php │ ├── AsyncFillTask.php │ ├── AsyncPasteTask.php │ ├── AsyncReplaceTask.php │ ├── AsyncRevertTask.php │ ├── MWEAsyncTask.php │ └── action/ │ ├── ActionRegistry.php │ ├── ClipboardAction.php │ ├── CountAction.php │ ├── CutAction.php │ ├── FlipAction.php │ ├── RotateAction.php │ ├── SetBiomeAction.php │ ├── SetBlockAction.php │ ├── TaskAction.php │ ├── TestAction.php │ └── ThawAction.php └── tool/ ├── Brush.php ├── BrushProperties.php ├── Flood.php └── WETool.php ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report with detailed information for faster fixes title: "[Bug]" labels: Bug assignees: '' --- ### Description --- | MagicWE2 | Information | | --- | --- | | Version | INSERT PLUGIN VERSION HERE | | Plugin API Version | INSERT PLUGIN API HERE (optional) | | PMMP Protocol Version | SEE /VERSION | | PMMP Version | SEE /VERSION | | PMMP API Version | SEE /VERSION | ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea or request a feature for this project title: "[FR]" labels: Feature Request assignees: thebigsmileXD --- **Describe the feature you want here** **Suggestions** Suggest changes here **Related issues and pull requests** Please tag related issues and pull request here. ================================================ FILE: .github/ISSUE_TEMPLATE/todo-list.md ================================================ --- name: TODO list about: Template for the maintainers for things under TODO title: "[TODO]" labels: TODO assignees: '' --- **Description:** --- TODO list: - [ ] - [ ] - [ ] - [ ] - [ ] - [ ] - [ ] ================================================ FILE: .github/workflows/main.yml ================================================ name: PHPStan on: [push, pull_request] jobs: phpstan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: ref: ${{ github.ref }} - name: Create Vendor Directory run: | echo Making directory... mkdir vendor echo Directory made. - name: Download virions to vendor run: | php -f resources/parsepoggit.php > virion_urls.txt cat virion_urls.txt wget -P vendor --content-disposition -i virion_urls.txt rm virion_urls.txt - name: Run PHPStan uses: larryTheCoder/pmmp-phpstan-action@master with: phpstan-config: phpstan.neon.dist ================================================ FILE: .gitignore ================================================ .idea/* ================================================ FILE: .poggit.yml ================================================ --- # Poggit-CI Manifest. Open the CI at https://poggit.pmmp.io/ci/thebigsmileXD/MagicWE2 projects: MagicWE2: path: "" icon: "resources/magicwe_icon_square_small.png" excludeFiles: - "resources/magicwe_icon_square.png" - "resources/magicwe_icon_square_small.png" - "resources/magicwe_icon_wide.png" lint: phpstan: false libs: - src: BlockHorizons/libschematic/libschematic version: ^2.0.0 - src: thebigsmilexd/customui/customui version: ^4.0.0 branch: PM4 - src: thebigsmilexd/apibossbar/apibossbar version: ^0.1.3 branch: PM4 - src: CortexPE/Commando/Commando version: ^3.0.0 branch: PM4 - src: muqsit/invmenu/InvMenu version: ^4.0.1 branch: "4.0" - src: thebigsmilexd/libstructure/libstructure version: ^0.1.1 branch: mcstructure - src: buchwasa/ScoreFactory/ScoreFactory version: ^3.0.1 branch: pm4 ... ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. {one line to give the program's name and a brief idea of what it does.} Copyright (C) {year} {name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: {project} Copyright (C) {year} {fullname} This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: README.md ================================================ ![MagicWE2's awesome wide banner!](https://github.com/thebigsmileXD/MagicWE2/blob/master/resources/magicwe_icon_wide.png) --- # MagicWE2 Lag free asynchronous world editor for [PMMP](https://github.com/pmmp/PocketMine-MP) Try the new MagicWE, now way more powerful, with more support, more commands, new tools and more! [![Poggit-CI](https://poggit.pmmp.io/ci.badge/thebigsmileXD/MagicWE2/MagicWE2/master)](https://poggit.pmmp.io/ci/thebigsmileXD/MagicWE2) [![](https://poggit.pmmp.io/shield.state/MagicWE2)](https://poggit.pmmp.io/p/MagicWE2) [![](https://poggit.pmmp.io/shield.api/MagicWE2)](https://poggit.pmmp.io/p/MagicWE2) ![PHPStan](https://github.com/thebigsmileXD/MagicWE2/workflows/PHPStan/badge.svg) ## Why MagicWE2? _Rainbow sprinkles!_ Jokes aside, here is a list of pros: - Simple usage - Translations - Good performance and great speeds - Progress bars like on Windows 98! - Sessions - Clipboards - Optimized item / block parsing - you can place any block, by id, name, and item! - Alot more commands - Command auto-completion - Command flags (i.e. -p for relative copying/pasting, -h for hollow objects) - UI for brush setup and configuration - Fancy icon and optional startup ASCII art - Direct bug reporting to GitHub ## Commands | Command | Alias | Description | Usage | | --- | --- | --- | --- | | `//pos1` | `//1` | `Select first position` | `//pos1` | | `//pos2` | `//2` | `Select second position` | `//pos2` | | `//set` | `//fill` | `Fill an area with the specified blocks` | `//set [flags:text]` | | `//replace` | | `Replace blocks in an area with other blocks` | `//replace [flags:text]` | | `//copy` | | `Copy an area into a clipboard` | `//copy [flags:text]` | | `//paste` | | `Paste your clipboard` | `//paste [flags:text]` | | `//wand` | | `Gives you the selection wand` | `//wand` | | `//togglewand` | | `Toggle the wand tool on/off` | `//togglewand` | | `//undo` | | `Rolls back the last action` | `//undo` | | `//redo` | | `Applies the last undo action again` | `//redo` | | `//debug` | | `Gives you the debug stick, which gives information about the clicked block` | `//debug` | | `//toggledebug` | | `Toggle the debug stick on/off` | `//toggledebug` | | `//cylinder` | `//cyl` | `Create a cylinder` | `//cylinder [height:int] [flags:text]` | | `//count` | `//analyze` | `Count blocks in selection` | `//count [blocks:string] [flags:text]` | | `//help` | `//?,//mwe,//wehelp` | `MagicWE help command` | `//help [command:string]` | | `//version` | `//ver` | `MagicWE version` | `//version` | | `//info` | | `Information about MagicWE` | `//info` | | `//report` | `//bug,//github` | `Report a bug to GitHub` | `//report [title:text]` | | `//donate` | `//support,//paypal` | `Donate to support development of MagicWE!` | `//donate` | | `//brush` | | `Opens the brush tool menu` | `//brush` | | `//flood` | | `Opens the flood tool menu` | `//flood` | ## Planned features - Saved sessions (saved brushes and clipboards) - More commands, a glimpse at the plugin.yml should give you a good look what is coming up - Command based flags, since they are currently in a global state - Schematic and structure block data support - Clipboard naming, exporting and switching - ScoreboardAPI integration - Better and more brushes. For now i suggest using [BlockSniper](https://github.com/BlockHorizons/BlockSniper) for brushes! - [MyPlot](https://github.com/jasonwynn10/MyPlot) integration ## Fast updates You have an urgent issue, your server is crashing or players mess with the world and start griefing? Consider using //report to create a pre-filled GitHub issue! Feel free to open issues, feature requests and criticism are welcome! If you have an urgent issue, tag me on Twitter for faster response time: [@xenialdan](https://twitter.com/xenialdan) ## Quotes - _"MagicWE2 has a new fresh coating over the plugin, with rainbow colored sprinkle topping!"_ ~ XenialDan, 2017 ### Foot notes License: GNU GENERAL PUBLIC LICENSE Readme last updated: 4th August 2019 ================================================ FILE: TODO.md ================================================ TODO and bug list - [x] Redo does not apply changes - [ ] Setbiome does not send the changes, but //biomeinfo returns that it was set - [x] Count returns no messages - [x] Wand left click does not work without breaking blocks - [x] Brush command needs rework - [x] Undo seems to execute the action offset by 1 - [x] Shape does not refresh after pos1 and pos2 were set once - [x] Cylinder is 1 block too tall - [ ] Boss bar title does not always reset //appears to work now - [ ] Action with 0 blocks gets stuck (ErrorException: "Division by zero" (EXCEPTION) in "plugins/MagicWE2.phar/src/xenialdan/MagicWE2/task/AsyncFillTask" at line 119) - [ ] The flag is unknown //should be fixed by now - [x] "Created new session" string contains { and } - [ ] Session destructs upon re-login instead upon logout - [ ] Undo "steals" blocks that were changed manually later - todo test if fixed - [x] Rewrite CopyClipboard - [ ] Undo is incredibly slow - probably getAABB() - [ ] If an async task crashes, the user gets no feedback, and the boss bar gets stuck ================================================ FILE: phpstan.neon.dist ================================================ parameters: level: 7 checkMissingIterableValueType: false ignoreErrors: [] paths: - /source/src bootstrapFiles: - phar:///pocketmine/PocketMine-MP.phar/vendor/autoload.php scanDirectories: - /source/src - phar:///source/vendor/customui.phar/src - phar:///source/vendor/apibossbar.phar/src - phar:///source/vendor/Commando.phar/src - phar:///source/vendor/libschematic.phar/src - phar:///source/vendor/InvMenu.phar/src - phar:///source/vendor/libstructure.phar/src - phar:///source/vendor/ScoreFactory.phar/src excludes_analyse: - source/vendor ================================================ FILE: plugin.yml ================================================ --- name: MagicWE2 main: xenialdan\MagicWE2\Loader version: 10.1.2 api: ["4.0.0"] php: "7.4" authors: - XenialDan description: Lag free asynchronous world editor for PMMP with plenty of options prefix: 'MWE2' website: https://github.com/thebigsmileXD/MagicWE2 permissions: we.session: default: op we.donator: default: false we.command: default: op we.command.donate: default: true we.command.language: default: op we.command.help: default: op we.command.info: default: true we.command.limit: default: op we.command.report: default: op we.command.setrange: default: op we.command.version: default: op we.command.biome: default: op we.command.biome.info: default: op we.command.biome.list: default: op we.command.biome.set: default: op we.command.brush: default: op we.command.brush.name: default: op we.command.clipboard: default: op we.command.clipboard.clear: default: op we.command.clipboard.copy: default: op we.command.clipboard.cut: default: op we.command.clipboard.flip: default: op we.command.clipboard.paste: default: op we.command.clipboard.rotate: default: op we.command.generation: default: op we.command.generation.cyl: default: op we.command.history: default: op we.command.history.clear: default: op we.command.history.redo: default: op we.command.history.undo: default: op we.command.region: default: op we.command.region.overlay: default: op we.command.region.replace: default: op we.command.region.set: default: op we.command.selection: default: op we.command.selection.chunk: default: op we.command.selection.hpos: default: op we.command.selection.pos: default: op we.command.selection.info: default: op we.command.selection.info.count: default: op we.command.selection.info.listchunks: default: op we.command.selection.info.size: default: op we.command.tool: default: op we.command.tool.debug: default: op we.command.tool.floodfill: default: op we.command.tool.toggledebug: default: op we.command.tool.togglewand: default: op we.command.tool.wand: default: op we.command.utility: default: op we.command.utility.calculate: default: op we.command.utility.togglewaila: default: op we.command.test: default: op ... ================================================ FILE: resources/ContentLog__Wednesday__2020_February_19__00_27_24_1.txt ================================================ 00:32:58[Scripting][inform]-{"0":"{\"old_log_type\":\"oak\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:32:59[Scripting][inform]-{"0":"{\"old_log_type\":\"spruce\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:00[Scripting][inform]-{"0":"{\"old_log_type\":\"birch\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:01[Scripting][inform]-{"0":"{\"old_log_type\":\"jungle\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:01[Scripting][inform]-{"0":"{\"old_log_type\":\"oak\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:33:02[Scripting][inform]-{"0":"{\"old_log_type\":\"spruce\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:33:03[Scripting][inform]-{"0":"{\"old_log_type\":\"birch\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:33:04[Scripting][inform]-{"0":"{\"old_log_type\":\"jungle\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:33:04[Scripting][inform]-{"0":"{\"old_log_type\":\"oak\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:33:05[Scripting][inform]-{"0":"{\"old_log_type\":\"spruce\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:33:06[Scripting][inform]-{"0":"{\"old_log_type\":\"birch\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:33:07[Scripting][inform]-{"0":"{\"old_log_type\":\"jungle\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:33:07[Scripting][inform]-{"0":"{\"pillar_axis\":\"y\",\"stripped_bit\":false,\"wood_type\":\"oak\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:08[Scripting][inform]-{"0":"{\"pillar_axis\":\"y\",\"stripped_bit\":false,\"wood_type\":\"spruce\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:09[Scripting][inform]-{"0":"{\"facing_direction\":0,\"triggered_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:10[Scripting][inform]-{"0":"{\"facing_direction\":1,\"triggered_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:10[Scripting][inform]-{"0":"{\"facing_direction\":2,\"triggered_bit\":false}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:33:11[Scripting][inform]-{"0":"{\"facing_direction\":3,\"triggered_bit\":false}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:33:12[Scripting][inform]-{"0":"{\"facing_direction\":4,\"triggered_bit\":false}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:33:13[Scripting][inform]-{"0":"{\"facing_direction\":5,\"triggered_bit\":false}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:33:13[Scripting][inform]-{"0":"{\"facing_direction\":0,\"triggered_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:14[Scripting][inform]-{"0":"{\"facing_direction\":1,\"triggered_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:15[Scripting][inform]-{"0":"{\"facing_direction\":2,\"triggered_bit\":false}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:33:16[Scripting][inform]-{"0":"{\"facing_direction\":3,\"triggered_bit\":false}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:33:16[Scripting][inform]-{"0":"{\"facing_direction\":4,\"triggered_bit\":false}","90":"{\"facing_direction\":2,\"triggered_bit\":true}","180":"{\"facing_direction\":5,\"triggered_bit\":true}","270":"{\"facing_direction\":3,\"triggered_bit\":true}","x":"{\"triggered_bit\":true}","z":"{\"facing_direction\":5,\"triggered_bit\":true}","xz":"{\"facing_direction\":5,\"triggered_bit\":true}"} 00:33:17[Scripting][inform]-{"0":"{\"facing_direction\":5,\"triggered_bit\":false}","90":"{\"facing_direction\":3,\"triggered_bit\":true}","180":"{\"facing_direction\":4,\"triggered_bit\":true}","270":"{\"facing_direction\":2,\"triggered_bit\":true}","x":"{\"triggered_bit\":true}","z":"{\"facing_direction\":4,\"triggered_bit\":true}","xz":"{\"facing_direction\":4,\"triggered_bit\":true}"} 00:33:18[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":0}","90":"{\"rail_direction\":1}","180":"{}","270":"{\"rail_direction\":1}","x":"{}","z":"{}","xz":"{}"} 00:33:19[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":1}","90":"{\"rail_direction\":0}","180":"{}","270":"{\"rail_direction\":0}","x":"{}","z":"{}","xz":"{}"} 00:33:19[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":2}","90":"{\"rail_direction\":5}","180":"{\"rail_direction\":3}","270":"{\"rail_direction\":4}","x":"{}","z":"{\"rail_direction\":3}","xz":"{\"rail_direction\":3}"} 00:33:20[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":3}","90":"{\"rail_direction\":4}","180":"{\"rail_direction\":2}","270":"{\"rail_direction\":5}","x":"{}","z":"{\"rail_direction\":2}","xz":"{\"rail_direction\":2}"} 00:33:21[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":4}","90":"{\"rail_direction\":2}","180":"{\"rail_direction\":5}","270":"{\"rail_direction\":3}","x":"{\"rail_direction\":5}","z":"{}","xz":"{\"rail_direction\":5}"} 00:33:22[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":5}","90":"{\"rail_direction\":3}","180":"{\"rail_direction\":4}","270":"{\"rail_direction\":2}","x":"{\"rail_direction\":4}","z":"{}","xz":"{\"rail_direction\":4}"} 00:33:22[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":0}","90":"{\"rail_data_bit\":true,\"rail_direction\":1}","180":"{\"rail_data_bit\":true}","270":"{\"rail_data_bit\":true,\"rail_direction\":1}","x":"{\"rail_data_bit\":true}","z":"{\"rail_data_bit\":true}","xz":"{\"rail_data_bit\":true}"} 00:33:23[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":1}","90":"{\"rail_direction\":0}","180":"{}","270":"{\"rail_direction\":0}","x":"{}","z":"{}","xz":"{}"} 00:33:24[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":2}","90":"{\"rail_data_bit\":true,\"rail_direction\":5}","180":"{\"rail_data_bit\":true,\"rail_direction\":3}","270":"{\"rail_data_bit\":true,\"rail_direction\":4}","x":"{\"rail_data_bit\":true}","z":"{\"rail_data_bit\":true,\"rail_direction\":3}","xz":"{\"rail_data_bit\":true,\"rail_direction\":3}"} 00:33:25[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":3}","90":"{\"rail_data_bit\":true,\"rail_direction\":4}","180":"{\"rail_data_bit\":true,\"rail_direction\":2}","270":"{\"rail_data_bit\":true,\"rail_direction\":5}","x":"{\"rail_data_bit\":true}","z":"{\"rail_data_bit\":true,\"rail_direction\":2}","xz":"{\"rail_data_bit\":true,\"rail_direction\":2}"} 00:33:25[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":4}","90":"{\"rail_direction\":2}","180":"{\"rail_direction\":5}","270":"{\"rail_direction\":3}","x":"{\"rail_direction\":5}","z":"{}","xz":"{\"rail_direction\":5}"} 00:33:26[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":5}","90":"{\"rail_data_bit\":true,\"rail_direction\":3}","180":"{\"rail_data_bit\":true,\"rail_direction\":4}","270":"{\"rail_data_bit\":true,\"rail_direction\":2}","x":"{\"rail_data_bit\":true,\"rail_direction\":4}","z":"{\"rail_data_bit\":true}","xz":"{\"rail_data_bit\":true,\"rail_direction\":4}"} 00:33:27[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":0}","90":"{\"rail_direction\":1}","180":"{}","270":"{\"rail_direction\":1}","x":"{}","z":"{}","xz":"{}"} 00:33:28[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":1}","90":"{\"rail_direction\":0}","180":"{}","270":"{\"rail_direction\":0}","x":"{}","z":"{}","xz":"{}"} 00:33:28[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":2}","90":"{\"rail_direction\":5}","180":"{\"rail_direction\":3}","270":"{\"rail_direction\":4}","x":"{}","z":"{\"rail_direction\":3}","xz":"{\"rail_direction\":3}"} 00:33:29[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":3}","90":"{\"rail_direction\":4}","180":"{\"rail_direction\":2}","270":"{\"rail_direction\":5}","x":"{}","z":"{\"rail_direction\":2}","xz":"{\"rail_direction\":2}"} 00:33:30[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":4}","90":"{\"rail_direction\":2}","180":"{\"rail_direction\":5}","270":"{\"rail_direction\":3}","x":"{\"rail_direction\":5}","z":"{}","xz":"{\"rail_direction\":5}"} 00:33:31[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":5}","90":"{\"rail_direction\":3}","180":"{\"rail_direction\":4}","270":"{\"rail_direction\":2}","x":"{\"rail_direction\":4}","z":"{}","xz":"{\"rail_direction\":4}"} 00:33:31[Scripting][inform]-{"0":"{\"rail_data_bit\":true,\"rail_direction\":0}","90":"{\"rail_direction\":1}","180":"{}","270":"{\"rail_direction\":1}","x":"{}","z":"{}","xz":"{}"} 00:33:32[Scripting][inform]-{"0":"{\"rail_data_bit\":true,\"rail_direction\":1}","90":"{\"rail_direction\":0}","180":"{}","270":"{\"rail_direction\":0}","x":"{}","z":"{}","xz":"{}"} 00:33:33[Scripting][inform]-{"0":"{\"rail_data_bit\":true,\"rail_direction\":2}","90":"{\"rail_direction\":5}","180":"{\"rail_direction\":3}","270":"{\"rail_direction\":4}","x":"{}","z":"{\"rail_direction\":3}","xz":"{\"rail_direction\":3}"} 00:33:34[Scripting][inform]-{"0":"{\"rail_data_bit\":true,\"rail_direction\":3}","90":"{\"rail_direction\":4}","180":"{\"rail_direction\":2}","270":"{\"rail_direction\":5}","x":"{}","z":"{\"rail_direction\":2}","xz":"{\"rail_direction\":2}"} 00:33:34[Scripting][inform]-{"0":"{\"rail_data_bit\":true,\"rail_direction\":4}","90":"{\"rail_direction\":2}","180":"{\"rail_direction\":5}","270":"{\"rail_direction\":3}","x":"{\"rail_direction\":5}","z":"{}","xz":"{\"rail_direction\":5}"} 00:33:35[Scripting][inform]-{"0":"{\"rail_data_bit\":true,\"rail_direction\":5}","90":"{\"rail_direction\":3}","180":"{\"rail_direction\":4}","270":"{\"rail_direction\":2}","x":"{\"rail_direction\":4}","z":"{}","xz":"{\"rail_direction\":4}"} 00:33:36[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:37[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:37[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:33:38[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:33:39[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:33:40[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:33:40[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:41[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:42[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:33:43[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:33:43[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:33:44[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:33:45[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"west\"}","90":"{\"torch_facing_direction\":\"north\"}","180":"{\"torch_facing_direction\":\"east\"}","270":"{\"torch_facing_direction\":\"south\"}","x":"{}","z":"{\"torch_facing_direction\":\"east\"}","xz":"{\"torch_facing_direction\":\"east\"}"} 00:33:46[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"west\"}","90":"{\"torch_facing_direction\":\"north\"}","180":"{\"torch_facing_direction\":\"east\"}","270":"{\"torch_facing_direction\":\"south\"}","x":"{}","z":"{\"torch_facing_direction\":\"east\"}","xz":"{\"torch_facing_direction\":\"east\"}"} 00:33:46[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"east\"}","90":"{\"torch_facing_direction\":\"south\"}","180":"{\"torch_facing_direction\":\"west\"}","270":"{\"torch_facing_direction\":\"north\"}","x":"{}","z":"{\"torch_facing_direction\":\"west\"}","xz":"{\"torch_facing_direction\":\"west\"}"} 00:33:47[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"north\"}","90":"{\"torch_facing_direction\":\"east\"}","180":"{\"torch_facing_direction\":\"south\"}","270":"{\"torch_facing_direction\":\"west\"}","x":"{\"torch_facing_direction\":\"south\"}","z":"{}","xz":"{\"torch_facing_direction\":\"south\"}"} 00:33:48[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"south\"}","90":"{\"torch_facing_direction\":\"west\"}","180":"{\"torch_facing_direction\":\"north\"}","270":"{\"torch_facing_direction\":\"east\"}","x":"{\"torch_facing_direction\":\"north\"}","z":"{}","xz":"{\"torch_facing_direction\":\"north\"}"} 00:33:49[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"top\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:33:49[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:33:50[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:33:51[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:33:52[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:33:52[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:33:53[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:33:54[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:33:55[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:33:55[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:33:56[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:33:57[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:33:58[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:33:58[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:33:59[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:34:00[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:34:01[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:34:01[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:34:02[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:34:03[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:34:04[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:34:04[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:34:05[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:34:06[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:34:07[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:34:07[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:34:08[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:34:09[Scripting][inform]-{"0":"{\"ground_sign_direction\":0}","90":"{\"ground_sign_direction\":4}","180":"{\"ground_sign_direction\":8}","270":"{\"ground_sign_direction\":12}","x":"{\"ground_sign_direction\":8}","z":"{}","xz":"{\"ground_sign_direction\":8}"} 00:34:10[Scripting][inform]-{"0":"{\"ground_sign_direction\":1}","90":"{\"ground_sign_direction\":5}","180":"{\"ground_sign_direction\":9}","270":"{\"ground_sign_direction\":13}","x":"{\"ground_sign_direction\":7}","z":"{\"ground_sign_direction\":15}","xz":"{\"ground_sign_direction\":9}"} 00:34:10[Scripting][inform]-{"0":"{\"ground_sign_direction\":2}","90":"{\"ground_sign_direction\":6}","180":"{\"ground_sign_direction\":10}","270":"{\"ground_sign_direction\":14}","x":"{\"ground_sign_direction\":6}","z":"{\"ground_sign_direction\":14}","xz":"{\"ground_sign_direction\":10}"} 00:34:11[Scripting][inform]-{"0":"{\"ground_sign_direction\":3}","90":"{\"ground_sign_direction\":7}","180":"{\"ground_sign_direction\":11}","270":"{\"ground_sign_direction\":15}","x":"{\"ground_sign_direction\":5}","z":"{\"ground_sign_direction\":13}","xz":"{\"ground_sign_direction\":11}"} 00:34:12[Scripting][inform]-{"0":"{\"ground_sign_direction\":4}","90":"{\"ground_sign_direction\":8}","180":"{\"ground_sign_direction\":12}","270":"{\"ground_sign_direction\":0}","x":"{}","z":"{\"ground_sign_direction\":12}","xz":"{\"ground_sign_direction\":12}"} 00:34:13[Scripting][inform]-{"0":"{\"ground_sign_direction\":5}","90":"{\"ground_sign_direction\":9}","180":"{\"ground_sign_direction\":13}","270":"{\"ground_sign_direction\":1}","x":"{\"ground_sign_direction\":3}","z":"{\"ground_sign_direction\":11}","xz":"{\"ground_sign_direction\":13}"} 00:34:13[Scripting][inform]-{"0":"{\"ground_sign_direction\":6}","90":"{\"ground_sign_direction\":10}","180":"{\"ground_sign_direction\":14}","270":"{\"ground_sign_direction\":2}","x":"{\"ground_sign_direction\":2}","z":"{\"ground_sign_direction\":10}","xz":"{\"ground_sign_direction\":14}"} 00:34:14[Scripting][inform]-{"0":"{\"ground_sign_direction\":7}","90":"{\"ground_sign_direction\":11}","180":"{\"ground_sign_direction\":15}","270":"{\"ground_sign_direction\":3}","x":"{\"ground_sign_direction\":1}","z":"{\"ground_sign_direction\":9}","xz":"{\"ground_sign_direction\":15}"} 00:34:15[Scripting][inform]-{"0":"{\"ground_sign_direction\":8}","90":"{\"ground_sign_direction\":12}","180":"{\"ground_sign_direction\":0}","270":"{\"ground_sign_direction\":4}","x":"{\"ground_sign_direction\":0}","z":"{}","xz":"{\"ground_sign_direction\":0}"} 00:34:16[Scripting][inform]-{"0":"{\"ground_sign_direction\":9}","90":"{\"ground_sign_direction\":13}","180":"{\"ground_sign_direction\":1}","270":"{\"ground_sign_direction\":5}","x":"{\"ground_sign_direction\":15}","z":"{\"ground_sign_direction\":7}","xz":"{\"ground_sign_direction\":1}"} 00:34:16[Scripting][inform]-{"0":"{\"ground_sign_direction\":10}","90":"{\"ground_sign_direction\":14}","180":"{\"ground_sign_direction\":2}","270":"{\"ground_sign_direction\":6}","x":"{\"ground_sign_direction\":14}","z":"{\"ground_sign_direction\":6}","xz":"{\"ground_sign_direction\":2}"} 00:34:17[Scripting][inform]-{"0":"{\"ground_sign_direction\":11}","90":"{\"ground_sign_direction\":15}","180":"{\"ground_sign_direction\":3}","270":"{\"ground_sign_direction\":7}","x":"{\"ground_sign_direction\":13}","z":"{\"ground_sign_direction\":5}","xz":"{\"ground_sign_direction\":3}"} 00:34:18[Scripting][inform]-{"0":"{\"ground_sign_direction\":12}","90":"{\"ground_sign_direction\":0}","180":"{\"ground_sign_direction\":4}","270":"{\"ground_sign_direction\":8}","x":"{}","z":"{\"ground_sign_direction\":4}","xz":"{\"ground_sign_direction\":4}"} 00:34:19[Scripting][inform]-{"0":"{\"ground_sign_direction\":13}","90":"{\"ground_sign_direction\":1}","180":"{\"ground_sign_direction\":5}","270":"{\"ground_sign_direction\":9}","x":"{\"ground_sign_direction\":11}","z":"{\"ground_sign_direction\":3}","xz":"{\"ground_sign_direction\":5}"} 00:34:19[Scripting][inform]-{"0":"{\"ground_sign_direction\":14}","90":"{\"ground_sign_direction\":2}","180":"{\"ground_sign_direction\":6}","270":"{\"ground_sign_direction\":10}","x":"{\"ground_sign_direction\":10}","z":"{\"ground_sign_direction\":2}","xz":"{\"ground_sign_direction\":6}"} 00:34:20[Scripting][inform]-{"0":"{\"ground_sign_direction\":15}","90":"{\"ground_sign_direction\":3}","180":"{\"ground_sign_direction\":7}","270":"{\"ground_sign_direction\":11}","x":"{\"ground_sign_direction\":9}","z":"{\"ground_sign_direction\":1}","xz":"{\"ground_sign_direction\":7}"} 00:34:21[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:34:22[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:34:22[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:34:23[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:34:24[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:34:25[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:34:25[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:34:26[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:34:27[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:34:28[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:34:28[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:34:29[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:34:30[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:34:31[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:34:31[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:34:32[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:34:33[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:34:34[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:34:34[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:34:35[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:34:36[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:34:37[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:34:37[Scripting][inform]-{"0":"{\"rail_direction\":0}","90":"{\"rail_direction\":1}","180":"{}","270":"{\"rail_direction\":1}","x":"{}","z":"{}","xz":"{}"} 00:34:38[Scripting][inform]-{"0":"{\"rail_direction\":1}","90":"{\"rail_direction\":0}","180":"{}","270":"{\"rail_direction\":0}","x":"{}","z":"{}","xz":"{}"} 00:34:39[Scripting][inform]-{"0":"{\"rail_direction\":2}","90":"{\"rail_direction\":5}","180":"{\"rail_direction\":3}","270":"{\"rail_direction\":4}","x":"{}","z":"{\"rail_direction\":3}","xz":"{\"rail_direction\":3}"} 00:34:40[Scripting][inform]-{"0":"{\"rail_direction\":3}","90":"{\"rail_direction\":4}","180":"{\"rail_direction\":2}","270":"{\"rail_direction\":5}","x":"{}","z":"{\"rail_direction\":2}","xz":"{\"rail_direction\":2}"} 00:34:40[Scripting][inform]-{"0":"{\"rail_direction\":4}","90":"{\"rail_direction\":2}","180":"{\"rail_direction\":5}","270":"{\"rail_direction\":3}","x":"{\"rail_direction\":5}","z":"{}","xz":"{\"rail_direction\":5}"} 00:34:41[Scripting][inform]-{"0":"{\"rail_direction\":5}","90":"{\"rail_direction\":3}","180":"{\"rail_direction\":4}","270":"{\"rail_direction\":2}","x":"{\"rail_direction\":4}","z":"{}","xz":"{\"rail_direction\":4}"} 00:34:42[Scripting][inform]-{"0":"{\"rail_direction\":6}","90":"{\"rail_direction\":7}","180":"{\"rail_direction\":8}","270":"{\"rail_direction\":9}","x":"{\"rail_direction\":9}","z":"{\"rail_direction\":7}","xz":"{\"rail_direction\":8}"} 00:34:43[Scripting][inform]-{"0":"{\"rail_direction\":7}","90":"{\"rail_direction\":8}","180":"{\"rail_direction\":9}","270":"{\"rail_direction\":6}","x":"{\"rail_direction\":8}","z":"{\"rail_direction\":6}","xz":"{\"rail_direction\":9}"} 00:34:43[Scripting][inform]-{"0":"{\"rail_direction\":8}","90":"{\"rail_direction\":9}","180":"{\"rail_direction\":6}","270":"{\"rail_direction\":7}","x":"{\"rail_direction\":7}","z":"{\"rail_direction\":9}","xz":"{\"rail_direction\":6}"} 00:34:44[Scripting][inform]-{"0":"{\"rail_direction\":9}","90":"{\"rail_direction\":6}","180":"{\"rail_direction\":7}","270":"{\"rail_direction\":8}","x":"{\"rail_direction\":6}","z":"{\"rail_direction\":8}","xz":"{\"rail_direction\":7}"} 00:34:45[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:34:46[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:34:46[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:34:47[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:34:48[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:34:49[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:34:49[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:34:50[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:34:51[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:34:52[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:34:52[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:34:53[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:34:54[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:34:55[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:34:55[Scripting][inform]-{"0":"{\"lever_direction\":\"down_east_west\",\"open_bit\":false}","90":"{\"lever_direction\":\"down_north_south\"}","180":"{}","270":"{\"lever_direction\":\"down_north_south\"}","x":"{}","z":"{}","xz":"{}"} 00:34:56[Scripting][inform]-{"0":"{\"lever_direction\":\"east\",\"open_bit\":false}","90":"{\"lever_direction\":\"south\"}","180":"{\"lever_direction\":\"west\"}","270":"{\"lever_direction\":\"north\"}","x":"{}","z":"{\"lever_direction\":\"west\"}","xz":"{\"lever_direction\":\"west\"}"} 00:34:57[Scripting][inform]-{"0":"{\"lever_direction\":\"west\",\"open_bit\":false}","90":"{\"lever_direction\":\"north\"}","180":"{\"lever_direction\":\"east\"}","270":"{\"lever_direction\":\"south\"}","x":"{}","z":"{\"lever_direction\":\"east\"}","xz":"{\"lever_direction\":\"east\"}"} 00:34:58[Scripting][inform]-{"0":"{\"lever_direction\":\"south\",\"open_bit\":false}","90":"{\"lever_direction\":\"west\"}","180":"{\"lever_direction\":\"north\"}","270":"{\"lever_direction\":\"east\"}","x":"{\"lever_direction\":\"north\"}","z":"{}","xz":"{\"lever_direction\":\"north\"}"} 00:34:58[Scripting][inform]-{"0":"{\"lever_direction\":\"north\",\"open_bit\":false}","90":"{\"lever_direction\":\"east\"}","180":"{\"lever_direction\":\"south\"}","270":"{\"lever_direction\":\"west\"}","x":"{\"lever_direction\":\"south\"}","z":"{}","xz":"{\"lever_direction\":\"south\"}"} 00:34:59[Scripting][inform]-{"0":"{\"lever_direction\":\"up_north_south\",\"open_bit\":false}","90":"{\"lever_direction\":\"up_east_west\"}","180":"{}","270":"{\"lever_direction\":\"up_east_west\"}","x":"{}","z":"{}","xz":"{}"} 00:35:00[Scripting][inform]-{"0":"{\"lever_direction\":\"up_east_west\",\"open_bit\":false}","90":"{\"lever_direction\":\"up_north_south\"}","180":"{}","270":"{\"lever_direction\":\"up_north_south\"}","x":"{}","z":"{}","xz":"{}"} 00:35:01[Scripting][inform]-{"0":"{\"lever_direction\":\"down_north_south\",\"open_bit\":false}","90":"{\"lever_direction\":\"down_east_west\"}","180":"{}","270":"{\"lever_direction\":\"down_east_west\"}","x":"{}","z":"{}","xz":"{}"} 00:35:01[Scripting][inform]-{"0":"{\"lever_direction\":\"down_east_west\",\"open_bit\":true}","90":"{\"lever_direction\":\"down_north_south\"}","180":"{}","270":"{\"lever_direction\":\"down_north_south\"}","x":"{}","z":"{}","xz":"{}"} 00:35:02[Scripting][inform]-{"0":"{\"lever_direction\":\"east\",\"open_bit\":true}","90":"{\"lever_direction\":\"south\"}","180":"{\"lever_direction\":\"west\"}","270":"{\"lever_direction\":\"north\"}","x":"{}","z":"{\"lever_direction\":\"west\"}","xz":"{\"lever_direction\":\"west\"}"} 00:35:03[Scripting][inform]-{"0":"{\"lever_direction\":\"west\",\"open_bit\":true}","90":"{\"lever_direction\":\"north\"}","180":"{\"lever_direction\":\"east\"}","270":"{\"lever_direction\":\"south\"}","x":"{}","z":"{\"lever_direction\":\"east\"}","xz":"{\"lever_direction\":\"east\"}"} 00:35:04[Scripting][inform]-{"0":"{\"lever_direction\":\"south\",\"open_bit\":true}","90":"{\"lever_direction\":\"west\"}","180":"{\"lever_direction\":\"north\"}","270":"{\"lever_direction\":\"east\"}","x":"{\"lever_direction\":\"north\"}","z":"{}","xz":"{\"lever_direction\":\"north\"}"} 00:35:04[Scripting][inform]-{"0":"{\"lever_direction\":\"north\",\"open_bit\":true}","90":"{\"lever_direction\":\"east\"}","180":"{\"lever_direction\":\"south\"}","270":"{\"lever_direction\":\"west\"}","x":"{\"lever_direction\":\"south\"}","z":"{}","xz":"{\"lever_direction\":\"south\"}"} 00:35:05[Scripting][inform]-{"0":"{\"lever_direction\":\"up_north_south\",\"open_bit\":true}","90":"{\"lever_direction\":\"up_east_west\"}","180":"{}","270":"{\"lever_direction\":\"up_east_west\"}","x":"{}","z":"{}","xz":"{}"} 00:35:06[Scripting][inform]-{"0":"{\"lever_direction\":\"up_east_west\",\"open_bit\":true}","90":"{\"lever_direction\":\"up_north_south\"}","180":"{}","270":"{\"lever_direction\":\"up_north_south\"}","x":"{}","z":"{}","xz":"{}"} 00:35:07[Scripting][inform]-{"0":"{\"lever_direction\":\"down_north_south\",\"open_bit\":true}","90":"{\"lever_direction\":\"down_east_west\"}","180":"{}","270":"{\"lever_direction\":\"down_east_west\"}","x":"{}","z":"{}","xz":"{}"} 00:35:07[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:08[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:09[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:35:10[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:35:10[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:11[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:12[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:35:13[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:35:13[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:14[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:15[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:35:16[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:35:16[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:17[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:18[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:35:19[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:35:19[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"unknown\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:35:20[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"west\"}","90":"{\"torch_facing_direction\":\"north\"}","180":"{\"torch_facing_direction\":\"east\"}","270":"{\"torch_facing_direction\":\"south\"}","x":"{}","z":"{\"torch_facing_direction\":\"east\"}","xz":"{\"torch_facing_direction\":\"east\"}"} 00:35:21[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"east\"}","90":"{\"torch_facing_direction\":\"south\"}","180":"{\"torch_facing_direction\":\"west\"}","270":"{\"torch_facing_direction\":\"north\"}","x":"{}","z":"{\"torch_facing_direction\":\"west\"}","xz":"{\"torch_facing_direction\":\"west\"}"} 00:35:22[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"north\"}","90":"{\"torch_facing_direction\":\"east\"}","180":"{\"torch_facing_direction\":\"south\"}","270":"{\"torch_facing_direction\":\"west\"}","x":"{\"torch_facing_direction\":\"south\"}","z":"{}","xz":"{\"torch_facing_direction\":\"south\"}"} 00:35:22[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"south\"}","90":"{\"torch_facing_direction\":\"west\"}","180":"{\"torch_facing_direction\":\"north\"}","270":"{\"torch_facing_direction\":\"east\"}","x":"{\"torch_facing_direction\":\"north\"}","z":"{}","xz":"{\"torch_facing_direction\":\"north\"}"} 00:35:23[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"top\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:35:24[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"unknown\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:35:25[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"west\"}","90":"{\"torch_facing_direction\":\"north\"}","180":"{\"torch_facing_direction\":\"east\"}","270":"{\"torch_facing_direction\":\"south\"}","x":"{}","z":"{\"torch_facing_direction\":\"east\"}","xz":"{\"torch_facing_direction\":\"east\"}"} 00:35:25[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"east\"}","90":"{\"torch_facing_direction\":\"south\"}","180":"{\"torch_facing_direction\":\"west\"}","270":"{\"torch_facing_direction\":\"north\"}","x":"{}","z":"{\"torch_facing_direction\":\"west\"}","xz":"{\"torch_facing_direction\":\"west\"}"} 00:35:26[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"north\"}","90":"{\"torch_facing_direction\":\"east\"}","180":"{\"torch_facing_direction\":\"south\"}","270":"{\"torch_facing_direction\":\"west\"}","x":"{\"torch_facing_direction\":\"south\"}","z":"{}","xz":"{\"torch_facing_direction\":\"south\"}"} 00:35:27[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"south\"}","90":"{\"torch_facing_direction\":\"west\"}","180":"{\"torch_facing_direction\":\"north\"}","270":"{\"torch_facing_direction\":\"east\"}","x":"{\"torch_facing_direction\":\"north\"}","z":"{}","xz":"{\"torch_facing_direction\":\"north\"}"} 00:35:28[Scripting][inform]-{"0":"{\"torch_facing_direction\":\"top\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:35:28[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:35:29[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:35:30[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:35:31[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:35:31[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:35:32[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:35:33[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:35:34[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:35:34[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:35:35[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:35:36[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:35:37[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:35:37[Scripting][inform]-{"0":"{\"direction\":0}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:38[Scripting][inform]-{"0":"{\"direction\":1}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:39[Scripting][inform]-{"0":"{\"direction\":2}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:35:40[Scripting][inform]-{"0":"{\"direction\":3}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:35:40[Scripting][inform]-{"0":"{\"portal_axis\":\"unknown\"}","90":"{\"portal_axis\":\"x\"}","180":"{\"portal_axis\":\"z\"}","270":"{\"portal_axis\":\"x\"}","x":"{\"portal_axis\":\"z\"}","z":"{\"portal_axis\":\"z\"}","xz":"{\"portal_axis\":\"z\"}"} 00:35:41[Scripting][inform]-{"0":"{\"portal_axis\":\"x\"}","90":"{\"portal_axis\":\"z\"}","180":"{}","270":"{\"portal_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:35:42[Scripting][inform]-{"0":"{\"portal_axis\":\"z\"}","90":"{\"portal_axis\":\"x\"}","180":"{}","270":"{\"portal_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:35:43[Scripting][inform]-{"0":"{\"direction\":0}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:43[Scripting][inform]-{"0":"{\"direction\":1}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:44[Scripting][inform]-{"0":"{\"direction\":2}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:35:45[Scripting][inform]-{"0":"{\"direction\":3}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:35:46[Scripting][inform]-{"0":"{\"direction\":0,\"repeater_delay\":0}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:46[Scripting][inform]-{"0":"{\"direction\":1,\"repeater_delay\":0}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:47[Scripting][inform]-{"0":"{\"direction\":2,\"repeater_delay\":0}","90":"{\"direction\":3}","180":"{}","270":"{\"direction\":1}","x":"{}","z":"{}","xz":"{}"} 00:35:48[Scripting][inform]-{"0":"{\"direction\":3,\"repeater_delay\":0}","90":"{}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:35:49[Scripting][inform]-{"0":"{\"direction\":0,\"repeater_delay\":1}","90":"{}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:49[Scripting][inform]-{"0":"{\"direction\":1,\"repeater_delay\":1}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:50[Scripting][inform]-{"0":"{\"direction\":2,\"repeater_delay\":1}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:35:51[Scripting][inform]-{"0":"{\"direction\":3,\"repeater_delay\":1}","90":"{\"direction\":0}","180":"{}","270":"{\"direction\":2}","x":"{}","z":"{}","xz":"{}"} 00:35:52[Scripting][inform]-{"0":"{\"direction\":0,\"repeater_delay\":2}","90":"{\"direction\":1}","180":"{}","270":"{\"direction\":3}","x":"{}","z":"{}","xz":"{}"} 00:35:52[Scripting][inform]-{"0":"{\"direction\":1,\"repeater_delay\":2}","90":"{}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:53[Scripting][inform]-{"0":"{\"direction\":2,\"repeater_delay\":2}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:35:54[Scripting][inform]-{"0":"{\"direction\":3,\"repeater_delay\":2}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:35:55[Scripting][inform]-{"0":"{\"direction\":0,\"repeater_delay\":3}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:55[Scripting][inform]-{"0":"{\"direction\":1,\"repeater_delay\":3}","90":"{\"direction\":2}","180":"{}","270":"{\"direction\":0}","x":"{}","z":"{}","xz":"{}"} 00:35:56[Scripting][inform]-{"0":"{\"direction\":2,\"repeater_delay\":3}","90":"{}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:35:57[Scripting][inform]-{"0":"{\"direction\":3,\"repeater_delay\":3}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:35:58[Scripting][inform]-{"0":"{\"direction\":0,\"repeater_delay\":0}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:35:58[Scripting][inform]-{"0":"{\"direction\":1,\"repeater_delay\":0}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:35:59[Scripting][inform]-{"0":"{\"direction\":2,\"repeater_delay\":0}","90":"{\"direction\":3}","180":"{}","270":"{\"direction\":1}","x":"{}","z":"{}","xz":"{}"} 00:36:00[Scripting][inform]-{"0":"{\"direction\":3,\"repeater_delay\":0}","90":"{}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:36:01[Scripting][inform]-{"0":"{\"direction\":0,\"repeater_delay\":1}","90":"{}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:36:01[Scripting][inform]-{"0":"{\"direction\":1,\"repeater_delay\":1}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:36:02[Scripting][inform]-{"0":"{\"direction\":2,\"repeater_delay\":1}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:36:03[Scripting][inform]-{"0":"{\"direction\":3,\"repeater_delay\":1}","90":"{\"direction\":0}","180":"{}","270":"{\"direction\":2}","x":"{}","z":"{}","xz":"{}"} 00:36:04[Scripting][inform]-{"0":"{\"direction\":0,\"repeater_delay\":2}","90":"{\"direction\":1}","180":"{}","270":"{\"direction\":3}","x":"{}","z":"{}","xz":"{}"} 00:36:04[Scripting][inform]-{"0":"{\"direction\":1,\"repeater_delay\":2}","90":"{}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:36:05[Scripting][inform]-{"0":"{\"direction\":2,\"repeater_delay\":2}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:36:06[Scripting][inform]-{"0":"{\"direction\":3,\"repeater_delay\":2}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:36:07[Scripting][inform]-{"0":"{\"direction\":0,\"repeater_delay\":3}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:36:07[Scripting][inform]-{"0":"{\"direction\":1,\"repeater_delay\":3}","90":"{\"direction\":2}","180":"{}","270":"{\"direction\":0}","x":"{}","z":"{}","xz":"{}"} 00:36:08[Scripting][inform]-{"0":"{\"direction\":2,\"repeater_delay\":3}","90":"{}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:36:09[Scripting][inform]-{"0":"{\"direction\":3,\"repeater_delay\":3}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:36:10[Scripting][inform]-{"0":"{\"direction\":0,\"open_bit\":false,\"upside_down_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:36:10[Scripting][inform]-{"0":"{\"direction\":1,\"open_bit\":false,\"upside_down_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:36:11[Scripting][inform]-{"0":"{\"direction\":2,\"open_bit\":false,\"upside_down_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:36:12[Scripting][inform]-{"0":"{\"direction\":3,\"open_bit\":false,\"upside_down_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:36:13[Scripting][inform]-{"0":"{\"direction\":0,\"open_bit\":false,\"upside_down_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:36:13[Scripting][inform]-{"0":"{\"direction\":1,\"open_bit\":false,\"upside_down_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:36:14[Scripting][inform]-{"0":"{\"direction\":2,\"open_bit\":false,\"upside_down_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:36:15[Scripting][inform]-{"0":"{\"direction\":3,\"open_bit\":false,\"upside_down_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:36:16[Scripting][inform]-{"0":"{\"direction\":0,\"open_bit\":true,\"upside_down_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:36:16[Scripting][inform]-{"0":"{\"direction\":1,\"open_bit\":true,\"upside_down_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:36:17[Scripting][inform]-{"0":"{\"direction\":2,\"open_bit\":true,\"upside_down_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:36:18[Scripting][inform]-{"0":"{\"direction\":3,\"open_bit\":true,\"upside_down_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:36:19[Scripting][inform]-{"0":"{\"direction\":0,\"open_bit\":true,\"upside_down_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:36:19[Scripting][inform]-{"0":"{\"direction\":1,\"open_bit\":true,\"upside_down_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:36:20[Scripting][inform]-{"0":"{\"direction\":2,\"open_bit\":true,\"upside_down_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:36:21[Scripting][inform]-{"0":"{\"direction\":3,\"open_bit\":true,\"upside_down_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:36:22[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:22[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:23[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":2}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:24[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":3}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:25[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":4}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:25[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":5}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:26[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":6}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:27[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":7}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:28[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":8}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:28[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":9}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:29[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":10}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:30[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":11}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:31[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":12}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:31[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":13}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:32[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":14}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:33[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":15}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:34[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:34[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:35[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":2}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:36[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":3}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:37[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":4}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:37[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":5}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:38[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":6}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:39[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":7}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:40[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":8}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:40[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":9}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:41[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":10}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:42[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":11}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:43[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":12}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:43[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":13}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:44[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":14}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:45[Scripting][inform]-{"0":"{\"huge_mushroom_bits\":15}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:46[Scripting][inform]-{"0":"{\"vine_direction_bits\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:46[Scripting][inform]-{"0":"{\"vine_direction_bits\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:47[Scripting][inform]-{"0":"{\"vine_direction_bits\":2}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:48[Scripting][inform]-{"0":"{\"vine_direction_bits\":3}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:49[Scripting][inform]-{"0":"{\"vine_direction_bits\":4}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:49[Scripting][inform]-{"0":"{\"vine_direction_bits\":5}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:50[Scripting][inform]-{"0":"{\"vine_direction_bits\":6}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:51[Scripting][inform]-{"0":"{\"vine_direction_bits\":7}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:52[Scripting][inform]-{"0":"{\"vine_direction_bits\":8}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:52[Scripting][inform]-{"0":"{\"vine_direction_bits\":9}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:53[Scripting][inform]-{"0":"{\"vine_direction_bits\":10}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:54[Scripting][inform]-{"0":"{\"vine_direction_bits\":11}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:55[Scripting][inform]-{"0":"{\"vine_direction_bits\":12}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:55[Scripting][inform]-{"0":"{\"vine_direction_bits\":13}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:56[Scripting][inform]-{"0":"{\"vine_direction_bits\":14}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:57[Scripting][inform]-{"0":"{\"vine_direction_bits\":15}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:36:58[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:36:58[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:36:59[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:37:00[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:37:01[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:37:01[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:37:02[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:37:03[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:37:04[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:37:04[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:37:05[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:37:06[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:37:07[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:37:07[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:37:08[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:37:09[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:37:10[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:37:10[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:37:11[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:37:12[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:37:13[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:37:13[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:37:14[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:37:15[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:37:16[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:37:16[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:37:17[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:37:18[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:37:19[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:37:19[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:37:20[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:37:21[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:37:22[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:37:22[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:37:23[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:37:24[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:37:25[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:37:25[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:37:26[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:37:27[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:37:28[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:28[Scripting][inform]-{"0":"{\"direction\":0,\"end_portal_eye_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:37:29[Scripting][inform]-{"0":"{\"direction\":1,\"end_portal_eye_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:37:30[Scripting][inform]-{"0":"{\"direction\":2,\"end_portal_eye_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:37:31[Scripting][inform]-{"0":"{\"direction\":3,\"end_portal_eye_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:37:31[Scripting][inform]-{"0":"{\"direction\":0,\"end_portal_eye_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:37:32[Scripting][inform]-{"0":"{\"direction\":1,\"end_portal_eye_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:37:33[Scripting][inform]-{"0":"{\"direction\":2,\"end_portal_eye_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:37:34[Scripting][inform]-{"0":"{\"direction\":3,\"end_portal_eye_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:37:34[Scripting][inform]-{"0":"{\"facing_direction\":0,\"triggered_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:35[Scripting][inform]-{"0":"{\"facing_direction\":1,\"triggered_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:36[Scripting][inform]-{"0":"{\"facing_direction\":2,\"triggered_bit\":false}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:37:37[Scripting][inform]-{"0":"{\"facing_direction\":3,\"triggered_bit\":false}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:37:37[Scripting][inform]-{"0":"{\"facing_direction\":4,\"triggered_bit\":false}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:37:38[Scripting][inform]-{"0":"{\"facing_direction\":5,\"triggered_bit\":false}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:37:39[Scripting][inform]-{"0":"{\"facing_direction\":0,\"triggered_bit\":false}","90":"{\"triggered_bit\":true}","180":"{\"triggered_bit\":true}","270":"{\"triggered_bit\":true}","x":"{\"triggered_bit\":true}","z":"{\"triggered_bit\":true}","xz":"{\"triggered_bit\":true}"} 00:37:40[Scripting][inform]-{"0":"{\"facing_direction\":1,\"triggered_bit\":false}","90":"{\"triggered_bit\":true}","180":"{\"triggered_bit\":true}","270":"{\"triggered_bit\":true}","x":"{\"triggered_bit\":true}","z":"{\"triggered_bit\":true}","xz":"{\"triggered_bit\":true}"} 00:37:40[Scripting][inform]-{"0":"{\"facing_direction\":2,\"triggered_bit\":false}","90":"{\"facing_direction\":5,\"triggered_bit\":true}","180":"{\"facing_direction\":3,\"triggered_bit\":true}","270":"{\"facing_direction\":4,\"triggered_bit\":true}","x":"{\"facing_direction\":3,\"triggered_bit\":true}","z":"{\"triggered_bit\":true}","xz":"{\"facing_direction\":3,\"triggered_bit\":true}"} 00:37:41[Scripting][inform]-{"0":"{\"facing_direction\":3,\"triggered_bit\":false}","90":"{\"facing_direction\":4,\"triggered_bit\":true}","180":"{\"facing_direction\":2,\"triggered_bit\":true}","270":"{\"facing_direction\":5,\"triggered_bit\":true}","x":"{\"facing_direction\":2,\"triggered_bit\":true}","z":"{\"triggered_bit\":true}","xz":"{\"facing_direction\":2,\"triggered_bit\":true}"} 00:37:42[Scripting][inform]-{"0":"{\"facing_direction\":4,\"triggered_bit\":false}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:37:43[Scripting][inform]-{"0":"{\"facing_direction\":5,\"triggered_bit\":false}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:37:43[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":0}","90":"{\"rail_direction\":1}","180":"{}","270":"{\"rail_direction\":1}","x":"{}","z":"{}","xz":"{}"} 00:37:44[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":1}","90":"{\"rail_direction\":0}","180":"{}","270":"{\"rail_direction\":0}","x":"{}","z":"{}","xz":"{}"} 00:37:45[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":2}","90":"{\"rail_direction\":5}","180":"{\"rail_direction\":3}","270":"{\"rail_direction\":4}","x":"{}","z":"{\"rail_direction\":3}","xz":"{\"rail_direction\":3}"} 00:37:46[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":3}","90":"{\"rail_direction\":4}","180":"{\"rail_direction\":2}","270":"{\"rail_direction\":5}","x":"{}","z":"{\"rail_direction\":2}","xz":"{\"rail_direction\":2}"} 00:37:46[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":4}","90":"{\"rail_direction\":2}","180":"{\"rail_direction\":5}","270":"{\"rail_direction\":3}","x":"{\"rail_direction\":5}","z":"{}","xz":"{\"rail_direction\":5}"} 00:37:47[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":5}","90":"{\"rail_direction\":3}","180":"{\"rail_direction\":4}","270":"{\"rail_direction\":2}","x":"{\"rail_direction\":4}","z":"{}","xz":"{\"rail_direction\":4}"} 00:37:48[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":0}","90":"{\"rail_direction\":1}","180":"{}","270":"{\"rail_direction\":1}","x":"{}","z":"{}","xz":"{}"} 00:37:49[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":1}","90":"{\"rail_direction\":0}","180":"{}","270":"{\"rail_direction\":0}","x":"{}","z":"{}","xz":"{}"} 00:37:49[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":2}","90":"{\"rail_data_bit\":true,\"rail_direction\":5}","180":"{\"rail_data_bit\":true,\"rail_direction\":3}","270":"{\"rail_data_bit\":true,\"rail_direction\":4}","x":"{\"rail_data_bit\":true}","z":"{\"rail_data_bit\":true,\"rail_direction\":3}","xz":"{\"rail_data_bit\":true,\"rail_direction\":3}"} 00:37:50[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":3}","90":"{\"rail_direction\":4}","180":"{\"rail_direction\":2}","270":"{\"rail_direction\":5}","x":"{}","z":"{\"rail_direction\":2}","xz":"{\"rail_direction\":2}"} 00:37:51[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":4}","90":"{\"rail_data_bit\":true,\"rail_direction\":2}","180":"{\"rail_data_bit\":true,\"rail_direction\":5}","270":"{\"rail_data_bit\":true,\"rail_direction\":3}","x":"{\"rail_data_bit\":true,\"rail_direction\":5}","z":"{\"rail_data_bit\":true}","xz":"{\"rail_data_bit\":true,\"rail_direction\":5}"} 00:37:52[Scripting][inform]-{"0":"{\"rail_data_bit\":false,\"rail_direction\":5}","90":"{\"rail_data_bit\":true,\"rail_direction\":3}","180":"{\"rail_data_bit\":true,\"rail_direction\":4}","270":"{\"rail_data_bit\":true,\"rail_direction\":2}","x":"{\"rail_data_bit\":true,\"rail_direction\":4}","z":"{\"rail_data_bit\":true}","xz":"{\"rail_data_bit\":true,\"rail_direction\":4}"} 00:37:52[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:53[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:54[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:55[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:55[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:56[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:57[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:58[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:58[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:37:59[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:38:00[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:38:01[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:38:01[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:38:02[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:38:03[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:38:04[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:38:04[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:38:05[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:38:06[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:38:07[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:38:07[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:38:08[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:38:09[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:38:10[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:38:10[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:38:11[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:38:12[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":0,\"powered_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:38:13[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":1,\"powered_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:38:13[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":2,\"powered_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:38:14[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":3,\"powered_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:38:15[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":0,\"powered_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:38:16[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":1,\"powered_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:38:16[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":2,\"powered_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:38:17[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":3,\"powered_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:38:18[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":0,\"powered_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:38:19[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":1,\"powered_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:38:19[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":2,\"powered_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:38:20[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":3,\"powered_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:38:21[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":0,\"powered_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:38:22[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":1,\"powered_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:38:22[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":2,\"powered_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:38:23[Scripting][inform]-{"0":"{\"attached_bit\":false,\"direction\":3,\"powered_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:38:24[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:38:25[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:38:25[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:38:26[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:38:27[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:38:28[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:38:28[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:38:29[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:38:30[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:38:31[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:38:31[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:38:32[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:38:33[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:38:34[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:38:34[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:38:35[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:38:36[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:38:37[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:38:37[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:38:38[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:38:39[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:38:40[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:38:40[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:38:41[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:38:42[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:38:43[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:38:43[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:38:44[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:38:45[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:38:46[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:38:46[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":0}","90":"{\"conditional_bit\":false}","180":"{\"conditional_bit\":false}","270":"{\"conditional_bit\":false}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false}"} 00:38:47[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":1}","90":"{\"conditional_bit\":false}","180":"{\"conditional_bit\":false}","270":"{\"conditional_bit\":false}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false}"} 00:38:48[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":2}","90":"{\"conditional_bit\":false,\"facing_direction\":5}","180":"{\"conditional_bit\":false,\"facing_direction\":3}","270":"{\"conditional_bit\":false,\"facing_direction\":4}","x":"{\"conditional_bit\":false,\"facing_direction\":3}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false,\"facing_direction\":3}"} 00:38:49[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":3}","90":"{\"conditional_bit\":false,\"facing_direction\":4}","180":"{\"conditional_bit\":false,\"facing_direction\":2}","270":"{\"conditional_bit\":false,\"facing_direction\":5}","x":"{\"conditional_bit\":false,\"facing_direction\":2}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false,\"facing_direction\":2}"} 00:38:49[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":4}","90":"{\"conditional_bit\":false,\"facing_direction\":2}","180":"{\"conditional_bit\":false,\"facing_direction\":5}","270":"{\"conditional_bit\":false,\"facing_direction\":3}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false,\"facing_direction\":5}","xz":"{\"conditional_bit\":false,\"facing_direction\":5}"} 00:38:50[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":5}","90":"{\"conditional_bit\":false,\"facing_direction\":3}","180":"{\"conditional_bit\":false,\"facing_direction\":4}","270":"{\"conditional_bit\":false,\"facing_direction\":2}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false,\"facing_direction\":4}","xz":"{\"conditional_bit\":false,\"facing_direction\":4}"} 00:38:51[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:38:52[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:38:52[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:38:53[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:38:54[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:38:55[Scripting][inform]-{"0":"{\"button_pressed_bit\":false,\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:38:55[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:38:56[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:38:57[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:38:58[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:38:58[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:38:59[Scripting][inform]-{"0":"{\"button_pressed_bit\":true,\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:39:00[Scripting][inform]-{"0":"{\"facing_direction\":0,\"no_drop_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:39:01[Scripting][inform]-{"0":"{\"facing_direction\":1,\"no_drop_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:39:01[Scripting][inform]-{"0":"{\"facing_direction\":2,\"no_drop_bit\":false}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:39:02[Scripting][inform]-{"0":"{\"facing_direction\":3,\"no_drop_bit\":false}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:39:03[Scripting][inform]-{"0":"{\"facing_direction\":4,\"no_drop_bit\":false}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:39:04[Scripting][inform]-{"0":"{\"facing_direction\":5,\"no_drop_bit\":false}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:39:04[Scripting][inform]-{"0":"{\"facing_direction\":0,\"no_drop_bit\":true}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:39:05[Scripting][inform]-{"0":"{\"facing_direction\":1,\"no_drop_bit\":true}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:39:06[Scripting][inform]-{"0":"{\"facing_direction\":2,\"no_drop_bit\":true}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:39:07[Scripting][inform]-{"0":"{\"facing_direction\":3,\"no_drop_bit\":true}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:39:07[Scripting][inform]-{"0":"{\"facing_direction\":4,\"no_drop_bit\":true}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:39:08[Scripting][inform]-{"0":"{\"facing_direction\":5,\"no_drop_bit\":true}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:39:09[Scripting][inform]-{"0":"{\"damage\":\"undamaged\",\"direction\":0}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:10[Scripting][inform]-{"0":"{\"damage\":\"undamaged\",\"direction\":1}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:10[Scripting][inform]-{"0":"{\"damage\":\"undamaged\",\"direction\":2}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:11[Scripting][inform]-{"0":"{\"damage\":\"undamaged\",\"direction\":3}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:12[Scripting][inform]-{"0":"{\"damage\":\"slightly_damaged\",\"direction\":0}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:13[Scripting][inform]-{"0":"{\"damage\":\"slightly_damaged\",\"direction\":1}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:13[Scripting][inform]-{"0":"{\"damage\":\"slightly_damaged\",\"direction\":2}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:14[Scripting][inform]-{"0":"{\"damage\":\"slightly_damaged\",\"direction\":3}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:15[Scripting][inform]-{"0":"{\"damage\":\"very_damaged\",\"direction\":0}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:16[Scripting][inform]-{"0":"{\"damage\":\"very_damaged\",\"direction\":1}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:16[Scripting][inform]-{"0":"{\"damage\":\"very_damaged\",\"direction\":2}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:17[Scripting][inform]-{"0":"{\"damage\":\"very_damaged\",\"direction\":3}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:18[Scripting][inform]-{"0":"{\"damage\":\"broken\",\"direction\":0}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:19[Scripting][inform]-{"0":"{\"damage\":\"broken\",\"direction\":1}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:19[Scripting][inform]-{"0":"{\"damage\":\"broken\",\"direction\":2}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:20[Scripting][inform]-{"0":"{\"damage\":\"broken\",\"direction\":3}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:21[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:39:22[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:39:22[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:39:23[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:39:24[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:39:25[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:39:25[Scripting][inform]-{"0":"{\"direction\":0,\"output_lit_bit\":false,\"output_subtract_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:26[Scripting][inform]-{"0":"{\"direction\":1,\"output_lit_bit\":false,\"output_subtract_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:27[Scripting][inform]-{"0":"{\"direction\":2,\"output_lit_bit\":false,\"output_subtract_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:28[Scripting][inform]-{"0":"{\"direction\":3,\"output_lit_bit\":false,\"output_subtract_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:28[Scripting][inform]-{"0":"{\"direction\":0,\"output_lit_bit\":false,\"output_subtract_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:29[Scripting][inform]-{"0":"{\"direction\":1,\"output_lit_bit\":false,\"output_subtract_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:30[Scripting][inform]-{"0":"{\"direction\":2,\"output_lit_bit\":false,\"output_subtract_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:31[Scripting][inform]-{"0":"{\"direction\":3,\"output_lit_bit\":false,\"output_subtract_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:31[Scripting][inform]-{"0":"{\"direction\":0,\"output_lit_bit\":true,\"output_subtract_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:32[Scripting][inform]-{"0":"{\"direction\":1,\"output_lit_bit\":true,\"output_subtract_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:33[Scripting][inform]-{"0":"{\"direction\":2,\"output_lit_bit\":true,\"output_subtract_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:34[Scripting][inform]-{"0":"{\"direction\":3,\"output_lit_bit\":true,\"output_subtract_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:34[Scripting][inform]-{"0":"{\"direction\":0,\"output_lit_bit\":true,\"output_subtract_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:35[Scripting][inform]-{"0":"{\"direction\":1,\"output_lit_bit\":true,\"output_subtract_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:36[Scripting][inform]-{"0":"{\"direction\":2,\"output_lit_bit\":true,\"output_subtract_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:37[Scripting][inform]-{"0":"{\"direction\":3,\"output_lit_bit\":true,\"output_subtract_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:37[Scripting][inform]-{"0":"{\"direction\":0,\"output_lit_bit\":false,\"output_subtract_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:38[Scripting][inform]-{"0":"{\"direction\":1,\"output_lit_bit\":false,\"output_subtract_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:39[Scripting][inform]-{"0":"{\"direction\":2,\"output_lit_bit\":false,\"output_subtract_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:40[Scripting][inform]-{"0":"{\"direction\":3,\"output_lit_bit\":false,\"output_subtract_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:40[Scripting][inform]-{"0":"{\"direction\":0,\"output_lit_bit\":false,\"output_subtract_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:41[Scripting][inform]-{"0":"{\"direction\":1,\"output_lit_bit\":false,\"output_subtract_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:42[Scripting][inform]-{"0":"{\"direction\":2,\"output_lit_bit\":false,\"output_subtract_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:43[Scripting][inform]-{"0":"{\"direction\":3,\"output_lit_bit\":false,\"output_subtract_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:43[Scripting][inform]-{"0":"{\"direction\":0,\"output_lit_bit\":true,\"output_subtract_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:44[Scripting][inform]-{"0":"{\"direction\":1,\"output_lit_bit\":true,\"output_subtract_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:45[Scripting][inform]-{"0":"{\"direction\":2,\"output_lit_bit\":true,\"output_subtract_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:46[Scripting][inform]-{"0":"{\"direction\":3,\"output_lit_bit\":true,\"output_subtract_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:46[Scripting][inform]-{"0":"{\"direction\":0,\"output_lit_bit\":true,\"output_subtract_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:39:47[Scripting][inform]-{"0":"{\"direction\":1,\"output_lit_bit\":true,\"output_subtract_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:39:48[Scripting][inform]-{"0":"{\"direction\":2,\"output_lit_bit\":true,\"output_subtract_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:39:49[Scripting][inform]-{"0":"{\"direction\":3,\"output_lit_bit\":true,\"output_subtract_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:39:49[Scripting][inform]-{"0":"{\"facing_direction\":0,\"toggle_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:39:50[Scripting][inform]-{"0":"{\"facing_direction\":1,\"toggle_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:39:51[Scripting][inform]-{"0":"{\"facing_direction\":2,\"toggle_bit\":false}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:39:52[Scripting][inform]-{"0":"{\"facing_direction\":3,\"toggle_bit\":false}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:39:52[Scripting][inform]-{"0":"{\"facing_direction\":4,\"toggle_bit\":false}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:39:53[Scripting][inform]-{"0":"{\"facing_direction\":5,\"toggle_bit\":false}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:39:54[Scripting][inform]-{"0":"{\"facing_direction\":0,\"toggle_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:39:55[Scripting][inform]-{"0":"{\"facing_direction\":1,\"toggle_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:39:55[Scripting][inform]-{"0":"{\"facing_direction\":2,\"toggle_bit\":false}","90":"{\"facing_direction\":5,\"toggle_bit\":true}","180":"{\"facing_direction\":3,\"toggle_bit\":true}","270":"{\"facing_direction\":4,\"toggle_bit\":true}","x":"{\"facing_direction\":3,\"toggle_bit\":true}","z":"{\"toggle_bit\":true}","xz":"{\"facing_direction\":3,\"toggle_bit\":true}"} 00:39:56[Scripting][inform]-{"0":"{\"facing_direction\":3,\"toggle_bit\":false}","90":"{\"facing_direction\":4,\"toggle_bit\":true}","180":"{\"facing_direction\":2,\"toggle_bit\":true}","270":"{\"facing_direction\":5,\"toggle_bit\":true}","x":"{\"facing_direction\":2,\"toggle_bit\":true}","z":"{\"toggle_bit\":true}","xz":"{\"facing_direction\":2,\"toggle_bit\":true}"} 00:39:57[Scripting][inform]-{"0":"{\"facing_direction\":4,\"toggle_bit\":false}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:39:58[Scripting][inform]-{"0":"{\"facing_direction\":5,\"toggle_bit\":false}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:39:58[Scripting][inform]-{"0":"{\"chisel_type\":\"default\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:39:59[Scripting][inform]-{"0":"{\"chisel_type\":\"chiseled\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:40:00[Scripting][inform]-{"0":"{\"chisel_type\":\"lines\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:40:01[Scripting][inform]-{"0":"{\"chisel_type\":\"smooth\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:40:01[Scripting][inform]-{"0":"{\"chisel_type\":\"default\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:40:02[Scripting][inform]-{"0":"{\"chisel_type\":\"chiseled\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:40:03[Scripting][inform]-{"0":"{\"chisel_type\":\"lines\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:40:04[Scripting][inform]-{"0":"{\"chisel_type\":\"smooth\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:40:04[Scripting][inform]-{"0":"{\"chisel_type\":\"default\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:40:05[Scripting][inform]-{"0":"{\"chisel_type\":\"chiseled\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:40:06[Scripting][inform]-{"0":"{\"chisel_type\":\"lines\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:40:07[Scripting][inform]-{"0":"{\"chisel_type\":\"smooth\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:40:07[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:40:08[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:40:09[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:40:10[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:40:10[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:40:11[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:40:12[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:40:13[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:40:13[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:40:14[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:40:15[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:40:16[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:40:16[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:40:17[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:40:18[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:40:19[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:40:19[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:40:20[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:40:21[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:40:22[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:40:22[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:40:23[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:40:24[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:40:25[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:40:25[Scripting][inform]-{"0":"{\"direction\":0,\"open_bit\":false,\"upside_down_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:40:26[Scripting][inform]-{"0":"{\"direction\":1,\"open_bit\":false,\"upside_down_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:40:27[Scripting][inform]-{"0":"{\"direction\":2,\"open_bit\":false,\"upside_down_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:40:28[Scripting][inform]-{"0":"{\"direction\":3,\"open_bit\":false,\"upside_down_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:40:28[Scripting][inform]-{"0":"{\"direction\":0,\"open_bit\":false,\"upside_down_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:40:29[Scripting][inform]-{"0":"{\"direction\":1,\"open_bit\":false,\"upside_down_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:40:30[Scripting][inform]-{"0":"{\"direction\":2,\"open_bit\":false,\"upside_down_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:40:31[Scripting][inform]-{"0":"{\"direction\":3,\"open_bit\":false,\"upside_down_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:40:31[Scripting][inform]-{"0":"{\"direction\":0,\"open_bit\":true,\"upside_down_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:40:32[Scripting][inform]-{"0":"{\"direction\":1,\"open_bit\":true,\"upside_down_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:40:33[Scripting][inform]-{"0":"{\"direction\":2,\"open_bit\":true,\"upside_down_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:40:34[Scripting][inform]-{"0":"{\"direction\":3,\"open_bit\":true,\"upside_down_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:40:34[Scripting][inform]-{"0":"{\"direction\":0,\"open_bit\":true,\"upside_down_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:40:35[Scripting][inform]-{"0":"{\"direction\":1,\"open_bit\":true,\"upside_down_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:40:36[Scripting][inform]-{"0":"{\"direction\":2,\"open_bit\":true,\"upside_down_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:40:37[Scripting][inform]-{"0":"{\"direction\":3,\"open_bit\":true,\"upside_down_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:40:37[Scripting][inform]-{"0":"{\"deprecated\":0,\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:40:38[Scripting][inform]-{"0":"{\"deprecated\":1,\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:40:39[Scripting][inform]-{"0":"{\"deprecated\":2,\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:40:40[Scripting][inform]-{"0":"{\"deprecated\":3,\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:40:40[Scripting][inform]-{"0":"{\"deprecated\":0,\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:40:41[Scripting][inform]-{"0":"{\"deprecated\":1,\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:40:42[Scripting][inform]-{"0":"{\"deprecated\":2,\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:40:43[Scripting][inform]-{"0":"{\"deprecated\":3,\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:40:43[Scripting][inform]-{"0":"{\"deprecated\":0,\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:40:44[Scripting][inform]-{"0":"{\"deprecated\":1,\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:40:45[Scripting][inform]-{"0":"{\"deprecated\":2,\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:40:46[Scripting][inform]-{"0":"{\"deprecated\":3,\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:40:46[Scripting][inform]-{"0":"{\"ground_sign_direction\":0}","90":"{\"ground_sign_direction\":4}","180":"{\"ground_sign_direction\":8}","270":"{\"ground_sign_direction\":12}","x":"{\"ground_sign_direction\":8}","z":"{}","xz":"{\"ground_sign_direction\":8}"} 00:40:47[Scripting][inform]-{"0":"{\"ground_sign_direction\":1}","90":"{\"ground_sign_direction\":5}","180":"{\"ground_sign_direction\":9}","270":"{\"ground_sign_direction\":13}","x":"{\"ground_sign_direction\":7}","z":"{\"ground_sign_direction\":15}","xz":"{\"ground_sign_direction\":9}"} 00:40:48[Scripting][inform]-{"0":"{\"ground_sign_direction\":2}","90":"{\"ground_sign_direction\":6}","180":"{\"ground_sign_direction\":10}","270":"{\"ground_sign_direction\":14}","x":"{\"ground_sign_direction\":6}","z":"{\"ground_sign_direction\":14}","xz":"{\"ground_sign_direction\":10}"} 00:40:49[Scripting][inform]-{"0":"{\"ground_sign_direction\":3}","90":"{\"ground_sign_direction\":7}","180":"{\"ground_sign_direction\":11}","270":"{\"ground_sign_direction\":15}","x":"{\"ground_sign_direction\":5}","z":"{\"ground_sign_direction\":13}","xz":"{\"ground_sign_direction\":11}"} 00:40:49[Scripting][inform]-{"0":"{\"ground_sign_direction\":4}","90":"{\"ground_sign_direction\":8}","180":"{\"ground_sign_direction\":12}","270":"{\"ground_sign_direction\":0}","x":"{}","z":"{\"ground_sign_direction\":12}","xz":"{\"ground_sign_direction\":12}"} 00:40:50[Scripting][inform]-{"0":"{\"ground_sign_direction\":5}","90":"{\"ground_sign_direction\":9}","180":"{\"ground_sign_direction\":13}","270":"{\"ground_sign_direction\":1}","x":"{\"ground_sign_direction\":3}","z":"{\"ground_sign_direction\":11}","xz":"{\"ground_sign_direction\":13}"} 00:40:51[Scripting][inform]-{"0":"{\"ground_sign_direction\":6}","90":"{\"ground_sign_direction\":10}","180":"{\"ground_sign_direction\":14}","270":"{\"ground_sign_direction\":2}","x":"{\"ground_sign_direction\":2}","z":"{\"ground_sign_direction\":10}","xz":"{\"ground_sign_direction\":14}"} 00:40:52[Scripting][inform]-{"0":"{\"ground_sign_direction\":7}","90":"{\"ground_sign_direction\":11}","180":"{\"ground_sign_direction\":15}","270":"{\"ground_sign_direction\":3}","x":"{\"ground_sign_direction\":1}","z":"{\"ground_sign_direction\":9}","xz":"{\"ground_sign_direction\":15}"} 00:40:52[Scripting][inform]-{"0":"{\"ground_sign_direction\":8}","90":"{\"ground_sign_direction\":12}","180":"{\"ground_sign_direction\":0}","270":"{\"ground_sign_direction\":4}","x":"{\"ground_sign_direction\":0}","z":"{}","xz":"{\"ground_sign_direction\":0}"} 00:40:53[Scripting][inform]-{"0":"{\"ground_sign_direction\":9}","90":"{\"ground_sign_direction\":13}","180":"{\"ground_sign_direction\":1}","270":"{\"ground_sign_direction\":5}","x":"{\"ground_sign_direction\":15}","z":"{\"ground_sign_direction\":7}","xz":"{\"ground_sign_direction\":1}"} 00:40:54[Scripting][inform]-{"0":"{\"ground_sign_direction\":10}","90":"{\"ground_sign_direction\":14}","180":"{\"ground_sign_direction\":2}","270":"{\"ground_sign_direction\":6}","x":"{\"ground_sign_direction\":14}","z":"{\"ground_sign_direction\":6}","xz":"{\"ground_sign_direction\":2}"} 00:40:55[Scripting][inform]-{"0":"{\"ground_sign_direction\":11}","90":"{\"ground_sign_direction\":15}","180":"{\"ground_sign_direction\":3}","270":"{\"ground_sign_direction\":7}","x":"{\"ground_sign_direction\":13}","z":"{\"ground_sign_direction\":5}","xz":"{\"ground_sign_direction\":3}"} 00:40:55[Scripting][inform]-{"0":"{\"ground_sign_direction\":12}","90":"{\"ground_sign_direction\":0}","180":"{\"ground_sign_direction\":4}","270":"{\"ground_sign_direction\":8}","x":"{}","z":"{\"ground_sign_direction\":4}","xz":"{\"ground_sign_direction\":4}"} 00:40:56[Scripting][inform]-{"0":"{\"ground_sign_direction\":13}","90":"{\"ground_sign_direction\":1}","180":"{\"ground_sign_direction\":5}","270":"{\"ground_sign_direction\":9}","x":"{\"ground_sign_direction\":11}","z":"{\"ground_sign_direction\":3}","xz":"{\"ground_sign_direction\":5}"} 00:40:57[Scripting][inform]-{"0":"{\"ground_sign_direction\":14}","90":"{\"ground_sign_direction\":2}","180":"{\"ground_sign_direction\":6}","270":"{\"ground_sign_direction\":10}","x":"{\"ground_sign_direction\":10}","z":"{\"ground_sign_direction\":2}","xz":"{\"ground_sign_direction\":6}"} 00:40:58[Scripting][inform]-{"0":"{\"ground_sign_direction\":15}","90":"{\"ground_sign_direction\":3}","180":"{\"ground_sign_direction\":7}","270":"{\"ground_sign_direction\":11}","x":"{\"ground_sign_direction\":9}","z":"{\"ground_sign_direction\":1}","xz":"{\"ground_sign_direction\":7}"} 00:40:58[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:40:59[Scripting][inform]-{"0":"null","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:41:00[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:41:01[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:41:01[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:41:02[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:41:03[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:41:04[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:41:04[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:41:05[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:41:06[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:41:07[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:41:07[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:41:08[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:41:09[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:10[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:10[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:11[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:12[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:13[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:13[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:14[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:15[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:16[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:16[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:17[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:18[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:19[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:19[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:20[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:21[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:22[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:22[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:23[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:24[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:25[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:25[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:26[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:27[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:28[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:28[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:29[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:30[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:31[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:31[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:32[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:33[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:34[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:34[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:35[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:36[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:37[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:37[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:38[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:39[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:40[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:40[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:41[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:42[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:43[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:43[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:44[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:45[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:46[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:46[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:47[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:48[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:49[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:49[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:50[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:51[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:52[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:52[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:53[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:54[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:55[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:55[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:56[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:41:57[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:41:58[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:41:58[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:41:59[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:00[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:01[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:01[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:02[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:03[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:04[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:04[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:05[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:06[Scripting][inform]-{"0":"{\"direction\":0,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:07[Scripting][inform]-{"0":"{\"direction\":1,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:07[Scripting][inform]-{"0":"{\"direction\":2,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:08[Scripting][inform]-{"0":"{\"direction\":3,\"in_wall_bit\":false,\"open_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:09[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:42:10[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:42:10[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:42:11[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:42:12[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:42:13[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:42:13[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":0}","90":"{\"conditional_bit\":false}","180":"{\"conditional_bit\":false}","270":"{\"conditional_bit\":false}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false}"} 00:42:14[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":1}","90":"{\"conditional_bit\":false}","180":"{\"conditional_bit\":false}","270":"{\"conditional_bit\":false}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false}"} 00:42:15[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":2}","90":"{\"conditional_bit\":false,\"facing_direction\":5}","180":"{\"conditional_bit\":false,\"facing_direction\":3}","270":"{\"conditional_bit\":false,\"facing_direction\":4}","x":"{\"conditional_bit\":false,\"facing_direction\":3}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false,\"facing_direction\":3}"} 00:42:16[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":3}","90":"{\"conditional_bit\":false,\"facing_direction\":4}","180":"{\"conditional_bit\":false,\"facing_direction\":2}","270":"{\"conditional_bit\":false,\"facing_direction\":5}","x":"{\"conditional_bit\":false,\"facing_direction\":2}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false,\"facing_direction\":2}"} 00:42:16[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":4}","90":"{\"conditional_bit\":false,\"facing_direction\":2}","180":"{\"conditional_bit\":false,\"facing_direction\":5}","270":"{\"conditional_bit\":false,\"facing_direction\":3}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false,\"facing_direction\":5}","xz":"{\"conditional_bit\":false,\"facing_direction\":5}"} 00:42:17[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":5}","90":"{\"conditional_bit\":false,\"facing_direction\":3}","180":"{\"conditional_bit\":false,\"facing_direction\":4}","270":"{\"conditional_bit\":false,\"facing_direction\":2}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false,\"facing_direction\":4}","xz":"{\"conditional_bit\":false,\"facing_direction\":4}"} 00:42:18[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:42:19[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:42:19[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:42:20[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:42:21[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:42:22[Scripting][inform]-{"0":"{\"conditional_bit\":false,\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:42:22[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":0}","90":"{\"conditional_bit\":false}","180":"{\"conditional_bit\":false}","270":"{\"conditional_bit\":false}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false}"} 00:42:23[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":1}","90":"{\"conditional_bit\":false}","180":"{\"conditional_bit\":false}","270":"{\"conditional_bit\":false}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false}"} 00:42:24[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":2}","90":"{\"conditional_bit\":false,\"facing_direction\":5}","180":"{\"conditional_bit\":false,\"facing_direction\":3}","270":"{\"conditional_bit\":false,\"facing_direction\":4}","x":"{\"conditional_bit\":false,\"facing_direction\":3}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false,\"facing_direction\":3}"} 00:42:25[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":3}","90":"{\"conditional_bit\":false,\"facing_direction\":4}","180":"{\"conditional_bit\":false,\"facing_direction\":2}","270":"{\"conditional_bit\":false,\"facing_direction\":5}","x":"{\"conditional_bit\":false,\"facing_direction\":2}","z":"{\"conditional_bit\":false}","xz":"{\"conditional_bit\":false,\"facing_direction\":2}"} 00:42:25[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":4}","90":"{\"conditional_bit\":false,\"facing_direction\":2}","180":"{\"conditional_bit\":false,\"facing_direction\":5}","270":"{\"conditional_bit\":false,\"facing_direction\":3}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false,\"facing_direction\":5}","xz":"{\"conditional_bit\":false,\"facing_direction\":5}"} 00:42:26[Scripting][inform]-{"0":"{\"conditional_bit\":true,\"facing_direction\":5}","90":"{\"conditional_bit\":false,\"facing_direction\":3}","180":"{\"conditional_bit\":false,\"facing_direction\":4}","270":"{\"conditional_bit\":false,\"facing_direction\":2}","x":"{\"conditional_bit\":false}","z":"{\"conditional_bit\":false,\"facing_direction\":4}","xz":"{\"conditional_bit\":false,\"facing_direction\":4}"} 00:42:27[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:28[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:28[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:29[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:30[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:31[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:31[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:32[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:33[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:34[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:34[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:35[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:36[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:37[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:37[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:38[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:39[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:40[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:40[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:41[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:42[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:43[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:43[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:44[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:45[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:46[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:46[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:47[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:48[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:49[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:49[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:50[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:51[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:52[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:52[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:53[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:54[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:55[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:55[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:56[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:42:57[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:42:58[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:42:58[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:42:59[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:00[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:43:01[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:43:01[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:43:02[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:03[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:43:04[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:43:04[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:43:05[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:06[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:43:07[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:43:07[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:43:08[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:09[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:43:10[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:43:10[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:43:11[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:12[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:43:13[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:43:13[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:43:14[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:15[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:43:16[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:43:16[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:43:17[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:18[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:43:19[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:43:19[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:43:20[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":false}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:21[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:43:22[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:43:22[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:43:23[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":false,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:24[Scripting][inform]-{"0":"{\"direction\":0,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":1}","180":"{\"direction\":2}","270":"{\"direction\":3}","x":"{\"direction\":2}","z":"{}","xz":"{\"direction\":2}"} 00:43:25[Scripting][inform]-{"0":"{\"direction\":1,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":2}","180":"{\"direction\":3}","270":"{\"direction\":0}","x":"{}","z":"{\"direction\":3}","xz":"{\"direction\":3}"} 00:43:25[Scripting][inform]-{"0":"{\"direction\":2,\"door_hinge_bit\":false,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":3}","180":"{\"direction\":0}","270":"{\"direction\":1}","x":"{\"direction\":0}","z":"{}","xz":"{\"direction\":0}"} 00:43:26[Scripting][inform]-{"0":"{\"direction\":3,\"door_hinge_bit\":true,\"open_bit\":true,\"upper_block_bit\":true}","90":"{\"direction\":0}","180":"{\"direction\":1}","270":"{\"direction\":2}","x":"{}","z":"{\"direction\":1}","xz":"{\"direction\":1}"} 00:43:27[Scripting][inform]-{"0":"{\"facing_direction\":5,\"item_frame_map_bit\":false}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:43:28[Scripting][inform]-{"0":"{\"facing_direction\":4,\"item_frame_map_bit\":false}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:43:28[Scripting][inform]-{"0":"{\"facing_direction\":3,\"item_frame_map_bit\":false}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:43:29[Scripting][inform]-{"0":"{\"facing_direction\":2,\"item_frame_map_bit\":false}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:43:30[Scripting][inform]-{"0":"{\"facing_direction\":5,\"item_frame_map_bit\":true}","90":"{\"facing_direction\":3,\"item_frame_map_bit\":false}","180":"{\"facing_direction\":4,\"item_frame_map_bit\":false}","270":"{\"facing_direction\":2,\"item_frame_map_bit\":false}","x":"{\"item_frame_map_bit\":false}","z":"{\"facing_direction\":4,\"item_frame_map_bit\":false}","xz":"{\"facing_direction\":4,\"item_frame_map_bit\":false}"} 00:43:31[Scripting][inform]-{"0":"{\"facing_direction\":4,\"item_frame_map_bit\":true}","90":"{\"facing_direction\":2,\"item_frame_map_bit\":false}","180":"{\"facing_direction\":5,\"item_frame_map_bit\":false}","270":"{\"facing_direction\":3,\"item_frame_map_bit\":false}","x":"{\"item_frame_map_bit\":false}","z":"{\"facing_direction\":5,\"item_frame_map_bit\":false}","xz":"{\"facing_direction\":5,\"item_frame_map_bit\":false}"} 00:43:31[Scripting][inform]-{"0":"{\"facing_direction\":3,\"item_frame_map_bit\":true}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:43:32[Scripting][inform]-{"0":"{\"facing_direction\":2,\"item_frame_map_bit\":true}","90":"{\"facing_direction\":5,\"item_frame_map_bit\":false}","180":"{\"facing_direction\":3,\"item_frame_map_bit\":false}","270":"{\"facing_direction\":4,\"item_frame_map_bit\":false}","x":"{\"facing_direction\":3,\"item_frame_map_bit\":false}","z":"{\"item_frame_map_bit\":false}","xz":"{\"facing_direction\":3,\"item_frame_map_bit\":false}"} 00:43:33[Scripting][inform]-{"0":"{\"chisel_type\":\"default\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:34[Scripting][inform]-{"0":"{\"chisel_type\":\"chiseled\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:34[Scripting][inform]-{"0":"{\"chisel_type\":\"lines\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:35[Scripting][inform]-{"0":"{\"chisel_type\":\"smooth\",\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:36[Scripting][inform]-{"0":"{\"chisel_type\":\"default\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:43:37[Scripting][inform]-{"0":"{\"chisel_type\":\"chiseled\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:43:37[Scripting][inform]-{"0":"{\"chisel_type\":\"lines\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:43:38[Scripting][inform]-{"0":"{\"chisel_type\":\"smooth\",\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:43:39[Scripting][inform]-{"0":"{\"chisel_type\":\"default\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:43:40[Scripting][inform]-{"0":"{\"chisel_type\":\"chiseled\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:43:40[Scripting][inform]-{"0":"{\"chisel_type\":\"lines\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:43:41[Scripting][inform]-{"0":"{\"chisel_type\":\"smooth\",\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:43:42[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:43:43[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:43:43[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:43:44[Scripting][inform]-{"0":"{\"upside_down_bit\":false,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:43:45[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":0}","90":"{\"weirdo_direction\":2}","180":"{\"weirdo_direction\":1}","270":"{\"weirdo_direction\":3}","x":"{}","z":"{\"weirdo_direction\":1}","xz":"{\"weirdo_direction\":1}"} 00:43:46[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":1}","90":"{\"weirdo_direction\":3}","180":"{\"weirdo_direction\":0}","270":"{\"weirdo_direction\":2}","x":"{}","z":"{\"weirdo_direction\":0}","xz":"{\"weirdo_direction\":0}"} 00:43:46[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":2}","90":"{\"weirdo_direction\":1}","180":"{\"weirdo_direction\":3}","270":"{\"weirdo_direction\":0}","x":"{\"weirdo_direction\":3}","z":"{}","xz":"{\"weirdo_direction\":3}"} 00:43:47[Scripting][inform]-{"0":"{\"upside_down_bit\":true,\"weirdo_direction\":3}","90":"{\"weirdo_direction\":0}","180":"{\"weirdo_direction\":2}","270":"{\"weirdo_direction\":1}","x":"{\"weirdo_direction\":2}","z":"{}","xz":"{\"weirdo_direction\":2}"} 00:43:48[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:49[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:49[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:43:50[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:43:51[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:43:52[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:43:52[Scripting][inform]-{"0":"{\"deprecated\":0,\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:53[Scripting][inform]-{"0":"{\"deprecated\":1,\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:54[Scripting][inform]-{"0":"{\"deprecated\":2,\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:55[Scripting][inform]-{"0":"{\"deprecated\":3,\"pillar_axis\":\"y\"}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:43:55[Scripting][inform]-{"0":"{\"deprecated\":0,\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:43:56[Scripting][inform]-{"0":"{\"deprecated\":1,\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:43:57[Scripting][inform]-{"0":"{\"deprecated\":2,\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:43:58[Scripting][inform]-{"0":"{\"deprecated\":3,\"pillar_axis\":\"x\"}","90":"{\"pillar_axis\":\"z\"}","180":"{}","270":"{\"pillar_axis\":\"z\"}","x":"{}","z":"{}","xz":"{}"} 00:43:58[Scripting][inform]-{"0":"{\"deprecated\":0,\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:43:59[Scripting][inform]-{"0":"{\"deprecated\":1,\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:44:00[Scripting][inform]-{"0":"{\"deprecated\":2,\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:44:01[Scripting][inform]-{"0":"{\"deprecated\":3,\"pillar_axis\":\"z\"}","90":"{\"pillar_axis\":\"x\"}","180":"{}","270":"{\"pillar_axis\":\"x\"}","x":"{}","z":"{}","xz":"{}"} 00:44:01[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:02[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:03[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:04[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:04[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:05[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:06[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:07[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:07[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:08[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:09[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:10[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:10[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:11[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:12[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:13[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:13[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:14[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:15[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:16[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:16[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:17[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:18[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:19[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:19[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:20[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:21[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:22[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:22[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:23[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:24[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:25[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:25[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:26[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:27[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:28[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:28[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:29[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:30[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:31[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:31[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:32[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:33[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:34[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:34[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:35[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:36[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:37[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:37[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:38[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:39[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:40[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:40[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:41[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:42[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:43[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:43[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:44[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:45[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:46[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:46[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:47[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:48[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:49[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:49[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:50[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:51[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:52[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:52[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:53[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:54[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:55[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:44:55[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:56[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:44:57[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:44:58[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:44:58[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:44:59[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:45:00[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:45:01[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:45:01[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:45:02[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:45:03[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:45:04[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:45:04[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:45:05[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:45:06[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:45:07[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:45:07[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:45:08[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:45:09[Scripting][inform]-{"0":"{\"facing_direction\":0}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:45:10[Scripting][inform]-{"0":"{\"facing_direction\":1}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:45:10[Scripting][inform]-{"0":"{\"facing_direction\":2}","90":"{\"facing_direction\":5}","180":"{\"facing_direction\":3}","270":"{\"facing_direction\":4}","x":"{\"facing_direction\":3}","z":"{}","xz":"{\"facing_direction\":3}"} 00:45:11[Scripting][inform]-{"0":"{\"facing_direction\":3}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:45:12[Scripting][inform]-{"0":"{\"facing_direction\":4}","90":"{\"facing_direction\":2}","180":"{\"facing_direction\":5}","270":"{\"facing_direction\":3}","x":"{}","z":"{\"facing_direction\":5}","xz":"{\"facing_direction\":5}"} 00:45:13[Scripting][inform]-{"0":"{\"facing_direction\":5}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:45:13[Scripting][inform]-{"0":"{\"facing_direction\":0,\"powered_bit\":false}","90":"{\"powered_bit\":true}","180":"{\"powered_bit\":true}","270":"{\"powered_bit\":true}","x":"{\"powered_bit\":true}","z":"{\"powered_bit\":true}","xz":"{\"powered_bit\":true}"} 00:45:14[Scripting][inform]-{"0":"{\"facing_direction\":1,\"powered_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:45:15[Scripting][inform]-{"0":"{\"facing_direction\":2,\"powered_bit\":false}","90":"{\"facing_direction\":5,\"powered_bit\":true}","180":"{\"facing_direction\":3,\"powered_bit\":true}","270":"{\"facing_direction\":4,\"powered_bit\":true}","x":"{\"facing_direction\":3,\"powered_bit\":true}","z":"{\"powered_bit\":true}","xz":"{\"facing_direction\":3,\"powered_bit\":true}"} 00:45:16[Scripting][inform]-{"0":"{\"facing_direction\":3,\"powered_bit\":false}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:45:16[Scripting][inform]-{"0":"{\"facing_direction\":4,\"powered_bit\":false}","90":"{\"facing_direction\":2,\"powered_bit\":true}","180":"{\"facing_direction\":5,\"powered_bit\":true}","270":"{\"facing_direction\":3,\"powered_bit\":true}","x":"{\"powered_bit\":true}","z":"{\"facing_direction\":5,\"powered_bit\":true}","xz":"{\"facing_direction\":5,\"powered_bit\":true}"} 00:45:17[Scripting][inform]-{"0":"{\"facing_direction\":5,\"powered_bit\":false}","90":"{\"facing_direction\":3}","180":"{\"facing_direction\":4}","270":"{\"facing_direction\":2}","x":"{}","z":"{\"facing_direction\":4}","xz":"{\"facing_direction\":4}"} 00:45:18[Scripting][inform]-{"0":"{\"facing_direction\":0,\"powered_bit\":false}","90":"{\"powered_bit\":true}","180":"{\"powered_bit\":true}","270":"{\"powered_bit\":true}","x":"{\"powered_bit\":true}","z":"{\"powered_bit\":true}","xz":"{\"powered_bit\":true}"} 00:45:19[Scripting][inform]-{"0":"{\"facing_direction\":1,\"powered_bit\":false}","90":"{}","180":"{}","270":"{}","x":"{}","z":"{}","xz":"{}"} 00:45:19[Scripting][inform]-{"0":"{\"facing_direction\":2,\"powered_bit\":false}","90":"{\"facing_direction\":5,\"powered_bit\":true}","180":"{\"facing_direction\":3,\"powered_bit\":true}","270":"{\"facing_direction\":4,\"powered_bit\":true}","x":"{\"facing_direction\":3,\"powered_bit\":true}","z":"{\"powered_bit\":true}","xz":"{\"facing_direction\":3,\"powered_bit\":true}"} 00:45:20[Scripting][inform]-{"0":"{\"facing_direction\":3,\"powered_bit\":false}","90":"{\"facing_direction\":4}","180":"{\"facing_direction\":2}","270":"{\"facing_direction\":5}","x":"{\"facing_direction\":2}","z":"{}","xz":"{\"facing_direction\":2}"} 00:45:21[Scripting][inform]-{"0":"{\"facing_direction\":4,\"powered_bit\":false}","90":"{\"facing_direction\":2,\"powered_bit\":true}","180":"{\"facing_direction\":5,\"powered_bit\":true}","270":"{\"facing_direction\":3,\"powered_bit\":true}","x":"{\"powered_bit\":true}","z":"{\"facing_direction\":5,\"powered_bit\":true}","xz":"{\"facing_direction\":5,\"powered_bit\":true}"} ================================================ FILE: resources/blockstate_alias_map.json ================================================ { "age": { "alias": [ "age" ] }, "age_bit": { "alias": [ "age" ] }, "allow_underwater_bit": { "alias": [ "underwater" ] }, "attached_bit": { "alias": [ "attached" ] }, "attachment": { "alias": [ "attachment" ] }, "bamboo_leaf_size": { "alias": [ "leaf_size" ] }, "bamboo_stalk_thickness": { "alias": [ "stalk_thickness", "thickness" ] }, "bite_counter": { "alias": [ "bites" ] }, "block_light_level": { "alias": [ "light" ] }, "brewing_stand_slot_a_bit": { "alias": [ "slot_a" ] }, "brewing_stand_slot_b_bit": { "alias": [ "slot_b" ] }, "brewing_stand_slot_c_bit": { "alias": [ "slot_c" ] }, "button_pressed_bit": { "alias": [ "pressed" ] }, "cauldron_liquid": { "alias": [ "liquid" ] }, "chemistry_table_type": { "alias": [ "type" ] }, "chisel_type": { "alias": [ "type" ] }, "cluster_count": { "alias": [ "count" ] }, "color": { "alias": [ "color" ] }, "color_bit": { "alias": [ "color" ] }, "composter_fill_level": { "alias": [ "fill" ] }, "conditional_bit": { "alias": [ "conditional" ] }, "coral_color": { "alias": [ "color" ] }, "coral_direction": { "alias": [ "direction" ] }, "coral_fan_direction": { "alias": [ "direction" ] }, "coral_hang_type_bit": { "alias": [ "type" ] }, "covered_bit": { "alias": [ "covered" ] }, "cracked_state": { "alias": [ "cracked" ] }, "damage": { "alias": [ "damage" ] }, "dead_bit": { "alias": [ "dead" ] }, "deprecated": { "alias": [ "deprecated" ] }, "direction": { "alias": [ "direction" ] }, "dirt_type": { "alias": [ "type" ] }, "disarmed_bit": { "alias": [ "disarmed" ] }, "door_hinge_bit": { "alias": [ "hinge" ] }, "double_plant_type": { "alias": [ "type" ] }, "drag_down": { "alias": [ "drag_down" ] }, "end_portal_eye_bit": { "alias": [ "eye" ] }, "explode_bit": { "alias": [ "explode" ] }, "extinguished": { "alias": [ "off" ] }, "facing_direction": { "alias": [ "direction", "facing" ] }, "fill_level": { "alias": [ "fill" ] }, "flower_type": { "alias": [ "type" ] }, "ground_sign_direction": { "alias": [ "direction" ] }, "growth": { "alias": [ "growth" ] }, "hanging": { "alias": [ "hanging" ] }, "head_piece_bit": { "alias": [ "head" ] }, "height": { "alias": [ "height" ] }, "huge_mushroom_bits": { "alias": [ "huge" ] }, "in_wall_bit": { "alias": [ "in_wall" ] }, "infiniburn_bit": { "alias": [ "burn" ] }, "item_frame_map_bit": { "alias": [ "map" ] }, "kelp_age": { "alias": [ "age" ] }, "lever_direction": { "alias": [ "direction" ] }, "liquid_depth": { "alias": [ "depth" ] }, "moisturized_amount": { "alias": [ "moisturized", "wetness" ] }, "monster_egg_stone_type": { "alias": [ "type" ] }, "new_leaf_type": { "alias": [ "type" ] }, "new_log_type": { "alias": [ "type" ] }, "no_drop_bit": { "alias": [ "no_drop" ] }, "occupied_bit": { "alias": [ "occupied" ] }, "old_leaf_type": { "alias": [ "type" ] }, "old_log_type": { "alias": [ "type" ] }, "open_bit": { "alias": [ "open" ] }, "output_lit_bit": { "alias": [ "lit", "output_lit" ] }, "output_subtract_bit": { "alias": [ "subtract", "output_subtract" ] }, "persistent_bit": { "alias": [ "persistent" ] }, "pillar_axis": { "alias": [ "axis" ] }, "portal_axis": { "alias": [ "axis" ] }, "powered_bit": { "alias": [ "powered" ] }, "prismarine_block_type": { "alias": [ "type" ] }, "rail_data_bit": { "alias": [ "data" ] }, "rail_direction": { "alias": [ "direction" ] }, "redstone_signal": { "alias": [ "signal", "redstone", "power" ] }, "repeater_delay": { "alias": [ "delay" ] }, "sand_stone_type": { "alias": [ "type" ] }, "sand_type": { "alias": [ "type" ] }, "sapling_type": { "alias": [ "type" ] }, "sea_grass_type": { "alias": [ "type" ] }, "sponge_type": { "alias": [ "type" ] }, "stability": { "alias": [ "stability" ] }, "stability_check": { "alias": [ "stability_check" ] }, "stone_brick_type": { "alias": [ "type" ] }, "stone_slab_type": { "alias": [ "type" ] }, "stone_slab_type_2": { "alias": [ "type" ] }, "stone_slab_type_3": { "alias": [ "type" ] }, "stone_slab_type_4": { "alias": [ "type" ] }, "stone_type": { "alias": [ "type" ] }, "stripped_bit": { "alias": [ "stripped" ] }, "structure_block_type": { "alias": [ "type" ] }, "suspended_bit": { "alias": [ "suspended" ] }, "tall_grass_type": { "alias": [ "type" ] }, "toggle_bit": { "alias": [ "toggle", "toggled" ] }, "top_slot_bit": { "alias": [ "top" ] }, "torch_facing_direction": { "alias": [ "direction" ] }, "triggered_bit": { "alias": [ "triggered" ] }, "turtle_egg_count": { "alias": [ "count" ] }, "update_bit": { "alias": [ "update" ] }, "upper_block_bit": { "alias": [ "top" ] }, "upside_down_bit": { "alias": [ "flipped" ] }, "vine_direction_bits": { "alias": [ "direction" ] }, "wall_block_type": { "alias": [ "type" ] }, "weirdo_direction": { "alias": [ "direction" ] }, "wood_type": { "alias": [ "type" ] } } ================================================ FILE: resources/blockstaterotate.json ================================================ [{"0":{"old_log_type":"oak","pillar_axis":"y"}},{"0":{"old_log_type":"spruce","pillar_axis":"y"}},{"0":{"old_log_type":"birch","pillar_axis":"y"}},{"0":{"old_log_type":"jungle","pillar_axis":"y"}},{"0":{"old_log_type":"oak","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"old_log_type":"spruce","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"old_log_type":"birch","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"old_log_type":"jungle","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"old_log_type":"oak","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"old_log_type":"spruce","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"old_log_type":"birch","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"old_log_type":"jungle","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"pillar_axis":"y","stripped_bit":false,"wood_type":"oak"}},{"0":{"pillar_axis":"y","stripped_bit":false,"wood_type":"spruce"}},{"0":{"facing_direction":0,"triggered_bit":false}},{"0":{"facing_direction":1,"triggered_bit":false}},{"0":{"facing_direction":2,"triggered_bit":false},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3,"triggered_bit":false},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4,"triggered_bit":false},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5,"triggered_bit":false},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0,"triggered_bit":false}},{"0":{"facing_direction":1,"triggered_bit":false}},{"0":{"facing_direction":2,"triggered_bit":false},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3,"triggered_bit":false},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4,"triggered_bit":false},"90":{"facing_direction":2,"triggered_bit":true},"180":{"facing_direction":5,"triggered_bit":true},"270":{"facing_direction":3,"triggered_bit":true},"x":{"triggered_bit":true},"z":{"facing_direction":5,"triggered_bit":true},"xz":{"facing_direction":5,"triggered_bit":true}},{"0":{"facing_direction":5,"triggered_bit":false},"90":{"facing_direction":3,"triggered_bit":true},"180":{"facing_direction":4,"triggered_bit":true},"270":{"facing_direction":2,"triggered_bit":true},"x":{"triggered_bit":true},"z":{"facing_direction":4,"triggered_bit":true},"xz":{"facing_direction":4,"triggered_bit":true}},{"0":{"rail_data_bit":false,"rail_direction":0},"90":{"rail_direction":1},"270":{"rail_direction":1}},{"0":{"rail_data_bit":false,"rail_direction":1},"90":{"rail_direction":0},"270":{"rail_direction":0}},{"0":{"rail_data_bit":false,"rail_direction":2},"90":{"rail_direction":5},"180":{"rail_direction":3},"270":{"rail_direction":4},"z":{"rail_direction":3},"xz":{"rail_direction":3}},{"0":{"rail_data_bit":false,"rail_direction":3},"90":{"rail_direction":4},"180":{"rail_direction":2},"270":{"rail_direction":5},"z":{"rail_direction":2},"xz":{"rail_direction":2}},{"0":{"rail_data_bit":false,"rail_direction":4},"90":{"rail_direction":2},"180":{"rail_direction":5},"270":{"rail_direction":3},"x":{"rail_direction":5},"xz":{"rail_direction":5}},{"0":{"rail_data_bit":false,"rail_direction":5},"90":{"rail_direction":3},"180":{"rail_direction":4},"270":{"rail_direction":2},"x":{"rail_direction":4},"xz":{"rail_direction":4}},{"0":{"rail_data_bit":false,"rail_direction":0},"90":{"rail_data_bit":true,"rail_direction":1},"180":{"rail_data_bit":true},"270":{"rail_data_bit":true,"rail_direction":1},"x":{"rail_data_bit":true},"z":{"rail_data_bit":true},"xz":{"rail_data_bit":true}},{"0":{"rail_data_bit":false,"rail_direction":1},"90":{"rail_direction":0},"270":{"rail_direction":0}},{"0":{"rail_data_bit":false,"rail_direction":2},"90":{"rail_data_bit":true,"rail_direction":5},"180":{"rail_data_bit":true,"rail_direction":3},"270":{"rail_data_bit":true,"rail_direction":4},"x":{"rail_data_bit":true},"z":{"rail_data_bit":true,"rail_direction":3},"xz":{"rail_data_bit":true,"rail_direction":3}},{"0":{"rail_data_bit":false,"rail_direction":3},"90":{"rail_data_bit":true,"rail_direction":4},"180":{"rail_data_bit":true,"rail_direction":2},"270":{"rail_data_bit":true,"rail_direction":5},"x":{"rail_data_bit":true},"z":{"rail_data_bit":true,"rail_direction":2},"xz":{"rail_data_bit":true,"rail_direction":2}},{"0":{"rail_data_bit":false,"rail_direction":4},"90":{"rail_direction":2},"180":{"rail_direction":5},"270":{"rail_direction":3},"x":{"rail_direction":5},"xz":{"rail_direction":5}},{"0":{"rail_data_bit":false,"rail_direction":5},"90":{"rail_data_bit":true,"rail_direction":3},"180":{"rail_data_bit":true,"rail_direction":4},"270":{"rail_data_bit":true,"rail_direction":2},"x":{"rail_data_bit":true,"rail_direction":4},"z":{"rail_data_bit":true},"xz":{"rail_data_bit":true,"rail_direction":4}},{"0":{"rail_data_bit":false,"rail_direction":0},"90":{"rail_direction":1},"270":{"rail_direction":1}},{"0":{"rail_data_bit":false,"rail_direction":1},"90":{"rail_direction":0},"270":{"rail_direction":0}},{"0":{"rail_data_bit":false,"rail_direction":2},"90":{"rail_direction":5},"180":{"rail_direction":3},"270":{"rail_direction":4},"z":{"rail_direction":3},"xz":{"rail_direction":3}},{"0":{"rail_data_bit":false,"rail_direction":3},"90":{"rail_direction":4},"180":{"rail_direction":2},"270":{"rail_direction":5},"z":{"rail_direction":2},"xz":{"rail_direction":2}},{"0":{"rail_data_bit":false,"rail_direction":4},"90":{"rail_direction":2},"180":{"rail_direction":5},"270":{"rail_direction":3},"x":{"rail_direction":5},"xz":{"rail_direction":5}},{"0":{"rail_data_bit":false,"rail_direction":5},"90":{"rail_direction":3},"180":{"rail_direction":4},"270":{"rail_direction":2},"x":{"rail_direction":4},"xz":{"rail_direction":4}},{"0":{"rail_data_bit":true,"rail_direction":0},"90":{"rail_direction":1},"270":{"rail_direction":1}},{"0":{"rail_data_bit":true,"rail_direction":1},"90":{"rail_direction":0},"270":{"rail_direction":0}},{"0":{"rail_data_bit":true,"rail_direction":2},"90":{"rail_direction":5},"180":{"rail_direction":3},"270":{"rail_direction":4},"z":{"rail_direction":3},"xz":{"rail_direction":3}},{"0":{"rail_data_bit":true,"rail_direction":3},"90":{"rail_direction":4},"180":{"rail_direction":2},"270":{"rail_direction":5},"z":{"rail_direction":2},"xz":{"rail_direction":2}},{"0":{"rail_data_bit":true,"rail_direction":4},"90":{"rail_direction":2},"180":{"rail_direction":5},"270":{"rail_direction":3},"x":{"rail_direction":5},"xz":{"rail_direction":5}},{"0":{"rail_data_bit":true,"rail_direction":5},"90":{"rail_direction":3},"180":{"rail_direction":4},"270":{"rail_direction":2},"x":{"rail_direction":4},"xz":{"rail_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"torch_facing_direction":"west"},"90":{"torch_facing_direction":"north"},"180":{"torch_facing_direction":"east"},"270":{"torch_facing_direction":"south"},"z":{"torch_facing_direction":"east"},"xz":{"torch_facing_direction":"east"}},{"0":{"torch_facing_direction":"west"},"90":{"torch_facing_direction":"north"},"180":{"torch_facing_direction":"east"},"270":{"torch_facing_direction":"south"},"z":{"torch_facing_direction":"east"},"xz":{"torch_facing_direction":"east"}},{"0":{"torch_facing_direction":"east"},"90":{"torch_facing_direction":"south"},"180":{"torch_facing_direction":"west"},"270":{"torch_facing_direction":"north"},"z":{"torch_facing_direction":"west"},"xz":{"torch_facing_direction":"west"}},{"0":{"torch_facing_direction":"north"},"90":{"torch_facing_direction":"east"},"180":{"torch_facing_direction":"south"},"270":{"torch_facing_direction":"west"},"x":{"torch_facing_direction":"south"},"xz":{"torch_facing_direction":"south"}},{"0":{"torch_facing_direction":"south"},"90":{"torch_facing_direction":"west"},"180":{"torch_facing_direction":"north"},"270":{"torch_facing_direction":"east"},"x":{"torch_facing_direction":"north"},"xz":{"torch_facing_direction":"north"}},{"0":{"torch_facing_direction":"top"}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"ground_sign_direction":0},"90":{"ground_sign_direction":4},"180":{"ground_sign_direction":8},"270":{"ground_sign_direction":12},"x":{"ground_sign_direction":8},"xz":{"ground_sign_direction":8}},{"0":{"ground_sign_direction":1},"90":{"ground_sign_direction":5},"180":{"ground_sign_direction":9},"270":{"ground_sign_direction":13},"x":{"ground_sign_direction":7},"z":{"ground_sign_direction":15},"xz":{"ground_sign_direction":9}},{"0":{"ground_sign_direction":2},"90":{"ground_sign_direction":6},"180":{"ground_sign_direction":10},"270":{"ground_sign_direction":14},"x":{"ground_sign_direction":6},"z":{"ground_sign_direction":14},"xz":{"ground_sign_direction":10}},{"0":{"ground_sign_direction":3},"90":{"ground_sign_direction":7},"180":{"ground_sign_direction":11},"270":{"ground_sign_direction":15},"x":{"ground_sign_direction":5},"z":{"ground_sign_direction":13},"xz":{"ground_sign_direction":11}},{"0":{"ground_sign_direction":4},"90":{"ground_sign_direction":8},"180":{"ground_sign_direction":12},"270":{"ground_sign_direction":0},"z":{"ground_sign_direction":12},"xz":{"ground_sign_direction":12}},{"0":{"ground_sign_direction":5},"90":{"ground_sign_direction":9},"180":{"ground_sign_direction":13},"270":{"ground_sign_direction":1},"x":{"ground_sign_direction":3},"z":{"ground_sign_direction":11},"xz":{"ground_sign_direction":13}},{"0":{"ground_sign_direction":6},"90":{"ground_sign_direction":10},"180":{"ground_sign_direction":14},"270":{"ground_sign_direction":2},"x":{"ground_sign_direction":2},"z":{"ground_sign_direction":10},"xz":{"ground_sign_direction":14}},{"0":{"ground_sign_direction":7},"90":{"ground_sign_direction":11},"180":{"ground_sign_direction":15},"270":{"ground_sign_direction":3},"x":{"ground_sign_direction":1},"z":{"ground_sign_direction":9},"xz":{"ground_sign_direction":15}},{"0":{"ground_sign_direction":8},"90":{"ground_sign_direction":12},"180":{"ground_sign_direction":0},"270":{"ground_sign_direction":4},"x":{"ground_sign_direction":0},"xz":{"ground_sign_direction":0}},{"0":{"ground_sign_direction":9},"90":{"ground_sign_direction":13},"180":{"ground_sign_direction":1},"270":{"ground_sign_direction":5},"x":{"ground_sign_direction":15},"z":{"ground_sign_direction":7},"xz":{"ground_sign_direction":1}},{"0":{"ground_sign_direction":10},"90":{"ground_sign_direction":14},"180":{"ground_sign_direction":2},"270":{"ground_sign_direction":6},"x":{"ground_sign_direction":14},"z":{"ground_sign_direction":6},"xz":{"ground_sign_direction":2}},{"0":{"ground_sign_direction":11},"90":{"ground_sign_direction":15},"180":{"ground_sign_direction":3},"270":{"ground_sign_direction":7},"x":{"ground_sign_direction":13},"z":{"ground_sign_direction":5},"xz":{"ground_sign_direction":3}},{"0":{"ground_sign_direction":12},"90":{"ground_sign_direction":0},"180":{"ground_sign_direction":4},"270":{"ground_sign_direction":8},"z":{"ground_sign_direction":4},"xz":{"ground_sign_direction":4}},{"0":{"ground_sign_direction":13},"90":{"ground_sign_direction":1},"180":{"ground_sign_direction":5},"270":{"ground_sign_direction":9},"x":{"ground_sign_direction":11},"z":{"ground_sign_direction":3},"xz":{"ground_sign_direction":5}},{"0":{"ground_sign_direction":14},"90":{"ground_sign_direction":2},"180":{"ground_sign_direction":6},"270":{"ground_sign_direction":10},"x":{"ground_sign_direction":10},"z":{"ground_sign_direction":2},"xz":{"ground_sign_direction":6}},{"0":{"ground_sign_direction":15},"90":{"ground_sign_direction":3},"180":{"ground_sign_direction":7},"270":{"ground_sign_direction":11},"x":{"ground_sign_direction":9},"z":{"ground_sign_direction":1},"xz":{"ground_sign_direction":7}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"rail_direction":0},"90":{"rail_direction":1},"270":{"rail_direction":1}},{"0":{"rail_direction":1},"90":{"rail_direction":0},"270":{"rail_direction":0}},{"0":{"rail_direction":2},"90":{"rail_direction":5},"180":{"rail_direction":3},"270":{"rail_direction":4},"z":{"rail_direction":3},"xz":{"rail_direction":3}},{"0":{"rail_direction":3},"90":{"rail_direction":4},"180":{"rail_direction":2},"270":{"rail_direction":5},"z":{"rail_direction":2},"xz":{"rail_direction":2}},{"0":{"rail_direction":4},"90":{"rail_direction":2},"180":{"rail_direction":5},"270":{"rail_direction":3},"x":{"rail_direction":5},"xz":{"rail_direction":5}},{"0":{"rail_direction":5},"90":{"rail_direction":3},"180":{"rail_direction":4},"270":{"rail_direction":2},"x":{"rail_direction":4},"xz":{"rail_direction":4}},{"0":{"rail_direction":6},"90":{"rail_direction":7},"180":{"rail_direction":8},"270":{"rail_direction":9},"x":{"rail_direction":9},"z":{"rail_direction":7},"xz":{"rail_direction":8}},{"0":{"rail_direction":7},"90":{"rail_direction":8},"180":{"rail_direction":9},"270":{"rail_direction":6},"x":{"rail_direction":8},"z":{"rail_direction":6},"xz":{"rail_direction":9}},{"0":{"rail_direction":8},"90":{"rail_direction":9},"180":{"rail_direction":6},"270":{"rail_direction":7},"x":{"rail_direction":7},"z":{"rail_direction":9},"xz":{"rail_direction":6}},{"0":{"rail_direction":9},"90":{"rail_direction":6},"180":{"rail_direction":7},"270":{"rail_direction":8},"x":{"rail_direction":6},"z":{"rail_direction":8},"xz":{"rail_direction":7}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"lever_direction":"down_east_west","open_bit":false},"90":{"lever_direction":"down_north_south"},"270":{"lever_direction":"down_north_south"}},{"0":{"lever_direction":"east","open_bit":false},"90":{"lever_direction":"south"},"180":{"lever_direction":"west"},"270":{"lever_direction":"north"},"z":{"lever_direction":"west"},"xz":{"lever_direction":"west"}},{"0":{"lever_direction":"west","open_bit":false},"90":{"lever_direction":"north"},"180":{"lever_direction":"east"},"270":{"lever_direction":"south"},"z":{"lever_direction":"east"},"xz":{"lever_direction":"east"}},{"0":{"lever_direction":"south","open_bit":false},"90":{"lever_direction":"west"},"180":{"lever_direction":"north"},"270":{"lever_direction":"east"},"x":{"lever_direction":"north"},"xz":{"lever_direction":"north"}},{"0":{"lever_direction":"north","open_bit":false},"90":{"lever_direction":"east"},"180":{"lever_direction":"south"},"270":{"lever_direction":"west"},"x":{"lever_direction":"south"},"xz":{"lever_direction":"south"}},{"0":{"lever_direction":"up_north_south","open_bit":false},"90":{"lever_direction":"up_east_west"},"270":{"lever_direction":"up_east_west"}},{"0":{"lever_direction":"up_east_west","open_bit":false},"90":{"lever_direction":"up_north_south"},"270":{"lever_direction":"up_north_south"}},{"0":{"lever_direction":"down_north_south","open_bit":false},"90":{"lever_direction":"down_east_west"},"270":{"lever_direction":"down_east_west"}},{"0":{"lever_direction":"down_east_west","open_bit":true},"90":{"lever_direction":"down_north_south"},"270":{"lever_direction":"down_north_south"}},{"0":{"lever_direction":"east","open_bit":true},"90":{"lever_direction":"south"},"180":{"lever_direction":"west"},"270":{"lever_direction":"north"},"z":{"lever_direction":"west"},"xz":{"lever_direction":"west"}},{"0":{"lever_direction":"west","open_bit":true},"90":{"lever_direction":"north"},"180":{"lever_direction":"east"},"270":{"lever_direction":"south"},"z":{"lever_direction":"east"},"xz":{"lever_direction":"east"}},{"0":{"lever_direction":"south","open_bit":true},"90":{"lever_direction":"west"},"180":{"lever_direction":"north"},"270":{"lever_direction":"east"},"x":{"lever_direction":"north"},"xz":{"lever_direction":"north"}},{"0":{"lever_direction":"north","open_bit":true},"90":{"lever_direction":"east"},"180":{"lever_direction":"south"},"270":{"lever_direction":"west"},"x":{"lever_direction":"south"},"xz":{"lever_direction":"south"}},{"0":{"lever_direction":"up_north_south","open_bit":true},"90":{"lever_direction":"up_east_west"},"270":{"lever_direction":"up_east_west"}},{"0":{"lever_direction":"up_east_west","open_bit":true},"90":{"lever_direction":"up_north_south"},"270":{"lever_direction":"up_north_south"}},{"0":{"lever_direction":"down_north_south","open_bit":true},"90":{"lever_direction":"down_east_west"},"270":{"lever_direction":"down_east_west"}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"torch_facing_direction":"unknown"}},{"0":{"torch_facing_direction":"west"},"90":{"torch_facing_direction":"north"},"180":{"torch_facing_direction":"east"},"270":{"torch_facing_direction":"south"},"z":{"torch_facing_direction":"east"},"xz":{"torch_facing_direction":"east"}},{"0":{"torch_facing_direction":"east"},"90":{"torch_facing_direction":"south"},"180":{"torch_facing_direction":"west"},"270":{"torch_facing_direction":"north"},"z":{"torch_facing_direction":"west"},"xz":{"torch_facing_direction":"west"}},{"0":{"torch_facing_direction":"north"},"90":{"torch_facing_direction":"east"},"180":{"torch_facing_direction":"south"},"270":{"torch_facing_direction":"west"},"x":{"torch_facing_direction":"south"},"xz":{"torch_facing_direction":"south"}},{"0":{"torch_facing_direction":"south"},"90":{"torch_facing_direction":"west"},"180":{"torch_facing_direction":"north"},"270":{"torch_facing_direction":"east"},"x":{"torch_facing_direction":"north"},"xz":{"torch_facing_direction":"north"}},{"0":{"torch_facing_direction":"top"}},{"0":{"torch_facing_direction":"unknown"}},{"0":{"torch_facing_direction":"west"},"90":{"torch_facing_direction":"north"},"180":{"torch_facing_direction":"east"},"270":{"torch_facing_direction":"south"},"z":{"torch_facing_direction":"east"},"xz":{"torch_facing_direction":"east"}},{"0":{"torch_facing_direction":"east"},"90":{"torch_facing_direction":"south"},"180":{"torch_facing_direction":"west"},"270":{"torch_facing_direction":"north"},"z":{"torch_facing_direction":"west"},"xz":{"torch_facing_direction":"west"}},{"0":{"torch_facing_direction":"north"},"90":{"torch_facing_direction":"east"},"180":{"torch_facing_direction":"south"},"270":{"torch_facing_direction":"west"},"x":{"torch_facing_direction":"south"},"xz":{"torch_facing_direction":"south"}},{"0":{"torch_facing_direction":"south"},"90":{"torch_facing_direction":"west"},"180":{"torch_facing_direction":"north"},"270":{"torch_facing_direction":"east"},"x":{"torch_facing_direction":"north"},"xz":{"torch_facing_direction":"north"}},{"0":{"torch_facing_direction":"top"}},{"0":{"button_pressed_bit":false,"facing_direction":0}},{"0":{"button_pressed_bit":false,"facing_direction":1}},{"0":{"button_pressed_bit":false,"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"button_pressed_bit":false,"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"button_pressed_bit":false,"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"button_pressed_bit":false,"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"button_pressed_bit":true,"facing_direction":0}},{"0":{"button_pressed_bit":true,"facing_direction":1}},{"0":{"button_pressed_bit":true,"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"button_pressed_bit":true,"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"button_pressed_bit":true,"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"button_pressed_bit":true,"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"portal_axis":"unknown"},"90":{"portal_axis":"x"},"180":{"portal_axis":"z"},"270":{"portal_axis":"x"},"x":{"portal_axis":"z"},"z":{"portal_axis":"z"},"xz":{"portal_axis":"z"}},{"0":{"portal_axis":"x"},"90":{"portal_axis":"z"},"270":{"portal_axis":"z"}},{"0":{"portal_axis":"z"},"90":{"portal_axis":"x"},"270":{"portal_axis":"x"}},{"0":{"direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"repeater_delay":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"repeater_delay":0},"90":{"direction":2},"180":{"direction":3},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"repeater_delay":0},"90":{"direction":3},"270":{"direction":1}},{"0":{"direction":3,"repeater_delay":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"repeater_delay":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"repeater_delay":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"repeater_delay":1},"90":{"direction":3},"180":{"direction":0},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"repeater_delay":1},"90":{"direction":0},"270":{"direction":2}},{"0":{"direction":0,"repeater_delay":2},"90":{"direction":1},"270":{"direction":3}},{"0":{"direction":1,"repeater_delay":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"repeater_delay":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"repeater_delay":2},"90":{"direction":0},"180":{"direction":1},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"repeater_delay":3},"90":{"direction":1},"180":{"direction":2},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"repeater_delay":3},"90":{"direction":2},"270":{"direction":0}},{"0":{"direction":2,"repeater_delay":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"repeater_delay":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"repeater_delay":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"repeater_delay":0},"90":{"direction":2},"180":{"direction":3},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"repeater_delay":0},"90":{"direction":3},"270":{"direction":1}},{"0":{"direction":3,"repeater_delay":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"repeater_delay":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"repeater_delay":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"repeater_delay":1},"90":{"direction":3},"180":{"direction":0},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"repeater_delay":1},"90":{"direction":0},"270":{"direction":2}},{"0":{"direction":0,"repeater_delay":2},"90":{"direction":1},"270":{"direction":3}},{"0":{"direction":1,"repeater_delay":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"repeater_delay":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"repeater_delay":2},"90":{"direction":0},"180":{"direction":1},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"repeater_delay":3},"90":{"direction":1},"180":{"direction":2},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"repeater_delay":3},"90":{"direction":2},"270":{"direction":0}},{"0":{"direction":2,"repeater_delay":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"repeater_delay":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"open_bit":false,"upside_down_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"open_bit":false,"upside_down_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"open_bit":false,"upside_down_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"open_bit":false,"upside_down_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"open_bit":false,"upside_down_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"open_bit":false,"upside_down_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"open_bit":false,"upside_down_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"open_bit":false,"upside_down_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"open_bit":true,"upside_down_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"open_bit":true,"upside_down_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"open_bit":true,"upside_down_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"open_bit":true,"upside_down_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"open_bit":true,"upside_down_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"open_bit":true,"upside_down_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"open_bit":true,"upside_down_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"open_bit":true,"upside_down_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"huge_mushroom_bits":0}},{"0":{"huge_mushroom_bits":1}},{"0":{"huge_mushroom_bits":2}},{"0":{"huge_mushroom_bits":3}},{"0":{"huge_mushroom_bits":4}},{"0":{"huge_mushroom_bits":5}},{"0":{"huge_mushroom_bits":6}},{"0":{"huge_mushroom_bits":7}},{"0":{"huge_mushroom_bits":8}},{"0":{"huge_mushroom_bits":9}},{"0":{"huge_mushroom_bits":10}},{"0":{"huge_mushroom_bits":11}},{"0":{"huge_mushroom_bits":12}},{"0":{"huge_mushroom_bits":13}},{"0":{"huge_mushroom_bits":14}},{"0":{"huge_mushroom_bits":15}},{"0":{"huge_mushroom_bits":0}},{"0":{"huge_mushroom_bits":1}},{"0":{"huge_mushroom_bits":2}},{"0":{"huge_mushroom_bits":3}},{"0":{"huge_mushroom_bits":4}},{"0":{"huge_mushroom_bits":5}},{"0":{"huge_mushroom_bits":6}},{"0":{"huge_mushroom_bits":7}},{"0":{"huge_mushroom_bits":8}},{"0":{"huge_mushroom_bits":9}},{"0":{"huge_mushroom_bits":10}},{"0":{"huge_mushroom_bits":11}},{"0":{"huge_mushroom_bits":12}},{"0":{"huge_mushroom_bits":13}},{"0":{"huge_mushroom_bits":14}},{"0":{"huge_mushroom_bits":15}},{"0":{"vine_direction_bits":0}},{"0":{"vine_direction_bits":1}},{"0":{"vine_direction_bits":2}},{"0":{"vine_direction_bits":3}},{"0":{"vine_direction_bits":4}},{"0":{"vine_direction_bits":5}},{"0":{"vine_direction_bits":6}},{"0":{"vine_direction_bits":7}},{"0":{"vine_direction_bits":8}},{"0":{"vine_direction_bits":9}},{"0":{"vine_direction_bits":10}},{"0":{"vine_direction_bits":11}},{"0":{"vine_direction_bits":12}},{"0":{"vine_direction_bits":13}},{"0":{"vine_direction_bits":14}},{"0":{"vine_direction_bits":15}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{},{"0":{"direction":0,"end_portal_eye_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"end_portal_eye_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"end_portal_eye_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"end_portal_eye_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"end_portal_eye_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"end_portal_eye_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"end_portal_eye_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"end_portal_eye_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"facing_direction":0,"triggered_bit":false}},{"0":{"facing_direction":1,"triggered_bit":false}},{"0":{"facing_direction":2,"triggered_bit":false},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3,"triggered_bit":false},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4,"triggered_bit":false},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5,"triggered_bit":false},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0,"triggered_bit":false},"90":{"triggered_bit":true},"180":{"triggered_bit":true},"270":{"triggered_bit":true},"x":{"triggered_bit":true},"z":{"triggered_bit":true},"xz":{"triggered_bit":true}},{"0":{"facing_direction":1,"triggered_bit":false},"90":{"triggered_bit":true},"180":{"triggered_bit":true},"270":{"triggered_bit":true},"x":{"triggered_bit":true},"z":{"triggered_bit":true},"xz":{"triggered_bit":true}},{"0":{"facing_direction":2,"triggered_bit":false},"90":{"facing_direction":5,"triggered_bit":true},"180":{"facing_direction":3,"triggered_bit":true},"270":{"facing_direction":4,"triggered_bit":true},"x":{"facing_direction":3,"triggered_bit":true},"z":{"triggered_bit":true},"xz":{"facing_direction":3,"triggered_bit":true}},{"0":{"facing_direction":3,"triggered_bit":false},"90":{"facing_direction":4,"triggered_bit":true},"180":{"facing_direction":2,"triggered_bit":true},"270":{"facing_direction":5,"triggered_bit":true},"x":{"facing_direction":2,"triggered_bit":true},"z":{"triggered_bit":true},"xz":{"facing_direction":2,"triggered_bit":true}},{"0":{"facing_direction":4,"triggered_bit":false},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5,"triggered_bit":false},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"rail_data_bit":false,"rail_direction":0},"90":{"rail_direction":1},"270":{"rail_direction":1}},{"0":{"rail_data_bit":false,"rail_direction":1},"90":{"rail_direction":0},"270":{"rail_direction":0}},{"0":{"rail_data_bit":false,"rail_direction":2},"90":{"rail_direction":5},"180":{"rail_direction":3},"270":{"rail_direction":4},"z":{"rail_direction":3},"xz":{"rail_direction":3}},{"0":{"rail_data_bit":false,"rail_direction":3},"90":{"rail_direction":4},"180":{"rail_direction":2},"270":{"rail_direction":5},"z":{"rail_direction":2},"xz":{"rail_direction":2}},{"0":{"rail_data_bit":false,"rail_direction":4},"90":{"rail_direction":2},"180":{"rail_direction":5},"270":{"rail_direction":3},"x":{"rail_direction":5},"xz":{"rail_direction":5}},{"0":{"rail_data_bit":false,"rail_direction":5},"90":{"rail_direction":3},"180":{"rail_direction":4},"270":{"rail_direction":2},"x":{"rail_direction":4},"xz":{"rail_direction":4}},{"0":{"rail_data_bit":false,"rail_direction":0},"90":{"rail_direction":1},"270":{"rail_direction":1}},{"0":{"rail_data_bit":false,"rail_direction":1},"90":{"rail_direction":0},"270":{"rail_direction":0}},{"0":{"rail_data_bit":false,"rail_direction":2},"90":{"rail_data_bit":true,"rail_direction":5},"180":{"rail_data_bit":true,"rail_direction":3},"270":{"rail_data_bit":true,"rail_direction":4},"x":{"rail_data_bit":true},"z":{"rail_data_bit":true,"rail_direction":3},"xz":{"rail_data_bit":true,"rail_direction":3}},{"0":{"rail_data_bit":false,"rail_direction":3},"90":{"rail_direction":4},"180":{"rail_direction":2},"270":{"rail_direction":5},"z":{"rail_direction":2},"xz":{"rail_direction":2}},{"0":{"rail_data_bit":false,"rail_direction":4},"90":{"rail_data_bit":true,"rail_direction":2},"180":{"rail_data_bit":true,"rail_direction":5},"270":{"rail_data_bit":true,"rail_direction":3},"x":{"rail_data_bit":true,"rail_direction":5},"z":{"rail_data_bit":true},"xz":{"rail_data_bit":true,"rail_direction":5}},{"0":{"rail_data_bit":false,"rail_direction":5},"90":{"rail_data_bit":true,"rail_direction":3},"180":{"rail_data_bit":true,"rail_direction":4},"270":{"rail_data_bit":true,"rail_direction":2},"x":{"rail_data_bit":true,"rail_direction":4},"z":{"rail_data_bit":true},"xz":{"rail_data_bit":true,"rail_direction":4}},{},{},{},{},{},{},{},{},{},{},{},{},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"attached_bit":false,"direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"attached_bit":false,"direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"attached_bit":false,"direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"attached_bit":false,"direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"attached_bit":false,"direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"attached_bit":false,"direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"attached_bit":false,"direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"attached_bit":false,"direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"attached_bit":false,"direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"attached_bit":false,"direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"attached_bit":false,"direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"attached_bit":false,"direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"attached_bit":false,"direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"attached_bit":false,"direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"attached_bit":false,"direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"attached_bit":false,"direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"conditional_bit":false,"facing_direction":0}},{"0":{"conditional_bit":false,"facing_direction":1}},{"0":{"conditional_bit":false,"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"conditional_bit":false,"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"conditional_bit":false,"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"conditional_bit":false,"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"conditional_bit":true,"facing_direction":0},"90":{"conditional_bit":false},"180":{"conditional_bit":false},"270":{"conditional_bit":false},"x":{"conditional_bit":false},"z":{"conditional_bit":false},"xz":{"conditional_bit":false}},{"0":{"conditional_bit":true,"facing_direction":1},"90":{"conditional_bit":false},"180":{"conditional_bit":false},"270":{"conditional_bit":false},"x":{"conditional_bit":false},"z":{"conditional_bit":false},"xz":{"conditional_bit":false}},{"0":{"conditional_bit":true,"facing_direction":2},"90":{"conditional_bit":false,"facing_direction":5},"180":{"conditional_bit":false,"facing_direction":3},"270":{"conditional_bit":false,"facing_direction":4},"x":{"conditional_bit":false,"facing_direction":3},"z":{"conditional_bit":false},"xz":{"conditional_bit":false,"facing_direction":3}},{"0":{"conditional_bit":true,"facing_direction":3},"90":{"conditional_bit":false,"facing_direction":4},"180":{"conditional_bit":false,"facing_direction":2},"270":{"conditional_bit":false,"facing_direction":5},"x":{"conditional_bit":false,"facing_direction":2},"z":{"conditional_bit":false},"xz":{"conditional_bit":false,"facing_direction":2}},{"0":{"conditional_bit":true,"facing_direction":4},"90":{"conditional_bit":false,"facing_direction":2},"180":{"conditional_bit":false,"facing_direction":5},"270":{"conditional_bit":false,"facing_direction":3},"x":{"conditional_bit":false},"z":{"conditional_bit":false,"facing_direction":5},"xz":{"conditional_bit":false,"facing_direction":5}},{"0":{"conditional_bit":true,"facing_direction":5},"90":{"conditional_bit":false,"facing_direction":3},"180":{"conditional_bit":false,"facing_direction":4},"270":{"conditional_bit":false,"facing_direction":2},"x":{"conditional_bit":false},"z":{"conditional_bit":false,"facing_direction":4},"xz":{"conditional_bit":false,"facing_direction":4}},{"0":{"button_pressed_bit":false,"facing_direction":0}},{"0":{"button_pressed_bit":false,"facing_direction":1}},{"0":{"button_pressed_bit":false,"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"button_pressed_bit":false,"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"button_pressed_bit":false,"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"button_pressed_bit":false,"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"button_pressed_bit":true,"facing_direction":0}},{"0":{"button_pressed_bit":true,"facing_direction":1}},{"0":{"button_pressed_bit":true,"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"button_pressed_bit":true,"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"button_pressed_bit":true,"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"button_pressed_bit":true,"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0,"no_drop_bit":false}},{"0":{"facing_direction":1,"no_drop_bit":false}},{"0":{"facing_direction":2,"no_drop_bit":false},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3,"no_drop_bit":false},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4,"no_drop_bit":false},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5,"no_drop_bit":false},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0,"no_drop_bit":true}},{"0":{"facing_direction":1,"no_drop_bit":true}},{"0":{"facing_direction":2,"no_drop_bit":true},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3,"no_drop_bit":true},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4,"no_drop_bit":true},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5,"no_drop_bit":true},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"damage":"undamaged","direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"damage":"undamaged","direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"damage":"undamaged","direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"damage":"undamaged","direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"damage":"slightly_damaged","direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"damage":"slightly_damaged","direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"damage":"slightly_damaged","direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"damage":"slightly_damaged","direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"damage":"very_damaged","direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"damage":"very_damaged","direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"damage":"very_damaged","direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"damage":"very_damaged","direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"damage":"broken","direction":0},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"damage":"broken","direction":1},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"damage":"broken","direction":2},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"damage":"broken","direction":3},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"direction":0,"output_lit_bit":false,"output_subtract_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"output_lit_bit":false,"output_subtract_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"output_lit_bit":false,"output_subtract_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"output_lit_bit":false,"output_subtract_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"output_lit_bit":false,"output_subtract_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"output_lit_bit":false,"output_subtract_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"output_lit_bit":false,"output_subtract_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"output_lit_bit":false,"output_subtract_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"output_lit_bit":true,"output_subtract_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"output_lit_bit":true,"output_subtract_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"output_lit_bit":true,"output_subtract_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"output_lit_bit":true,"output_subtract_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"output_lit_bit":true,"output_subtract_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"output_lit_bit":true,"output_subtract_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"output_lit_bit":true,"output_subtract_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"output_lit_bit":true,"output_subtract_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"output_lit_bit":false,"output_subtract_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"output_lit_bit":false,"output_subtract_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"output_lit_bit":false,"output_subtract_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"output_lit_bit":false,"output_subtract_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"output_lit_bit":false,"output_subtract_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"output_lit_bit":false,"output_subtract_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"output_lit_bit":false,"output_subtract_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"output_lit_bit":false,"output_subtract_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"output_lit_bit":true,"output_subtract_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"output_lit_bit":true,"output_subtract_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"output_lit_bit":true,"output_subtract_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"output_lit_bit":true,"output_subtract_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"output_lit_bit":true,"output_subtract_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"output_lit_bit":true,"output_subtract_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"output_lit_bit":true,"output_subtract_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"output_lit_bit":true,"output_subtract_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"facing_direction":0,"toggle_bit":false}},{"0":{"facing_direction":1,"toggle_bit":false}},{"0":{"facing_direction":2,"toggle_bit":false},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3,"toggle_bit":false},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4,"toggle_bit":false},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5,"toggle_bit":false},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0,"toggle_bit":false}},{"0":{"facing_direction":1,"toggle_bit":false}},{"0":{"facing_direction":2,"toggle_bit":false},"90":{"facing_direction":5,"toggle_bit":true},"180":{"facing_direction":3,"toggle_bit":true},"270":{"facing_direction":4,"toggle_bit":true},"x":{"facing_direction":3,"toggle_bit":true},"z":{"toggle_bit":true},"xz":{"facing_direction":3,"toggle_bit":true}},{"0":{"facing_direction":3,"toggle_bit":false},"90":{"facing_direction":4,"toggle_bit":true},"180":{"facing_direction":2,"toggle_bit":true},"270":{"facing_direction":5,"toggle_bit":true},"x":{"facing_direction":2,"toggle_bit":true},"z":{"toggle_bit":true},"xz":{"facing_direction":2,"toggle_bit":true}},{"0":{"facing_direction":4,"toggle_bit":false},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5,"toggle_bit":false},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"chisel_type":"default","pillar_axis":"y"}},{"0":{"chisel_type":"chiseled","pillar_axis":"y"}},{"0":{"chisel_type":"lines","pillar_axis":"y"}},{"0":{"chisel_type":"smooth","pillar_axis":"y"}},{"0":{"chisel_type":"default","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"chisel_type":"chiseled","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"chisel_type":"lines","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"chisel_type":"smooth","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"chisel_type":"default","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"chisel_type":"chiseled","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"chisel_type":"lines","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"chisel_type":"smooth","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"direction":0,"open_bit":false,"upside_down_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"open_bit":false,"upside_down_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"open_bit":false,"upside_down_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"open_bit":false,"upside_down_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"open_bit":false,"upside_down_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"open_bit":false,"upside_down_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"open_bit":false,"upside_down_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"open_bit":false,"upside_down_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"open_bit":true,"upside_down_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"open_bit":true,"upside_down_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"open_bit":true,"upside_down_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"open_bit":true,"upside_down_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"open_bit":true,"upside_down_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"open_bit":true,"upside_down_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"open_bit":true,"upside_down_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"open_bit":true,"upside_down_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"deprecated":0,"pillar_axis":"y"}},{"0":{"deprecated":1,"pillar_axis":"y"}},{"0":{"deprecated":2,"pillar_axis":"y"}},{"0":{"deprecated":3,"pillar_axis":"y"}},{"0":{"deprecated":0,"pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"deprecated":1,"pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"deprecated":2,"pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"deprecated":3,"pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"deprecated":0,"pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"deprecated":1,"pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"deprecated":2,"pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"deprecated":3,"pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"ground_sign_direction":0},"90":{"ground_sign_direction":4},"180":{"ground_sign_direction":8},"270":{"ground_sign_direction":12},"x":{"ground_sign_direction":8},"xz":{"ground_sign_direction":8}},{"0":{"ground_sign_direction":1},"90":{"ground_sign_direction":5},"180":{"ground_sign_direction":9},"270":{"ground_sign_direction":13},"x":{"ground_sign_direction":7},"z":{"ground_sign_direction":15},"xz":{"ground_sign_direction":9}},{"0":{"ground_sign_direction":2},"90":{"ground_sign_direction":6},"180":{"ground_sign_direction":10},"270":{"ground_sign_direction":14},"x":{"ground_sign_direction":6},"z":{"ground_sign_direction":14},"xz":{"ground_sign_direction":10}},{"0":{"ground_sign_direction":3},"90":{"ground_sign_direction":7},"180":{"ground_sign_direction":11},"270":{"ground_sign_direction":15},"x":{"ground_sign_direction":5},"z":{"ground_sign_direction":13},"xz":{"ground_sign_direction":11}},{"0":{"ground_sign_direction":4},"90":{"ground_sign_direction":8},"180":{"ground_sign_direction":12},"270":{"ground_sign_direction":0},"z":{"ground_sign_direction":12},"xz":{"ground_sign_direction":12}},{"0":{"ground_sign_direction":5},"90":{"ground_sign_direction":9},"180":{"ground_sign_direction":13},"270":{"ground_sign_direction":1},"x":{"ground_sign_direction":3},"z":{"ground_sign_direction":11},"xz":{"ground_sign_direction":13}},{"0":{"ground_sign_direction":6},"90":{"ground_sign_direction":10},"180":{"ground_sign_direction":14},"270":{"ground_sign_direction":2},"x":{"ground_sign_direction":2},"z":{"ground_sign_direction":10},"xz":{"ground_sign_direction":14}},{"0":{"ground_sign_direction":7},"90":{"ground_sign_direction":11},"180":{"ground_sign_direction":15},"270":{"ground_sign_direction":3},"x":{"ground_sign_direction":1},"z":{"ground_sign_direction":9},"xz":{"ground_sign_direction":15}},{"0":{"ground_sign_direction":8},"90":{"ground_sign_direction":12},"180":{"ground_sign_direction":0},"270":{"ground_sign_direction":4},"x":{"ground_sign_direction":0},"xz":{"ground_sign_direction":0}},{"0":{"ground_sign_direction":9},"90":{"ground_sign_direction":13},"180":{"ground_sign_direction":1},"270":{"ground_sign_direction":5},"x":{"ground_sign_direction":15},"z":{"ground_sign_direction":7},"xz":{"ground_sign_direction":1}},{"0":{"ground_sign_direction":10},"90":{"ground_sign_direction":14},"180":{"ground_sign_direction":2},"270":{"ground_sign_direction":6},"x":{"ground_sign_direction":14},"z":{"ground_sign_direction":6},"xz":{"ground_sign_direction":2}},{"0":{"ground_sign_direction":11},"90":{"ground_sign_direction":15},"180":{"ground_sign_direction":3},"270":{"ground_sign_direction":7},"x":{"ground_sign_direction":13},"z":{"ground_sign_direction":5},"xz":{"ground_sign_direction":3}},{"0":{"ground_sign_direction":12},"90":{"ground_sign_direction":0},"180":{"ground_sign_direction":4},"270":{"ground_sign_direction":8},"z":{"ground_sign_direction":4},"xz":{"ground_sign_direction":4}},{"0":{"ground_sign_direction":13},"90":{"ground_sign_direction":1},"180":{"ground_sign_direction":5},"270":{"ground_sign_direction":9},"x":{"ground_sign_direction":11},"z":{"ground_sign_direction":3},"xz":{"ground_sign_direction":5}},{"0":{"ground_sign_direction":14},"90":{"ground_sign_direction":2},"180":{"ground_sign_direction":6},"270":{"ground_sign_direction":10},"x":{"ground_sign_direction":10},"z":{"ground_sign_direction":2},"xz":{"ground_sign_direction":6}},{"0":{"ground_sign_direction":15},"90":{"ground_sign_direction":3},"180":{"ground_sign_direction":7},"270":{"ground_sign_direction":11},"x":{"ground_sign_direction":9},"z":{"ground_sign_direction":1},"xz":{"ground_sign_direction":7}},{},{},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"in_wall_bit":false,"open_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"in_wall_bit":false,"open_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"in_wall_bit":false,"open_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"in_wall_bit":false,"open_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"conditional_bit":false,"facing_direction":0}},{"0":{"conditional_bit":false,"facing_direction":1}},{"0":{"conditional_bit":false,"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"conditional_bit":false,"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"conditional_bit":false,"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"conditional_bit":false,"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"conditional_bit":true,"facing_direction":0},"90":{"conditional_bit":false},"180":{"conditional_bit":false},"270":{"conditional_bit":false},"x":{"conditional_bit":false},"z":{"conditional_bit":false},"xz":{"conditional_bit":false}},{"0":{"conditional_bit":true,"facing_direction":1},"90":{"conditional_bit":false},"180":{"conditional_bit":false},"270":{"conditional_bit":false},"x":{"conditional_bit":false},"z":{"conditional_bit":false},"xz":{"conditional_bit":false}},{"0":{"conditional_bit":true,"facing_direction":2},"90":{"conditional_bit":false,"facing_direction":5},"180":{"conditional_bit":false,"facing_direction":3},"270":{"conditional_bit":false,"facing_direction":4},"x":{"conditional_bit":false,"facing_direction":3},"z":{"conditional_bit":false},"xz":{"conditional_bit":false,"facing_direction":3}},{"0":{"conditional_bit":true,"facing_direction":3},"90":{"conditional_bit":false,"facing_direction":4},"180":{"conditional_bit":false,"facing_direction":2},"270":{"conditional_bit":false,"facing_direction":5},"x":{"conditional_bit":false,"facing_direction":2},"z":{"conditional_bit":false},"xz":{"conditional_bit":false,"facing_direction":2}},{"0":{"conditional_bit":true,"facing_direction":4},"90":{"conditional_bit":false,"facing_direction":2},"180":{"conditional_bit":false,"facing_direction":5},"270":{"conditional_bit":false,"facing_direction":3},"x":{"conditional_bit":false},"z":{"conditional_bit":false,"facing_direction":5},"xz":{"conditional_bit":false,"facing_direction":5}},{"0":{"conditional_bit":true,"facing_direction":5},"90":{"conditional_bit":false,"facing_direction":3},"180":{"conditional_bit":false,"facing_direction":4},"270":{"conditional_bit":false,"facing_direction":2},"x":{"conditional_bit":false},"z":{"conditional_bit":false,"facing_direction":4},"xz":{"conditional_bit":false,"facing_direction":4}},{"0":{"conditional_bit":false,"facing_direction":0}},{"0":{"conditional_bit":false,"facing_direction":1}},{"0":{"conditional_bit":false,"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"conditional_bit":false,"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"conditional_bit":false,"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"conditional_bit":false,"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"conditional_bit":true,"facing_direction":0},"90":{"conditional_bit":false},"180":{"conditional_bit":false},"270":{"conditional_bit":false},"x":{"conditional_bit":false},"z":{"conditional_bit":false},"xz":{"conditional_bit":false}},{"0":{"conditional_bit":true,"facing_direction":1},"90":{"conditional_bit":false},"180":{"conditional_bit":false},"270":{"conditional_bit":false},"x":{"conditional_bit":false},"z":{"conditional_bit":false},"xz":{"conditional_bit":false}},{"0":{"conditional_bit":true,"facing_direction":2},"90":{"conditional_bit":false,"facing_direction":5},"180":{"conditional_bit":false,"facing_direction":3},"270":{"conditional_bit":false,"facing_direction":4},"x":{"conditional_bit":false,"facing_direction":3},"z":{"conditional_bit":false},"xz":{"conditional_bit":false,"facing_direction":3}},{"0":{"conditional_bit":true,"facing_direction":3},"90":{"conditional_bit":false,"facing_direction":4},"180":{"conditional_bit":false,"facing_direction":2},"270":{"conditional_bit":false,"facing_direction":5},"x":{"conditional_bit":false,"facing_direction":2},"z":{"conditional_bit":false},"xz":{"conditional_bit":false,"facing_direction":2}},{"0":{"conditional_bit":true,"facing_direction":4},"90":{"conditional_bit":false,"facing_direction":2},"180":{"conditional_bit":false,"facing_direction":5},"270":{"conditional_bit":false,"facing_direction":3},"x":{"conditional_bit":false},"z":{"conditional_bit":false,"facing_direction":5},"xz":{"conditional_bit":false,"facing_direction":5}},{"0":{"conditional_bit":true,"facing_direction":5},"90":{"conditional_bit":false,"facing_direction":3},"180":{"conditional_bit":false,"facing_direction":4},"270":{"conditional_bit":false,"facing_direction":2},"x":{"conditional_bit":false},"z":{"conditional_bit":false,"facing_direction":4},"xz":{"conditional_bit":false,"facing_direction":4}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":false},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":false},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":false,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":false,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"direction":0,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":1},"180":{"direction":2},"270":{"direction":3},"x":{"direction":2},"xz":{"direction":2}},{"0":{"direction":1,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":2},"180":{"direction":3},"270":{"direction":0},"z":{"direction":3},"xz":{"direction":3}},{"0":{"direction":2,"door_hinge_bit":false,"open_bit":true,"upper_block_bit":true},"90":{"direction":3},"180":{"direction":0},"270":{"direction":1},"x":{"direction":0},"xz":{"direction":0}},{"0":{"direction":3,"door_hinge_bit":true,"open_bit":true,"upper_block_bit":true},"90":{"direction":0},"180":{"direction":1},"270":{"direction":2},"z":{"direction":1},"xz":{"direction":1}},{"0":{"facing_direction":5,"item_frame_map_bit":false},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":4,"item_frame_map_bit":false},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":3,"item_frame_map_bit":false},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":2,"item_frame_map_bit":false},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":5,"item_frame_map_bit":true},"90":{"facing_direction":3,"item_frame_map_bit":false},"180":{"facing_direction":4,"item_frame_map_bit":false},"270":{"facing_direction":2,"item_frame_map_bit":false},"x":{"item_frame_map_bit":false},"z":{"facing_direction":4,"item_frame_map_bit":false},"xz":{"facing_direction":4,"item_frame_map_bit":false}},{"0":{"facing_direction":4,"item_frame_map_bit":true},"90":{"facing_direction":2,"item_frame_map_bit":false},"180":{"facing_direction":5,"item_frame_map_bit":false},"270":{"facing_direction":3,"item_frame_map_bit":false},"x":{"item_frame_map_bit":false},"z":{"facing_direction":5,"item_frame_map_bit":false},"xz":{"facing_direction":5,"item_frame_map_bit":false}},{"0":{"facing_direction":3,"item_frame_map_bit":true},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":2,"item_frame_map_bit":true},"90":{"facing_direction":5,"item_frame_map_bit":false},"180":{"facing_direction":3,"item_frame_map_bit":false},"270":{"facing_direction":4,"item_frame_map_bit":false},"x":{"facing_direction":3,"item_frame_map_bit":false},"z":{"item_frame_map_bit":false},"xz":{"facing_direction":3,"item_frame_map_bit":false}},{"0":{"chisel_type":"default","pillar_axis":"y"}},{"0":{"chisel_type":"chiseled","pillar_axis":"y"}},{"0":{"chisel_type":"lines","pillar_axis":"y"}},{"0":{"chisel_type":"smooth","pillar_axis":"y"}},{"0":{"chisel_type":"default","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"chisel_type":"chiseled","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"chisel_type":"lines","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"chisel_type":"smooth","pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"chisel_type":"default","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"chisel_type":"chiseled","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"chisel_type":"lines","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"chisel_type":"smooth","pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"upside_down_bit":false,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":false,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":false,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":false,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"upside_down_bit":true,"weirdo_direction":0},"90":{"weirdo_direction":2},"180":{"weirdo_direction":1},"270":{"weirdo_direction":3},"z":{"weirdo_direction":1},"xz":{"weirdo_direction":1}},{"0":{"upside_down_bit":true,"weirdo_direction":1},"90":{"weirdo_direction":3},"180":{"weirdo_direction":0},"270":{"weirdo_direction":2},"z":{"weirdo_direction":0},"xz":{"weirdo_direction":0}},{"0":{"upside_down_bit":true,"weirdo_direction":2},"90":{"weirdo_direction":1},"180":{"weirdo_direction":3},"270":{"weirdo_direction":0},"x":{"weirdo_direction":3},"xz":{"weirdo_direction":3}},{"0":{"upside_down_bit":true,"weirdo_direction":3},"90":{"weirdo_direction":0},"180":{"weirdo_direction":2},"270":{"weirdo_direction":1},"x":{"weirdo_direction":2},"xz":{"weirdo_direction":2}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"deprecated":0,"pillar_axis":"y"}},{"0":{"deprecated":1,"pillar_axis":"y"}},{"0":{"deprecated":2,"pillar_axis":"y"}},{"0":{"deprecated":3,"pillar_axis":"y"}},{"0":{"deprecated":0,"pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"deprecated":1,"pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"deprecated":2,"pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"deprecated":3,"pillar_axis":"x"},"90":{"pillar_axis":"z"},"270":{"pillar_axis":"z"}},{"0":{"deprecated":0,"pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"deprecated":1,"pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"deprecated":2,"pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"deprecated":3,"pillar_axis":"z"},"90":{"pillar_axis":"x"},"270":{"pillar_axis":"x"}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}},{"0":{"facing_direction":0}},{"0":{"facing_direction":1}},{"0":{"facing_direction":2},"90":{"facing_direction":5},"180":{"facing_direction":3},"270":{"facing_direction":4},"x":{"facing_direction":3},"xz":{"facing_direction":3}},{"0":{"facing_direction":3},"90":{"facing_direction":4},"180":{"facing_direction":2},"270":{"facing_direction":5},"x":{"facing_direction":2},"xz":{"facing_direction":2}},{"0":{"facing_direction":4},"90":{"facing_direction":2},"180":{"facing_direction":5},"270":{"facing_direction":3},"z":{"facing_direction":5},"xz":{"facing_direction":5}},{"0":{"facing_direction":5,"powered_bit":false},"90":{"facing_direction":3},"180":{"facing_direction":4},"270":{"facing_direction":2},"z":{"facing_direction":4},"xz":{"facing_direction":4}} ] ================================================ FILE: resources/config.yml ================================================ --- # The language that should be used in the plugin # If your language is missing, you can add it on GitHub! # Available languages (ISO639-2): # eng, ara, cat, ces, chi, dan, deu, ell, epo, esp, est, fre, geo, hin, ind, ita, jpn, kor, lit, mar, mas, nld, nor, pol, por, rom, rus, slo, swa, swe, tgl, tha, zho language: eng show-startup-icon: false limit: -1 tool-range: 100 ================================================ FILE: resources/donator.txt ================================================ XenialDan ================================================ FILE: resources/door_data.json ================================================ [ { "0":{ "direction":0, "door_hinge_bit":false, "open_bit":false, "upper_block_bit":false }, "90":{ "direction":1 }, "180":{ "direction":2 }, "270":{ "direction":3 }, "x":{ "direction":2 }, "z":{ }, "xz":{ "direction":2 } }, { "0":{ "direction":1, "door_hinge_bit":true, "open_bit":false, "upper_block_bit":false }, "90":{ "direction":2 }, "180":{ "direction":3 }, "270":{ "direction":0 }, "x":{ }, "z":{ "direction":3 }, "xz":{ "direction":3 } }, { "0":{ "direction":2, "door_hinge_bit":false, "open_bit":false, "upper_block_bit":false }, "90":{ "direction":3 }, "180":{ "direction":0 }, "270":{ "direction":1 }, "x":{ "direction":0 }, "z":{ }, "xz":{ "direction":0 } }, { "0":{ "direction":3, "door_hinge_bit":true, "open_bit":false, "upper_block_bit":false }, "90":{ "direction":0 }, "180":{ "direction":1 }, "270":{ "direction":2 }, "x":{ }, "z":{ "direction":1 }, "xz":{ "direction":1 } }, { "0":{ "direction":0, "door_hinge_bit":false, "open_bit":true, "upper_block_bit":false }, "90":{ "direction":1 }, "180":{ "direction":2 }, "270":{ "direction":3 }, "x":{ "direction":2 }, "z":{ }, "xz":{ "direction":2 } }, { "0":{ "direction":1, "door_hinge_bit":true, "open_bit":true, "upper_block_bit":false }, "90":{ "direction":2 }, "180":{ "direction":3 }, "270":{ "direction":0 }, "x":{ }, "z":{ "direction":3 }, "xz":{ "direction":3 } }, { "0":{ "direction":2, "door_hinge_bit":false, "open_bit":true, "upper_block_bit":false }, "90":{ "direction":3 }, "180":{ "direction":0 }, "270":{ "direction":1 }, "x":{ "direction":0 }, "z":{ }, "xz":{ "direction":0 } }, { "0":{ "direction":3, "door_hinge_bit":true, "open_bit":true, "upper_block_bit":false }, "90":{ "direction":0 }, "180":{ "direction":1 }, "270":{ "direction":2 }, "x":{ }, "z":{ "direction":1 }, "xz":{ "direction":1 } }, { "0":{ "direction":0, "door_hinge_bit":false, "open_bit":false, "upper_block_bit":true }, "90":{ "direction":1 }, "180":{ "direction":2 }, "270":{ "direction":3 }, "x":{ "direction":2 }, "z":{ }, "xz":{ "direction":2 } }, { "0":{ "direction":1, "door_hinge_bit":true, "open_bit":false, "upper_block_bit":true }, "90":{ "direction":2 }, "180":{ "direction":3 }, "270":{ "direction":0 }, "x":{ }, "z":{ "direction":3 }, "xz":{ "direction":3 } }, { "0":{ "direction":2, "door_hinge_bit":false, "open_bit":false, "upper_block_bit":true }, "90":{ "direction":3 }, "180":{ "direction":0 }, "270":{ "direction":1 }, "x":{ "direction":0 }, "z":{ }, "xz":{ "direction":0 } }, { "0":{ "direction":3, "door_hinge_bit":true, "open_bit":false, "upper_block_bit":true }, "90":{ "direction":0 }, "180":{ "direction":1 }, "270":{ "direction":2 }, "x":{ }, "z":{ "direction":1 }, "xz":{ "direction":1 } }, { "0":{ "direction":0, "door_hinge_bit":false, "open_bit":true, "upper_block_bit":true }, "90":{ "direction":1 }, "180":{ "direction":2 }, "270":{ "direction":3 }, "x":{ "direction":2 }, "z":{ }, "xz":{ "direction":2 } }, { "0":{ "direction":1, "door_hinge_bit":true, "open_bit":true, "upper_block_bit":true }, "90":{ "direction":2 }, "180":{ "direction":3 }, "270":{ "direction":0 }, "x":{ }, "z":{ "direction":3 }, "xz":{ "direction":3 } }, { "0":{ "direction":2, "door_hinge_bit":false, "open_bit":true, "upper_block_bit":true }, "90":{ "direction":3 }, "180":{ "direction":0 }, "270":{ "direction":1 }, "x":{ "direction":0 }, "z":{ }, "xz":{ "direction":0 } }, { "0":{ "direction":3, "door_hinge_bit":true, "open_bit":true, "upper_block_bit":true }, "90":{ "direction":0 }, "180":{ "direction":1 }, "270":{ "direction":2 }, "x":{ }, "z":{ "direction":1 }, "xz":{ "direction":1 } }, { "0":{ "direction":0, "door_hinge_bit":false, "open_bit":false, "upper_block_bit":false }, "90":{ "direction":1 }, "180":{ "direction":2 }, "270":{ "direction":3 }, "x":{ "direction":2 }, "z":{ }, "xz":{ "direction":2 } }, { "0":{ "direction":1, "door_hinge_bit":true, "open_bit":false, "upper_block_bit":false }, "90":{ "direction":2 }, "180":{ "direction":3 }, "270":{ "direction":0 }, "x":{ }, "z":{ "direction":3 }, "xz":{ "direction":3 } }, { "0":{ "direction":2, "door_hinge_bit":false, "open_bit":false, "upper_block_bit":false }, "90":{ "direction":3 }, "180":{ "direction":0 }, "270":{ "direction":1 }, "x":{ "direction":0 }, "z":{ }, "xz":{ "direction":0 } }, { "0":{ "direction":3, "door_hinge_bit":true, "open_bit":false, "upper_block_bit":false }, "90":{ "direction":0 }, "180":{ "direction":1 }, "270":{ "direction":2 }, "x":{ }, "z":{ "direction":1 }, "xz":{ "direction":1 } }, { "0":{ "direction":0, "door_hinge_bit":false, "open_bit":true, "upper_block_bit":false }, "90":{ "direction":1 }, "180":{ "direction":2 }, "270":{ "direction":3 }, "x":{ "direction":2 }, "z":{ }, "xz":{ "direction":2 } }, { "0":{ "direction":1, "door_hinge_bit":true, "open_bit":true, "upper_block_bit":false }, "90":{ "direction":2 }, "180":{ "direction":3 }, "270":{ "direction":0 }, "x":{ }, "z":{ "direction":3 }, "xz":{ "direction":3 } }, { "0":{ "direction":2, "door_hinge_bit":false, "open_bit":true, "upper_block_bit":false }, "90":{ "direction":3 }, "180":{ "direction":0 }, "270":{ "direction":1 }, "x":{ "direction":0 }, "z":{ }, "xz":{ "direction":0 } }, { "0":{ "direction":3, "door_hinge_bit":true, "open_bit":true, "upper_block_bit":false }, "90":{ "direction":0 }, "180":{ "direction":1 }, "270":{ "direction":2 }, "x":{ }, "z":{ "direction":1 }, "xz":{ "direction":1 } }, { "0":{ "direction":0, "door_hinge_bit":false, "open_bit":false, "upper_block_bit":true }, "90":{ "direction":1 }, "180":{ "direction":2 }, "270":{ "direction":3 }, "x":{ "direction":2 }, "z":{ }, "xz":{ "direction":2 } }, { "0":{ "direction":1, "door_hinge_bit":true, "open_bit":false, "upper_block_bit":true }, "90":{ "direction":2 }, "180":{ "direction":3 }, "270":{ "direction":0 }, "x":{ }, "z":{ "direction":3 }, "xz":{ "direction":3 } }, { "0":{ "direction":2, "door_hinge_bit":false, "open_bit":false, "upper_block_bit":true }, "90":{ "direction":3 }, "180":{ "direction":0 }, "270":{ "direction":1 }, "x":{ "direction":0 }, "z":{ }, "xz":{ "direction":0 } }, { "0":{ "direction":3, "door_hinge_bit":true, "open_bit":false, "upper_block_bit":true }, "90":{ "direction":0 }, "180":{ "direction":1 }, "270":{ "direction":2 }, "x":{ }, "z":{ "direction":1 }, "xz":{ "direction":1 } }, { "0":{ "direction":0, "door_hinge_bit":false, "open_bit":true, "upper_block_bit":true }, "90":{ "direction":1 }, "180":{ "direction":2 }, "270":{ "direction":3 }, "x":{ "direction":2 }, "z":{ }, "xz":{ "direction":2 } }, { "0":{ "direction":1, "door_hinge_bit":true, "open_bit":true, "upper_block_bit":true }, "90":{ "direction":2 }, "180":{ "direction":3 }, "270":{ "direction":0 }, "x":{ }, "z":{ "direction":3 }, "xz":{ "direction":3 } }, { "0":{ "direction":2, "door_hinge_bit":false, "open_bit":true, "upper_block_bit":true }, "90":{ "direction":3 }, "180":{ "direction":0 }, "270":{ "direction":1 }, "x":{ "direction":0 }, "z":{ }, "xz":{ "direction":0 } }, { "0":{ "direction":3, "door_hinge_bit":true, "open_bit":true, "upper_block_bit":true }, "90":{ "direction":0 }, "180":{ "direction":1 }, "270":{ "direction":2 }, "x":{ }, "z":{ "direction":1 }, "xz":{ "direction":1 } } ] ================================================ FILE: resources/lang/ara.ini ================================================ ; Updated time : 26th 07 2017 language.name = "Arabic" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "حصل خطأ ما" noperm = "لا تملك الصلاحيات الكافية لتفعيل هذا الأمر" runingame = "الرجاء تفعيل هذا الأمر داخل اللعبة !" commands = "الأوامر" ; user interfaces ui.confirmation = "تأكيد" ui.confirmation.yes = "نعم" ui.confirmation.no = "لا" ; ui brush ui.brush.title = "قائمة الفرشاة" ; ui brush select ui.brush.select.title = "اختر نوع الفرشاة" ui.brush.select.type.sphere = "كرة" ui.brush.select.type.cylinder = "اسطوانة" ui.brush.select.type.cuboid = "مكعب" ui.brush.select.type.clipboard = "حافظة" ; ui brush settings ui.brush.settings.title = "{%0} اعدادات الفرشاة" ; ui brush options ui.brush.options.blocks = "كتل" ui.brush.options.blocks.placeholder = "مثال : 1:1,2,tnt,log:12" ui.brush.options.diameter = "القطر" ui.brush.options.width = "العرض" ui.brush.options.height = "الطول" ui.brush.options.depth = "العمق" ui.brush.options.flags = "أضف الأعلام؟" ; ui flags ui.flags.keepexistingblocks = "إبقاء الكتل الموجودة" ui.flags.keepair = "حافظ على الهواء" ui.flags.hollow = "أجوف" ui.flags.natural = "طبيعي" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "قائمة التعبئة" ui.flood.options.limit = "أقصى حد من الكتل" ui.flood.options.blocks = "كتل" ui.flood.options.blocks.placeholder = "كتل مفصولة بفواصل منقوطة" ui.flood.options.label.infoapply = "اضغط على "Submit" للتطبيق" ================================================ FILE: resources/lang/cat.ini ================================================ ; Updated time : 26th 07 2017 language.name = "Valencian" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "Quelcom ha fallat" noperm = "Tu no tens permisos per executar aquesta comanda" runingame = "Si us plau executa aquesta comanda en el joc!" commands = "ordres" ; user interfaces ui.confirmation = "Confirmació" ui.confirmation.yes = "Si" ui.confirmation.no = "No" ; ui brush ui.brush.title = "Menú de pinzells" ; ui brush select ui.brush.select.title = "Selecciona un tipus de pinzell" ui.brush.select.type.sphere = "Esfera" ui.brush.select.type.cylinder = "Cilindre" ui.brush.select.type.cuboid = "Cuboide" ui.brush.select.type.clipboard = "Portapapers" ; ui brush settings ui.brush.settings.title = "{%0} configuració del pinzell" ; ui brush options ui.brush.options.blocks = "Blocs" ui.brush.options.blocks.placeholder = "Exemple: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diàmetre" ui.brush.options.width = "Ample" ui.brush.options.height = "Alt" ui.brush.options.depth = "Profunditat" ui.brush.options.flags = "Afegir banderes?" ; ui flags ui.flags.keepexistingblocks = "Mantenir blocs existents" ui.flags.keepair = "Mantenir l'aire" ui.flags.hollow = "Buit" ui.flags.natural = "Natural" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "Menú d'inundacions" ui.flood.options.limit = "Blocs màxims" ui.flood.options.blocks = "Blocs" ui.flood.options.blocks.placeholder = "Els blocs han d'estar separats per punt i coma" ui.flood.options.label.infoapply = "Prem el botó enviar per aplicar els canvis" ================================================ FILE: resources/lang/ces.ini ================================================ ; Updated time : 15th 10 2020 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Czech" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "příkazy" enabled = "zapnuto" disabled = "vypnuto" confirmation = "Potvrzení" confirmation.yes = "Ano" confirmation.no = "Ne" ; errors error = "Něco se pokazilo" error.command-error = "Chybí požadovaný argument nebo byl příkaz použit špatně!" error.runingame = "Prosím, spusťte tento příkaz ve hře!" error.limitexceeded = "Snažíte se editovat příliš mnoho bloků naráz. Zmenšete výběr nebo zvyšte limit" error.notarget = "Nebyl nalezen cílový blok. Můžete zvýšit dosah pomocí //setrange" error.noselection = "Nebyl nalezen žádný výběr - nejprve vyberte oblast" error.selectioninvalid = "Výběr není platný! Zkontrolujte, jestli jsou nastaveny všechny pozice!" error.nosession = "Nebylo vytvořeno žádné sezení - nejspíše chybí oprávnění {%0}" error.noclipboard = "Žádná kopírovací schránka nebyla nalezena - nejprve ji vytvořte" warning.differentworld = "[VAROVÁNÍ] Editujete svět ve kterém momentálně nejste!" ; commands command.info.title = "Informace" command.limit.current = "Aktuální limit: {%0}" command.limit.set = "Limit množství bloků byl nastaven na {%0}" command.setrange.current = "Aktuální dosah: {%0}" command.setrange.set = "Dosah nástroje byl nastaven na {%0}" command.biomeinfo.attarget = "Biom v cíli" command.biomeinfo.atposition = "Biom na pozici" command.biomeinfo.result = "{%0} biomů nalezeno ve výběru" command.biomeinfo.result.line = "ID: {%0} Jméno: {%1}" command.biomelist.title = "Seznam biomů" command.biomelist.result.line = "ID: {%0} Jméno: {%1}" command.brushname.set = "Název štětce nastaven na \"{%0}\"" command.clearclipboard.cleared = "Schránky vyprázdněny" command.flip.try = "Zkouším zrcadlit schránku o {%0}" command.flip.success = "Úspěšně se povedlo zrcadlit schránku" command.rotate.try = "Zkouším otočit schránku o {%0} stupňů" command.rotate.success = "Úspěšně se povedlo otočit schránku" command.history.cleared = "Historie vyprázdněna" command.listchunks.found = "{%0} kusů nalezeno ve výběru" command.size = "Velikost výběru" ; selection selection.pos1.set = "Pozice 1 nastavena na X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Pozice 2 nastavena na X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Nelze nic vrátit" session.undo.left = "Máte {%0} akcí k vrácení zpět" session.redo.none = "Nelze nic zopakovat" session.redo.left = "Máte {%0} akcí k zopakování" session.brush.added = "Přidáno {%0} do sezení" session.brush.deleted = "Smazáno {%0} (UUID {%1})" session.brush.removed = "Odstraněno {%0} (UUID {%1})" session.language.set = "Úspěšně nastaven jazyk na {%0}" session.language.notfound = "Jazyk {%0} nebyl nalezen, nastavuji výchozí" ; task task.copy.success = "Asynchronní kopie úspěšná, trvala {%0}, zkopírováno {%1} bloků z {%2}." task.count.success = "Asynchronní analýza úspěšná, trvala {%0}" task.count.result = "{%0} bloků nalezeno z celkového množství {%1} bloků" task.fill.success = "Asynchronní Výplň úspěšná, trvala {%0}, {%1} bloků z {%2} změněno." task.replace.success = "Async Nahrazení úspěšné, trvalo {%0}, {%1} bloků z {%2} změněno." task.revert.undo.success = "Asynchronní Zpět úspěšné, trvalo {%0}, {%1} bloků z {%2} změněno." task.revert.redo.success = "Asynchronní Znovu úspěšné, trvalo {%0}, {%1} bloků z {%2} změněno." ; flags flags.keepexistingblocks = "Ponechat existující bloky" flags.keepair = "Ponechat vzduch" flags.hollow = "Duté" flags.hollowclosed = "Duté s uzavřenými konci" flags.natural = "Přírodní" ; tools ; wand tool tool.wand = "Hůlka" tool.wand.lore.1 = "Klikněte levým na blok k nastavení pozice 1 výběru" tool.wand.lore.2 = "Klikněte pravým na blok k nastavení pozice 2 výběru" tool.wand.lore.3 = "Použijte //togglewand k vypnutí/zapnutí Hůlky" tool.wand.disabled = "Hůlka je nyní vypnutá. Použijte //togglewand k opětovnému zapnutí" tool.wand.setenabled = "Hůlka je nyní {%0}!" ; debug tool tool.debug = "Debugovací Nástroj" tool.debug.lore.1 = "Klikněte levým na blok pro získání informace" tool.debug.lore.2 = "jako je jméno a hodnoty poškození bloku" tool.debug.lore.3 = "Použijte //toggledebug k vypnutí/zapnutí debugovacího nástroje" tool.debug.disabled = "Debugovací nástroj je nyní vypnut. Použijte //toggledebug k opětovnému zapnutí" tool.debug.setenabled = "Debugovací nástroj je nyní {%0}!" ; flood tool ui.flood.title = "Zanořené menu" ui.flood.options.limit = "Maximální bloky" ui.flood.options.blocks = "Bloky" ui.flood.options.blocks.placeholder = "Bloky oddělené středníky" ui.flood.options.label.infoapply = "Klepnutím na tlačítko odeslat uložíte změny" ; brush tool ui.brush.title = "Menu štětce" ui.brush.content = "Hlavní menu štětců" ui.brush.create = "Vytvořit nový" ui.brush.getsession = "Získat štetec ze sezení" ui.brush.edithand = "Editovat aktuální štětec" ; brush settings ui.brush.settings.title = "{%0} nastavení štětce" ; brush options ui.brush.options.blocks = "Bloky" ui.brush.options.blocks.placeholder = "Například: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Průměr" ui.brush.options.width = "Šířka" ui.brush.options.height = "Výška" ui.brush.options.depth = "Hloubka" ui.brush.options.flags = "Přidat flagy?" ; language ui.language.title = "Vyberte jazyk" ui.language.label = "Nastavte jazyk sezení. Pokud Váš jazyk zatím není podporován, můžete plugin přeložit na GitHubu!" ui.language.dropdown = "Vyberte jazyk" ================================================ FILE: resources/lang/chi.ini ================================================ ; Updated time : 26th 07 2017 language.name = "Traditional Chinese" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "某些地方出錯了" noperm = "您並沒有執行這條指令的權限" runingame = "請在遊戲中執行這條指令!" commands = "指令" ; user interfaces ui.confirmation = "確認" ui.confirmation.yes = "是" ui.confirmation.no = "否" ; ui brush ui.brush.title = "筆刷選單" ; ui brush select ui.brush.select.title = "選取一支筆刷" ui.brush.select.type.sphere = "球體" ui.brush.select.type.cylinder = "圓柱" ui.brush.select.type.cuboid = "立方體" ui.brush.select.type.clipboard = "剪貼簿" ; ui brush settings ui.brush.settings.title = "{%0} 筆刷設置" ; ui brush options ui.brush.options.blocks = "塊" ui.brush.options.blocks.placeholder = "範例: 1:1,2,tnt,log:12" ui.brush.options.diameter = "直徑" ui.brush.options.width = "寬度" ui.brush.options.height = "高度" ui.brush.options.depth = "深度" ui.brush.options.flags = "是否加上標誌 (flags)?" ; ui flags ui.flags.keepexistingblocks = "保留現有區塊" ui.flags.keepair = "保留空氣" ui.flags.hollow = "中空" ui.flags.natural = "自然" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "填充選單" ui.flood.options.limit = "最大塊" ui.flood.options.blocks = "塊" ui.flood.options.blocks.placeholder = "用分號分隔的塊" ui.flood.options.label.infoapply = "請點擊"送出"按鈕來套用" ================================================ FILE: resources/lang/dan.ini ================================================ ; Updated time : 15th 10 2019 language.name = "Danish" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "kommandoer" enabled = "aktiveret" disabled = "deaktiveret" confirmation = "Bekræftelse" confirmation.yes = "Ja" confirmation.no = "Nej" ; errors error = "En fejl opstod" error.command-error = "Det ser ud til, at du mangler et argument eller bruger kommandoen forkert!" error.runingame = "Kør venligst denne kommando i spillet!" error.limitexceeded = "Du prøver at redigere for mange blokke på en gang. Reducer din markering eller hæv grænsen" error.notarget = "Ingen mål blok fundet. Forøg din værktøjsrækkevidde med //setrange hvis nødvendigt" error.noselection = "Ingen markering fundet - vælg et område først" error.selectioninvalid = "Markeringen er ikke gyldig! Tjek at alle positioner er sat!" error.nosession = "Ingen session er oprettet - du har sandsynligvis ikke rettigheder til at bruge {%0}" error.noclipboard = "Intet clipboard fundet - opret et clipboard først" warning.differentworld = "[ADVARSEL] Du redigere i en verden, som du ikke er i på nuværende tidspunkt!" ; commands command.info.title = "Information" command.limit.current = "Nuværende grænse: {%0}" command.limit.set = "Grænse for blokændring er blevet sat til {%0}" command.setrange.current = "Nuværende rækkevidde: {%0}" command.setrange.set = "Værktøjsrækkevidde er blevet sat til {%0}" command.biomeinfo.attarget = "Biom ved målet" command.biomeinfo.atposition = "Biom ved positionen" command.biomeinfo.result = "{%0} biomer er blevet fundet i markeringen" command.biomeinfo.result.line = "ID: {%0} Navn: {%1}" command.biomelist.title = "Biomliste" command.biomelist.result.line = "ID: {%0} Navn: {%1}" command.brushname.set = "Penselnavn er blevet sat til \"{%0}\"" command.clearclipboard.cleared = "Clipboardet er blevet ryddet" command.flip.try = "Prøver at vende clipboardet med {%0}" command.flip.success = "Clipboardet er blevet vendt med succes" command.rotate.try = "Prøver at rotere clipboardet med {%0} grader" command.rotate.success = "Clipboardet er blevet roteret med succes" command.history.cleared = "Historikken er blevet ryddet" command.listchunks.found = "{%0} chunks er blevet fundet i markeringen" command.size = "Markeringsstørrelse" ; selection selection.pos1.set = "Position 1 er blevet sat til X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Position 2 er blevet sat til X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Intet at fortryde" session.undo.left = "Du har {%0} fortrydningshandlinger tilbage" session.redo.none = "Intet at gøre igen" session.redo.left = "Du har {%0} omgørningshandlinger tilbage" session.brush.added = "Tilføjede {%0} til sessionen" session.brush.deleted = "Slettede {%0} (UUID {%1})" session.brush.removed = "Fjernede {%0} (UUID {%1})" session.language.set = "Sproget er blevet sat til {%0} med succes" session.language.notfound = "Sproget {%0} er ikke fundet, nulstiller til standard" ; task task.copy.success = "Asynkron Kopi lykkedes, tog {%0}, kopierede {%1} blokke ud af {%2}." task.count.success = "Asynkron analyse lykkedes, tog {%0}" task.count.result = "{%0} blokke fundet i alt ud af {%1} blokke" task.fill.success = "Asynkron Fyldning lykkedes, tog {%0}, {%1} blokke ud af {%2} ændret." task.replace.success = "Asynkron Ombytning lykkedes, tog {%0}, {%1} blokke ud af {%2} ændret." task.revert.undo.success = "Asynkron Fortrydning lykkedes, tog {%0}, {%1} blokke ud af {%2} ændret." task.revert.redo.success = "Async Omgørning lykkedes, tog {%0}, {%1} blokke ud af {%2} ændret." ; flags flags.keepexistingblocks = "Behold eksisterende blokke" flags.keepair = "Behold luft" flags.hollow = "Fordybning" flags.hollowclosed = "Fordybning med lukkede ender" flags.natural = "Naturlig" ; tools ; wand tool tool.wand = "Stav" tool.wand.lore.1 = "Venstre-klik på en blok for at sætte position 1 af en markeringen" tool.wand.lore.2 = "Venstre-klik på en blok for at sætte position 2 af en markeringen" tool.wand.lore.3 = "Brug //togglewand til at skifte dets funktionalitet" tool.wand.disabled = "Staven er deaktiveret. Brug //togglewand til at genaktivere den" tool.wand.setenabled = "Stavet er nu {%0}!" ; debug tool tool.debug = "Fejlfindingsværktøj" tool.debug.lore.1 = "Venstre-klik på en blok for at få information" tool.debug.lore.2 = "såsom navnet og skadeværdier, der hører til en blok" tool.debug.lore.3 = "Brug //toggledebug til at skifte dets funktionalitet" tool.debug.disabled = "Fejlfindingsværktøjet er deaktiveret. Brug //toggledebug til at genaktivere det" tool.debug.setenabled = "Fejlfindingsværktøjet er nu {%0}!" ; flood tool ui.flood.title = "Oversvømmelsesmenu" ui.flood.options.limit = "Maksimum antal blokke" ui.flood.options.blocks = "Blokke" ui.flood.options.blocks.placeholder = "Blokke er adskilt med semikolon" ui.flood.options.label.infoapply = "Klik på "Indsend"-knappen for at ansøge" ; brush tool ui.brush.title = "Pensel-menu" ui.brush.content = "Pensel-hovedmenu" ui.brush.create = "Opret ny" ui.brush.getsession = "Få sessionspensel" ui.brush.edithand = "Rediger penselen i hånden" ; brush settings ui.brush.settings.title = "{%0} penselindstillinger" ; brush options ui.brush.options.blocks = "Blokke" ui.brush.options.blocks.placeholder = "Eksempel: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diameter" ui.brush.options.width = "Bredde" ui.brush.options.height = "Højde" ui.brush.options.depth = "Dybde" ui.brush.options.flags = "Tilføj flags?" ; language ui.language.title = "Vælg sprog" ui.language.label = "Sæt sproget for denne session. Hvis dit sprog ikke er tilgængeligt, kan du oversætte dette plugin på GitHub!" ui.language.dropdown = "Vælg et sprog" ================================================ FILE: resources/lang/deu.ini ================================================ ; Updated time : 25th 10 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "German" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "Befehle" enabled = "aktiviert" disabled = "deaktiviert" confirmation = "Bestätigung" confirmation.yes = "Ja" confirmation.no = "Nein" ; errors error = "Ein Fehler ist aufgetreten!" error.command-error = "Es scheint, dass ein Argument fehlt oder der Befehl falsch genutzt wurde!" error.runingame = "Bitte führe diesen Befehl im Spiel aus!" error.limitexceeded = "Du versuchst zu viele Blöcke auf einmal zu bearbeiten. Verkleinere die Auswahl oder erhöhe das Limit" error.notarget = "Kein Ziel-Block gefunden. Erhöhe die Reichweite von Werkzeugen mit //setrange falls nötig" error.noselection = "Keine Auswahl gefunden - wähle zuerst einen Bereich aus" error.selectioninvalid = "Die Auswahl ist ungültig! Überprüfe, ob alle Positionen gesetzt sind!" error.nosession = "Es wurde keine Sitzung erstellt - wahrscheinlich keine Berechtigung zur Verwendung von {%0}" error.noclipboard = "Keine Zwischenablage gefunden - erstelle erst eine Zwischenablage" warning.differentworld = "[WARNUNG] Du bearbeitest eine Welt, in der du dich gerade nicht befindest!" ; commands command.info.title = "Information" command.limit.current = "Derzeitiges Limit: {%0}" command.limit.set = "Blockänderungslimit wurde auf {%0} gesetzt." command.setrange.current = "Aktuelle Reichweite: {%0}" command.setrange.set = "Werkzeugreichweite wurde auf {%0} gesetzt." command.biomeinfo.attarget = "Biom am Ziel-Block" command.biomeinfo.atposition = "Biom an der Ziel-Position" command.biomeinfo.result = "{%0} in der Auswahl gefundene Biome" command.biomeinfo.result.line = "ID: {%0} Name: {%1}" command.biomelist.title = "Biom-Liste" command.biomelist.result.line = "ID: {%0} Name: {%1}" command.brushname.set = "Pinselname auf \"{%0}\" gesetzt" command.clearclipboard.cleared = "Zwischenablagen gelöscht" command.flip.try = "Es wird versucht, die Zwischenablage um {%0} zu spiegeln." command.flip.success = "Zwischenablage erfolgreich gespiegelt" command.rotate.try = "Es wird versucht, die Zwischenablage um {%0} Grad zu drehen." command.rotate.success = "Zwischenablage erfolgreich gedreht" command.history.cleared = "Verlauf gelöscht" command.listchunks.found = "In der Auswahl wurden {%0} Chunks gefunden." command.size = "Größe der Auswahl" ; selection selection.pos1.set = "Position 1 auf X: {%0} Y: {%1} Z: {%2} gesetzt" selection.pos2.set = "Position 2 auf X: {%0} Y: {%1} Z: {%2} gesetzt" ; session session.undo.none = "Nichts rückgängig zu machen" session.undo.left = "Du kannst noch {%0} Aktionen rückgängig machen." session.redo.none = "Nichts zu wiederholen" session.redo.left = "Du kannst noch {%0} Aktionen wiederherstellen." session.brush.added = "{%0} zur Sitzung hinzugefügt" session.brush.deleted = "{%0} (UUID {%1} gelöscht)" session.brush.removed = "{%0} (UUID {%1} entfernt)" session.language.set = "Sprache erfolgreich auf {%0} gesetzt" session.language.notfound = "Sprache {%0} nicht gefunden, auf Standard zurückgesetzt" ; task task.copy.success = "Asynchrones Kopieren erfolgreich, brauchte {%0}, {%1} von {%2} Blöcken kopiert." task.count.success = "Asynchrone Analyse erfolgreich, brauchte {%0}." task.count.result = "{%0} Blöcke in insgesamt {%1} Blöcken gefunden" task.fill.success = "Asynchrones Füllen erfolgreich, brauchte {%0}, {%1} von {%2} Blöcken geändert." task.replace.success = "Asynchrones Ersetzen erfolgreich, brauchte {%0}, {%1} von {%2} Blöcken geändert." task.revert.undo.success = "Asynchrone Rückgängigmachung erfolgreich, brauchte {%0}, {%1} von {%2} Blöcken geändert." task.revert.redo.success = "Asynchrone Wiederherstellung erfolgreich, brauchte {%0}, {%1} von {%2} Blöcken geändert." ; flags flags.keepexistingblocks = "Bestehende Blöcke beibehalten" flags.keepair = "Luft beibehalten" flags.hollow = "Hohlraum" flags.hollowclosed = "Hohlraum mit geschlossenen Enden" flags.natural = "Natürlich" ; tools ; wand tool tool.wand = "Auswahlwerkzeug" tool.wand.lore.1 = "Klicke mit der linken Maustaste auf einen Block, um die 1. Position einer Auswahl festzulegen" tool.wand.lore.2 = "Klicke mit der rechten Maustaste auf einen Block, um die 2. Position einer Auswahl festzulegen" tool.wand.lore.3 = "Mit //togglewand können sie die Funktionalität umschalten" tool.wand.disabled = "Das Auswahlwerkzeug ist deaktiviert. Verwenden sie //togglewand, um es wieder zu aktivieren" tool.wand.setenabled = "Das Auswahlwerkzeug ist jetzt {%0}!" ; debug tool tool.debug = "Debug-Werkzeug" tool.debug.lore.1 = "Klicke mit der linken Maustaste auf einen Block, um Informationen zu erhalten" tool.debug.lore.2 = "wie z.B. den Namen und die Meta-Daten eines Blocks" tool.debug.lore.3 = "Mit //toggledebug kannst du die Funktionalität umschalten" tool.debug.disabled = "Das Debug-Werkzeug ist deaktiviert. Verwenden Sie //toggledebug, um es wieder zu aktivieren" tool.debug.setenabled = "Das Debug-Werkzeug ist jetzt {%0}!" ; flood tool ui.flood.title = "Füllwerkzeug-Menü" ui.flood.options.limit = "Maximale Blöcke" ui.flood.options.blocks = "Blöcke" ui.flood.options.blocks.placeholder = "Blöcke, getrennt durch Semikolons" ui.flood.options.label.infoapply = "Drücke den "Submit"-Knopf, um die Änderung anzuwenden!" ; brush tool ui.brush.title = "Pinsel-Menü" ui.brush.content = "Pinsel-Hauptmenü" ui.brush.create = "Neuer Pinsel" ui.brush.getsession = "Sitzungs-Pinsel erhalten" ui.brush.edithand = "Pinsel in der Hand bearbeiten" ; brush settings ui.brush.settings.title = "{%0} Pinsel-Einstellungen" ; brush options ui.brush.options.blocks = "Blöcke" ui.brush.options.blocks.placeholder = "Beispiel: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Durchmesser" ui.brush.options.width = "Breite" ui.brush.options.height = "Höhe" ui.brush.options.depth = "Tiefe" ui.brush.options.flags = "Optionen hinzufügen?" ; language ui.language.title = "Sprache auswählen" ui.language.label = "Stelle die Sprache deiner Sitzung ein. Wenn deine Sprache nicht verfügbar ist, kannst du das Plugin auf GitHub übersetzen!" ui.language.dropdown = "Wähle eine Sprache" ================================================ FILE: resources/lang/ell.ini ================================================ ; Updated time : 8th 10 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Greek" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "εντολές" enabled = "ενεργοποιημένο" disabled = "απενεργοποιημένο" confirmation = "Επιβεβαίωση" confirmation.yes = "Ναι" confirmation.no = "Όχι" ; errors error = "Προέκυψε σφάλμα" error.command-error = "Φαίνεται σαν να λείπει κάποιο όρισμα ή χρησιμοποιήσατε λανθασμένα την εντολή!" error.runingame = "Παρακαλώ τρέξτε αυτή την εντολή μέσα στο παιχνίδι!" error.limitexceeded = "Προσπαθείτε να επεξεργαστείτε πολλά τουβλάκια συγχρόνως. Μειώστε το μέγεθος της επιλογής σας ή αυξήστε το όριο" error.notarget = "Δεν βρέθηκε το τουβλάκι. Αυξήστε την εμβέλεια του εργαλείου με το //setrange αν χρειάζεται" error.noselection = "Δεν βρέθηκε η επιλογή - επιλέξτε μια περιοχή πρώτα" error.selectioninvalid = "Η επιλογή αυτή δεν είναι έγκυρη! Ελέγξτε αν όλες οι τοποθεσίες έχουν οριστεί!" error.nosession = "Δεν δημιουργήθηκε συνεδρία - μάλλον δεν υπάρχει δικαίωμα χρήσης {%0}" error.noclipboard = "Δεν βρέθηκε πρόχειρο - δημιουργήστε ένα πρόχειρο πρώτα" warning.differentworld = "[ΠΡΟΕΙΔΟΠΟΙΗΣΗ] Επεξεργάζεστε σε ένα επίπεδο στο οποίο δεν βρίσκεστε μέσα επί του παρόντος!" ; commands command.info.title = "Πληροφορίες" command.limit.current = "Τωρινό όριο: {%0}" command.limit.set = "Το όριο αλλαγής για τα τουβλάκια αλλάχθηκε σε {%0}" command.setrange.current = "Τωρινή εμβέλεια: {%0}" command.setrange.set = "Η εμβέλεια εργαλείου αλλάχθηκε σε {%0}" command.biomeinfo.attarget = "Biome at target" command.biomeinfo.atposition = "Βιότοπος στη τοποθεσία" command.biomeinfo.result = "{%0} βιότοποι βρέθηκαν στη τοποθεσία" command.biomeinfo.result.line = "ID: {%0} Όνομα: {%1}" command.biomelist.title = "Κατάλογος βιότοπων" command.biomelist.result.line = "ID: {%0} Όνομα: {%1}" command.brushname.set = "Όνομα βούρτσας αλλάχθηκε σε \"{%0}\"" command.clearclipboard.cleared = "Έγινε εκκαθάριση προχείρων" command.flip.try = "Προσπάθεια γύρισματος προχείρων κατά {%0}" command.flip.success = "Επιτυχές γύρισμα προχείρων" command.rotate.try = "Προσπάθεια γυρίσματος προχείρων κατά {%0} μοίρες" command.rotate.success = "Επιτυχής στροφή προχείρων" command.history.cleared = "Εκκαθαρίστηκε το ιστορικό" command.listchunks.found = "{%0} κομμάτια βρέθηκαν στην επιλογή" command.size = "Μέγεθος επιλογής" ; selection selection.pos1.set = "Θέση 1 τέθηκε σε X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Θέση 2 τέθηκε σε X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Τίποτα προς αναίρεση" session.undo.left = "Έχετε {%0} ενέργειες αναίρεσης διαθέσιμες" session.redo.none = "Τίποτα διαθέσιμο προς επαναφορά" session.redo.left = "Σας απέμειναν {%0} ενέργειες επαναφοράς" session.brush.added = "Προστέθηκε {%0} στη συνεδρία" session.brush.deleted = "Διαγράφθηκε {%0} (UUID {%1})" session.brush.removed = "Αφαιρέθηκε {%0} (UUID {%1})" session.language.set = "Επιτυχώς επιλέχθηκε η γλώσσα {%0}" session.language.notfound = "Η γλώσσα {%0} δεν βρέθηκε, επαναφορά στη προεπιλογή" ; task task.copy.success = "Επιτυχής ασύγχρονη αντιγραφή, πήρε {%0}, αντιγράφθηκαν {%1} τουβλάκια από τα {%2}." task.count.success = "Ασύγχρονη ανάλυση επιτυχής, διήρκησε {%0}" task.count.result = "{%0} τουβλάκια βρέθηκαν συνολικά από τα {%1} τουβλάκια" task.fill.success = "Ασύγχρονο Γέμισμα επιτυχές, διήρκησε {%0}, {%1} τουβλάκια από τα {%2} άλλαξαν." task.replace.success = "Ασύγχρονη Αντικατάσταση επιτυχής, διήρκησε {%0}, {%1} τουβλάκια από τα {%2} άλλαξαν." task.revert.undo.success = "Αρύγχρονη Αναίρεση επιτυχής, διήρκησε {%0}, {%1} τουβλάκια από τα {%2} άλλαξαν." task.revert.redo.success = "Αρύγχρονη Επαναφορά επιτυχής, διήρκησε {%0}, {%1} τουβλάκια από τα {%2} άλλαξαν." ; flags flags.keepexistingblocks = "Κράτα υφιστάμενα τουβλάκια" flags.keepair = "Κράτα αέρα" flags.hollow = "Κούφιο" flags.hollowclosed = "Κούφιο με κλειστά άκρα" flags.natural = "Φυσική" ; tools ; wand tool tool.wand = "Ραβδί" tool.wand.lore.1 = "Κάντε αριστερό κλικ σε ένα τουβλάκι για να θέσετε τη τοποθεσία 1 από μια επιλογή" tool.wand.lore.2 = "Κάντε δεξί κλικ σε ένα τουβλάκι για να θέσετε τη τοποθεσία 2 από μια επιλογή" tool.wand.lore.3 = "Χρησιμοποιείστε το //togglewand για να αλλάξετε τη λειτουργία του" tool.wand.disabled = "Το εργαλείο ραβδί είναι απενεργοποιημένο. Χρησιμοποιείστε το //togglewand " tool.wand.setenabled = "Το εργαλείο ραβδί είναι τώρα {%0}!" ; debug tool tool.debug = "Εργαλείο αποσφαλμάτωσης" tool.debug.lore.1 = "Κάντε αριστερό κλικ στο τουβλάκι για να πάρετε πληροφορίες" tool.debug.lore.2 = "σαν το όνομα και το ποσό ζημιάς ενός τουβλάκι" tool.debug.lore.3 = "Χρησιμοποιείστε το //toggledebug να αλλάξετε τη λειτουργία του" tool.debug.disabled = "Το εργαλείο αποσφαλμάτωσης είναι απενεργοποιημένο. Χρησιμοποιείστε το //toggledebug για να το επανενεργοποιήσετε" tool.debug.setenabled = "Το εργαλείο αποσφαλμάτωσης είναι τώρα {%0}!" ; flood tool ui.flood.title = "Μενού πλημμύρας" ui.flood.options.limit = "Μέγιστα τουβλάκια" ui.flood.options.blocks = "Τουβλάκια" ui.flood.options.blocks.placeholder = "Τουβλάκια διαχωρισμένα από ερωτηματικά" ui.flood.options.label.infoapply = "Πατήστε το κουμπί "Υποβολή" για εφαρμογή" ; brush tool ui.brush.title = "Μενού βουρτσών" ui.brush.content = "Κεντρικό μενού βουρτσών" ui.brush.create = "Δημιουργία νέας" ui.brush.getsession = "Πάρτε τη βούρτσα συνεδρίας" ui.brush.edithand = "Επεξεργασία βούρτσας στο χέρι" ; brush settings ui.brush.settings.title = "{%0} ρυθμίσεις βούρτσας" ; brush options ui.brush.options.blocks = "Τουβλάκια" ui.brush.options.blocks.placeholder = "Παράδειγμα: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Διάμετρος" ui.brush.options.width = "Πλάτος" ui.brush.options.height = "Ύψος" ui.brush.options.depth = "Βάθος" ui.brush.options.flags = "Προσθήκη σημαιών;" ; language ui.language.title = "Επιλογή γλώσσας" ui.language.label = "Θέστε τη γλώσσα της συνεδρίας σας. Αν η γλώσσα σας δεν είναι διαθέσιμη, you may translate the plugin on GitHub!" ui.language.dropdown = "Επιλέξτε γλώσσα" ================================================ FILE: resources/lang/eng.ini ================================================ ; Updated time : 26th 09 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "English" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "commands" enabled = "enabled" disabled = "disabled" confirmation = "Confirmation" confirmation.yes = "Yes" confirmation.no = "No" ; errors error = "An error occurred" error.command-error = "Looks like you are missing an argument or used the command wrong!" error.runingame = "Please run this command in-game!" error.limitexceeded = "You are trying to edit too many blocks at once. Reduce the selection or raise the limit" error.notarget = "No target block found. Increase tool range with //setrange if needed" error.noselection = "No selection found - select an area first" error.selectioninvalid = "The selection is not valid! Check if all positions are set!" error.nosession = "No session was created - probably no permission to use {%0}" error.noclipboard = "No clipboard found - create a clipboard first" warning.differentworld = "[WARNING] You are editing in a world which you are currently not in!" ; commands command.info.title = "Information" command.limit.current = "Current limit: {%0}" command.limit.set = "Block change limit was set to {%0}" command.setrange.current = "Current range: {%0}" command.setrange.set = "Tool range was set to {%0}" command.biomeinfo.attarget = "Biome at target" command.biomeinfo.atposition = "Biome at position" command.biomeinfo.result = "{%0} biomes found in selection" command.biomeinfo.result.line = "ID: {%0} Name: {%1}" command.biomelist.title = "Biome list" command.biomelist.result.line = "ID: {%0} Name: {%1}" command.brushname.set = "Brush name set to \"{%0}\"" command.clearclipboard.cleared = "Clipboards cleared" command.flip.try = "Trying to flip clipboard by {%0}" command.flip.success = "Successfully flipped clipboard" command.rotate.try = "Trying to rotate clipboard by {%0} degrees" command.rotate.success = "Successfully rotated clipboard" command.history.cleared = "History cleared" command.listchunks.found = "{%0} chunks found in selection" command.size = "Selection size" ; selection selection.pos1.set = "Position 1 set to X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Position 2 set to X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Nothing to undo" session.undo.left = "You have {%0} undo actions left" session.redo.none = "Nothing to redo" session.redo.left = "You have {%0} redo actions left" session.brush.added = "Added {%0} to session" session.brush.deleted = "Deleted {%0} (UUID {%1})" session.brush.removed = "Removed {%0} (UUID {%1})" session.language.set = "Successfully set language to {%0}" session.language.notfound = "Language {%0} not found, resetting to default" ; task task.copy.success = "Async Copy succeed, took {%0}, copied {%1} blocks out of {%2}." task.count.success = "Async analysing succeed, took {%0}" task.count.result = "{%0} blocks found in a total of {%1} blocks" task.fill.success = "Async Fill succeed, took {%0}, {%1} blocks out of {%2} changed." task.replace.success = "Async Replace succeed, took {%0}, {%1} blocks out of {%2} changed." task.revert.undo.success = "Async Undo succeed, took {%0}, {%1} blocks out of {%2} changed." task.revert.redo.success = "Async Redo succeed, took {%0}, {%1} blocks out of {%2} changed." ; flags flags.keepexistingblocks = "Keep existing blocks" flags.keepair = "Keep air" flags.hollow = "Hollow" flags.hollowclosed = "Hollow with closed ends" flags.natural = "Natural" ; tools ; wand tool tool.wand = "Wand" tool.wand.lore.1 = "Left click a block to set the position 1 of a selection" tool.wand.lore.2 = "Right click a block to set the position 2 of a selection" tool.wand.lore.3 = "Use //togglewand to toggle it's functionality" tool.wand.disabled = "The wand tool is disabled. Use //togglewand to re-enable it" tool.wand.setenabled = "The wand tool is now {%0}!" ; debug tool tool.debug = "Debug Tool" tool.debug.lore.1 = "Left click a block to get information" tool.debug.lore.2 = "like the name and damage values of a block" tool.debug.lore.3 = "Use //toggledebug to toggle it's functionality" tool.debug.disabled = "The debug tool is disabled. Use //toggledebug to re-enable it" tool.debug.setenabled = "The debug tool is now {%0}!" ; WAILA tool (What am i looking at) tool.waila = "Waila" tool.waila.setenabled = "The Waila utility is now {%0}!" ; Sidebar tool.sidebar = "Sidebar" tool.sidebar.setenabled = "The sidebar is now {%0}!" ; flood tool ui.flood.title = "Flood menu" ui.flood.options.limit = "Maximum blocks" ui.flood.options.blocks = "Blocks" ui.flood.options.blocks.placeholder = "Blocks separated by semicolons" ui.flood.options.label.infoapply = "Click the "Submit" button to apply" ; brush tool ui.brush.title = "Brush menu" ui.brush.content = "Brush main menu" ui.brush.create = "Create new" ui.brush.getsession = "Get session brush" ui.brush.edithand = "Edit brush in hand" ; brush settings ui.brush.settings.title = "{%0} brush settings" ; brush options ui.brush.options.blocks = "Blocks" ui.brush.options.blocks.placeholder = "Example: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diameter" ui.brush.options.width = "Width" ui.brush.options.height = "Height" ui.brush.options.depth = "Depth" ui.brush.options.flags = "Add flags?" ; language ui.language.title = "Select language" ui.language.label = "Set the language of your session. If your language is not available, you may translate the plugin on GitHub!" ui.language.dropdown = "Select a language" ================================================ FILE: resources/lang/epo.ini ================================================ ; Updated time : 9th 10 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Esperanto" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "ordonoj" enabled = "aktivigita" disabled = "malaktivigita" confirmation = "Konfirmacio" confirmation.yes = "Jes" confirmation.no = "Ne" ; errors error = "Eraro okazis" error.command-error = "Ŝajnas ke vi mankas argumenton aŭ misuzis la ordonon!" error.runingame = "Bonvolu uzu ĉi-tiun ordonon enlude!" error.limitexceeded = "Vi provas redakti tro da blokoj samtempe. Malkreskigu la areo aŭ kreskigu la limon!" error.notarget = "Neniu altrafita bloko trovita. Kreskigu iloatingo per //setrange" error.noselection = "Neniu elektaro trovita - elektu areon unue" error.selectioninvalid = "La elektaro ne validas! Kontrolu ke ĉiuj pozicioj ekzistas!" error.nosession = "Ne kreis sesion - verŝajne malpermesita uzi {%0}" error.noclipboard = "Ne ekzistas tondejo - kreu tondejon unue" warning.differentworld = "[AVERTO] Vi redaktas mondon kiu vi ne enestas!" ; commands command.info.title = "Informo" command.limit.current = "Nuntempa limo: {%0}" command.limit.set = "Blokŝanĝlimo fariĝis {%0}" command.setrange.current = "Nuntempa atingopovo: {%0}" command.setrange.set = "Iloatingo fariĝis {%0}" command.biomeinfo.attarget = "Biomedio ĉe celo" command.biomeinfo.atposition = "Biomedio ĉe pozicio" command.biomeinfo.result = "{%0} bimedioj trovitaj en elektaro" command.biomeinfo.result.line = "ID: {%0} Nomo: {%1}" command.biomelist.title = "Biomedio listo" command.biomelist.result.line = "ID: {%0} Nomo: {%1}" command.brushname.set = "Brosonomo fariĝis \"{%0}\"" command.clearclipboard.cleared = "Tondejoj forigitaj" command.flip.try = "Provante renversi tondejo per {%0}" command.flip.success = "Tondejo renversita" command.rotate.try = "Provante turnigi tondejon per {%0} da gradoj" command.rotate.success = "Tondejo turnigita" command.history.cleared = "Historio forigita" command.listchunks.found = "{%0} blokegoj found in selection" command.size = "Elektaro grandeco" ; selection selection.pos1.set = "Pozicio 1 fariĝis X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Pozicio 2 fariĝis X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Neniu por malfari" session.undo.left = "Restas{%0} da malfaroagoj" session.redo.none = "Neniu por refari" session.redo.left = "Restas {%0} da refaroagoj" session.brush.added = "Aldonis {%0} al sesio" session.brush.deleted = "Foriĝis {%0} (UUID {%1})" session.brush.removed = "Formovis {%0} (UUID {%1})" session.language.set = "Agordis lingvon al {%0}" session.language.notfound = "Lingvo {%0} ne trovita, uzante defaŭlton" ; task task.copy.success = "Sukcesis neinsinkrona kopio, daŭris {%0}, kopiis {%1} da blokoj el{%2}." task.count.success = "Sukcesis neinsinkrona analizo, daŭris {%0}" task.count.result = "{%0} da blokoj trovitaj el totalo de {%1} blocks" task.replace.success = "Sukcesis neinsinkrona interŝanĝo, daŭris {%0}, ŝanĝis {%1} da blokoj el{%2}." task.revert.undo.success = "Sukcesis neinsinkrona malfarado, daŭris {%0}, ŝanĝis {%1} da blokoj el{%2}." task.revert.redo.success = "Sukcesis neinsinkrona refarado, daŭris {%0}, ŝanĝis {%1} da blokoj el{%2}." ; flags flags.keepexistingblocks = "Konservu jamaj blokoj" flags.keepair = "Konservu aero" flags.hollow = "Kava" flags.hollowclosed = "Kava kun ŝtopitaj ekstremaĵoj" flags.natural = "Natura" ; tools ; wand tool tool.wand = "Sorĉbastono" tool.wand.lore.1 = "Alklaku maldekstren por agordi la pozicio 1 de elektaro" tool.wand.lore.2 = "Alklaku dekstren por agordi la pozicio 2 de elektaro" tool.wand.lore.3 = "Baskulu ĝin per //togglewand" tool.wand.disabled = "La sorĉbastono estas malaktivigita. Baskulu ĝin per //togglewand" tool.wand.setenabled = "La sorĉbastono nun estas {%0}!" ; debug tool tool.debug = "Erarserĉilo" tool.debug.lore.1 = "Alklaku maldesktre por ricevi informon" tool.debug.lore.2 = "kiel la nomo kaj damaĝovaloro de bloko" tool.debug.lore.3 = "Uzu //toggledebug por baskuli la funkciado" tool.debug.disabled = "La erarserĉilo estas malativigita. Reaktivigu ĝin per //toggledebug" tool.debug.setenabled = "La erarserĉilo nun estas {%0}!" ; flood tool ui.flood.title = "Plenigomenuo" ui.flood.options.limit = "Blokolimo" ui.flood.options.blocks = "Blokoj" ui.flood.options.blocks.placeholder = "Blokoj apartigita per punktokomo" ui.flood.options.label.infoapply = "Alklaku la "Submit" butono por apliku" ; brush tool ui.brush.title = "Brosomenuo" ui.brush.content = "Broso ĉefmenuo" ui.brush.create = "Kreu nova" ui.brush.getsession = "Akiru sesiobroso" ui.brush.edithand = "Redaktu broso enmane" ; brush settings ui.brush.settings.title = "{%0} brosagordoj" ; brush options ui.brush.options.blocks = "Blokoj" ui.brush.options.blocks.placeholder = "Exemple: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diametro" ui.brush.options.width = "Larĝeco" ui.brush.options.height = "Alteco" ui.brush.options.depth = "Profundeco" ui.brush.options.flags = "Ĉu aldoni opciojn?" ; language ui.language.title = "Elektu lingvon" ui.language.label = "Elektu la lingvon por via sesio. Se ne havebla, vi povas traduki la programo ĉe GitHub!" ui.language.dropdown = "Elektu lingvon" ================================================ FILE: resources/lang/esp.ini ================================================ ; Updated time : 26th 09 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Español" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "Comandos" enabled = "habilitado" disabled = "deshabilitado" confirmation = "Confirmación" confirmation.yes = "Si" confirmation.no = "No" ; errors error = "A ocurrido un error" error.command-error = "Parece que te falta un argumento o has usado el comando incorrectamente!" error.runingame = "Por favor ejecuta este comando en el juego!" error.limitexceeded = "Estás intentando editar demasiados bloques a la vez. Reduzca la selección o aumente el límite" error.notarget = "No se ha encontrado el bloque objetivo. Aumente el rango de herramientas con //setrange si es necesario" error.noselection = "No se ha encontrado ninguna selección - seleccione primero un área" error.selectioninvalid = "¡La selección no es válida!. Compruebe si todas las posiciones están establecidas" error.nosession = "No se creó ninguna sesión, probablemente sin permiso para usar {%0}" error.noclipboard = "No se encontró el portapapeles - cree primero un portapapeles" warning.differentworld = "[ADVERTENCIA] Estás editando en un nivel en el que no estás actualmente!" ; commands command.info.title = "Información" command.limit.current = "Límite actual: {%0}" command.limit.set = "El límite de cambio de bloque se estableció en {%0}" command.setrange.current = "Rango actual: {%0}" command.setrange.set = "El rango de herramientas se estableció en {%0}" command.biomeinfo.attarget = "Bioma en el objetivo" command.biomeinfo.atposition = "Bioma en posición" command.biomeinfo.result = "{%0} biomas encontrados en la selección" command.biomeinfo.result.line = "ID: {%0} Nombre: {%1}" command.biomelist.title = "Lista de biomas" command.biomelist.result.line = "ID: {%0} Nombre: {%1}" command.brushname.set = "Nombre del pincel establecido en \"{%0}\"" command.clearclipboard.cleared = "Portapapeles borrados" command.flip.try = "Intentando voltear el portapapeles por {%0}" command.flip.success = "Portapapeles invertido con éxito" command.rotate.try = "Intentando rotar el portapapeles en {%0} grados" command.rotate.success = "Portapapeles rotado con éxito" command.history.cleared = "Historial borrado" command.listchunks.found = "{%0} fragmentos encontrados en la selección" command.size = "Tamaño de selección" ; selection selection.pos1.set = "Posición 1 establecida en X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Posición 2 establecida en X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Nada que deshacer" session.undo.left = "Te quedan {%0} acciones para deshacer" session.redo.none = "Nada que rehacer" session.redo.left = "Te quedan {%0} acciones de rehacer" session.brush.added = "Agregado {%0} a la sesión" session.brush.deleted = "Eliminado {%0} (UUID {%1})" session.brush.removed = "Eliminado {%0} (UUID {%1})" session.language.set = "Establecer correctamente el idioma en {%0}" session.language.notfound = "Idioma {%0} no encontrado, restableciendo a los valores predeterminados" ; task task.copy.success = "La copia asíncrona se realizó correctamente, tomó {%0}, copió {%1} bloques de {%2}". task.count.success = "El análisis asincrónico tuvo éxito, tomó {%0}" task.count.result = "{%0} bloques encontrados en un total de {%1} bloques" task.fill.success = "El llenado asíncrono tuvo éxito, tomó {%0}, {%1} bloques de {%2} cambiado". task.replace.success = "Reemplazo asíncrono exitoso, tomó {%0}, {%1} bloques de {%2} cambiado". task.revert.undo.success = "Deshacer asíncrono exitoso, tomó {%0}, {%1} bloques de {%2} cambiado". task.revert.redo.success = "Rehacer asíncrono tuvo éxito, tomó {%0}, {%1} bloques de {%2} cambiado". ; flags flags.keepexistingblocks = "Mantener bloques existentes" flags.keepair = "Mantener el aire" flags.hollow = "Hueco" flags.hollowclosed = "Hueco con extremos cerrados" flags.natural = "Natural" ; tools ; wand tool tool.wand = "Varita mágica" tool.wand.lore.1 = "Haga clic izquierdo en un bloque para establecer la posición 1 de una selección" tool.wand.lore.2 = "Haga clic derecho en un bloque para establecer la posición 2 de una selección" tool.wand.lore.3 = "Use //togglewand para alternar su funcionalidad" tool.wand.disabled = "La herramienta de varita está deshabilitada. Use //togglewand para volver a habilitarla" tool.wand.setenabled = "¡La herramienta de varita ahora es {% 0}!" ; debug tool tool.debug = "Herramienta de depuración" tool.debug.lore.1 = "Haga clic izquierdo en un bloque para obtener información" tool.debug.lore.2 = "nombre y valores de daño de un bloque" tool.debug.lore.3 = "Use //toggledebug para alternar su funcionalidad" tool.debug.disabled = "La herramienta de depuración está deshabilitada. Use //toggledebug para volver a habilitarla" tool.debug.setenabled = "¡La herramienta de depuración ahora es {%0}!" ; flood tool ui.flood.title = "Menú de inundación" ui.flood.options.limit = "Bloques máximos" ui.flood.options.blocks = "Bloques" ui.flood.options.blocks.placeholder = "Bloques separados por punto y coma" ui.flood.options.label.infoapply = "Haga clic en el botón "Enviar" para aplicar" ; brush tool ui.brush.title = "Menú de pincel" ui.brush.content = "Menú principal de pincel" ui.brush.create = "Crear nuevo" ui.brush.getsession = "Obtener pincel de sesión" ui.brush.edithand = "Editar pincel en mano" ; brush settings ui.brush.settings.title = "{%0} ajustes de pincel" ; brush options ui.brush.options.blocks = "Bloques" ui.brush.options.blocks.placeholder = "Ejemplo: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diámetro" ui.brush.options.width = "Anchura" ui.brush.options.height = "Altura" ui.brush.options.depth = "Profundidad" ui.brush.options.flags = "Agregar banderas?" ; language ui.language.title = "Seleccione el idioma" ui.language.label = "Establece el idioma de tu sesión. Si su idioma no está disponible, puede traducir el complemento en GitHub!" ui.language.dropdown = "Seleccione el idioma" ================================================ FILE: resources/lang/est.ini ================================================ ; Updated time : 26th 09 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Estonian" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "käsud" enabled = "lubatud" disabled = "puudega" confirmation = "Kinnitamine" confirmation.yes = "Jah" confirmation.no = "Ei" ; errors error = "Ilmnes viga" error.command-error = "Paistab, et teil pole argumenti ega käsku valesti kasutanud!" error.runingame = "Käitage seda käsku mängus!" error.limitexceeded = "Üritate redigeerida liiga palju plokke korraga. Vähendage valikut või tõstke limiiti" error.notarget = "Sihtplokki ei leitud. Kui vaja, suurendage tööriistavahemikku // setrange abil" error.noselection = "Valikut ei leitud - valige kõigepealt piirkond" error.selectioninvalid = "Valik ei kehti! Kontrollige, kas kõik positsioonid on seatud!" error.nosession = "Ühtegi seanssi ei loodud - tõenäoliselt pole selle kasutamiseks luba {%0}" error.noclipboard = "Lõikelauda ei leitud - kõigepealt looge lõikelauale" warning.differentworld = "[HOIATUS] Redigeerite tasemel, milles te praegu ei viibi!" ; commands command.info.title = "Teave" command.limit.current = "Praegune piir: {%0}" command.limit.set = "Ploki muutmise limiidiks seati {%0}" command.setrange.current = "Praegune vahemik: {%0}" command.setrange.set = "Tööriistade vahemik seati väärtusele {%0}" command.biomeinfo.attarget = "Biome sihtmärgis" command.biomeinfo.atposition = "Biome positsioonil" command.biomeinfo.result = "{%0} biomid, mis on leitud valikul" command.biomeinfo.result.line = "ID: {%0} Nimi: {%1}" command.biomelist.title = "Biome loend" command.biomelist.result.line = "ID: {%0} Nimi: {%1}" command.brushname.set = "Pintsli nimi on seatud \"{%0}\"" command.clearclipboard.cleared = "Lõikelauad on puhastatud" command.flip.try = "Trying to flip clipboard by {%0}" command.flip.success = "Successfully flipped clipboard" command.rotate.try = "Proovin lõikelauda pöörata {%0} kraadi" command.rotate.success = "Lõikelaua edukas pööramine" command.history.cleared = "Ajalugu on kustutatud" command.listchunks.found = "Valikus leiti {%0} tükki" command.size = "Valiku suurus" ; selection selection.pos1.set = "Asend 1 seatud X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Asend 2 seatud X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Pole midagi tühistada" session.undo.left = "Teil on {%0} toiminguid tühistatud" session.redo.none = "Pole midagi tee kordada" session.redo.left = "Teil on{%0} korratud toimingut on jäänud" session.brush.added = "Lisas sessioonidele {%0} eset" session.brush.deleted = "Kustutatud {%0} (UUID {%1})" session.brush.removed = "Eemaldatud {%0} (UUID {%1})" session.language.set = "Keele valimine õnnestus {%0}" session.language.notfound = "Keelt {%0} ei leitud, lähtestatakse vaikeseadele" ; task task.copy.success = "Asynci kopeerimine õnnestus, kulus {%0}, kopeeriti {%1} plokid väljast {%2}." task.count.success = "Asynci analüüsimine õnnestus, võttis {%0}" task.count.result = "{%0} plokke leiti kokku {%1} plokkidest" task.fill.success = "Asynci täitmine õnnestus, võttis {%0}, {%1} plokid saidist {%2} muudeti." task.replace.success = "Asynci asendamine õnnestus, võttis {%0}, {%1} plokid saidist {%2} muudeti." task.revert.undo.success = "Asynci tagasivõtmine õnnestus, võttis {%0}, {%1} plokid saidist {%2} muudeti." task.revert.redo.success = "Async Redo õnnestus, võttis {%0}, {%1} plokid saidist {%2} muudeti." ; flags flags.keepexistingblocks = "Hoidke olemasolevad plokid alles" flags.keepair = "Hoidke õhku" flags.hollow = "Õõnes" flags.hollowclosed = "Õõnes suletud otstega" flags.natural = "Looduslik" ; tools ; wand tool tool.wand = "Võlukepp" tool.wand.lore.1 = "Vasakklõps plokil võimaldab seada valiku 1. positsiooni" tool.wand.lore.2 = "Vasakklõps plokil võimaldab seada valiku 2. positsiooni" tool.wand.lore.3 = "Kasutage //togglewand selle funktsionaalsuse muutmiseks" tool.wand.disabled = "Võlukepp on keelatud. Selle uuesti lubamiseks kasutage //togglewand" tool.wand.setenabled = "Võlukepi tööriist on nüüd {%0}!" ; debug tool tool.debug = "Silumisriist" tool.debug.lore.1 = "Teabe saamiseks klõpsake vasakklõpsake plokki" tool.debug.lore.2 = "nagu ploki nimi ja kahjustusväärtused" tool.debug.lore.3 = "Kasutage //toggledebug selle funktsionaalsuse muutmiseks" tool.debug.disabled = "Silumisriist on keelatud. Selle uuesti lubamiseks kasutage //toggledebug" tool.debug.setenabled = "Silumisriist on nüüd {%0}!" ; flood tool ui.flood.title = "Üleujutuse menüü" ui.flood.options.limit = "Maksimaalne plokkide arv" ui.flood.options.blocks = "Plokid" ui.flood.options.blocks.placeholder = "Semikoolonitega eraldatud plokid" ui.flood.options.label.infoapply = "Muudatuste rakendamiseks klõpsake nuppu Edasta" ; brush tool ui.brush.title = "Pintslimenüü" ui.brush.content = "Pintsli peamenüü" ui.brush.create = "Loo uus" ui.brush.getsession = "Hankige sessioonipintsel" ui.brush.edithand = "Redigeeri pintslit käes" ; brush settings ui.brush.settings.title = "{%0} harjaseaded" ; brush options ui.brush.options.blocks = "Plokid" ui.brush.options.blocks.placeholder = "Näide: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Läbimõõt" ui.brush.options.width = "Laius" ui.brush.options.height = "Kõrgus" ui.brush.options.depth = "Sügavus" ui.brush.options.flags = "Kas lisada lippe?" ; language ui.language.title = "Vali keel" ui.language.label = "Seansi keele määramine. Kui teie keel pole saadaval, võite tõlkida pistikprogrammi GitHubis!" ui.language.dropdown = "Vali keel" ================================================ FILE: resources/lang/fre.ini ================================================ ; Updated time : 6th 10 2019 language.name = "French" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "Quelque chose s'est mal passé" commands = "Commandes" enabled = "activé" disabled = "désactivé" ; errors error.command-error = "Il semble qu'il manque un argument ou que vous ayez mal utilisé la commande !" error.runingame = "Veuillez éxécuter cette commande en jeu !" error.limitexceeded = "Vous êtes en train d'essayer de modifier trop de blocs d'un coup, réduisez la sélection ou augmentez la limite" error.notarget = "Bloc de cible pas trouvé. Augmentez la portée de l'outil avec //setrange si besoin" error.noselection = "Aucune sélection trouvée - sélectionnez une zone d'abord" error.selectioninvalid = "Sélection non valide ! Vérifiez que toutes les positions sont définies" error.nosession = "Aucune session n'a été créée - vous n'avez probablement pas le droit d'utiliser {%0}" error.noclipboard = "Aucun presse-papier trouvé - créez d'abord un presse-papier" warning.differentworld = "[ATTENTION] Vous êtes en train de modifier un niveau dans lequel vous n'êtes pas" ; commands command.info.title = "Information" command.limit.current = "Limite actuelle: {%0}" command.limit.set = "Limite de changement de block mis à {%0}" command.setrange.current = "Portée actuelle: {%0}" command.setrange.set = "Portée de l'outil mis à {%0}" command.biomeinfo.attarget = "Biome ciblé" command.biomeinfo.atposition = "Biome à la position position" command.biomeinfo.result = "{%0} biomes trouvés dans la sélection" command.biomeinfo.result.line = "ID: {%0} Nom: {%1}" command.biomelist.title = "Liste de biomes" command.biomelist.result.line = "ID: {%0} Nom: {%1}" command.brushname.set = "Nom de pinceau mis à \"{%0}\"" command.clearclipboard.cleared = "Presse-papiers effacés" command.flip.try = "Tentative de retourner presse-papier de {%0}" command.flip.success = "Presse-papier retourné avec succès" command.rotate.try = "Tentative de rotation du presse-papier de {%0} degrés" command.rotate.success = "Rotation du presse-papier avec succès" command.history.cleared = "Historique effacé" command.listchunks.found = "{%0} chunks trouvés dans la sélection" command.size = "Taille de sélection" ; selection selection.pos1.set = "Position 1 mis à X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Position 2 mis à X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Rien à annuler" session.undo.left = "Il vous reste {%0} actions à annuler" session.redo.none = "Rien à refaire" session.redo.left = "Il vous reste {%0} actions à refaire" session.brush.added = "{%0} ajouté à la session" session.brush.deleted = "Effacé {%0} (UUID {%1})" session.brush.removed = "Enlevé {%0} (UUID {%1})" session.language.set = "Langue mise avec succès à {%0}" session.language.notfound = "Langue {%0} pas trouvée, remise par défaut" ; task task.copy.success = "Copie asynchrone réussie, pris {%0}, copié {%1} blocs sur {%2}." task.count.success = "Analyse asynchrone réussie, pris {%0}" task.count.result = "{%0} blocs trouvés sur un total de {%1} blocs" task.fill.success = "Remplissage asynchrone réussi, pris {%0}, {%1} blocs sur {%2} changés." task.replace.success = "Remplacement asynchrone réussi, pris {%0}, {%1} blocs sur {%2} changés." task.revert.undo.success = "Annulation asynchrone réussie, pris {%0}, {%1} blocs sur {%2} changés." task.revert.redo.success = "Restauration asynchrone réussi, pris {%0}, {%1} blocs sur {%2} changés." ; user interfaces confirmation = "Confirmation" confirmation.yes = "Oui" confirmation.no = "Non" ; wand tool tool.wand = "Baguette" tool.wand.lore.1 = "Clic gauche sur un bloc pour définir position 1 d'une sélection" tool.wand.lore.2 = "Clic droit sur un bloc pour définir position 2 d'une sélection" tool.wand.lore.3 = "Utilisez //togglewand pour basculer sa fonctionnalité" tool.wand.disabled = "L'outil de baguette est desactivé. Utilisez //togglewand pour le réactiver" tool.wand.setenabled = "L'outil de baguette est maintenant {%0}!" ; debug tool tool.debug = "Outil de debug" tool.debug.lore.1 = "Clic droit sur un bloc pour obtenir de l'information" tool.debug.lore.2 = "comme le nom et les valeurs de dégâts d'un bloc" tool.debug.lore.3 = "Utilisez //toggledebug pour basculer sa fonctionnalité" tool.debug.disabled = "L'outil de debug est désactivé. Utilisez //toggledebug Pour le réactiver" tool.debug.setenabled = "L'outil de débug est maintenant {%0}!" ; ui brush ui.brush.title = "Menu Pinceau" ; ui brush settings ui.brush.settings.title = "{%0} paramètres de pinceau" ; ui brush options ui.brush.options.blocks = "Blocs" ui.brush.options.blocks.placeholder = "Exemple: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diamètre" ui.brush.options.width = "Largeur" ui.brush.options.height = "Elevé" ui.brush.options.depth = "Profondeur" ui.brush.options.flags = "Ajouter des drapeaux?" ui.brush.content = "Menu principal du pinceau" ui.brush.create = "Créer nouveau" ui.brush.edithand = "Modifier pinceau en main" ui.brush.getsession = "Recevoir pinceau de session" ; ui flags flags.keepexistingblocks = "Conserver les blocs existants" flags.keepair = "Gardez l'air" flags.hollow = "Creux" flags.hollowclosed = "Creux avec bouts fermés" flags.natural = "Naturel" ; ui flood ui.flood.title = "Menu Flood" ui.flood.options.limit = "Maximum de blocs" ui.flood.options.blocks = "Blocs" ui.flood.options.blocks.placeholder = "Les blocs doivent être séparés par des points-virgules" ui.flood.options.label.infoapply = "Cliquez sur le bouton Envoyer pour appliquer les modifications" ; language ui.language.title = "Sélectionner langage" ui.language.label = "Définir le langage pour la session. Si votre langage n'est pas disponible, vous pouvez traduire ce plugin sur GitHub!" ui.language.dropdown = "Sélectionnez une langue" ================================================ FILE: resources/lang/geo.ini ================================================ ; Updated time : 30th 10 2020 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Georgian" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "ბრძანებები" enabled = "ჩართული" disabled = "გამორთული" confirmation = "დადასტურება" confirmation.yes = "კი" confirmation.no = "არა" ; errors error = "დაფიქსირდა შეცდომა" error.command-error = "როგორც ჩანს აკლია არგუმენტი ან ბრძანება არასწორად იქნა გამოყენებული!" error.runingame = "გთხოვთ გაუშვით ეს ბრძანება თამაშში!" error.limitexceeded = "თქვენ ცდილობთ ერთდროულად ძალიან ბევრი ბლოკის რედაქტირებას. შეამცირეთ მონიშნული ან გაზარდეთ ლიმიტი" error.notarget = "სამიზნე ბლოკი ვერ იქნა ნაპოვნი. საჭიროების შემთხვევაში გაზარდეთ ინსტრუმენტის დიაპაზონი //setrange პარამეტრით" error.noselection = "მონიშნული ტერიტორია ვერ მოიძებნა - პირველ რიგში მონიშნეთ ტერიტორია" error.selectioninvalid = "მონიშნული ტერიტორია არაა ვალიდური! შეამოწმეთ არის თუ არა ყველა პოზიცია მითითებული!" error.nosession = "სესია არაა შექმნილი - სავარაუდოდ არაა გამოყენების ნება დართული {%0}" error.noclipboard = "ბუფერი ვერ მოიძებნა - პირველ რიგში შექმენით ბუფერი" warning.differentworld = "[გაფრთხილება] თქვენ არედაქტირებთ იმ დონეს, რომელშიც ამჟამად არ ხართ!" ; commands command.info.title = "ინფორმაცია" command.limit.current = "მიმდინარე ლიმიტი: {%0}" command.limit.set = "ბლოკის ცვლილების ლიმიტი მითითებულია როგორც {%0}" command.setrange.current = "მიმდინარე დიაპაზონი: {%0}" command.setrange.set = "ინსტრუმენტის დიაპაზონი მითითებულია როგორც {%0}" command.biomeinfo.attarget = "გარემო სამიზნე ადგილზე" command.biomeinfo.atposition = "გარემო პოზიციაზე" command.biomeinfo.result = "{%0} გარემო იქნა ნაპოვნი მონიშნულში" command.biomeinfo.result.line = "იდენტიფიკატორი: {%0} დასახელება: {%1}" command.biomelist.title = "გარემოთა სია" command.biomelist.result.line = "იდენტიფიკატორი: {%0} დასახელება: {%1}" command.brushname.set = "ფუნჯის სახელი მითითებულია როგორც \"{%0}\"" command.clearclipboard.cleared = "ბუფერი გასუფთავებულია" command.flip.try = "სცადეთ ამოაბრუნოთ ბუფერი {%0}" command.flip.success = "წარმატებით ამობრუნდა ბუფერში" command.rotate.try = "სცადეთ გადაატრიალოთ ბუფერი {%0} გრადუსით" command.rotate.success = "წარმატებით გადატრიალდა ბუფერში" command.history.cleared = "ისტორია გასუფთავებულია" command.listchunks.found = "{%0} ნაწილი მოიძებნა მონიშნულში" command.size = "არჩეულის ზომა" ; selection selection.pos1.set = "პოზიცია 1 მითითებულია X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "პოზიცია 2 მითითებულია X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "არაფერია გასაუქმებელი" session.undo.left = "თქვენ გაქვთ {%0} გაუქმების ქმედება დარჩენილი" session.redo.none = "არაფერია დასაბრუნებელი" session.redo.left = "თქვენ გაქვთ {%0} დაბრუნების ქმედება დარჩენილი" session.brush.added = "{%0} დაემატა სესიაში" session.brush.deleted = "წაიშალა {%0} (UUID {%1})" session.brush.removed = "ამოღებულია {%0} (UUID {%1})" session.language.set = "წარმატებით შეიცვალა ენა {%0}-ზე" session.language.notfound = "{%0} ენა ვერ მოიძებნა, იტვირთება სტანდარტული" ; task task.copy.success = "ასინქრონული კოპირება წარმატებით შესრულდა, დასჭირდა {%0}, დაკოპირდა {%1} ბლოკი {%2} ბლოკიდან." task.count.success = "ასინქრონული ანალიზი წარმატებით შესრულდა, დასჭირდა {%0}" task.count.result = "{%0} ბლოკი იქნა ნაპოვნი ჯამური {%1} ბლოკიდან" task.fill.success = "ასინქრონული შევსება წარმატებით შესრულდა, დასჭირდა {%0}, შეიცვალა {%1} ბლოკი {%2} ბლოკიდან." task.replace.success = "ასინქრონული ჩანაცვლება წარმატებით შესრულდა, დასჭირდა {%0}, შეიცვალა {%1} ბლოკი {%2} ბლოკიდან." task.revert.undo.success = "ასინქრონული გაუქმება წარმატებით შესრულდა, დასჭირდა {%0}, შეიცვალა {%1} ბლოკი {%2} ბლოკიდან." task.revert.redo.success = "ასინქრონული დაბრუნება წარმატებით შესრულდა, დასჭირდა {%0}, შეიცვალა {%1} ბლოკი {%2} ბლოკიდან." ; flags flags.keepexistingblocks = "არსებული ბლოკების შენარჩუნება" flags.keepair = "ჰაერის შენარჩუნება" flags.hollow = "ცარიელი" flags.hollowclosed = "ცარიელი დახურული ბოლოებით" flags.natural = "ბუნებრივი" ; tools ; wand tool tool.wand = "კვერთხი" tool.wand.lore.1 = "მარცხენა ღილაკით დააჭირეთ ბლოკს რათა მიუთითოთ პოზიცია 1 მონიშნულზე" tool.wand.lore.2 = "მარჯვენა ღილაკით დააჭირეთ ბლოკს რათა მიუთითოთ პოზიცია 2 მონიშნულზე" tool.wand.lore.3 = "გამოიყენეთ //togglewand მისი ფუნქციონირების გადასართავად" tool.wand.disabled = "კვერთხის ინსტრუმენტი გამორთულია. გამოიყენეთ //togglewand ხელახლა ჩასართავად" tool.wand.setenabled = "კვერთხის ინსტრუმენტი ახლა არის {%0}!" ; debug tool tool.debug = "დებაგირების ინსტრუმენტი" tool.debug.lore.1 = "მარცხენა ღილაკით დააჭირეთ ბლოკს ინფორმაციის მისაღებად" tool.debug.lore.2 = "მაგალითად, ბლოკის სახელი და ზიანის მნიშვნელობები" tool.debug.lore.3 = "გამოიყენეთ //toggledebug მისი ფუნქციონირების გადასართავად" tool.debug.disabled = "დებაგირების ინსტრუმენტი გამორთულია. გამოიყენეთ //toggledebug ხელახლა ჩასართავად" tool.debug.setenabled = "დებაგირების ინსტრუმენტი ახლა არის {%0}!" ; WAILA tool (What am i looking at) tool.waila = "Waila" tool.waila.setenabled = "Waila საშუალება ახლა არის {%0}!" ; flood tool ui.flood.title = "წყალდიდობის მენიუ" ui.flood.options.limit = "მაქსიმალური ბლოკები" ui.flood.options.blocks = "ბლოკები" ui.flood.options.blocks.placeholder = "ბლოკები გამოყოფილია წერტილმძიმით" ui.flood.options.label.infoapply = "გასაწევრიანებლად დააჭირეთ "დადასტურების" ღილაკს" ; brush tool ui.brush.title = "ფუნჯის მენიუ" ui.brush.content = "ფუნჯის მთავარი მენიუ" ui.brush.create = "ახლის შექმნა" ui.brush.getsession = "მიიღეთ სესიის ფუნჯი" ui.brush.edithand = "შეცვალეთ ფუნჯი" ; brush settings ui.brush.settings.title = "{%0} ფუნჯის პარამეტრები" ; brush options ui.brush.options.blocks = "ბლოკები" ui.brush.options.blocks.placeholder = "მაგ: 1:1,2,tnt,log:12" ui.brush.options.diameter = "დიამეტრი" ui.brush.options.width = "სიგანე" ui.brush.options.height = "სიმაღლე" ui.brush.options.depth = "სიღრმე" ui.brush.options.flags = "დავამატოთ პარამეტრები?" ; language ui.language.title = "აირჩიეთ ენა" ui.language.label = "აირჩიეთ სესიის ენა. თუ თქვენთვის სასურველი ენა მიუწვდომელია, შეგიძლიათ თარგმნოთ მოდული GitHub-ზე!" ui.language.dropdown = "აირჩიეთ ენა" ================================================ FILE: resources/lang/hin.ini ================================================ ; Updated time : 4th 10 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Hindi" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "आदेश" enabled = "चालू" disabled = "बंद" confirmation = "पुष्टीकरण" confirmation.yes = "हाँ" confirmation.no = "नहीं" ; errors error = "कुछ गलत हो गया" error.command-error = "लगता है अपने कोई आर्गुमेंट लगाना भूल गए या कमांड को ग़लत लगाया" error.runingame = "कृपया इस कमांड को खेल में चलाएं" error.limitexceeded = "आप कई सारे ब्लॉक एक साथ ही सम्पादित करने की कोशिश कर रहे हैं। चुने हुए ब्लॉक की संख्या घटाएं अथवा सीमा बढ़ाएं।" error.notarget = "कोई भी लक्ष्य ब्लॉक मिला नहीं। आवश्यकता होने पर //setrange द्वारा उपकरण का विस्तार बढ़ाएं।" error.noselection = "कोई चयनक्षेत्र मिला नहीं। पहले क्षेत्र चुनें।" error.selectioninvalid = "यह चयनक्षेत्र मान्य नहीं है। सुनिश्चित करें कि सभी स्थिति निर्धारित किये जा चुके हैं।" error.nosession = "कोई सत्र बना नहीं; शायद {%0} के प्रयोग की अनुमति नहीं है।" error.noclipboard = "कोई क्लिपबोर्ड मिला नहीं; पहले एक क्लिपबोर्ड बनाएं।" warning.differentworld = "[चेतावनी] आप ऐसे स्तर का संपादन कर रहे है जहाँ आप अभी हैं नहीं।" ; commands command.info.title = "सूचना" command.limit.current = "मौजूदा विस्तार: {%0}" command.limit.set = "ब्लॉक बदलाव सीमा अब {%0}" command.setrange.current = "मौजूदा विस्तार: {%0}" command.setrange.set = "उपकरण विस्तार अब {%0}" command.biomeinfo.attarget = "बायोम लक्ष्य पर" command.biomeinfo.atposition = "बायोम स्थिति पर" command.biomeinfo.result = "चयन में {%0} बायोम मिले" command.biomeinfo.result.line = "ID: {%0} नाम: {%1}" command.biomelist.title = "बायोम सूचि" command.biomelist.result.line = "ID: {%0} नाम: {%1}" command.brushname.set = "ब्रश का नाम अब \"{%0}\"" command.clearclipboard.cleared = "क्लिपबोर्ड साफ़ हो गए" command.flip.try = "क्लिपबोर्ड को {%0} पलटने की कोशिश" command.flip.success = "क्लिपबोर्ड पलट गया" command.rotate.try = "क्लिपबोर्ड को {%0} डिग्री घुमाने की कोशिश" command.rotate.success = "क्लिपबोर्ड घूम गया" command.history.cleared = "इतिहास साफ़ हो गया" command.listchunks.found = "चयन में {%0} खंड मिले" command.size = "चयन साइज़" ; selection selection.pos1.set = "स्थिति 1 अब X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "स्थिति 2 अब X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "पूर्वस्थिति में लौटाने को कुछ है नहीं" session.undo.left = "आपके पास {%0} पूर्ववत क्रिया बाकी हैं" session.redo.none = "फिर से करने को कुछ है नहीं" session.redo.left = "आपके पास {%0} पुनरावत क्रिया बाकी हैं" session.brush.added = "{%0} को सत्र में जोड़ा" session.brush.deleted = "{%0} (UUID {%1}) मिटा दिया" session.brush.removed = "{%0} (UUID {%1}) हटा दिया" session.language.set = "भाषा अब {%0}" session.language.notfound = "{%0} भाषा मिला नहीं; डिफ़ॉल्ट भाषा लागू" ; task task.copy.success = "एसिन्क्रोनस कॉपी हो गया; {%0} लिए गए, {%2} में से {%1} ब्लॉक कॉपी हुए।" task.count.success = "एसिन्क्रोनस विश्लेषण हो गया; {%0} लिए गए।" task.count.result = "कुल {%1} ब्लॉक में {%0} ब्लॉक पाए गए" task.fill.success = "एसिन्क्रोनस भराव हो गया; {%0} लिए गए, {%2} में से {%1} ब्लॉक बदले।" task.replace.success = "एसिन्क्रोनस बदलाव हो गया; {%0} लिए गए, {%2} में से {%1} ब्लॉक बदले।" task.revert.undo.success = "एसिन्क्रोनस पूर्ववत हो गया; {%0} लिए गए, {%2} में से {%1} ब्लॉक बदले।" task.revert.redo.success = "एसिन्क्रोनस पुनरावत हो गया; {%0} लिए गए, {%2} में से {%1} ब्लॉक बदले।" ; flags flags.keepexistingblocks = "मौजूदा ब्लॉक रखें" flags.keepair = "हवा रखें" flags.hollow = "खोखला" flags.hollowclosed = "दोनों तरफ से बंद खोखला" flags.natural = "प्राकृतिक" ; tools ; wand tool tool.wand = "वाण्ड" tool.wand.lore.1 = "चयन की स्थिति 1 निश्चित करने के लिए ब्लॉक पर बाईं ओर का बटन दबाएं" tool.wand.lore.2 = "चयन की स्थिति 2 निश्चित करने के लिए ब्लॉक पर दाईं ओर का बटन दबाएं" tool.wand.lore.3 = "कार्यात्मकता टॉगल करने को //togglewand का प्रयोग करें" tool.wand.disabled = "वाण्ड उपकरण चालू नहीं है। उसे चालू करने के लिए //togglewand का प्रयोग करें।" tool.wand.setenabled = "वाण्ड उपकरण अब {%0}" ; debug tool tool.debug = "डिबग उपकरण" tool.debug.lore.1 = "जानकारी के लिए ब्लॉक पर बाईं ओर का बटन दबाएं" tool.debug.lore.2 = "ब्लॉक का नाम एवं क्षति मूल्य की तरह" tool.debug.lore.3 = " कार्यात्मकता टॉगल करने को //toggledebug का प्रयोग करें" tool.debug.disabled = "डिबग उपकरण चालू नहीं है। उसे चालू करने के लिए //toggledebug का प्रयोग करें।" tool.debug.setenabled = "डिबग उपकरण अब {%0}" ; flood tool ui.flood.title = "फ्लड मेनू" ui.flood.options.limit = "अधिकतम ब्लॉक" ui.flood.options.blocks = "ब्लॉक" ui.flood.options.blocks.placeholder = "अल्पविराम द्वारा अलग किये गए ब्लॉक" ui.flood.options.label.infoapply = "लागू करने के लिए 'सबमिट' बटन दबाएं" ; brush tool ui.brush.title = "ब्रश मेनू" ui.brush.content = "ब्रश मुख्य मेनू" ui.brush.create = "नया बनाएं" ui.brush.getsession = "सत्र ब्रश लें" ui.brush.edithand = "हाथ का ब्रश सम्पादित करें" ; brush settings ui.brush.settings.title = "{%0} ब्रश सेटिंग्स" ; brush options ui.brush.options.blocks = "ब्लॉक" ui.brush.options.blocks.placeholder = "उदाहरण: 1:1,2,tnt,log:12" ui.brush.options.diameter = "व्यास" ui.brush.options.width = "चौड़ाई" ui.brush.options.height = "ऊंचाई" ui.brush.options.depth = "गहराई" ui.brush.options.flags = "झंडे जोड़ें?" ; language ui.language.title = "भाषा चुनें" ui.language.label = "अपने सत्र के लिए भाषा चुनें। यदि आपकी भाषा उपलब्ध नहीं है, आप इस प्लग-इन का गिटहब पर अनुवाद कर सकते हैं।" ui.language.dropdown = "भाषा चुनें" ================================================ FILE: resources/lang/ind.ini ================================================ ; Updated time : 05th 10 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Indonesian" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "perintah" enabled = "diaktifkan" disabled = "dimatikan" confirmation = "Konfirmasi" confirmation.yes = "Ya" confirmation.no = "Tidak" ; errors error = "Terjadi kesalahan" error.command-error = "Sepertinya Anda melewatkan argumen atau menggunakan perintah yang salah!" error.runingame = "Silakan jalankan perintah ini dalam game!" error.limitexceeded = "Anda mencoba mengedit terlalu banyak blok sekaligus. Kurangi pilihan atau naikkan batas" error.notarget = "Tidak ada blok target yang ditemukan. Tingkatkan rentang alat dengan //atur rentang jika perlu" error.noselection = "Tidak ada pilihan yang ditemukan - pilih area terlebih dahulu" error.selectioninvalid = "Pilihannya tidak valid! Periksa apakah semua posisi sudah ditentukan!" error.nosession = "Tidak ada sesi yang dibuat - mungkin tidak ada izin untuk menggunakan {%0}" error.noclipboard = "Papan klip tidak ditemukan - buat papan klip dulu" warning.differentworld = "[PERINGATAN] Anda mengedit di level yang saat ini tidak Anda masuki!" ; commands command.info.title = "Informasi" command.limit.current = "Batas saat ini: {%0}" command.limit.set = "Batas perubahan blok disetel ke {%0}" command.setrange.current = "Kisaran saat ini: {%0}" command.setrange.set = "Rentang alat diatur ke {%0}" command.biomeinfo.attarget = "Bioma target" command.biomeinfo.atposition = "Bioma di posisi" command.biomeinfo.result = "{%0} bioma ditemukan dalam seleksi" command.biomeinfo.result.line = "ID: {%0} Nama: {%1}" command.biomelist.title = "Daftar Biome" command.biomelist.result.line = "ID: {%0} Nama: {%1}" command.brushname.set = "Nama kuas ditetapkan ke \"{%0}\"" command.clearclipboard.cleared = "Clipboard dihapus" command.flip.try = "Mencoba membalik clipboard dengan {%0}" command.flip.success = "Papan klip terbalik sukses" command.rotate.try = "Mencoba memutar clipboard dengan {%0} derajat" command.rotate.success = "Papan klip berhasil diputar" command.history.cleared = "Riwayat dihapus" command.listchunks.found = "{%0} potongan ditemukan dalam pilihan" command.size = "Ukuran pilihan" ; selection selection.pos1.set = "Posisi 1 diatur ke X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Posisi 2 diatur ke X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Tidak ada yang dibatalkan" session.undo.left = "Anda memiliki {%0} membatalkan tindakan yang tersisa" session.redo.none = "Tidak ada yang harus diulang" session.redo.left = "Anda memiliki {%0} ulangi tindakan yang tersisa" session.brush.added = "Ditambahkan {%0} ke sesi" session.brush.deleted = "Dihapus {%0} (UUID {%1})" session.brush.removed = "Dihapus {%0} (UUID {%1})" session.language.set = "Berhasil mengatur bahasa ke {%0}" session.language.notfound = "Bahasa {%0} tidak ditemukan, mengatur ulang ke default" ; task task.copy.success = "Salin Async berhasil, ambil {%0}, salin {%1} blok dari {%2}." task.count.success = "Analisis async berhasil, ambil {%0}" task.count.result = "{%0} blok ditemukan dalam total {%1} blok" task.fill.success = "Async Fill berhasil, ambil {%0}, {%1} blok dari {%2} diubah." task.replace.success = "Async Replace berhasil, mengambil {%0}, {%1} blok dari {%2} diubah." task.revert.undo.success = "Async Undo berhasil, ambil {%0}, {%1} blok dari {%2} diubah." task.revert.redo.success = "Async Redo berhasil, ambil {%0}, {%1} blok dari {%2} diubah." ; flags flags.keepexistingblocks = "Simpan blok yang ada" flags.keepair = "Jaga udara" flags.hollow = "Hollow" flags.hollowclosed = "Berongga dengan ujung tertutup" flags.natural = "Alami" ; tools ; wand tool tool.wand = "Wand" tool.wand.lore.1 = "Klik kiri sebuah blok untuk mengatur posisi 1 dari suatu pilihan" tool.wand.lore.2 = "Klik kanan sebuah blok untuk mengatur posisi 2 dari suatu pilihan" tool.wand.lore.3 = "Gunakan //togglewand untuk mengganti fungsionalitasnya" tool.wand.disabled = "Alat tongkat dinonaktifkan. Gunakan //togglewand untuk mengaktifkannya kembali" tool.wand.setenabled = "Alat tongkat sekarang {%0}!" ; debug tool tool.debug = "Alat Debug" tool.debug.lore.1 = "Klik kiri satu blok untuk mendapatkan informasi" tool.debug.lore.2 = "seperti nama dan nilai kerusakan suatu blok" tool.debug.lore.3 = "Gunakan //toggledebug untuk mengaktifkan fungsinya" tool.debug.disabled = "Alat debug dinonaktifkan. Gunakan //toggledebug untuk mengaktifkannya kembali" tool.debug.setenabled = "Alat debug sekarang {%0}!" ; flood tool ui.flood.title = "Menu banjir" ui.flood.options.limit = "Blok maksimum" ui.flood.options.blocks = "Blok" ui.flood.options.blocks.placeholder = "Blok dipisahkan oleh titik koma" ui.flood.options.label.infoapply = "Klik tombol" Kirim "untuk mendaftar" ; brush tool ui.brush.title = "Menu kuas" ui.brush.content = "Menu utama sikat" ui.brush.create = "Buat baru" ui.brush.getsession = "Dapatkan sikat sesi" ui.brush.edithand = "Edit kuas di tangan" ; brush settings ui.brush.settings.title = "{%0} pengaturan kuas" ; brush options ui.brush.options.blocks = "Blok" ui.brush.options.blocks.placeholder = "Contoh: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diameter" ui.brush.options.width = "Lebar" ui.brush.options.height = "Tinggi" ui.brush.options.depth = "Kedalaman" ui.brush.options.flags = "Tambah bendera?" ; language ui.language.title = "Pilih bahasa" ui.language.label = "Atur bahasa sesi Anda. Jika bahasa Anda tidak tersedia, Anda dapat menerjemahkan plugin di GitHub!" ui.language.dropdown = "Pilih bahasa" ================================================ FILE: resources/lang/ita.ini ================================================ ; Updated time : 22th 10 2020 language.name = "Italian" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "comandi" enabled = "abilitato" disabled = "disabilitato" confirmation = "Conferma" confirmation.yes = "Sì" confirmation.no = "No" ; errors error = "Qualcosa è andato storto" error.command-error = "Sembra che ti manchi un argomento o che tu abbia usato il comando sbagliato!" error.runingame = "Esegui questo comando nel gioco!" error.limitexceeded = "Stai cercando di modificare troppi blocchi contemporaneamente. Riduci la selezione o aumenta il limite" error.notarget = "Nessun obiettivo trovato. Aumenta l'intervallo degli strumenti //setrange se necessario" error.noselection = "Nessuna selezione trovata - seleziona prima un'area" error.selectioninvalid = "La selezione non è valida! Controlla se tutte le posizioni sono impostate!" error.nosession = "Nessuna sessione è stata creata - probabilmente non hai il permesso di utilizzare {%0}" error.noclipboard = "Nessuna clipboard trovata - prima crea una clipboard" warning.differentworld = "[ATTENZIONE] Stai modificando in un mondo in cui al momento non ci sei!" ; commands command.info.title = "Informazioni" command.limit.current = "Limite attuale: {%0}" command.limit.set = "Il limite di modifica del blocco è stato impostato a {%0}" command.setrange.current = "Raggio attuale {%0}" command.setrange.set = "Il raggio degli strumenti è impostato a {%0}" command.biomeinfo.attarget = "Bioma sull'obiettivo" command.biomeinfo.atposition = "Bioma in posizione" command.biomeinfo.result = "{%0} biomi trovati nella selezione" command.biomeinfo.result.line = "ID: {%0} Nome: {%1}" command.biomelist.title = "Lista biomi" command.biomelist.result.line = "ID: {%0} Nome: {%1}" command.brushname.set = "Nome pennello impostato a \"{%0}\"" command.clearclipboard.cleared = "Clipboards pulite" command.flip.try = "Cercando di capovolgere la clipboard di {%0}" command.flip.success = "Clipboard capovolta con successo" command.rotate.try = "Cercando di ruotare la clipboard di {%0} gradi" command.rotate.success = "Clipboard ruotata con successo" command.history.cleared = "Cronologia cancellata" command.listchunks.found = "{%0} chunk trovati nella selezione" command.size = "Dimensione della selezione" ; selection selection.pos1.set = "Posizione 1 impostata a X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Posizione 2 impostata a X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Niente da annullare" session.undo.left = "Sono rimaste {%0} azioni annullabili" session.redo.none = "Niente da ripetere" session.redo.left = "Sono rimaste {%0} azioni ripetibili" session.brush.added = "Aggiunto {%0} alla sessione" session.brush.deleted = "Cancellato {%0} (UUID {%1})" session.brush.removed = "Rimosso {%0} (UUID {%1})" session.language.set = "Impostata con successo la lingua su {%0}" session.language.notfound = "Lingua {%0} non trovata, ripristino a quella predefinita" ; task task.copy.success = "Copia asincrona riuscita, impiegando {%0}, copiati {%1} blocchi su {%2}." task.count.success = "Analisi asincrona riuscita, impiegando {%0}" task.count.result = "{%0} blocchi trovati su un totale di {%1} blocchi" task.fill.success = "Riempimento asincrono riuscito, impiegando {%0}, {%1} blocchi su {%2} modificati." task.replace.success = "Sostituzione asincrona riuscita, impiegando {%0}, {%1} blocchi su {%2} modificati." task.revert.undo.success = "Annullamento asincrono riuscito, impiegando {%0}, {%1} blocchi su {%2} modificati." task.revert.redo.success = "Ripetizione asincrona riuscita, impiegando {%0}, {%1} blocchi su {%2} modificati." ; flags flags.keepexistingblocks = "Mantieni i blocchi esistenti" flags.keepair = "Mantieni l'aria" flags.hollow = "Cavo" flags.hollowclosed = "Cavo con le estremità chiuse" flags.natural = "Naturale" ; tools ; wand tool tool.wand = "Bacchetta magica" tool.wand.lore.1 = "Clicca con il tasto sinistro su un blocco per impostare la posizione 1 di una selezione" tool.wand.lore.2 = "Clicca con il tasto destro su un blocco per impostare la posizione 2 di una selezione" tool.wand.lore.3 = "Usa //togglewand per attivare la sua funzionalità" tool.wand.disabled = "Lo strumento bacchetta magica è disabilitato. Usa //togglewand per riabilitarlo" tool.wand.setenabled = "Lo strumento bacchetta magica è ora {%0}!" ; debug tool tool.debug = "Strumento di debug" tool.debug.lore.1 = "Clicca con il tasto sinistro su un blocco per ricevere informazioni" tool.debug.lore.2 = "come il nome e i valori di danno di un blocco" tool.debug.lore.3 = "Usa //toggledebug per attivare la sua funzionalità" tool.debug.disabled = "Lo strumento di debug è disabilitato. Usa //toggledebug per riabilitarlo" tool.debug.setenabled = "Lo strumento di debug è ora {%0}!" ; flood tool ui.flood.title = "Menu riempimento" ui.flood.options.limit = "Numero massimo di blocchi" ui.flood.options.blocks = "Blocchi" ui.flood.options.blocks.placeholder = "I blocchi devono essere separati da punti e virgola" ui.flood.options.label.infoapply = "Clicca il pulsante "Invio" per confermare" ; brush tool ui.brush.title = "Menu pennello" ui.brush.content = "Menu pennello principale" ui.brush.create = "Crea nuovo" ui.brush.getsession = "Ottieni una sessione pennello" ui.brush.edithand = "Modifica il pennello in mano" ; ui brush settings ui.brush.settings.title = "{%0} impostazioni pennello" ; ui brush options ui.brush.options.blocks = "Blocchi" ui.brush.options.blocks.placeholder = "Esempio: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diametro" ui.brush.options.width = "Larghezza" ui.brush.options.height = "Altezza" ui.brush.options.depth = "Profondità" ui.brush.options.flags = "Aggiungere flag?" ; language ui.language.title = "Seleziona la lingua" ui.language.label = "Imposta la lingua della tua sessione. Se la tua lingua non è disponibile, puoi tradurre il plugin su GitHub!" ui.language.dropdown = "Seleziona una lingua" ================================================ FILE: resources/lang/jpn.ini ================================================ ; Updated time : 26th 07 2017 language.name = "Japanese" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "問題が発生しました" noperm = "このコマンドを実行する権限がありません" runingame = "ゲーム内でこのコマンドを実行してください!" commands = "コマンド" ; user interfaces ui.confirmation = "確認" ui.confirmation.yes = "はい" ui.confirmation.no = "いいえ" ; ui brush ui.brush.title = "ブラシメニュー" ; ui brush select ui.brush.select.title = "ブラシの種類を選択" ui.brush.select.type.sphere = "球" ui.brush.select.type.cylinder = "円柱" ui.brush.select.type.cuboid = "直方体" ui.brush.select.type.clipboard = "クリップボード" ; ui brush settings ui.brush.settings.title = "{%0} ブラシ設定" ; ui brush options ui.brush.options.blocks = "ブロック" ui.brush.options.blocks.placeholder = "例:1:1,2,tnt,log:12" ui.brush.options.diameter = "直径" ui.brush.options.width = "横幅" ui.brush.options.height = "縦幅" ui.brush.options.depth = "深さ" ui.brush.options.flags = "フラグを追加?" ; ui flags ui.flags.keepexistingblocks = "既存のブロックを維持" ui.flags.keepair = "空気を維持" ui.flags.hollow = "空洞" ui.flags.natural = "自然" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "塗りつぶしメニュー" ui.flood.options.limit = "最大ブロック数" ui.flood.options.blocks = "ブロック" ui.flood.options.blocks.placeholder = "セミコロンで区切られたブロック" ui.flood.options.label.infoapply = "適用するには"送信"ボタンをクリックしてください" ================================================ FILE: resources/lang/kor.ini ================================================ ; Updated time : 2nd 10 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Korean" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "명령어" enabled = "활성화됩니다" disabled = "비활성화됩니다" confirmation = "확인" confirmation.yes = "예" confirmation.no = "아니요" ; errors error = "오류가 발생했습니다" error.command-error = "인수가 누락되었거나 명령어를 잘못 사용한 것 같습니다!" error.runingame = "게임 내에서 이 명령어를 실행해주세요!" error.limitexceeded = "한 번에 너무 많은 블록을 편집하려고 합니다. 선택 영역을 줄이거나 제한을 늘리세요" error.notarget = "대상 블록이 없습니다. 필요한 경우 //setrange로 도구 범위를 늘리세요" error.noselection = "선택 영역이 없습니다. 영역을 먼저 선택하세요" error.selectioninvalid = "선택 영역이 올바르지 않습니다! 모든 위치가 설정되어 있는지 확인하세요!" error.nosession = "세션이 만들어지지 않았습니다. {%0}을(를) 사용할 수 있는 권한이 없을 수 있습니다" error.noclipboard = "클립보드가 없습니다. 먼저 클립보드를 만드세요" warning.differentworld = "[경고] 사용자가 현재 있지 않은 레벨을 편집하고 있습니다!" ; commands command.info.title = "정보" command.limit.current = "현재 제한: {%0}" command.limit.set = "블록 변경 제한이 {%0}(으)로 설정되었습니다" command.setrange.current = "현재 범위: {%0}" command.setrange.set = "도구 범위가 {%0}(으)로 설정되었습니다" command.biomeinfo.attarget = "대상 블록의 생물 군계" command.biomeinfo.atposition = "대상 위치의 생물 군계" command.biomeinfo.result = "선택 영역에서 생물 군계 {%0}개를 찾았습니다" command.biomeinfo.result.line = "ID: {%0} 이름: {%1}" command.biomelist.title = "생물 군계 목록" command.biomelist.result.line = "ID: {%0} 이름: {%1}" command.brushname.set = "브러시 이름이 \"{%0}\"(으)로 설정되었습니다" command.clearclipboard.cleared = "클립보드가 삭제되었습니다" command.flip.try = "클립보드 {%0} 뒤집기 시도 중" command.flip.success = "클립보드를 성공적으로 뒤집었습니다" command.rotate.try = "클립보드 {%0}도 회전 시도 중" command.rotate.success = "클립보드를 성공적으로 회전시켰습니다" command.history.cleared = "기록이 삭제되었습니다" command.listchunks.found = "선택 영역에서 청크 {%0}개를 찾았습니다" command.size = "선택 영역 크기" ; selection selection.pos1.set = "위치 1이 X: {%0} Y: {%1} Z: {%2}(으)로 설정되었습니다" selection.pos2.set = "위치 2가 X: {%0} Y: {%1} Z: {%2}(으)로 설정되었습니다" ; session session.undo.none = "실행 취소할 작업이 없습니다" session.undo.left = "실행 취소할 작업이 {%0}개 남았습니다" session.redo.none = "다시 실행할 작업이 없습니다" session.redo.left = "다시 실행할 작업이 {%0}개 남았습니다" session.brush.added = "{%0}을(를) 세션에 추가했습니다" session.brush.deleted = "{%0}(UUID {%1})을(를) 삭제했습니다" session.brush.removed = "{%0}(UUID {%1})을(를) 제거했습니다" session.language.set = "언어를 {%0}(으)로 성공적으로 설정했습니다" session.language.notfound = "언어 {%0}을(를) 찾을 수 없기에 기본값으로 초기화합니다" ; task task.copy.success = "비동기 복사에 성공했습니다(걸린 시간 {%0}, 블록 {%2}개 중 {%1}개 복사)." task.count.success = "비동기 분석에 성공했습니다(걸린 시간 {%0})" task.count.result = "블록 총 {%1}개 중 블록 {%0}개를 찾았습니다" task.fill.success = "비동기 채우기에 성공했습니다(걸린 시간 {%0}, 블록 {%2}개 중 {%1}개 변경)." task.replace.success = "비동기 교체에 성공했습니다(걸린 시간 {%0}, 블록 {%2}개 중 {%1}개 변경)." task.revert.undo.success = "비동기 실행 취소에 성공했습니다(걸린 시간 {%0}, 블록 {%2}개 중 {%1}개 변경)." task.revert.redo.success = "비동기 다시 실행에 성공했습니다(걸린 시간 {%0}, 블록 {%2}개 중 {%1}개 변경)." ; flags flags.keepexistingblocks = "기존 블록 유지" flags.keepair = "공기 유지" flags.hollow = "구멍" flags.hollowclosed = "닫힌 끝이 있는 구멍" flags.natural = "자연" ; tools ; wand tool tool.wand = "선택 도구" tool.wand.lore.1 = "블록을 왼쪽 버튼으로 클릭해 선택 영역의 위치 1을 설정합니다" tool.wand.lore.2 = "블록을 오른쪽 버튼으로 클릭해 선택 영역의 위치 2를 설정합니다" tool.wand.lore.3 = "//togglewand를 사용해 기능을 전환합니다" tool.wand.disabled = "선택 도구가 비활성화되어 있습니다. //togglewand를 사용해 다시 활성화하세요" tool.wand.setenabled = "선택 도구가 이제 {%0}!" ; debug tool tool.debug = "디버그 도구" tool.debug.lore.1 = "블록을 왼쪽 버튼으로 클릭해 블록의 이름이나" tool.debug.lore.2 = "손상 정도 등의 정보를 가져옵니다" tool.debug.lore.3 = "//toggledebug를 사용해 기능을 전환합니다" tool.debug.disabled = "디버그 도구가 비활성화되어 있습니다. //toggledebug를 사용해 다시 활성화하세요" tool.debug.setenabled = "디버그 도구가 이제 {%0}!" ; flood tool ui.flood.title = "채우기 메뉴" ui.flood.options.limit = "최대 블록 수" ui.flood.options.blocks = "블록" ui.flood.options.blocks.placeholder = "쌍반점으로 구분된 블록" ui.flood.options.label.infoapply = "적용하려면 "보내기" 버튼을 클릭하세요" ; brush tool ui.brush.title = "브러시 메뉴" ui.brush.content = "브러시 메인 메뉴" ui.brush.create = "새로 만들기" ui.brush.getsession = "세션 브러시 획득" ui.brush.edithand = "손에 있는 브러시 편집" ; brush settings ui.brush.settings.title = "{%0} 브러시 설정" ; brush options ui.brush.options.blocks = "블록" ui.brush.options.blocks.placeholder = "예: 1:1,2,tnt,log:12" ui.brush.options.diameter = "지름" ui.brush.options.width = "너비" ui.brush.options.height = "높이" ui.brush.options.depth = "깊이" ui.brush.options.flags = "플래그 추가?" ; language ui.language.title = "언어 선택" ui.language.label = "세션의 언어를 선택하세요. 언어를 사용할 수 없는 경우, GitHub에서 플러그인을 번역하세요!" ui.language.dropdown = "언어 선택" ================================================ FILE: resources/lang/lao.ini ================================================ ; Updated time : 26th 09 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Lao" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "ຄຳສັ່ງ" enabled = "ເປີດໃຊ້ງານ" disabled = "ປິດໃຊ້ງານ" confirmation = "ການຢືນຢັນ" confirmation.yes = "ແມ່ນ" confirmation.no = "ບໍ່" ; errors error = "ມີຂໍ້ຜິດພາດເກີດຂື້ນ" error.command-error = "ໂຕປ່ຽນຫຼືຄຳສັ່ງບໍ່ຖືກຕ້ອງ!" error.runingame = "ກະລຸນາໃຊ້ຄຳສັ່ງນີ້ໃນເກມເທົ່ານັ້ນ!" error.limitexceeded = "ທ່ານໄດ້ແກ້ໄຂບລັອກຈຳນວນຫຼາຍເກີນໄປ ຫຼຸດຈຳນວນຫຼືເພີ່ມຈຳນວນຈຳກັດ" error.notarget = "ບໍ່ມີບລັອກເປົ້າໝາຍໃຫ້ເລືອກ. ເພີ່ມໄລຍະອຸປະກອນດ້ວຍຄຳສັ່ງ //setrange ຖ້າຕ້ອງການ" error.noselection = "ບໍ່ມີການເລືອກ - ເລືອກພື້ນທີ່ກ່ອນ" error.selectioninvalid = "ການເລືອກບໍ່ຖືກຕ້ອງ! ກວດສອບຕຳແໜ່ງທັງໝົດອີກເທື່ອໜຶ່ງ!" error.nosession = "ບໍ່ມີເຊສຊັ່ນສ້າງຂຶ້ນ - ອາດເປັນເພາະບໍ່ມີສິດນຳໃຊ້ {%0}" error.noclipboard = "ບໍ່ມີຄລິບບອດ - ສ້າງຄລິບບອດກ່ອນ" warning.differentworld = "[ຄຳເຕືອນ] ທ່ານແກ້ໄຂເລເວລທ່ານບໍ່ໄດ້ຢູ່!" ; commands command.info.title = "ຂໍ້ມູນ" command.limit.current = "ຈຳນວນຈຳກັດປະຈຸບັນ: {%0}" command.limit.set = "ຈຳນວນຈຳກັດໃນການແກ້ໄຂບລັອກຖືກຕັ້ງເປັນ {%0}" command.setrange.current = "ໄລຍະປັດຈຸບັນ: {%0}" command.setrange.set = "ໄລຍະອຸປະກອນຖືກຕັ້ງເປັນ {%0}" command.biomeinfo.attarget = "Biome ທີ່ເປົ້າໝາຍ" command.biomeinfo.atposition = "Biome ທີ່ຕຳແໜ່ງ" command.biomeinfo.result = "ພົບ {%0} biomes ໃນການເລຶອກ" command.biomeinfo.result.line = "ໄອດີ: {%0} ຊື່: {%1}" command.biomelist.title = "ລາຍຈຳນວນຂອງ Biome" command.biomelist.result.line = "ໄອດີ: {%0} ຊື່: {%1}" command.brushname.set = "ຊື່ຖືກປ່ຽນເປັນ \"{%0}\"" command.clearclipboard.cleared = "ຄລິບບອດຖືກລົບລ້າງ" command.flip.try = "ພະຍາຍາມທີ່ຈະພິກຄລິບບອດໂດຍ {%0}" command.flip.success = "ຄລິບບອດຖືກພິກຮຽບຮ້ອຍ" command.rotate.try = "ພະຍາຍາມທີ່ຈະພິກຄລິບບອດ {%0} ອົງສາ" command.rotate.success = "ຄລິບບອດຖືກໝຸນຮຽບຮ້ອຍແລ້ວ" command.history.cleared = "ປະຫວັດຖືກລົບລ້າງແລ້ວ" command.listchunks.found = "ພົບ {%0} chunks ໃນການເລືອກ" command.size = "ຂະໜາດການເລືອກ" ; selection selection.pos1.set = "ຕຳແໜ່ງທີ່ 1 ຕັ້ງເປັນ X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "ຕຳແໜ່ງທີ່ 2 ຕັ້ງເປັນ X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "ຍ້ອນກັບບໍ່ໄດ້" session.undo.left = "ທ່ານມີຄຳສັ່ງຍ້ອນກັບເຫຼືອ {%0} ເທື່ອ" session.redo.none = "ບໍ່ມີຫຍັງໃໝ່ໃຫ້ເຮັດ" session.redo.left = "ທ່ານມີຄຳສັ່ງໃໝ່ໃຫ້ເຮັດ {%0}" session.brush.added = "ເພີ່ມ {%0} ເຂົ້າເຊສຊັ້ນ" session.brush.deleted = "ລົບ {%0} (UUID {%1})" session.brush.removed = "ນຳອອກ {%0} (UUID {%1})" session.language.set = "ປ່ຽນພາສາເປັນ {%0} ຮຽບຮ້ອຍ" session.language.notfound = "ບໍ່ພົບພາສາ {%0} ປັບເປັນຄ່າເລີ່ມຕົ້ນ" ; task task.copy.success = "ຄັດລອກສຳເລັດ, ໃຊ້ເວລາ {%0}, ຄັດລອກ {%1} ບລັອກຈາກທັງໝົດ {%2}" task.count.success = "ວິເຄາະສຳເລັດ, ໃຊ້ເວລາ {%0}" task.count.result = "ພົບ {%0} ບລັອກທັງໝົດ {%1} ບລັອກ" task.fill.success = "ເຕີມເຕັມສຳເລັດ, ໃຊ້ເວລາ {%0}, ປ່ຽນ {%1} ບລັອກຈາກທັງໝົດ {%2}" task.replace.success = "ວາງທັບສຳເລັດ ໃຊ້ເວລາ {%0}, ປ່ຽນ {%1} ບລັອກຈາກທັງໝົດ {%2}" task.revert.undo.success = "ຍ້ອນກັບສຳເລັດ, ໃຊ້ເວລາ {%0}, ປ່ຽນ {%1} ບລັອກຈາກທັງໝົດ {%2}" task.revert.redo.success = "ເຮັດໃໝ່ສຳເລັດ, ໃຊ້ເວລາ {%0}, ປ່ຽນ {%1} ບລັອກຈາກທັງໝົດ {%2}" ; flags flags.keepexistingblocks = "ເກັບບລັອກທີ່ມີຢູ່ສຳເລັດ" flags.keepair = "ເກັບອາກາດ" flags.hollow = "ໂພງ" flags.hollowclosed = "ໂພງທີ່ມີທາງອອກປິດ" flags.natural = "ຕາມທຳມະຊາດ" ; tools ; wand tool tool.wand = "ຄະທາ" tool.wand.lore.1 = "ຄິກຊ້າຍທີ່ບລັອກເພື່ອຕັ້ງຕຳແໜ່ງ 1 ຂອງການເລືອກ" tool.wand.lore.2 = "ຄິກຂວາທີ່ບລັອກເພື່ອຕັ້ງຕຳແໜ່ງ 2 ຂອງການເລືອກ" tool.wand.lore.3 = "ໃຊ້ຄຳສັ່ງ //togglewand ເພື່ອສະຫຼັບການເຮັດວຽກຂອງຄະທາ" tool.wand.disabled = "ຄະທາຖືກປິດໃຊ້ງານ ໃຊ້ຄຳສັ່ງ //togglewand ເພື່ອເປີດໃຊ້ງານ" tool.wand.setenabled = "ຄະທາໄດ້ຖືກ {%0}!" ; debug tool tool.debug = "ເຄື່ອງມື Debug" tool.debug.lore.1 = "ຄລິກຊ້າຍທີ່ບລັອກເພື່ອເບິ່ງຂໍ້ມູນ" tool.debug.lore.2 = "ເຊັ່ນເບິ່ງຊື່ຫຼືຄ່າຄວາມເສຍຫາຍຂອງບລັອກ" tool.debug.lore.3 = "ໃຊ້ຄຳສັ່ງ //toggledebug ເພື່ອສະຫຼັບການເຮັດວຽກຂອງຄະທາ" tool.debug.disabled = "ເຄື່ອງມື Debug ຖືກປິດໃຊ້ງານ ໃຊ້ຄຳສັ່ງ //toggledebug ເພື່ອເປີດໃຊ້ງານ" tool.debug.setenabled = "ເຄື່ອງ Debug ຖືກ {%0}!" ; flood tool ui.flood.title = "ເມນູ Flood" ui.flood.options.limit = "ຈຳນວນບລັອກທີ່ຫຼາຍທີ່ສຸດ" ui.flood.options.blocks = "ບລັອກ" ui.flood.options.blocks.placeholder = "ບລັກທີ່ແຍກດ້ວຍ ;" ui.flood.options.label.infoapply = "ກົດປຸ່ມ "Submit" ເພື່ອນຳມາໃຊ້" ; brush tool ui.brush.title = "ເມນູແປງ" ui.brush.content = "ເມນູແປງຫຼັກ" ui.brush.create = "ສ້າງໃໝ່" ui.brush.getsession = "ເອີ້ນເຊສຊັ້ນແປງ" ui.brush.edithand = "ແກ້ໄຊແປງໃນມື" ; brush settings ui.brush.settings.title = "ການຕັ້ງຄ່າແປງ {%0}" ; brush options ui.brush.options.blocks = "ບລັອກ" ui.brush.options.blocks.placeholder = "ຕົວຢ່າງ: 1:1,2,tnt,log:12" ui.brush.options.diameter = "ເສັ້ນຜ່າໃຈກາງ" ui.brush.options.width = "ກ້ວາງ" ui.brush.options.height = "ສູງ" ui.brush.options.depth = "ເລິກ" ui.brush.options.flags = "ເພີ່ມຕົວເລືອກ?" ; language ui.language.title = "ເລືອກພາສາ" ui.language.label = "ຕັ້ງຄ່າພາສາຂອງເຊສຊັ້ນທ່ານ ຖ້າບໍ່ມີພາສາຂອງທ່ານ ທ່ານສາມາດຊ່ວຍແປງປລັກອິນທີ່ GitHub!" ui.language.dropdown = "ເລືອກພາສາ" ================================================ FILE: resources/lang/lit.ini ================================================ ; Updated time : 29th 10 2018 language.name = "Lithuanian" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "Kažkas nutiko klaidingai" noperm = "Jūs neturite leidimo paleisti šią komandą" runingame = "Prašau paleisti šią komandą žaidime!" commands = "komandos" ; user interfaces ui.confirmation = "Patvirtinimas" ui.confirmation.yes = "Taip" ui.confirmation.no = "Ne" ; ui brush ui.brush.title = "Teptuko meniu" ; ui brush select ui.brush.select.title = "Pasirinkite teptuko tipą" ui.brush.select.type.sphere = "Sfera" ui.brush.select.type.cylinder = "Cilindras" ui.brush.select.type.cuboid = "Kuboidas" ui.brush.select.type.clipboard = "Iškarpinė" ; ui brush settings ui.brush.settings.title = "{%0} teptuko nustatymai" ; ui brush options ui.brush.options.blocks = "Blokai" ui.brush.options.blocks.placeholder = "Pavyzdys: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diametras" ui.brush.options.width = "Plotis" ui.brush.options.height = "Aukštis" ui.brush.options.depth = "Gylis" ui.brush.options.flags = "Dėti vėliavėles?" ; ui flags ui.flags.keepexistingblocks = "Laikyti esamus blokus" ui.flags.keepair = "Laikyti orą" ui.flags.hollow = "Tuščiaviduris" ui.flags.natural = "Natūralus" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "Užpildymo meniu" ui.flood.options.limit = "Maximalūs blokai" ui.flood.options.blocks = "Blokai" ui.flood.options.blocks.placeholder = "Blokai atskirti kabliataškiais" ui.flood.options.label.infoapply = "Paspauskite "Submit" mygtukas pakeisti" ================================================ FILE: resources/lang/mar.ini ================================================ ; Updated time : 20th 10 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Marathi" ; general divider = "======================================== " spacer = " -=+=- {%0} -=+=-" commands = "आदेश" enabled = "कार्यान्वित केले" disabled = "निष्क्रिय केले" confirmation = "पुष्टीकरण करा" confirmation.yes = "होय" confirmation.no = "नाही" ; errors error = "एक त्रुटी आली" error.command-error = "कदाचित आपण एक मापदंड (parameter) गमावत आहात किंवा चुकीची कमांड वापरली आहे!" error.runingame = "कृपया ही आज्ञा खेळ चालू असताना चालवा!" error.limitexceeded = "आपण एकाच वेळी अनेक ब्लॉक संपादित करण्याचा प्रयत्न करीत आहात. कमी ब्लॉक निवडा किंवा मर्यादा वाढवा" error.notarget = "लक्ष्य ब्लॉक आढळला नाही. आवश्यक असल्यास //setrange वापरुन टूलचा पल्ला (range) वाढवा" error.noselection = "कोणतीही निवड आढळली नाही - प्रथम एक क्षेत्र निवडा" error.selectioninvalid = "निवड वैध नाही! सर्व जागा सेट केल्या आहेत का, ते तपासा!" error.nosession = "सत्र (सेशन) तयार केले नाही - कदाचित {%0} वापरण्याची परवानगी नाही" error.noclipboard = "कोणताही क्लिपबोर्ड सापडला नाही - प्रथम एक क्लिपबोर्ड तयार करा" warning.differentworld = "[चेतावणी] आपण सध्या ज्या पातळीवर नाही, त्या पातळीवर आपण संपादन करीत आहात!" ; commands command.info.title = "माहिती" command.limit.current = "वर्तमान मर्यादा: {%0}" command.limit.set = "ब्लॉक बदल मर्यादा {%0} इतकी सेट केली आहे" command.setrange.current = "वर्तमान पल्ला (रेंज): {%0}" command.setrange.set = "टुल रेंज {%0} इतकी सेट केली आहे" command.biomeinfo.attarget = "बायोम निशाण्यावर आहे" command.biomeinfo.atposition = "बायोम ठिकाणावर आहे" command.biomeinfo.result = "निवडीत {%0} बायोम सापडले" command.biomeinfo.result.line = "ओळख: {%0} नाव: {%1}" command.biomelist.title = "बायोम यादी" command.biomelist.result.line = "ओळख: {%0} नाव: {%1}" command.brushname.set = "ब्रश नाव सेट केले आहे \"{%0}\"" command.clearclipboard.cleared = "क्लिपबोर्ड मोकळे केले" command.flip.try = "{%0} द्वारा क्लिपबोर्ड फ्लिप करण्याचा प्रयत्न करीत आहे" command.flip.success = "क्लिपबोर्ड यशस्वीरित्या फ्लिप झाला" command.rotate.try = "{%0} अंशांनी क्लिपबोर्ड फिरवण्याचा प्रयत्न करीत आहे" command.rotate.success = "क्लिपबोर्ड यशस्वीरित्या फिरविला" command.history.cleared = "इतिहास पुसला" command.listchunks.found = "निवडीत {%0} तुकडे सापडले" command.size = "निवड आकार" ; selection selection.pos1.set = "जागा 1 ला X: {%0} Y: {%1} Z: {%2} वर सेट केले" selection.pos2.set = "जागा 2 ला X: {%0} Y: {%1} Z: {%2} वर सेट केले" ; session session.undo.none = "पूर्ववत करण्यासाठी काहीही नाही" session.undo.left = "आपल्याकडे {%0} पूर्ववत क्रिया बाकी आहे" session.redo.none = "पुन्हा करण्यासारखे काही नाही" session.redo.left = "आपल्याकडे {%0} पुन्हा करण्याच्या क्रिया बाकी आहे" session.brush.added = "सत्रामध्ये {%0} जोडले" session.brush.deleted = "{%0} हटविले (UUID {%1})" session.brush.removed = "{%0} काढून टाकले (UUID {%1})" session.language.set = "{%0} भाषा यशस्वीरित्या सेट केली" session.language.notfound = "{%0} भाषा आढळली नाही, म्हणून मुळ भाषा सेट करत आहोत" ; task task.copy.success = "एसिंक कॉपी यशस्वी, {%0} घेतली, {%2} पैकी {%1} ब्लॉक कॉपी केले." task.count.success = "एसिंकचे विश्लेषण यशस्वी, {%0} घेतले" task.count.result = "एकूण {%1} ब्लॉक्समध्ये {%0} ब्लॉक सापडले" task.fill.success = "एसिंक भरणे यशस्वी, {%0} घेतले, {%2} पैकी {%1} ब्लॉक बदलले." task.replace.success = "एसिंक बदलणे यशस्वी, {%0} घेतले, {%2} पैकी {%1} ब्लॉक बदलले" task.revert.undo.success = "एसिंक यशस्वीरित्या पूर्ववत (undo) केले, {%0} घेतले, {%2} पैकी {%1} ब्लॉक बदलले" task.revert.redo.success = "एसिंक यशस्वीरित्या पुन्हा (redo) केले, {%0} घेतले, {%2} पैकी {%1} ब्लॉक बदलले" ; flags flags.keepexistingblocks = "विद्यमान ब्लॉक्स ठेवा" flags.keepair = "हवा ठेवा" flags.hollow = "पोकळ" flags.hollowclosed = "बंद टोकांसह पोकळ" flags.natural = "नैसर्गिक" ; tools ; wand tool tool.wand = "कांडी" tool.wand.lore.1 = "निवडीची स्थिती 1 सेट करण्यासाठी ब्लॉकवर डावे क्लिक करा" tool.wand.lore.2 = "निवडीची स्थिती 2 सेट करण्यासाठी ब्लॉकवर उजवे क्लिक करा" tool.wand.lore.3 = "कार्यक्षमता बदलण्यासाठी //togglewand वापरा" tool.wand.disabled = "कांडीचे साधन (wand tool) निष्क्रिय केले. ते पुन्हा कार्यान्वित करण्यासाठी //togglewand वापरा" tool.wand.setenabled = "कांडीचे साधन {%0}!" ; debug tool tool.debug = "डीबग साधन" tool.debug.lore.1 = "माहिती मिळविण्यासाठी ब्लॉक वर डावे क्लिक करा" tool.debug.lore.2 = "ब्लॉकचे नाव आणि नुकसान मूल्ये यासारख्या" tool.debug.lore.3 = "कार्यक्षमता बदलण्यासाठी //toggledebug वापरा" tool.debug.disabled = "डीबग साधन निष्क्रिय केले आहे. ते पुन्हा सक्रिय करण्यासाठी //toggledebug वापरा" tool.debug.setenabled = "डीबग साधन {%0}!" ; flood tool ui.flood.title = "पूर मेनू" ui.flood.options.limit = "जास्तीत जास्त ब्लॉक्स" ui.flood.options.blocks = "ब्लॉक्स" ui.flood.options.blocks.placeholder = "अर्धविरामांनी विभक्त (वेगळे) केलेले ब्लॉक्स" ui.flood.options.label.infoapply = "लागू करण्यासाठी "सबमिट" बटणावर क्लिक करा" ; brush tool ui.brush.title = "ब्रश मेन्यू" ui.brush.content = "मुख्य ब्रश मेन्यू" ui.brush.create = "नवीन तयार करा" ui.brush.getsession = "सेशन ब्रश मिळवा" ui.brush.edithand = "हातातील ब्रश संपादित करा" ; brush settings ui.brush.settings.title = "{%0} ब्रश सेटिंग्ज" ; brush options ui.brush.options.blocks = "ब्लॉक्स" ui.brush.options.blocks.placeholder = "उदाहरण: 1:1,2,tnt,log:12" ui.brush.options.diameter = "व्यास" ui.brush.options.width = "रुंदी" ui.brush.options.height = "ऊंची" ui.brush.options.depth = "खोली" ui.brush.options.flags = "चिन्ह जोडा?" ; language ui.language.title = "भाषा निवडा" ui.language.label = "आपल्या सत्राची भाषा सेट करा. जर आपली भाषा उपलब्ध नसेल तर आपण GitHub वर प्लगइन भाषांतरित करू शकता!" ui.language.dropdown = "एक भाषा निवडा" ================================================ FILE: resources/lang/mas.ini ================================================ ; Updated time : 29th 10 2018 language.name = "Masai" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "Sesuatu telah salah." noperm = "Kamu tidak ada hak untuk jalankan arahan ini." runingame = "Sila jalankan arahan ini dalam permainan!" commands = "Arahan" ; user interfaces ui.confirmation = "Pengesahan" ui.confirmation.yes = "Ya" ui.confirmation.no = "Tidak" ; ui brush ui.brush.title = "Menu berus" ; ui brush select ui.brush.select.title = "Pilih sejenis berus" ui.brush.select.type.sphere = "Sfera" ui.brush.select.type.cylinder = "Silinder" ui.brush.select.type.cuboid = "Cuboid" ui.brush.select.type.clipboard = "Papan Klip" ; ui brush settings ui.brush.settings.title = "{%0} Penetapan berus" ; ui brush options ui.brush.options.blocks = "Blok" ui.brush.options.blocks.placeholder = "Contohnya: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diameter" ui.brush.options.width = "Lebar" ui.brush.options.height = "Ketinggian" ui.brush.options.depth = "Kedalaman" ui.brush.options.flags = "Tambah bendera?" ; ui flags ui.flags.keepexistingblocks = "Kekal blok yang sedia ada" ui.flags.keepair = "Kekal udara" ui.flags.hollow = "Kosong" ui.flags.natural = "Semula jadi" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "Isi menu" ui.flood.options.limit = "Maksimum blok" ui.flood.options.blocks = "Blok" ui.flood.options.blocks.placeholder = "Blok dipisahkan oleh titik koma" ui.flood.options.label.infoapply = "Klik butang "Hantar" untuk memohon" ================================================ FILE: resources/lang/nld.ini ================================================ ; Updated time : 7th 11 2019 language.name = "Dutch" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "Opdrachten" enabled = "ingeschakeld" disabled = "uitgeschakeld" confirmation = "Bevestiging" confirmation.yes = "Ja" confirmation.no = "Nee" ; errors error = "Er is iets fout gegaan" error.command-error = "Het lijkt erop dat je een argument mist of de opdracht verkeerd hebt gebruikt!" error.runingame = "Voer deze opdracht alstublieft in-game uit" error.limitexceeded = "U probeert te veel blokken tegelijk te bewerken. Verklein de selectie of verhoog de limiet" error.notarget = "Geen doelblok gevonden. Vergroot gereedschapsbereik met //setrange indien nodig" error.noselection = "Geen selectie gevonden - selecteer eerst een gebied" error.selectioninvalid = "De selectie is niet geldig! Controleer of alle posities zijn geselecteerd!" error.nosession = "Er is geen sessie gemaakt - waarschijnlijk geen toestemming om {% 0} te gebruiken" error.noclipboard = "Geen klembord gevonden - maak eerst een klembord" warning.differentworld = "[WAARSCHUWING] Je bewerkt een wereld waar je momenteel niet in zit!" ; commands command.info.title = "Informatie" command.limit.current = "Huidig limiet: {%0}" command.limit.set = "Limiet voor aantal wijzigingen van blok is ingesteld op {%0}" command.setrange.current = "Huidig bereik: {%0}" command.setrange.set = "Gereedschapsbereik is ingesteld op {%0}" command.biomeinfo.attarget = "Biome op doel" command.biomeinfo.atposition = "Biome op positie" command.biomeinfo.result = "{%0} biomen gevonden in selectie" command.biomeinfo.result.line = "ID: {%0} Naam: {%1}" command.biomelist.title = "Biome lijst" command.biomelist.result.line = "ID: {%0} Naam: {%1}" command.brushname.set = "Kwast naam ingesteld op \"{%0}\"" command.clearclipboard.cleared = "Klemborden gewist" command.flip.try = "Klembord proberen te draaien met {%0}" command.flip.success = "Klembord succesvol gedraaid" command.rotate.try = "Probeeren het klembord met {%0} graden te draaien" command.rotate.success = "Klembord succesvol gedraaid" command.history.cleared = "Geschiedenis gewist" command.listchunks.found = "{%0} chunks in selectie gevonden" command.size = "Selectie grootte" ; selection selection.pos1.set = "Positie 1 ingesteld op X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Positie 2 ingesteld op X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Niks om ongedaan te maken" session.undo.left = "U kunt nog {%0} acties ongedaan maken" session.redo.none = "Niets om opnieuw te doen" session.redo.left = "U heeft nog {%0} opnieuw uit te voeren acties" session.brush.added = "{%0} toegevoegd aan sessie" session.brush.deleted = "Verwijderd {%0} (UUID {%1})" session.brush.removed = "Verwijderd {%0} (UUID {%1})" session.language.set = "Taal succesvol ingesteld op {%0}" session.language.notfound = "Taal {%0} niet gevonden, gereset naar standaard" ; task task.copy.success = "Async Copy geslaagd, duurde {% 0}, kopieerde {% 1} blokken van {% 2}." task.count.success = "Async-analyse slaagde, duurde {% 0}" task.count.result = "{% 0} blokken gevonden van in totaal {% 1} blokken" task.fill.success = "Async Fill is geslaagd, duurde {%0}, {%1} blokken uit {%2} gewijzigd." task.replace.success = "Async vervangen geslaagd, duurde {%0}, {%1} blokken van {%2} gewijzigd." task.revert.undo.success = "Async Ongedaan maken geslaagd, duurde {%0}, {%1} blokken uit {%2} gewijzigd." task.revert.redo.success = "Async opnieuw doen is geslaagd, duurde {%0}, {%1} blokken uit {%2} gewijzigd." ; flags flags.keepexistingblocks = "Behoudt bestaande blokken" flags.keepair = "Behoudt lucht" flags.hollow = "Hol" flags.hollowwclosed = "Hol met gesloten einden" flags.natural = "Natuurlijk" ; tools ; wand tool tool.wand = "Toverstaf" tool.wand.lore.1 = "Klik met de linkermuisknop op een blok om de positie 1 van een selectie in te stellen" tool.wand.lore.2 = "Klik met de rechtermuisknop op een blok om de positie 2 van een selectie in te stellen" tool.wand.lore.3 = "Gebruik //togglewand om van functionaliteit te wisselen" tool.wand.disabled = "De toverstaf is uitgeschakeld. Gebruik //togglewand om het opnieuw in te schakelen" tool.wand.setenabled = "Het gereedschap Toverstaf is nu{ %0}!" ; debug tool tool.debug = "Foutopsporing gereedschap" tool.debug.lore.1 = "Klik met de linkermuisknop op een blok om informatie te krijgen" tool.debug.lore.2 = "zoals de naam en schadewaarden van een blok" tool.debug.lore.3 = "Gebruik //toggledebug om van functionaliteit te wisselen" tool.debug.disabled = "Het foutopsporing gereedschap is uitgeschakeld. Gebruik //toggledebug om het opnieuw in te schakelen" tool.debug.setenabled = "Het foutopsporing gereedschap is nu {%0}!" ; flood tool ui.flood.title = "Opvullings menu" ui.flood.options.limit = "Maximum aantal blokken" ui.flood.options.blocks = "Blokken" ui.flood.options.blocks.placeholder = "Blokken onderbroken door puntkomma" ui.flood.options.label.infoapply = "Klik op de "Submit" knop om het op te sturen" ; brush tool ui.brush.title = "Kwast menu" ui.brush.content = "Kwast hoofdmenu" ui.brush.create = "Maak nieuw" ui.brush.getsession = "Krijg sessie kwast" ui.brush.edithand = "Verander kwast in hand" ; brush settings ui.brush.settings.title = "{%0} kwast instellingen" ; brush options ui.brush.options.blocks = "Blokken" ui.brush.options.blocks.placeholder = "Bijvoorbeeld 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diameter" ui.brush.options.width = "Breedte" ui.brush.options.height = "Hoogte" ui.brush.options.depth = "Diepte" ui.brush.options.flags = "Opties toevoegen?" ; language ui.language.title = "Selecteer taal" ui.language.label = "Stel de taal van je sessie in. Als jou taal niet beschikbaar is kan je de plug-in vertalen op GitHub!" ui.language.dropdown = "Selecteer een taal" ================================================ FILE: resources/lang/nor.ini ================================================ ; Updated time : 28th 10 2018 language.name = "Norwegian" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "Noe gikk galt" noperm = "Du har ikke rettigheter til å kjøre denne kommandoen" runingame = "Vennligst kjør denne kommandoen i spillet!" commands = "commands" ; user interfaces ui.confirmation = "Bekreft" ui.confirmation.yes = "Ja" ui.confirmation.no = "Nei" ; ui brush ui.brush.title = "Pensel-meny" ; ui brush select ui.brush.select.title = "Velg en type pensel" ui.brush.select.type.sphere = "Sfære" ui.brush.select.type.cylinder = "Sylinder" ui.brush.select.type.cuboid = "Kubeform" ui.brush.select.type.clipboard = "Utklippstavle" ; ui brush settings ui.brush.settings.title = "{%0} pensel innstillinger" ; ui brush options ui.brush.options.blocks = "Blokker" ui.brush.options.blocks.placeholder = "Eksempel: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diameter" ui.brush.options.width = "Bredde" ui.brush.options.height = "Høyde" ui.brush.options.depth = "Dybde" ui.brush.options.flags = "Legg til flagg?" ; ui flags ui.flags.keepexistingblocks = "Behold eksisterende blokker" ui.flags.keepair = "Behold luft" ui.flags.hollow = "Hul" ui.flags.natural = "Naturlig" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "Flommeny" ui.flood.options.limit = "Maximum blokker" ui.flood.options.blocks = "Blokker" ui.flood.options.blocks.placeholder = "Blokker separert av semikolon" ui.flood.options.label.infoapply = "Klikk på "Submit"-knappen for å lagre" ================================================ FILE: resources/lang/pol.ini ================================================ ; Updated time : 26th 07 2017 language.name = "Polish" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "Coś poszło nie tak" noperm = "Nie masz uprawnień do wykonania tego polecenia" runingame = "Proszę wykonać to polecenie w grze!" commands = "Commands" ; user interfaces ui.confirmation = "Potwierdzenie" ui.confirmation.yes = "Tak" ui.confirmation.no = "Nie" ; ui brush ui.brush.title = "Menu pędzla" ; ui brush select ui.brush.select.title = "Wybierz rodzaj pędzla" ui.brush.select.type.sphere = "Kula" ui.brush.select.type.cylinder = "Cylinder" ui.brush.select.type.cuboid = "Cuboid" ui.brush.select.type.clipboard = "Schowek" ; ui brush settings ui.brush.settings.title = "{%0} ustawienia pędzla" ; ui brush options ui.brush.options.blocks = "Bloky" ui.brush.options.blocks.placeholder = "Przykład: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Średnica" ui.brush.options.width = "Szerokość" ui.brush.options.height = "High" ui.brush.options.depth = "Depth" ui.brush.options.flags = "Dodaj flagi?" ; ui flags ui.flags.keepexistingblocks = "Zachowaj istniejące bloki" ui.flags.keepair = "Zatrzymaj powietrze" ui.flags.hollow = "Hollow" ui.flags.natural = "Prírodné" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "Menu powodzi" ui.flood.options.limit = "Maksymalne bloki" ui.flood.options.blocks = "Bloki" ui.flood.options.blocks.placeholder = "Bloki muszą być oddzielone średnikami" ui.flood.options.label.infoapply = "Kliknij przycisk Wyślij, aby zastosować zmiany" ================================================ FILE: resources/lang/por.ini ================================================ ; Updated time : 26th 07 2017 language.name = "Portuguese" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " noperm = "Você não tem permissão para executar este comando" runingame = "Por favor, execute este comando no jogo!" commands = "comandos" enabled = "Ativado" disabled = "Desativado" confirmation = "Confirmação" confirmation.yes = "Sim" confirmation.no = "Não" ; errors error = "Algo deu errado" error.command-error = "Parece que você esqueceu um argumento ou usou o comando errado!" error.runingame = "Por favor, execute o comando dentro do jogo!" error.limitexceeded = "Você está tentando editar vários blocos de uma vez. Reduza a quantidade selecionada ou aumente o limite" error.notarget = "Nenhum bloco de destino foi encontrado. Aumente o alcance da ferramenta com //setrange se necessário" error.noselection = "Nenhuma seleção encontrada - selecione uma área primeiro" error.selectioninvalid = "A seleção não é válida! Verifique se todas as posições estão definidas!" error.nosession = "Nenuma sessão foi criada - provavelmente você não tem permissão para usar {%0}" error.noclipboard = "Nenhuma área de transferência encontrada - primeiro crie uma área de transferência" warning.differentworld = "[AVISO] Você está editando em um nível no qual não está atualmente!" ; commands command.info.title = "Informação" command.limit.current = "Limite atual: {%0}" command.limit.set = "O limite de alteração de bloco foi definido para {%0}" command.setrange.current = "Alcance atual: {%0}" command.setrange.set = "Alcance da ferramenta foi definida para {%0}" command.biomeinfo.attarget = "Bioma no alvo" command.biomeinfo.atposition = "Bioma na posição" command.biomeinfo.result = "{%0} biomas encontrados na seleção" command.biomeinfo.result.line = "ID: {%0} Nome: {%1}" command.biomelist.title = "Lista de biomas" command.biomelist.result.line = "ID: {%0} Nome: {%1}" command.brushname.set = "Nome do pincel definido como \"{%0}\"" command.clearclipboard.cleared = "Área de transferência limpa" command.flip.try = "Tentando virar a área de transferência em {%0}" command.flip.success = "Área de transferência lançada com sucesso" command.rotate.try = "Tentando girar a área de transferência em {%0} graus" command.rotate.success = "Área de transferência girada com sucesso" command.history.cleared = "Histórico limpo" command.listchunks.found = "{%0} pedaços encontrados na seleção" command.size = "Tamanho da selação" ; selection selection.pos1.set = "Posição 1 difinido em X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Posição 2 definido em X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Nada para desfazer" session.undo.left = "Você tem {%0} ações para desfazer" session.redo.none = "Nada para refazer" session.redo.left = "Você tem {%0} ações para refazer" session.brush.added = "Adicionado {%0} na sessão" session.brush.deleted = "Excluído {%0} (UUID {%1})" session.brush.removed = "Removido {%0} (UUID {%1})" session.language.set = "Definido com sucesso o idioma para {%0}" session.language.notfound = "Idioma {%0} não encontrado, redefinido para o padrão" ; task task.copy.success = "Cópia assíncrona realizada com sucesso, levou {%0}, copiou {%1} blocos de um total de {%2}." task.count.success = "Análise assíncrona bem-sucedida, levou {%0}" task.count.result = "{%0} blocos encontrado em um total de {%1} blocos" task.fill.success = "Preenchimento assíncrono bem-sucedido, levou {%0}, {%1} blocos de um total de {%2} alterados." task.replace.success = "Substituição assíncrona bem-sucedida, levou {%0}, {%1} blocos de um total de {%2} alterados." task.revert.undo.success = "Desfeito assíncrono com êxito, levou {%0}, {%1} blocos de um total de {%2} alterados." task.revert.redo.success = "Refeito assíncrono com êxito, levou {%0}, {%1} blocos de um total de {%2} alterados." ; flags flags.keepexistingblocks = "Manter blocos existentes" flags.keepair = "Manter ar" flags.hollow = "Oco" flags.hollowclosed = "Oco com extremidades fechadas" flags.natural = "Natural" ; tools ; wand tool tool.wand = "Varinha" tool.wand.lore.1 = "Clique com o botão esquerdo do mouse em um bloco para definir a posição 1 de uma seleção" tool.wand.lore.2 = "Clique com o botão direito do mouse em um bloco para definir a posição 2 de uma seleção" tool.wand.lore.3 = "Utilize //togglewand para alternar sua funcionalidade" tool.wand.disabled = "A ferramenta da varinha está desativada. Utilize //togglewand para reativá-lo" tool.wand.setenabled = "A ferramenta da varinha está agora {%0}!" ; debug tool tool.debug = "Ferramenta de Depuração" tool.debug.lore.1 = "Clique com o botão esquerdo no bloco para obter informação" tool.debug.lore.2 = "Como o nome e os valores do dano de um bloco" tool.debug.lore.3 = "Utilize //toggledebug para alternar sua funcionalidade" tool.debug.disabled = "A ferramenta de depuração está desabilitada. Utilize //toggledebug para habilitá-la" tool.debug.setenabled = "A ferramenta de depuração está agora {%0}!" ; ui flood ui.flood.title = "Menu de inundação" ui.flood.options.limit = "Blocos máximos" ui.flood.options.blocks = "Blocos" ui.flood.options.blocks.placeholder = "Os blocos devem ser separados por ponto-e-vírgula" ui.flood.options.label.infoapply = "Clique no botão Enviar para aplicar as alterações" ; brush tool ui.brush.title = "Menu de pincel" ui.brush.content = "Menu principal do pincel" ui.brush.create = "Criar um novo" ui.brush.getsession = "Obter pincel da sessão" ui.brush.edithand = "Editar pincel na mão" ; ui brush settings ui.brush.settings.title = "{%0} configurações de pincel" ; ui brush options ui.brush.options.blocks = "Blocos" ui.brush.options.blocks.placeholder = "Exemplo: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diâmetro" ui.brush.options.width = "Largura" ui.brush.options.height = "Alto" ui.brush.options.depth = "Profundidade" ui.brush.options.flags = "Adicionar bandeiras?" ; language ui.language.title = "Selecione o idioma" ui.language.label = "Defina o idioma da sua sessão. Se o seu idioma não está disponível, sinta-se a vontade para traduzir o plugin no GitHub!" ui.language.dropdown = "Selecione um idioma" ================================================ FILE: resources/lang/rom.ini ================================================ ; Updated time : 26th 07 2017 language.name = "Romany" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "Ceva a mers prost" noperm = "Nu aveți permisiunea de a executa această comandă" runingame = "Vă rugăm să executați această comandă în joc!" commands = "Comenzi" ; user interfaces ui.confirmation = "Confirmare" ui.confirmation.yes = "Da" ui.confirmation.no = "Nu" ; ui brush ui.brush.title = "Meniu perie" ; ui brush select ui.brush.select.title = "Selectați un tip de pensulă" ui.brush.select.type.sphere = "Sphere" ui.brush.select.type.cylinder = "Cilindrul" ui.brush.select.type.cuboid = "Cuboid" ui.brush.select.type.clipboard = "Clipboard" ; ui brush settings ui.brush.settings.title = "{%0} setările periei" ; ui brush options ui.brush.options.blocks = "Blocuri" ui.brush.options.blocks.placeholder = "Exemplu: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diametru" ui.brush.options.width = "Lățime" ui.brush.options.height = "Înalt" ui.brush.options.depth = "Depth" ui.brush.options.flags = "Adaugă steaguri?" ; ui flags ui.flags.keepexistingblocks = "Păstrați blocurile existente" ui.flags.keepair = "Păstrați aerul" ui.flags.hollow = "Hollow" ui.flags.natural = "Natural" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "Meniul de inundații" ui.flood.options.limit = "Blocuri maxime" ui.flood.options.blocks = "Blocuri" ui.flood.options.blocks.placeholder = "Blocurile trebuie separate prin punct și virgulă" ui.flood.options.label.infoapply = "Faceți clic pe butonul de trimitere pentru a aplica modificările" ================================================ FILE: resources/lang/rus.ini ================================================ ; Updated time : 26th 09 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Russian" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "команды" enabled = "включен(а)" disabled = "отключен(а)" confirmation = "Подтверждение" confirmation.yes = "Да" confirmation.no = "Нет" ; errors error = "Что-то пошло не так" error.command-error = "Похоже, Вы пропустили аргумент или использовали команду неправильно!" error.runingame = "Пожалуйста, запустите эту команду в игре!" error.limitexceeded = "Вы пытаетесь отредактировать слишком много блоков за раз. Уменьшите выделение или увеличте лимит" error.notarget = "Целевой блок не найден. Увеличьте диапазон инструмента с помощью //setrange при необходимости" error.noselection = "Выделение не найдено - сначала выделите область" error.selectioninvalid = "Выделение не валидно! Проверьте, что все позиции выставлены!" error.nosession = "Сессия не была создана - возможно нет прав на использование {%0}" error.noclipboard = "Буфер обмена не найден - сначала создайте буфер обмена" warning.differentworld = "[ПРЕДУПРЕЖДЕНИЕ] Вы редактируете на уровне, на котором вы в данный момент не находитесь!" ; commands command.info.title = "Информация" command.limit.current = "Текущий лимит: {%0}" command.limit.set = "Лимит на количество изменяемых блоков установлен на {%0}" command.setrange.current = "Текущий диапазон: {%0}" command.setrange.set = "Диапазон инструментов был установлен на {%0}" command.biomeinfo.attarget = "Биом в мишени" command.biomeinfo.atposition = "Биом в положении" command.biomeinfo.result = "{%0} биомов найдено в выделении" command.biomeinfo.result.line = "ID: {%0} Имя: {%1}" command.biomelist.title = "Список биомов" command.biomelist.result.line = "ID: {%0} Имя: {%1}" command.brushname.set = "Имя кисти изменено на \"{%0}\"" command.clearclipboard.cleared = "Буферы обмена очищены" command.flip.try = "Попытка перевернуть буфер обмена на {%0}" command.flip.success = "Буфер обмена перевернут успешно" command.rotate.try = "Попытка повернуть буфер обмена на {%0} градусов" command.rotate.success = "Буфер обмена повернут успешно" command.history.cleared = "История очищена" command.listchunks.found = "{%0} кусков найдены в выделении" command.size = "Размер выделения" ; selection selection.pos1.set = "Позиция 1 выставлена на X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Позиция 2 выставлена на X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Нечего отменять" session.undo.left = "У вас осталось {%0} отмененяемых действий" session.redo.none = "Нечего возвращать" session.redo.left = "У вас осталось {%0} возвращаемых действий" session.brush.added = "{%0} добавлено в сессию" session.brush.deleted = "Удалено {%0} (UUID {%1})" session.brush.removed = "Удалено {%0} (UUID {%1})" session.language.set = "Выбран язык {%0}" session.language.notfound = "Язык {%0} не найден, восстановлен язык по умолчанию" ; task task.copy.success = "Асинхронное копирование выполнено успешно, извлечено {%0}, скопировано {%1} блоков из {%2}." task.count.success = "Асинхронный анализ выполнен успешно, извлечено {%0}" task.count.result = "{%0} блоков найдено в общей сложности {%1} блоков" task.fill.success = "Асинхронное заполнение выполнено успешно, извлечено {%0}, {%1} блоков из {%2} изменено." task.replace.success = "Асинхронная замена выполнена успешно, извлечено {%0}, {%1} блоков из {%2} изменено." task.revert.undo.success = "Асинхронная отмена выполнена успешно, извлечено {%0}, {%1} блоков из {%2} изменено." task.revert.redo.success = "Асинхронный возврат выполнен успешно, извлечено {%0}, {%1} блоков из {%2} изменено." ; flags flags.keepexistingblocks = "Оставить текущие блоки" flags.keepair = "Оставить воздух" flags.hollow = "Полый" flags.hollowclosed = "Полый с закрытыми концами" flags.natural = "Естественный" ; tools ; wand tool tool.wand = "Волшебная палочка" tool.wand.lore.1 = "Кликните левой кнопкой по блоку, чтобы выставить позицию 1 для выделения" tool.wand.lore.2 = "Кликните правой кнопкой по блоку, чтобы выставить позицию 2 для выделения" tool.wand.lore.3 = "Используйте //togglewand чтобы переключить функциональность" tool.wand.disabled = "Волшебная палочка отключена. Используйте //togglewand чтобы включить ее" tool.wand.setenabled = "Волшебная палочка сейчас {%0}!" ; debug tool tool.debug = "Инструмент отладки" tool.debug.lore.1 = "Кликните левой кнопкой по блоку, чтобы получить информацию" tool.debug.lore.2 = "как имя и значения урона блока" tool.debug.lore.3 = "Используйте //toggledebug чтобы переключить функциональность" tool.debug.disabled = "Инструмент отладки отключен. Используйте //toggledebug чтобы включить его" tool.debug.setenabled = "Инструмент отладки сейчас {%0}!" ; flood tool ui.flood.title = "Меню заливки" ui.flood.options.limit = "Максимум блоков" ui.flood.options.blocks = "Блоки" ui.flood.options.blocks.placeholder = "Блоки, разделенные точкой с запятой" ui.flood.options.label.infoapply = "Нажмите кнопку подтверждения, чтобы применить изменения" ; brush tool ui.brush.title = "Меню кистей" ui.brush.content = "Основное меню кистей" ui.brush.create = "Создать новую" ui.brush.getsession = "Взять кисть из сессии" ui.brush.edithand = "Редактировать кисть в руке" ; brush settings ui.brush.settings.title = "{%0} настройки кисти" ; brush options ui.brush.options.blocks = "Блоки" ui.brush.options.blocks.placeholder = "Пример: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Диаметр" ui.brush.options.width = "Ширина" ui.brush.options.height = "Высота" ui.brush.options.depth = "Глубина" ui.brush.options.flags = "Добавить флаги?" ; language ui.language.title = "Выбрать язык" ui.language.label = "Установите язык вашей сессии. Если ваш язык недоступен, вы можете перевести плагин на GitHub!" ui.language.dropdown = "Выберите язык" ================================================ FILE: resources/lang/slo.ini ================================================ ; Updated time : 31th 10 2019 language.name = "Slovak" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "príkazy" enabled = "povolené" disabled = "zablokovaný" confirmation = "Potvrdenie" confirmation.yes = "Áno" confirmation.no = "Nie" error = "Nastala chyba" error.command-error = "Vyzerá to, že vám chýba argument alebo ste použili príkaz nesprávne!" error.runingame = "Prosím spustite tento príkaz v hre!" error.limitexceeded = "Pokúšate sa upraviť príliš veľa blokov naraz. Znížte výber alebo zvýšte limit" error.notarget = "Nenašiel sa žiadny cieľový blok. Ak je to potrebné, zväčšite rozsah nástrojov pomocou //setrange" error.noselection = "Nenašiel sa žiadny výber - najskôr vyberte oblasť" error.selectioninvalid = "Výber nie je platný! Skontrolujte, či sú nastavené všetky polohy!" error.nosession = "Nebola vytvorená žiadna relácia - pravdepodobne žiadne povolenie na používanie {%0}" error.noclipboard = "Nenašla sa žiadna schránka - najprv si vytvorte schránku" warning.differentworld = "[VAROVANIE] Upravujete na úrovni, v ktorej sa momentálne nenachádzate!" ; commands command.info.title = "Informácie" command.limit.current = "Aktuálny limit: {%0}" command.limit.set = "Limit zmeny bloku bol nastavený na {%0}" command.setrange.current = "Aktuálny rozsah: {%0}" command.setrange.set = "Rozsah nástrojov bol nastavený na {%0}" command.biomeinfo.attarget = "Bióm v cieli" command.biomeinfo.atposition = "Bióm na pozícii" command.biomeinfo.result = "{%0} biómy nájdené vo výbere" command.biomeinfo.result.line = "ID: {%0} Meno: {%1}" command.biomelist.title = "Zoznam biómov" command.biomelist.result.line = "ID: {%0} Meno: {%1}" command.brushname.set = "Názov štetca je nastavený na \"{%0}\"" command.clearclipboard.cleared = "Schránky boli vymazané" command.flip.try = "Pokúšam sa otočiť schránku o {%0}" command.flip.success = "Schránka bola úspešne prevrátená" command.rotate.try = "Pokúšam sa otočiť schránku o {%0} stupňov" command.rotate.success = "Schránka bola úspešne otočená" command.history.cleared = "História vymazaná" command.listchunks.found = "{%0} kusy nájdené vo výbere" command.size = "Veľkosť výberu" ; selection selection.pos1.set = "Poloha 1 nastavená na X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Poloha 2 nastavená na X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Nič na vrátenie" session.undo.left = "Zostáva ti {%0} akcií na vrátenie" session.redo.none = "Nič na prerobenie" session.redo.left = "Zostáva ti {%0} akcií na prerobenie" session.brush.added = "Do relácie bolo pridané {%0}" session.brush.deleted = "Vymazané {%0} (UUID {%1})" session.brush.removed = "Odstránené {%0} (UUID {%1})" session.language.set = "Jazyk bol úspešne nastavený na {%0}" session.language.notfound = "Jazyk {%0} sa nenašiel, obnovuje sa predvolená hodnota" ; task task.copy.success = "Async Copy uspel, prevzal {%0}, skopíroval {%1} blokov z {%2}." task.count.success = "Analýza async bola úspešná trvala {%0}" task.count.result = "{%0} blokov nájdených v celkovo {%1} blokoch" task.fill.success = "Async Vyplň uspel, zabral {%0}, {%1} blokov z {%2} sa zmenilo." task.replace.success = "Async Vymeň uspel, zabral {%0}, {%1} blokov z {%2} sa zmenilo." task.revert.undo.success = "Async Vráť uspel, zabral {%0}, {%1} blokov z {%2} sa zmenilo." task.revert.redo.success = "Async Prerob uspel, zabral {%0}, {%1} blokov z {%2} sa zmenilo." ; flags flags.keepexistingblocks = "Zachovaj existujúce bloky" flags.keepair = "Zachovaj vzduch" flags.hollow = "Prázdny" flags.hollowclosed = "Duté so zatvorenými koncami" flags.natural = "Prírodné" ; tools ; wand tool tool.wand = "čarodejný prútik" tool.wand.lore.1 = "Kliknutím ľavým tlačidlom myši na blok nastavíte pozíciu 1 výberu" tool.wand.lore.2 = "Kliknutím pravým tlačidlom myši na blok nastavíte pozíciu 2 výberu" tool.wand.lore.3 = "Funkciu môžete prepínať pomocou //togglewand" tool.wand.disabled = "Nástroj čarodejný prútik je zakázaný. Použite //togglewand na jeho opätovné povolenie" tool.wand.setenabled = "Nástroj čarodejný prútik je teraz {%0}!" ; debug tool tool.debug = "Nástroj na odstraňovanie chýb" tool.debug.lore.1 = "Ak chcete získať informácie, kliknite ľavým tlačidlom na blok" tool.debug.lore.2 = "ako je názov a hodnoty poškodenia bloku" tool.debug.lore.3 = "Funkciu môžete prepínať pomocou //toggledebug" tool.debug.disabled = "Nástroj na odstraňovanie chýb je zakázaný. Použite //toggledebug na opätovné povolenie" tool.debug.setenabled = "Nástroj na odstraňovanie chýb je teraz {%0}!" ; flood tool ui.flood.title = "Ponuka výplne" ui.flood.options.limit = "Maximálny počet blokov" ui.flood.options.blocks = "Bloky" ui.flood.options.blocks.placeholder = "Bloky oddelené bodkočiarkami" ui.flood.options.label.infoapply = "Kliknite na tlačidlo "Submit" na použite" ; brush tool ui.brush.title = "Ponuka štetca" ui.brush.content = "Hlavná ponuka štetca" ui.brush.create = "Vytvor nový" ui.brush.getsession = "Získajte reláciu štetca" ui.brush.edithand = "Upravte štetec v ruke" ; brush settings ui.brush.settings.title = "{%0} nastavenie štetca" ; brush options ui.brush.options.blocks = "Bloky" ui.brush.options.blocks.placeholder = "Príklad: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Priemer" ui.brush.options.width = "šírka" ui.brush.options.height = "Výška" ui.brush.options.depth = "Hĺbka" ui.brush.options.flags = "Pridať vlajky?" ; language ui.language.title = "Výber jazyka" ui.language.label = "Nastavte jazyk relácie. Ak váš jazyk nie je k dispozícii, môžete preložiť doplnok na GitHub-e!" ui.language.dropdown = "Zvoľ jazyk" ================================================ FILE: resources/lang/swa.ini ================================================ ; Muda wa kufanyiwa marekebisho : 28th 10 2018 language.name = "Swahili" ; ya kawaida divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "Kuna kitu kimeenda vibaya" noperm = "Huna ruhusa ya kutekeleza amri hii" runingame = "Tafadhali tekeleza amri hii ndani ya mchezo!" commands = "amri nyingi" ; user interfaces ui.confirmation = "Uthibitisho" ui.confirmation.yes = "Ndio" ui.confirmation.no = "Hapana" ; ui brush ui.brush.title = "Orodha ya brashi" ; ui brush select ui.brush.select.title = "Chagua aina ya brashi" ui.brush.select.type.sphere = "Nyanja" ui.brush.select.type.cylinder = "Silinda" ui.brush.select.type.cuboid = "Cuboid" ui.brush.select.type.clipboard = "Kipande cha ubao cha kuandikia maelezo" ; ui brush settings ui.brush.settings.title = "{%0} mipangilio ya brashi" ; ui brush options ui.brush.options.blocks = "Vitalu" ui.brush.options.blocks.placeholder = "Mfano: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Kipenyo" ui.brush.options.width = "Upana" ui.brush.options.height = "Urefu" ui.brush.options.depth = "Kina" ui.brush.options.flags = "Ongeza bendera?" ; ui flags ui.flags.keepexistingblocks = "Weka vitalu vilivyopo" ui.flags.keepair = "Weka upepo" ui.flags.hollow = "Mashimo" ui.flags.natural = "Asili" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "Orodha ya mafuriko" ui.flood.options.limit = "Vitalu vingi" ui.flood.options.blocks = "Vitalu" ui.flood.options.blocks.placeholder = "Vitalu vilivyo tenganishwa na semicoloni" ui.flood.options.label.infoapply = "Bonyeza kitufe cha "Tuma" kuomba" ================================================ FILE: resources/lang/swe.ini ================================================ ; Updated time : 26th 07 2017 language.name = "Swedish" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "kommandon" enabled = "På" disabled = "Av" confirmation = "Bekräfta" confirmation.yes = "Yes" confirmation.no = "No" ; errors error = "Ett fel uppstod" error.command-error = "Det verkar som att du saknar ett argument eller använder komandot fel!" error.runingame = "Var snäll att köra detta kommando in-game!" error.limitexceeded = "Du försöker ändra för många block samtidigt. Minska valet eller öka gränsen." error.notarget = "Inget målblock hittat. Öka det effektiva avståndet med //setrange om du behöver" error.noselection = "Ingen markering hittad - välj en area först" error.selectioninvalid = "Markeringen är inte giltig! Kolla så att alla positioner är satta!" error.nosession = "Ingen session skapad - förmodeligen saknas rättigheter att använda {%0}" error.noclipboard = "Inget urklipp funnet - skapa ett urklipp först" warning.differentworld = "[VARNING] Du editerar en level som du inte är i för tillfället!" ; commands command.info.title = "Information" command.limit.current = "Nuvarande gräns: {%0}" command.limit.set = "Block change limit satt till {%0}" command.setrange.current = "Nuvarande nivå: {%0}" command.setrange.set = "Tool range satt till {%0}" command.biomeinfo.attarget = "Biome vid mål" command.biomeinfo.atposition = "Biome vid position" command.biomeinfo.result = "{%0} biomes hittade in markering" command.biomeinfo.result.line = "ID: {%0} Namn: {%1}" command.biomelist.title = "Biome lista" command.biomelist.result.line = "ID: {%0} Namn: {%1}" command.brushname.set = "Penselnamn satt till \"{%0}\"" command.clearclipboard.cleared = "Urklipps rensat" command.flip.try = "Försöker spegla urklipp med {%0}" command.flip.success = "Urklipp har speglats" command.rotate.try = "Försöker rotera urklipp med {%0} grader" command.rotate.success = "Urklipp har roterats" command.history.cleared = "Historik rensat" command.listchunks.found = "{%0} delar hittade i urvalet" command.size = "Markeringsstorlek" ; selection selection.pos1.set = "Position 1 satt till X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "Position 2 satt till X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "Det finns inget att ångra" session.undo.left = "Du kan ångra {%0} fler gånger" session.redo.none = "Inget att återskapa" session.redo.left = "Du kan återskapa {%0} fler gånger" session.brush.added = "Lade till {%0} till sessionen" session.brush.deleted = "Raderade {%0} (UUID {%1})" session.brush.removed = "Tog bort {%0} (UUID {%1})" session.language.set = "Språk satt till {%0}" session.language.notfound = "Språk {%0} inte hittat, återställer till standard!" ; task task.copy.success = "Async Kopiering lyckades, tog {%0}, kopierade {%1} block av {%2} totalt." task.count.success = "Async Analysering lyckades, tog {%0}" task.count.result = "{%0} block hittade av totalt {%1} block" task.fill.success = "Async Fyll lyckades, tog {%0}, {%1} block av {%2} ändrade." task.replace.success = "Async Ersätta lyckades, tog {%0}, {%1} block av {%2} ändrade." task.revert.undo.success = "Async Ånga lyckades, tog {%0}, {%1} block av {%2} ändrade." task.revert.redo.success = "Async Återskapa lyckades, tog {%0}, {%1} block av {%2} ändrade." ; flags flags.keepexistingblocks = "Behåll existerande block" flags.keepair = "Behåller luft" flags.hollow = "Ihåligt" flags.hollowclosed = "Ihåligt med stängda ändar" flags.natural = "Neutral" ; tools ; wand tool tool.wand = "Trollspö" tool.wand.lore.1 = "Vänsterklicka på ett block för att sätta position 1 av markering" tool.wand.lore.2 = "Högerklicka på ett block för att sätta position 2 av markering" tool.wand.lore.3 = "Använd //togglewand för att aktivera funktionaliteten" tool.wand.disabled = "Trollspöet är avaktiverat. Använd //togglewand för att aktivera" tool.wand.setenabled = "Trolspöet är nu {%0}!" ; debug tool tool.debug = "Debugverktyg" tool.debug.lore.1 = "Vänsterklicka för att få information" tool.debug.lore.2 = "som namn och skada på block" tool.debug.lore.3 = "Använd //toggledebug för att aktivera funktionaliteten" tool.debug.disabled = "Debugverktyget är avaktiverat. Använd //toggledebug för att aktivera" tool.debug.setenabled = "Debugverktyget är nu {%0}!" ; flood tool ui.flood.title = "Fyllmeny" ui.flood.options.limit = "Max block" ui.flood.options.blocks = "Block" ui.flood.options.blocks.placeholder = "Block separerade med semikolon" ui.flood.options.label.infoapply = "Klicka på "Submit" knappen för att använda" ; brush tool ui.brush.title = "Penselmeny" ui.brush.content = "Pensel huvudmeny" ui.brush.create = "Skapa ny" ui.brush.getsession = "Hämta sessionpensel" ui.brush.edithand = "Ändra pensel i handen" ; brush settings ui.brush.settings.title = "{%0} penselinställningar" ; brush options ui.brush.options.blocks = "Block" ui.brush.options.blocks.placeholder = "Exempel: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diameter" ui.brush.options.width = "Bredd" ui.brush.options.height = "Höjd" ui.brush.options.depth = "Djup" ui.brush.options.flags = "Lägg till flaggor?" ; language ui.language.title = "Välj språk" ui.language.label = "Välj språk för din session. Om ditt språk inte finns, kan du översätta det på GitHub!" ui.language.dropdown = "Välj ett språk" ================================================ FILE: resources/lang/tgl.ini ================================================ ; Updated time : 30th 10 2018 language.name = "Tagalog" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " error = "May sumablay." noperm = "Wala po kayong pahintulot na gawin ito" runingame = "Gawin ito sa loob lamang ng laro!" commands = "Mga Utos" ; user interfaces ui.confirmation = "Mga Tugon" ui.confirmation.yes = "Oo" ui.confirmation.no = "Hindi" ; ui brush ui.brush.title = "Mga Burutsa" ; ui brush select ui.brush.select.title = "Mamili ng uri ng burutsa" ui.brush.select.type.sphere = "Bola" ui.brush.select.type.cylinder = "Lata" ui.brush.select.type.cuboid = "Kahon" ui.brush.select.type.clipboard = "Clipboard" ; ui brush settings ui.brush.settings.title = "{%0} mga setting ng burutsa" ; ui brush options ui.brush.options.blocks = "Mga Bloke" ui.brush.options.blocks.placeholder = "Halimbawa: 1:1,2,tnt,log:12" ui.brush.options.diameter = "Diameter" ui.brush.options.width = "Lapad" ui.brush.options.height = "Taas" ui.brush.options.depth = "Lalim" ui.brush.options.flags = "Magdagdag ng mga flags?" ; ui flags ui.flags.keepexistingblocks = "Hayaan lamang ang mga bloke" ui.flags.keepair = "Keep air" ui.flags.hollow = "Walang laman" ui.flags.natural = "Natural" ; ui brush sphere ; ui brush cylinder ; ui brush cuboid ; ui brush clipboard ; ui flood ui.flood.title = "Menu sa pagpapadaloy/baha" ui.flood.options.limit = "Sagad na dami ng mga bloke" ui.flood.options.blocks = "Bloke" ui.flood.options.blocks.placeholder = "Tuldok-kuwit ang taga-hiwalay ng mga bloke" ui.flood.options.label.infoapply = "I-klik ang "Submit" na buton para i-apply" ================================================ FILE: resources/lang/tha.ini ================================================ ; Updated time : 26th 09 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name = "Thai" ; general divider = "========================================" spacer = " -=+=- {%0} -=+=- " commands = "คำสั่ง" enabled = "เปิดใช้งาน" disabled = "ปิดใช้งาน" confirmation = "การยืนยัน" confirmation.yes = "ใช่" confirmation.no = "ไม่" ; errors error = "มีข้อผิดพลาดเกิดขึ้น" error.command-error = "ดูเหมือนค่าตัวแปรจะหายไปหรือคุณใช้คำสั่งไม่ถูกต้อง!" error.runingame = "โปรดใช้คำสั่งนี้ในเกมเท่านั้น!" error.limitexceeded = "คุณพยายามแก้ไขบล็อกในจำนวนมากเกินไป ลดจำนวนที่เลือกลงหรือเพิ่มจำนวนจำกัด" error.notarget = "ไม่มีบล็อกเป้าหมายให้เลือก. เพิ่มระยะอุปกรณ์ด้วยคำสั่ง //setrange ถ้าต้องการ" error.noselection = "ไม่มีการเลือก - เลือกพื้นที่ก่อน" error.selectioninvalid = "การเลือกไม่ถูกต้อง! ตรวจสอบตำแหน่งทั้งหมดอีกครั้ง!" error.nosession = "ไม่มีเซสชั่นสร้างขึ้น - อาจเป็นเพราะไม่มีสิทธิ์ในการใช้ {%0}" error.noclipboard = "ไม่พบคลิปบอร์ด - สร้างคลิปบอร์ดก่อน" warning.differentworld = "[คำเตือน] คุณกำลังแก้ไขเลเวลที่คุณไม่ได้อยู่!" ; commands command.info.title = "ข้อมูล" command.limit.current = "จำนวนจำกัดปัจจุบัน: {%0}" command.limit.set = "จำนวนจำกัดการแก้ไขบล็อกถูกตั้งเป็น {%0}" command.setrange.current = "ระยะปัจจุบัน: {%0}" command.setrange.set = "ระยะอุปกรณ์ถูกตั้งเป็น {%0}" command.biomeinfo.attarget = "Biome ที่เป้าหมาย" command.biomeinfo.atposition = "Biome ที่ตำแหน่ง" command.biomeinfo.result = "พบ {%0} biomes ในการเลือก" command.biomeinfo.result.line = "ไอดี: {%0} ชื่อ: {%1}" command.biomelist.title = "ลิสของ Biome" command.biomelist.result.line = "ไอดี: {%0} ชื่อ: {%1}" command.brushname.set = "ชื่อแปรงถูกตั้งเป็น \"{%0}\"" command.clearclipboard.cleared = "คลิปบอร์ดถูกล้าง" command.flip.try = "พยายามที่จะพลิกคลิปบอร์ดโดย {%0}" command.flip.success = "คลิปบอร์ดถูกพลิกเรียบร้อย" command.rotate.try = "พยายามที่จะหมุนคลิปบอร์ด {%0} องศา" command.rotate.success = "คลิปบอร์ดถูกหมุนเรียบร้อย" command.history.cleared = "ประวัติถูกล้าง" command.listchunks.found = "พบ {%0} chunks ในการเลือก" command.size = "ขนาดการเลือก" ; selection selection.pos1.set = "ตำแหน่งที่ 1 ตั้งเป็น X: {%0} Y: {%1} Z: {%2}" selection.pos2.set = "ตำแหน่งที่ 2 ตั้งเป็น X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none = "ไม่มีอะไรให้ย้อนกลับ" session.undo.left = "คุณมีคำสั่งย้อนกลับเหลือ {%0}" session.redo.none = "ไม่มีอะไรให้ทำใหม่" session.redo.left = "คุณมีคำสั่งให้ทำใหม่เหลือ {%0}" session.brush.added = "เพิ่ม {%0} เข้าเซสชั่น" session.brush.deleted = "ลบ {%0} (UUID {%1})" session.brush.removed = "นำออก {%0} (UUID {%1})" session.language.set = "เปลี่ยนภาษาเป็น {%0} เรียบร้อย" session.language.notfound = "ไม่พบภาษา {%0} ปรับกลับเป็นค่าเริ่มต้น" ; task task.copy.success = "คัดลอกสำเร็จ, ใช้เวลา {%0}, คัดลอก {%1} บล็อกจากทั้งหมด {%2}" task.count.success = "วิเคราะห์สำเร็จ, ใช้เวลา {%0}" task.count.result = "พบ {%0} บล็อกจากทั้งหมด {%1} บล็อก" task.fill.success = "เติมเต็มสำเร็จ, ใช้เวลา {%0}, เปลี่ยน {%1} บล็อกจากทั้งหมด {%2}" task.replace.success = "วางทับสำเร็จ ใช้เวลา {%0}, เปลี่ยน {%1} บล็อกจากทั้งหมด {%2}" task.revert.undo.success = "ย้อนกลับสำเร็จ, ใช้เวลา {%0}, เปลี่ยน {%1} บล็อกจากทั้งหมด {%2}" task.revert.redo.success = "ทำใหม่สำเร็จ, ใช้เวลา {%0}, เปลี่ยน {%1} บล็อกจากทั้งหมด {%2}" ; flags flags.keepexistingblocks = "เก็บบล็อกที่มีอยู่ไว้" flags.keepair = "เก็บอากาศ" flags.hollow = "โพรง" flags.hollowclosed = "โพรงที่มีทางออกปิด" flags.natural = "ตามธรรมชาติ" ; tools ; wand tool tool.wand = "คทา" tool.wand.lore.1 = "คลิกซ้ายที่บล็อกเพื่อตั้งตำแหน่งที่ 1 ของการเลือก" tool.wand.lore.2 = "คลิกขวาที่บล็อกเพื่อตั้งตำแหน่งที่ 2 ของการเลือก" tool.wand.lore.3 = "ใช้คำสั่ง //togglewand เพื่อสลับการทำงานของคทา" tool.wand.disabled = "คทาถูกปิดใช้งาน ใช้คำสั่ง //togglewand เพื่อเปิดใช้งาน" tool.wand.setenabled = "คทาได้ถูก{%0}!" ; debug tool tool.debug = "เครื่องมือ Debug" tool.debug.lore.1 = "คลิกซ้ายที่บล็อกเพื่อดูข้อมูล" tool.debug.lore.2 = "เช่นดูชื่อหรือค่าความเสียหายของบล็อก" tool.debug.lore.3 = "ใช้คำสั่ง //toggledebug เพื่อสลับการทำงานของเครื่องมือ" tool.debug.disabled = "เครื่องมือ Debug ถูกปิดใช้งาน ใช้คำสั่ง //toggledebug เพื่อเปิดใช้งาน" tool.debug.setenabled = "เครื่องมือ Debug ถูก{%0}!" ; flood tool ui.flood.title = "เมนู Flood" ui.flood.options.limit = "จำนวนบล็อกที่มากที่สุด" ui.flood.options.blocks = "บล็อก" ui.flood.options.blocks.placeholder = "บล็อกที่แยกด้วย ;" ui.flood.options.label.infoapply = "กดปุ่ม "Submit" เพื่อนำมาใช้" ; brush tool ui.brush.title = "เมนูแปรง" ui.brush.content = "เมนูแปรงหลัก" ui.brush.create = "สร้างใหม่" ui.brush.getsession = "เรียกเซสชั่นแปรง" ui.brush.edithand = "แก้ไขแปรงในมือ" ; brush settings ui.brush.settings.title = "การตั้งค่าแปรง {%0}" ; brush options ui.brush.options.blocks = "บล็อก" ui.brush.options.blocks.placeholder = "ตัวอย่าง: 1:1,2,tnt,log:12" ui.brush.options.diameter = "เส้นผ่าศูนย์กลาง" ui.brush.options.width = "กว้าง" ui.brush.options.height = "สูง" ui.brush.options.depth = "ลึก" ui.brush.options.flags = "เพิ่มตัวเลือก?" ; language ui.language.title = "เลือกภาษา" ui.language.label = "ตั้งค่าภาษาของเซสชั่นของคุณ ถ้าไม่มีภาษาของคุณ คุณสามารถช่วยแปลปลั๊กอินนี้ได้ที่ GitHub!" ui.language.dropdown = "เลือกภาษา" ================================================ FILE: resources/lang/zho.ini ================================================ ; Updated time : 3rd 10 2019 ; See: https://www.loc.gov/standards/iso639-2/php/English_list.php language.name="Simplified Chinese" ; general divider="========================================" spacer="-=+=- {%0} -=+=-" commands="命令" enabled="已启用" disabled="已禁用" confirmation="确认" confirmation.yes="是" confirmation.no="否" ; errors error="发生了一个错误" error.command-error="看起来您缺少参数或使用了错误的命令!" error.runingame="请在游戏中运行这个命令!" error.limitexceeded="您正在尝试修改的方块太多了。减少选择的方块或提高限制" error.notarget="找不到目标方块。如果需要,使用//setrange增加工具范围" error.noselection="找不到选中 - 请先选中一个范围" error.selectioninvalid="选中范围无效!检查是否已设置所有位置!" error.nosession="为创建会话 - 可能没有使用{%0}的权限" error.noclipboard = "找不到剪贴板 - 请先创建一个剪贴板" warning.differentworld = "[警告] 您的编辑不处于您目前所在世界!" ; commands command.info.title="信息" command.limit.current="目前极限:{%0}" command.limit.set="方块变更限制已被设置为{%0}" command.setrange.current="目前范围:{%0}" command.setrange.set="工具范围已被设置为 {%0}" command.biomeinfo.attarget="目标的生物群系" command.biomeinfo.atposition="坐标的生物群系" command.biomeinfo.result="在选中范围中找到了{%0}个生物群系" command.biomeinfo.result.line="ID: {%0} 名称: {%1}" command.biomelist.title="生物群系列表" command.biomelist.result.line="ID: {%0} 名称: {%1}" command.brushname.set="画笔名称设置为“{%0}”" command.clearclipboard.cleared="已清空剪贴板" command.flip.try="尝试翻转剪贴板到{%0}" command.flip.success="成功翻转剪贴板" command.rotate.try="尝试旋转剪贴板到{%0}度" command.rotate.success="成功旋转剪贴板" command.history.cleared="已清空历史" command.listchunks.found="在选中范围内找到了{%0}个区块" command.size="选中尺寸" ; selection selection.pos1.set="设置坐标1为 X: {%0} Y: {%1} Z: {%2}" selection.pos2.set="设置坐标2为 X: {%0} Y: {%1} Z: {%2}" ; session session.undo.none="没有可撤销的操作" session.undo.left="你还可以进行 {%0}个撤销操作" session.redo.none="没有可重做的操作" session.redo.left="你还可以进行{%0}个重做操作" session.brush.added="已添加{%0}到会话" session.brush.deleted="已删除 {%0} (UUID {%1})" session.brush.removed="已移除 {%0} (UUID {%1})" session.language.set="成功将设置语言为{%0}" session.language.notfound="找不到语言“{%0}”,重置为默认" ; task task.copy.success="异步复制成功,耗时{%0},从{%2}个方块中复制了{%1}个。" task.count.success="异步分析成功,耗时{%0}" task.count.result="在{%1}个方块中找到了{%0}个方块" task.fill.success="异步填充成功,耗时{%0},在{%2}个方块中修改了{%1}个。" task.replace.success="异步填充成功,耗时{%0},在{%2}个方块中修改了{%1}个。" task.revert.undo.success="异步撤销成功,耗时{%0},在{%2}个方块中修改了{%1}个。" task.revert.redo.success="异步重做成功,耗时{%0},在{%2}个方块中修改了{%1}个。" ; flags flags.keepexistingblocks="保留现存方块" flags.keepair="保留空气" flags.hollow="中空" flags.hollowclosed="中空,两端封闭" flags.natural="自然" ; tools ; wand tool tool.wand="魔杖" tool.wand.lore.1="左键一个方块来设置选中的坐标1" tool.wand.lore.2="右键一个方块来设置选中的坐标2" tool.wand.lore.3="使用//togglewand来切换功能" tool.wand.disabled="魔杖工具已禁用。使用//togglewand来重新启用它" tool.wand.setenabled="魔杖已{%0}!" ; debug tool tool.debug="故障排除工具" tool.debug.lore.1="左键一个方块以获取信息" tool.debug.lore.2="例如方块的名称和损耗值" tool.debug.lore.3="使用//toggledebug切换其功能" tool.debug.disabled="故障排除工具已禁用。使用//toggledebug来重新启用它" tool.debug.setenabled = "故障排除工具已{%0}!" ; flood tool ui.flood.title="覆盖菜单" ui.flood.options.limit="最大方块数" ui.flood.options.blocks="方块" ui.flood.options.blocks.placeholder="用分号分隔的方块" ui.flood.options.label.infoapply="点击“Submit”按键来应用" ; brush tool ui.brush.title="画笔菜单" ui.brush.content="画笔主菜单" ui.brush.create="新建" ui.brush.getsession="获取会话的笔刷" ui.brush.edithand="编辑手中的画笔" ; brush settings ui.brush.settings.title="{%0}画笔设置" ; brush options ui.brush.options.blocks="方块" ui.brush.options.blocks.placeholder="例子:1:1,2,tnt,log:12" ui.brush.options.diameter="半径" ui.brush.options.width="宽" ui.brush.options.height="高" ui.brush.options.depth="深" ui.brush.options.flags="添加标志?" ; language ui.language.title="选择语言" ui.language.label="设置你会话的语言。如果你的语言不可用,你可以在GitHub上翻译这个插件!" ui.language.dropdown="选择一个语言" ================================================ FILE: resources/parsepoggit.php ================================================ sendMessage(TF::RED . "New blocks is empty!"); return false; } try { $limit = Loader::getInstance()->getConfig()->get("limit", -1); if ($limit !== -1 && $selection->getShape()->getTotalCount() > $limit) { throw new LimitExceededException($session->getLanguage()->translateString('error.limitexceeded')); } if ($session instanceof UserSession) { $player = $session->getPlayer(); /** @var Player $player */ $session->getBossBar()->showTo([$player]); } Server::getInstance()->getAsyncPool()->submitTask(new AsyncFillTask($session->getUUID(), $selection, $selection->getShape()->getTouchedChunks($selection->getWorld()), $newblocks, $flags)); } catch (Exception $e) { $session->sendMessage($e->getMessage()); Loader::getInstance()->getLogger()->logException($e); return false; } return true; } /** * @param Selection $selection * @param Session $session * @param Block[] $oldBlocks * @param Block[] $newBlocks * @param int $flags * @return bool */ public static function replaceAsync(Selection $selection, Session $session, $oldBlocks = [], $newBlocks = [], int $flags = self::FLAG_BASE): bool { if (empty($oldBlocks)) $session->sendMessage(TF::RED . "Old blocks is empty!"); if (empty($newBlocks)) $session->sendMessage(TF::RED . "New blocks is empty!"); if (empty($oldBlocks) || empty($newBlocks)) return false; try { $limit = Loader::getInstance()->getConfig()->get("limit", -1); if ($limit !== -1 && $selection->getShape()->getTotalCount() > $limit) { throw new LimitExceededException($session->getLanguage()->translateString('error.limitexceeded')); } if ($session instanceof UserSession) { $player = $session->getPlayer(); /** @var Player $player */ $session->getBossBar()->showTo([$player]); } Server::getInstance()->getAsyncPool()->submitTask(new AsyncReplaceTask($session->getUUID(), $selection, $selection->getShape()->getTouchedChunks($selection->getWorld()), $oldBlocks, $newBlocks, $flags)); } catch (Exception $e) { $session->sendMessage($e->getMessage()); Loader::getInstance()->getLogger()->logException($e); return false; } return true; } /** * @param Selection $selection * @param Session $session * @param int $flags * @return bool */ public static function copyAsync(Selection $selection, Session $session, int $flags = self::FLAG_BASE): bool { #return false; try { $limit = Loader::getInstance()->getConfig()->get("limit", -1); if ($limit !== -1 && $selection->getShape()->getTotalCount() > $limit) { throw new LimitExceededException($session->getLanguage()->translateString('error.limitexceeded')); } //TODO check/edit how relative position works $offset = new Vector3(0, 0, 0); if ($session instanceof UserSession) { /** @var Player $player */ $player = $session->getPlayer(); /*if (!self::hasFlag($flags, self::FLAG_POSITION_RELATIVE)*///TODO relative or not by flags $offset = $selection->getShape()->getMinVec3()->subtractVector($player->getPosition()->asVector3()->floor())->floor();//TODO figure out wrong offset $session->getBossBar()->showTo([$player]); } #var_dump($selection->getShape()->getMinVec3(), $session->getPlayer()->asVector3(), $selection->getShape()->getMinVec3()->subtract($session->getPlayer()), $offset); Server::getInstance()->getAsyncPool()->submitTask(new AsyncCopyTask($session->getUUID(), $selection, $offset, $selection->getShape()->getTouchedChunks($selection->getWorld()), $flags)); } catch (Exception $e) { $session->sendMessage($e->getMessage()); Loader::getInstance()->getLogger()->logException($e); return false; } return true; } /** * TODO: flag parsing, Position to paste at * @param SingleClipboard $clipboard TODO should this be Clipboard? * @param Session $session * @param Position $target CURRENTLY SENDER POSITION * @param int $flags * @return bool * @throws AssumptionFailedError */ public static function pasteAsync(SingleClipboard $clipboard, Session $session, Position $target, int $flags = self::FLAG_BASE): bool { #return false; try { $limit = Loader::getInstance()->getConfig()->get("limit", -1); if ($limit !== -1 && $clipboard->getTotalCount() > $limit) { throw new LimitExceededException($session->getLanguage()->translateString('error.limitexceeded')); } #$c = $clipboard->getCenter(); #$clipboard->setCenter($target->asVector3());//TODO check if ($session instanceof UserSession) { $player = $session->getPlayer(); /** @var Player $player */ $session->getBossBar()->showTo([$player]); } $start = clone $target->asVector3()->floor()->addVector($clipboard->position)->floor();//start pos of paste//TODO if using rotate, this fails $end = $start->addVector($clipboard->selection->getShape()->getMaxVec3()->subtractVector($clipboard->selection->getShape()->getMinVec3()));//add size $aabb = new AxisAlignedBB($start->getFloorX(), $start->getFloorY(), $start->getFloorZ(), $end->getFloorX(), $end->getFloorY(), $end->getFloorZ());//create paste aabb $shape = clone $clipboard->selection->getShape();//needed $shape->setPasteVector($target->asVector3()->floor());//needed $clipboard->selection->setShape($shape);//needed $touchedChunks = self::getAABBTouchedChunksTemp($target->getWorld(), $aabb);//TODO clean up or move somewhere else. Better not touch, it works. Server::getInstance()->getAsyncPool()->submitTask(new AsyncPasteTask($session->getUUID(), $clipboard->selection, $touchedChunks, $clipboard)); } catch (Exception $e) { $session->sendMessage($e->getMessage()); Loader::getInstance()->getLogger()->logException($e); return false; } return true; } /** * @param ChunkManager $manager * @param AxisAlignedBB $aabb * @return string[] */ private static function getAABBTouchedChunksTemp(ChunkManager $manager, AxisAlignedBB $aabb): array { $maxX = $aabb->maxX >> 4; $minX = $aabb->minX >> 4; $maxZ = $aabb->maxZ >> 4; $minZ = $aabb->minZ >> 4; $touchedChunks = []; for ($x = $minX; $x <= $maxX; $x++) { for ($z = $minZ; $z <= $maxZ; $z++) { $chunk = $manager->getChunk($x, $z); if ($chunk === null) { continue; } print __METHOD__ . " Touched Chunk at: $x:$z" . PHP_EOL; $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } } print __METHOD__ . " Touched chunks count: " . count($touchedChunks) . PHP_EOL; return $touchedChunks; } /** * @param Selection $selection * @param Session $session * @param Block[] $filterBlocks * @param int $flags * @return bool */ public static function countAsync(Selection $selection, Session $session, array $filterBlocks, int $flags = self::FLAG_BASE): bool { try { $limit = Loader::getInstance()->getConfig()->get("limit", -1); if ($limit !== -1 && $selection->getShape()->getTotalCount() > $limit) { throw new LimitExceededException("You are trying to count too many blocks at once. Reduce the selection or raise the limit"); } Server::getInstance()->getAsyncPool()->submitTask(new AsyncCountTask($session->getUUID(), $selection, $selection->getShape()->getTouchedChunks($selection->getWorld()), $filterBlocks, $flags)); } catch (Exception $e) { $session->sendMessage($e->getMessage()); Loader::getInstance()->getLogger()->logException($e); return false; } return true; } /** * @param Selection $selection * @param Session $session * @param int $biomeId * @return bool */ public static function setBiomeAsync(Selection $selection, Session $session, int $biomeId): bool { try { $limit = Loader::getInstance()->getConfig()->get("limit", -1); if ($limit !== -1 && $selection->getShape()->getTotalCount() > $limit) { throw new LimitExceededException($session->getLanguage()->translateString('error.limitexceeded')); } if ($session instanceof UserSession) { $player = $session->getPlayer(); /** @var Player $player */ $session->getBossBar()->showTo([$player]); } Server::getInstance()->getAsyncPool()->submitTask(new AsyncActionTask($session->getUUID(), $selection, new SetBiomeAction($biomeId), $selection->getShape()->getTouchedChunks($selection->getWorld()))); } catch (Exception $e) { $session->sendMessage($e->getMessage()); Loader::getInstance()->getLogger()->logException($e); return false; } return true; } /** * Creates a brush at a specific location with the passed settings * @param Block $target * @param Brush $brush * @param Session $session * @throws InvalidArgumentException * @throws RuntimeException * @throws AssumptionFailedError * @throws Exception * @throws Exception * @throws Exception */ public static function createBrush(Block $target, Brush $brush, Session $session): void { $shapeClass = $brush->properties->shape; /** @var Shape $shape */ $shape = new $shapeClass($target->getPos()->asVector3(), ...array_values($brush->properties->shapeProperties)); $selection = new Selection($session->getUUID(), $target->getPos()->getWorld()); $selection->setShape($shape); $actionClass = $brush->properties->action; //TODO remove hack if ($actionClass === SetBiomeAction::class) $brush->properties->actionProperties["biomeId"] = $brush->properties->biomeId; /** @var TaskAction $action */ $action = new $actionClass(...array_values($brush->properties->actionProperties)); $action->prefix = "Brush"; Server::getInstance()->getAsyncPool()->submitTask(new AsyncActionTask($session->getUUID(), $selection, $action, $selection->getShape()->getTouchedChunks($selection->getWorld()), $brush->properties->blocks, $brush->properties->filter)); } /** * @param Block $target * @param CompoundTag $settings * @param Session $session * @param int $flags * @return bool */ public static function floodArea(Block $target, CompoundTag $settings, Session $session, int $flags = self::FLAG_BASE): bool { //TODO if (!$settings instanceof CompoundTag) return false; $session->sendMessage(TF::RED . "TEMPORARILY DISABLED!"); return false;/* $shape = ShapeRegistry::getShape($target->getWorld(), ShapeRegistry::TYPE_FLOOD, self::compoundToArray($settings)); $shape->setCenter($target->asVector3());//TODO fix the offset?: if you have a uneven number, the center actually is between 2 blocks $messages = []; $error = false; return self::fillAsync($shape, $session, self::blockParser($shape->options['blocks'], $messages, $error), $flags);*/ } /// SCHEMATIC RELATED API PART /** * @return Clipboard[] */ public static function getSchematics(): array { return self::$schematics; } /** * @param Clipboard[] $schematics */ public static function setSchematics(array $schematics): void { self::$schematics = $schematics; } /* HELPER FUNCTIONS API PART */ /** * Parses String representations of flags into an integer with flags applied * @param string[] $flags An array containing string representations of the flags * @return int * @throws RuntimeException */ public static function flagParser(array $flags): int { $flagmeta = self::FLAG_BASE; foreach ($flags as $flag) { switch ($flag) { case "-keepblocks": $flagmeta ^= self::FLAG_BASE << self::FLAG_KEEP_BLOCKS; break; case "-keepair": $flagmeta ^= self::FLAG_BASE << self::FLAG_KEEP_AIR; break; case "-a": $flagmeta ^= self::FLAG_BASE << self::FLAG_PASTE_WITHOUT_AIR; break; case "-h": $flagmeta ^= self::FLAG_BASE << self::FLAG_HOLLOW; break; case "-hc": $flagmeta ^= self::FLAG_BASE << self::FLAG_HOLLOW_CLOSED; break; case "-n": $flagmeta ^= self::FLAG_BASE << self::FLAG_NATURAL; break; case "-p": $flagmeta ^= self::FLAG_BASE << self::FLAG_POSITION_RELATIVE; break; case "-v": $flagmeta ^= self::FLAG_BASE << self::FLAG_VARIANT; break; case "-m": $flagmeta ^= self::FLAG_BASE << self::FLAG_KEEP_META; break; default: Server::getInstance()->getLogger()->warning("The flag $flag is unknown"); } } return $flagmeta; } /** * Checks if $flags has the specified flag $check * @param int $flags The return value of flagParser * @param int $check The flag to check * @return bool */ public static function hasFlag(int $flags, int $check): bool { return ($flags & (self::FLAG_BASE << $check)) > 0; } /** * More fail proof method of parsing a string to a Block * @param string $fullstring * @param array $messages * @param bool $error * @return Block[] * @throws RuntimeException * @throws InvalidArgumentException * @throws InvalidBlockStateException */ public static function blockParser(string $fullstring, array &$messages, bool &$error): array { BlockFactory::getInstance(); $blocks = BlockStatesParser::getInstance()::fromString($fullstring, true); foreach ($blocks as $block) { if ($block instanceof UnknownBlock) { $messages[] = TF::GOLD . $block . " is an unknown block"; } } return $blocks; } /** * Evaluate mathematics in a string * https://stackoverflow.com/a/54684348/4532380 * @param string $str * @return float|int * @throws CalculationException */ public static function evalAsMath(string $str) { $error = false; $div_mul = false; $add_sub = false; $result = 0; $str = preg_replace('/[^\d.+\-*\/]/', '', $str); $str = rtrim(trim($str, '/*+'), '-'); if ((strpos($str, '/') !== false || strpos($str, '*') !== false)) { $div_mul = true; $operators = ['*', '/']; while (!$error && !empty($operators)) { $operator = array_pop($operators); while ($operator !== null && strpos($str, $operator) !== false) { $regex = '/([\d\.]+)\\' . $operator . '(\-?[\d\.]+)/'; preg_match($regex, $str, $matches); if (isset($matches[1], $matches[2])) { //if ($operator === '+') $result = (float)$matches[1] + (float)$matches[2]; //if ($operator === '-') $result = (float)$matches[1] - (float)$matches[2]; if ($operator === '*') $result = (float)$matches[1] * (float)$matches[2]; if ($operator === '/') { if ((float)$matches[2]) { $result = (float)$matches[1] / (float)$matches[2]; } else { $error = true; } } $str = preg_replace($regex, (string)$result, $str, 1); $str = str_replace(['++', '--', '-+', '+-'], ['+', '+', '-', '-'], $str); } else { $error = true; } } } } if (!$error && (strpos($str, '+') !== false || strpos($str, '-') !== false)) { $add_sub = true; preg_match_all('/([\d.]+|[+\-])/', $str, $matches); if (isset($matches[0])) { $result = 0; $operator = '+'; $tokens = $matches[0]; foreach ($tokens as $iValue) { if ($iValue === '+' || $iValue === '-') { $operator = $iValue; } else { $result = ($operator === '+') ? ($result + (float)$iValue) : ($result - (float)$iValue); } } } } if (!$error && !$div_mul && !$add_sub) { $result = (float)$str; } if ($error) throw new CalculationException("Expression contains an error"); return $result; } /** * Parses a CompoundTag into an array * @param CompoundTag $compoundTag * @return array */ public static function compoundToArray(CompoundTag $compoundTag): array { $a = []; foreach ($compoundTag->getValue() as $key => $value) { $a[$key] = $value; } return $a; #$nbt = new LittleEndianNbtSerializer(); #$treeRoot = new TreeRoot($compoundTag); #$buffer = $nbt->write($treeRoot); #return $treeRoot->getTag()->getValue();//TODO TEST PM4 } /** * This replicates the behaviour of Vector3::setComponents in PM3 * @param Block $block * @param int $x * @param int $y * @param int $z * @return Block */ public static function setComponents(Block $block, int $x, int $y, int $z): Block { [$block->getPos()->x, $block->getPos()->y, $block->getPos()->z] = [$x, $y, $z]; return $block; } } ================================================ FILE: src/xenialdan/MagicWE2/EventListener.php ================================================ owner = $plugin; } /** * @param PlayerJoinEvent $event * @throws AssumptionFailedError * @throws InvalidSkinException * @throws JsonException * @throws RuntimeException * @throws SessionException */ public function onLogin(PlayerJoinEvent $event): void { if ($event->getPlayer()->hasPermission("we.session")) { if (SessionHelper::hasSession($event->getPlayer()) && ($session = SessionHelper::getUserSession($event->getPlayer())) instanceof UserSession) { Loader::getInstance()->getLogger()->debug("Restored cached session for player {$session->getPlayer()->getName()}"); } else if (($session = SessionHelper::loadUserSession($event->getPlayer())) instanceof UserSession) { Loader::getInstance()->getLogger()->debug("Restored session from file for player {$session->getPlayer()->getName()}"); } else ($session = SessionHelper::createUserSession($event->getPlayer())); } } public function onSessionLoad(MWESessionLoadEvent $event): void { Loader::getInstance()->wailaBossBar->addPlayer($event->getPlayer()); if (Loader::hasScoreboard()) { try { if (($session = $event->getSession()) instanceof UserSession && $session->isSidebarEnabled()) /** @var UserSession $session */ $session->sidebar->handleScoreboard($session); } catch (InvalidArgumentException $e) { Loader::getInstance()->getLogger()->logException($e); } } } /** * @param PlayerQuitEvent $event * @throws SessionException * @throws JsonException */ public function onLogout(PlayerQuitEvent $event): void { if (($session = SessionHelper::getUserSession($event->getPlayer())) instanceof UserSession) { SessionHelper::destroySession($session); unset($session); } } /** * @param PlayerInteractEvent $event * @throws AssumptionFailedError * @throws Error */ public function onInteract(PlayerInteractEvent $event): void { try { switch ($event->getAction()) { case PlayerInteractEvent::RIGHT_CLICK_BLOCK: { $this->onRightClickBlock($event); break; } case PlayerInteractEvent::LEFT_CLICK_BLOCK: { $this->onLeftClickBlock($event); break; } } } catch (Exception $error) { $event->getPlayer()->sendMessage(Loader::PREFIX . TF::RED . "Interaction failed!"); $event->getPlayer()->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } /** * @param PlayerItemUseEvent $event * @throws AssumptionFailedError */ public function onItemRightClick(PlayerItemUseEvent $event): void { try { $this->onRightClickAir($event); } catch (Exception $error) { $event->getPlayer()->sendMessage(Loader::PREFIX . TF::RED . "Interaction failed!"); $event->getPlayer()->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } /** * @param BlockBreakEvent $event * @throws AssumptionFailedError * @throws Error */ public function onBreak(BlockBreakEvent $event): void { if (!is_null($event->getItem()->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE)) || !is_null($event->getItem()->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE_BRUSH))) { $event->cancel(); try { $this->onBreakBlock($event); } catch (Exception $error) { $event->getPlayer()->sendMessage(Loader::PREFIX . TF::RED . "Interaction failed!"); $event->getPlayer()->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } } /** * TODO use tool classes * @param BlockBreakEvent $event * @throws Error * @throws SessionException * @throws InvalidArgumentException * @throws AssumptionFailedError */ private function onBreakBlock(BlockBreakEvent $event): void { $session = SessionHelper::getUserSession($event->getPlayer()); if (!$session instanceof UserSession) return; switch ($event->getItem()->getId()) { case ItemIds::WOODEN_AXE: { if (!$session->isWandEnabled()) { $session->sendMessage(TF::RED . $session->getLanguage()->translateString("tool.wand.disabled")); break; } $selection = $session->getLatestSelection() ?? $session->addSelection(new Selection($session->getUUID(), $event->getBlock()->getPos()->getWorld())); // TODO check if the selection inside of the session updates if (is_null($selection)) { throw new Error("No selection created - Check the console for errors"); } $selection->setPos1(new Position($event->getBlock()->getPos()->x, $event->getBlock()->getPos()->y, $event->getBlock()->getPos()->z, $event->getBlock()->getPos()->getWorld())); break; } case ItemIds::STICK: { if (!$session->isDebugToolEnabled()) { $session->sendMessage(TF::RED . $session->getLanguage()->translateString("tool.debug.disabled")); break; } $event->getPlayer()->sendMessage($event->getBlock()->__toString() . ', variant: ' . $event->getBlock()->getIdInfo()->getVariant()); break; } } } /** * TODO use tool classes * @param PlayerInteractEvent $event * @throws Error * @throws InvalidStateException * @throws SessionException * @throws InvalidArgumentException * @throws AssumptionFailedError */ private function onRightClickBlock(PlayerInteractEvent $event): void { if (!is_null($event->getItem()->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE))) { $event->cancel(); $session = SessionHelper::getUserSession($event->getPlayer()); if (!$session instanceof UserSession) return; switch ($event->getItem()->getId()) { case ItemIds::WOODEN_AXE: { if (!$session->isWandEnabled()) { $session->sendMessage(TF::RED . $session->getLanguage()->translateString("tool.wand.disabled")); break; } $selection = $session->getLatestSelection() ?? $session->addSelection(new Selection($session->getUUID(), $event->getBlock()->getPos()->getWorld())); // TODO check if the selection inside of the session updates if (is_null($selection)) { throw new Error("No selection created - Check the console for errors"); } $selection->setPos2(new Position($event->getBlock()->getPos()->x, $event->getBlock()->getPos()->y, $event->getBlock()->getPos()->z, $event->getBlock()->getPos()->getWorld())); break; } case ItemIds::STICK: { if (!$session->isDebugToolEnabled()) { $session->sendMessage(TF::RED . $session->getLanguage()->translateString("tool.debug.disabled")); break; } $event->getPlayer()->sendMessage($event->getBlock()->__toString() . ', variant: ' . $event->getBlock()->getIdInfo()->getVariant()); break; } case ItemIds::BUCKET: { #if (){// && has perms API::floodArea($event->getBlock()->getSide($event->getFace()), $event->getItem()->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE), $session); #} break; } } } } /** * @param PlayerInteractEvent $event * @throws Error * @throws InvalidStateException * @throws SessionException * @throws InvalidArgumentException * @throws UnexpectedTagTypeException * @throws AssumptionFailedError */ private function onLeftClickBlock(PlayerInteractEvent $event): void { if (!is_null($event->getItem()->getNamedTag()->getTag(API::TAG_MAGIC_WE))) { $event->cancel(); $session = SessionHelper::getUserSession($event->getPlayer()); if (!$session instanceof UserSession) return; switch ($event->getItem()->getId()) { case ItemIds::WOODEN_AXE: { if (!$session->isWandEnabled()) { $session->sendMessage(TF::RED . $session->getLanguage()->translateString("tool.wand.disabled")); break; } $selection = $session->getLatestSelection() ?? $session->addSelection(new Selection($session->getUUID(), $event->getBlock()->getPos()->getWorld())); // TODO check if the selection inside of the session updates if (is_null($selection)) { throw new Error("No selection created - Check the console for errors"); } $selection->setPos1(new Position($event->getBlock()->getPos()->x, $event->getBlock()->getPos()->y, $event->getBlock()->getPos()->z, $event->getBlock()->getPos()->getWorld())); break; } case ItemIds::STICK: { if (!$session->isDebugToolEnabled()) { $session->sendMessage(TF::RED . $session->getLanguage()->translateString("tool.debug.disabled")); break; } $event->getPlayer()->sendMessage($event->getBlock()->__toString() . ', variant: ' . $event->getBlock()->getIdInfo()->getVariant()); break; } case ItemIds::BUCKET: { #if (){// && has perms API::floodArea($event->getBlock()->getSide($event->getFace()), $event->getItem()->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE), $session); #} break; } } } } /** * @param PlayerItemUseEvent $event * @throws AssumptionFailedError * @throws InvalidArgumentException * @throws SessionException * @throws JsonException * @throws RuntimeException * @throws Exception */ private function onRightClickAir(PlayerItemUseEvent $event): void { if (!is_null($event->getItem()->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE_BRUSH))) { $event->cancel(); $session = SessionHelper::getUserSession($event->getPlayer()); if (!$session instanceof UserSession) return; $target = $event->getPlayer()->getTargetBlock(Loader::getInstance()->getToolDistance()); $brush = $session->getBrushFromItem($event->getItem()); var_dump(json_encode($brush, JSON_THROW_ON_ERROR)); if ($brush instanceof Brush && !is_null($target)) {// && has perms API::createBrush($target, $brush, $session); } } } /** * @param PlayerDropItemEvent $event */ public function onDropItem(PlayerDropItemEvent $event): void { try { if (!is_null($event->getItem()->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE_BRUSH))) { $event->cancel(); $session = SessionHelper::getUserSession($event->getPlayer()); if (!$session instanceof UserSession) return; $brush = $session->getBrushFromItem($event->getItem()); if ($brush instanceof Brush) { $form = new ModalForm(TF::BOLD . $brush->getName(), TF::RED . "Delete" . TF::WHITE . " brush from session or " . TF::GREEN . "remove" . TF::WHITE . " from Inventory?" . TF::EOL . implode(TF::EOL, $event->getItem()->getLore()), TF::BOLD . TF::DARK_RED . "Delete", TF::BOLD . TF::DARK_GREEN . "Remove"); $form->setCallable(function (Player $player, $data) use ($session, $brush) { $session->removeBrush($brush, $data); }); $event->getPlayer()->sendForm($form); } } else if (!is_null($event->getItem()->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE))) { $event->cancel(); $event->getPlayer()->getInventory()->remove($event->getItem()); } } catch (Exception $e) { } } public function onSelectionChange(MWESelectionChangeEvent $event): void { Loader::getInstance()->getLogger()->debug("Called " . $event->getEventName()); if (($session = $event->getSession()) instanceof UserSession && ($player = $event->getPlayer()) !== null) { /** @var UserSession $session */ $session->sidebar->handleScoreboard($session); } } } ================================================ FILE: src/xenialdan/MagicWE2/Loader.php ================================================ getFile() . "resources" . DIRECTORY_SEPARATOR . "rotation_flip_data.json"; } public static function getDoorRotFlipPath(): string { return self::$doorRotPath; #return self::getInstance()->getFile() . "resources" . DIRECTORY_SEPARATOR . "door_data.json"; } /** * @return bool */ public static function hasScoreboard(): bool { return self::$scoreboardAPI !== null; } /** * @throws PluginException * @throws RuntimeException * @throws JsonException * @throws AssumptionFailedError */ public function onLoad(): void { self::$instance = $this; self::$ench = new Enchantment(self::FAKE_ENCH_ID, "", 0, ItemFlags::AXE, ItemFlags::NONE, 1); /** @var EnchantmentIdMap $enchantmapinstance */ $enchantmapinstance = EnchantmentIdMap::getInstance(); $enchantmapinstance->register(self::FAKE_ENCH_ID, self::$ench); self::$shapeRegistry = new ShapeRegistry(); self::$actionRegistry = new ActionRegistry(); SessionHelper::init(); #$this->saveResource("rotation_flip_data.json", true); $this->saveResource("blockstate_alias_map.json", true); self::$rotPath = $this->getFile() . "resources" . DIRECTORY_SEPARATOR . "rotation_flip_data.json"; self::$doorRotPath = $this->getFile() . "resources" . DIRECTORY_SEPARATOR . "door_data.json"; /** @var BlockStatesParser $blockstateparserInstance */ $blockstateparserInstance = BlockStatesParser::getInstance(); $blockstateparserInstance::$rotPath = $this->getFile() . "resources" . DIRECTORY_SEPARATOR . "rotation_flip_data.json"; $blockstateparserInstance::$doorRotPath = $this->getFile() . "resources" . DIRECTORY_SEPARATOR . "door_data.json"; $fileGetContents = file_get_contents($this->getDataFolder() . "blockstate_alias_map.json"); if ($fileGetContents === false) { throw new PluginException("blockstate_alias_map.json could not be loaded! Blockstate support has been disabled!"); } $blockstateparserInstance->setAliasMap(json_decode($fileGetContents, true, 512, JSON_THROW_ON_ERROR)); #StructureStore::getInstance(); } /** * ActionRegistry * @return ActionRegistry * @throws ActionRegistryException */ public static function getActionRegistry(): ActionRegistry { if (self::$actionRegistry) return self::$actionRegistry; throw new ActionRegistryException("Action registry is not initialized"); } /** * @throws InvalidArgumentException * @throws PluginException * @throws LanguageNotFoundException * @throws RuntimeException */ public function onEnable(): void { $lang = $this->getConfig()->get("language", Language::FALLBACK_LANGUAGE); $this->baseLang = new Language((string)$lang, $this->getFile() . "resources" . DIRECTORY_SEPARATOR . "lang" . DIRECTORY_SEPARATOR); if ($this->getConfig()->get("show-startup-icon", false)) $this->showStartupIcon(); //$this->loadDonator(); $this->getLogger()->warning("WARNING! Commands and their permissions changed! Make sure to update your permission sets!"); if (!InvMenuHandler::isRegistered()) InvMenuHandler::register($this); //PacketListener::register($this);//TODO currently this just doubles the debug spam $this->getServer()->getPluginManager()->registerEvents(new EventListener($this), $this); $this->getServer()->getCommandMap()->registerAll("MagicWE2", [ /* -- selection -- */ new Pos1Command($this, "/pos1", "Set position 1", ["/1"]), new Pos2Command($this, "/pos2", "Set position 2", ["/2"]), new HPos1Command($this, "/hpos1", "Set position 1 to targeted block", ["/h1"]), new HPos2Command($this, "/hpos2", "Set position 2 to targeted block", ["/h2"]), new ChunkCommand($this, "/chunk", "Set the selection to your current chunk"), /* -- tool -- */ new WandCommand($this, "/wand", "Gives you the selection wand"), new TogglewandCommand($this, "/togglewand", "Toggle the wand tool on/off", ["/toggleeditwand"]), new DebugCommand($this, "/debug", "Gives you the debug stick, which gives information about the clicked block"), new ToggledebugCommand($this, "/toggledebug", "Toggle the debug stick on/off"), /* -- selection modify -- */ //new ContractCommand($this,"/contract", "Contract the selection area"), //new ShiftCommand($this,"/shift", "Shift the selection area"), //new OutsetCommand($this,"/outset", "Outset the selection area"), //new InsetCommand($this,"/inset", "Inset the selection area"), /* -- selection info -- */ new SizeCommand($this, "/size", "Get information about the selection"), new CountCommand($this, "/count", "Counts the number of blocks matching a mask in selection", ["/analyze"]), new ListChunksCommand($this, "/listchunks", "List chunks that your selection includes"), /* -- region -- */ new SetCommand($this, "/set", "Fill a selection with the specified blocks"), //new LineCommand($this,"/line", "Draws a line segment between cuboid selection corners"), new ReplaceCommand($this, "/replace", "Replace blocks in an area with other blocks"), #new OverlayCommand($this,"/overlay", "Set a block on top of blocks in the region", ["/cover"]), //new CenterCommand($this,"/center", "Set the center block(s)",["/middle"]), //new NaturalizeCommand($this,"/naturalize", "3 layers of dirt on top then rock below"), //new WallsCommand($this,"/walls", "Build the four sides of the selection"), //new FacesCommand($this,"/faces", "Build the walls, ceiling, and floor of a selection"), //new MoveCommand($this,"/move", "Move the contents of the selection"), //new StackCommand($this,"/stack", "Repeat the contents of the selection"), //new HollowCommand($this,"/hollow", "Hollows out the object contained in this selection"), /* -- cosmetic -- */ //new ForestCommand($this,"/forest", "Make a forest within the region"), //new FloraCommand($this,"/flora", "Make flora within the region"), /* -- generation -- */ new CylinderCommand($this, "/cylinder", "Create a cylinder", ["/cyl"]), //new HollowCylinderCommand($this,"/hcyl", "Generates a hollow cylinder"), //new SphereCommand($this,"/sphere", "Generates a filled sphere"), //new HollowSphereCommand($this,"/hsphere", "Generates a hollow sphere"), //new PyramidCommand($this,"/pyramid", "Generates a filled pyramid"), //new HollowPyramidCommand($this,"/hpyramid", "Generates a hollow pyramid"), //new PumpkinsCommand($this,"/pumpkins", "Generate pumpkin patches"), /* -- clipboard -- */ new CopyCommand($this, "/copy", "Copy the selection to the clipboard"), new PasteCommand($this, "/paste", "Paste the clipboard’s contents"), new CutCommand($this, "/cut", "Cut the selection to the clipboard"), new Cut2Command($this, "/cut2", "Cut the selection to the clipboard - the new way"), new ClearClipboardCommand($this, "/clearclipboard", "Clear your clipboard"), new FlipCommand($this, "/flip", "Flip the contents of the clipboard across the origin", ["/mirror"]), new RotateCommand($this, "/rotate", "Rotate the contents of the clipboard around the origin"), /* -- history -- */ new UndoCommand($this, "/undo", "Rolls back the last action"), new RedoCommand($this, "/redo", "Applies the last undo action again"), new ClearhistoryCommand($this, "/clearhistory", "Clear your history"), /* -- schematic -- */ //new SchematicCommand($this,"/schematic", "Schematic commands for saving/loading areas"), /* -- navigation -- */ //new UnstuckCommand($this,"/unstuck", "Switch between your position and pos1 for placement"), //new AscendCommand($this,"/ascend", "Switch between your position and pos1 for placement", ["/asc"]), //new DescendCommand($this,"/descend", "Switch between your position and pos1 for placement", ["/desc"]), //new CeilCommand($this,"/ceil", "Switch between your position and pos1 for placement"), //new ThruCommand($this,"/thru", "Switch between your position and pos1 for placement"), //new UpCommand($this,"/up", "Switch between your position and pos1 for placement"), /* -- generic -- */ //new TogglePlaceCommand($this,"/toggleplace", "Switch between your position and pos1 for placement"), //new SearchItemCommand($this,"/searchitem", "Search for an item"), //new RangeCommand($this,"/range", "Set the brush range"), new TestCommand($this, "/test", "test action"),//TODO REMOVE new SetRangeCommand($this, "/setrange", "Set tool range", ["/toolrange"]), new LimitCommand($this, "/limit", "Set the block change limit. Use -1 to disable"), new HelpCommand($this, "/help", "MagicWE help command", ["/?", "/mwe", "/wehelp"]),//Blame MCPE for client side /help shit! only the aliases work new VersionCommand($this, "/version", "MagicWE version", ["/ver"]), new InfoCommand($this, "/info", "Information about MagicWE"), new ReportCommand($this, "/report", "Report a bug to GitHub", ["/bug", "/github"]), new DonateCommand($this, "/donate", "Donate to support development of MagicWE!", ["/support", "/paypal"]), new LanguageCommand($this, "/language", "Set your language", ["/lang"]), new DonateCommand($this, "/donate", "Support the development of MagicWE and get a cape!", ["/support", "/paypal"]), /* -- biome -- */ new BiomeListCommand($this, "/biomelist", "Gets all biomes available", ["/biomels"]), new BiomeInfoCommand($this, "/biomeinfo", "Get the biome of the targeted block"), new SetBiomeCommand($this, "/setbiome", "Sets the biome of your current block or region"), /* -- utility -- */ //new DrainCommand($this,"/drain", "Drain a pool"), //new FixLavaCommand($this,"/fixlava", "Fix lava to be stationary"), //new FixWaterCommand($this,"/fixwater", "Fix water to be stationary"), //new SnowCommand($this,"/snow", "Creates a snow layer cover in the selection"), //new ThawCommand($this,"/thaw", "Thaws blocks in the selection"), new CalculateCommand($this, "/calculate", "Evaluate a mathematical expression", ["/calc", "/eval", "/evaluate", "/solve"]), new ToggleWailaCommand($this, "/togglewaila", "Toggle the What Am I Looking At utility", ["/waila", "/wyla"]), /* -- debugging -- */ new PlaceAllBlockstatesCommand($this, "/placeallblockstates", "Place all blockstates similar to Java debug worlds"), ]); if (class_exists(CustomUIAPI::class)) { $this->getLogger()->notice("CustomUI found, can use ui-based commands"); $this->getServer()->getCommandMap()->registerAll("MagicWE2", [ /* -- brush -- */ new BrushCommand($this, "/brush", "Opens the brush tool menu"), /* -- tool -- */ new FloodCommand($this, "/flood", "Opens the flood fill tool menu", ["/floodfill"]), ]); } else { $this->getLogger()->notice(TF::RED . "CustomUI NOT found, can NOT use ui-based commands"); } if (class_exists(ScoreFactory::class)) { $this->getLogger()->notice("Scoreboard API found, can use scoreboards"); self::$scoreboardAPI = ScoreFactory::class; } else { $this->getLogger()->notice(TF::RED . "Scoreboard API NOT found, can NOT use scoreboards"); } // .mcstructure loading tests // $world = self::getInstance()->getServer()->getWorldManager()->getDefaultWorld(); // if ($world !== null) { // $spawn = $world->getSafeSpawn()->asVector3(); // $structureFiles = glob($this->getDataFolder() . 'structures' . DIRECTORY_SEPARATOR . "*.mcstructure"); // if ($structureFiles !== false) // foreach ($structureFiles as $file) { // $this->getLogger()->debug(TF::GOLD . "Loading " . basename($file)); // try { // /** @var StructureStore $instance */ // $instance = StructureStore::getInstance(); // $structure = $instance->loadStructure(basename($file)); // //this will dump wrong blocks for now // foreach ($structure->blocks() as $block) { // #$this->getLogger()->debug($block->getPos()->asVector3() . ' ' . BlockStatesParser::printStates(BlockStatesParser::getStateByBlock($block), false)); // $world->setBlock(($at = $spawn->addVector($block->getPos()->asVector3())), $block); // if (($tile = $structure->translateBlockEntity(Position::fromObject($block->getPos()->asVector3(), $world), $at)) instanceof Tile) { // $tileAt = $world->getTileAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()); // if ($tileAt !== null) $world->removeTile($tileAt); // $world->addTile($tile); // } // } // } catch (Exception $e) { // $this->getLogger()->debug($e->getMessage()); // } // } // } //register WAILA bar $this->wailaBossBar = new DiverseBossBar(); $this->wailaBossBar->setPercentage(1.0); //WAILA updater $this->getScheduler()->scheduleDelayedRepeatingTask(new ClosureTask(function (): void { $players = Loader::getInstance()->wailaBossBar->getPlayers(); foreach ($players as $player) { if (!$player->isOnline() || !SessionHelper::hasSession($player) || (($session = SessionHelper::getUserSession($player)) instanceof UserSession && !$session->isWailaEnabled())) { Loader::getInstance()->wailaBossBar->hideFrom([$player]); continue; } if (($block = $player->getTargetBlock(10)) instanceof Block && $block->getId() !== 0) { Loader::getInstance()->wailaBossBar->showTo([$player]); $stateEntry = BlockStatesParser::getStateByBlock($block); $sub = $block->getName(); $title = (string)$block; if ($stateEntry instanceof BlockStatesEntry) { $sub = implode("," . TF::EOL, explode(",", BlockStatesParser::printStates($stateEntry, false))); } $distancePercentage = round(floor($block->getPos()->distance($player->getEyePos())) / 10, 1); Loader::getInstance()->wailaBossBar->setTitleFor([$player], $title)->setSubTitleFor([$player], $sub)->setPercentage($distancePercentage); } else Loader::getInstance()->wailaBossBar->hideFrom([$player]); } }), 60, 1); } public function onDisable(): void { try { foreach (SessionHelper::getPluginSessions() as $session) { SessionHelper::destroySession($session, false); } foreach (SessionHelper::getUserSessions() as $session) { SessionHelper::destroySession($session); } } catch (JsonException $e) { $this->getLogger()->logException($e); } } /** * @return Language * @api */ public function getLanguage(): Language { return $this->baseLang; } public function getToolDistance(): int { return (int)$this->getConfig()->get("tool-range", 100); } public function getEditLimit(): int { return (int)$this->getConfig()->get("limit", -1); } /** * @return array * @throws RuntimeException */ public static function getInfo(): array { return [ "| " . TF::GREEN . self::getInstance()->getFullName() . TF::RESET . " | Information |", "| --- | --- |", "| Website | " . self::getInstance()->getDescription()->getWebsite() . " |", "| Version | " . self::getInstance()->getDescription()->getVersion() . " |", "| Plugin API Version | " . implode(", ", self::getInstance()->getDescription()->getCompatibleApis()) . " |", "| Authors | " . implode(", ", self::getInstance()->getDescription()->getAuthors()) . " |", "| Enabled | " . (Server::getInstance()->getPluginManager()->isPluginEnabled(self::getInstance()) ? TF::GREEN . "Yes" : TF::RED . "No") . TF::RESET . " |", "| Uses UI | " . (class_exists(CustomUIAPI::class) ? TF::GREEN . "Yes" : TF::RED . "No") . TF::RESET . " |", "| Uses ScoreFactory | " . (class_exists(ScoreFactory::class) ? TF::GREEN . "Yes" : TF::RED . "No") . TF::RESET . " |", "| Phar | " . (strpos(self::getInstance()->getFile(), 'phar:') !== false ? TF::GREEN . "Yes" : TF::RED . "No") . TF::RESET . " |", "| PMMP Protocol Version | " . Server::getInstance()->getVersion() . " |", "| PMMP Version | " . Server::getInstance()->getPocketMineVersion() . " |", "| PMMP API Version | " . Server::getInstance()->getApiVersion() . " |", ]; } private function showStartupIcon(): void { $colorAxe = TF::BOLD . TF::DARK_PURPLE; $colorAxeStem = TF::LIGHT_PURPLE; $colorAxeSky = TF::LIGHT_PURPLE; $colorAxeFill = TF::GOLD; $axe = [ " {$colorAxe}####{$colorAxeSky} ", " {$colorAxe}##{$colorAxeFill}####{$colorAxe}##{$colorAxeSky} ", " {$colorAxe}##{$colorAxeFill}######{$colorAxe}##{$colorAxeSky} ", " {$colorAxe}##{$colorAxeFill}########{$colorAxe}####{$colorAxeSky} ", " {$colorAxe}##{$colorAxeFill}######{$colorAxe}##{$colorAxeStem}##{$colorAxe}##{$colorAxeSky} ", " {$colorAxe}######{$colorAxeStem}##{$colorAxe}##{$colorAxeFill}##{$colorAxe}##", " {$colorAxe}##{$colorAxeStem}##{$colorAxe}##{$colorAxeFill}####{$colorAxe}##", " {$colorAxe}##{$colorAxeStem}##{$colorAxe}## {$colorAxe}####{$colorAxeSky} ", " {$colorAxe}##{$colorAxeStem}##{$colorAxe}##{$colorAxeSky} ", " {$colorAxe}##{$colorAxeStem}##{$colorAxe}##{$colorAxeSky} ", " {$colorAxe}##{$colorAxeStem}##{$colorAxe}##{$colorAxeSky} ", " {$colorAxe}##{$colorAxeStem}##{$colorAxe}##{$colorAxeSky} ", "{$colorAxe}##{$colorAxeStem}##{$colorAxe}##{$colorAxeSky} MagicWE v.2", "{$colorAxe}####{$colorAxeSky} by XenialDan"]; foreach (array_map(static function ($line) { return preg_replace_callback( '/ +(?getLogger()->info($axeMsg); } /** * Returns the path to the language files folder. * * @return string */ public function getLanguageFolder(): string { return $this->getFile() . "resources" . DIRECTORY_SEPARATOR . "lang" . DIRECTORY_SEPARATOR; } /** * Get a list of available languages * @return string[] * @phpstan-return array code=>name * @throws LanguageNotFoundException */ public function getLanguageList(): array { return Language::getLanguageList($this->getLanguageFolder()); } } ================================================ FILE: src/xenialdan/MagicWE2/clipboard/Clipboard.php ================================================ $chunk) { World::getXZ($hash, $x, $z); $manager->setChunk($x, $z, $chunk); } return $manager; } /** * @return World * @throws Exception */ public function getWorld(): World { if (is_null($this->worldId)) { throw new SelectionException("World is not set!"); } $world = Server::getInstance()->getWorldManager()->getWorld($this->worldId); if (is_null($world)) { throw new SelectionException("World is not found!"); } return $world; } /** * @param World $world */ public function setWorld(World $world): void { $this->worldId = $world->getId(); } /** * @return int */ public function getWorldId(): int { return $this->worldId; } /** * @return string */ public function getCustomName(): string { return $this->customName; } /** * @param string $customName */ public function setCustomName(string $customName): void { $this->customName = $customName; } } ================================================ FILE: src/xenialdan/MagicWE2/clipboard/RevertClipboard.php ================================================ */ public $chunks = []; /** * @var array[] * @phpstan-var array */ public $blocksAfter; /** * RevertClipboard constructor. * @param int $worldId * @param Chunk[] $chunks * @param array[] $blocksAfter //CHANGED AS HACK * @phpstan-param array $blocksAfter */ public function __construct(int $worldId, array $chunks = [], array $blocksAfter = []) { $this->worldId = $worldId; $this->chunks = $chunks; $this->blocksAfter = $blocksAfter; } /** * String representation of object * @link http://php.net/manual/en/serializable.serialize.php * @return string the string representation of the object or null * @since 5.1.0 */ public function serialize() { $chunks = []; foreach ($this->chunks as $hash => $chunk) { $chunks[$hash] = FastChunkSerializer::serialize($chunk); } return serialize([ $this->worldId, $chunks, $this->blocksAfter ]); } /** * Constructs the object * @link http://php.net/manual/en/serializable.unserialize.php * @param string $serialized

* The string representation of the object. *

* @return void * @since 5.1.0 * @noinspection PhpMissingParamTypeInspection */ public function unserialize($serialized) { [ $this->worldId, $chunks, $this->blocksAfter ] = unserialize($serialized/*, ['allowed_classes' => [__CLASS__]]*/);//TODO test pm4 foreach ($chunks as $hash => $chunk) $this->chunks[$hash] = FastChunkSerializer::deserialize($chunk); } } ================================================ FILE: src/xenialdan/MagicWE2/clipboard/SingleClipboard.php ================================================ position = $position->asVector3()->floor(); } public function addEntry(int $x, int $y, int $z, BlockEntry $entry): void { $this->entries[World::blockHash($x, $y, $z)] = $entry; } public function clear(): void { $this->entries = []; } /** * @param int|null $x * @param int|null $y * @param int|null $z * @return Generator|BlockEntry[] */ public function iterateEntries(?int &$x, ?int &$y, ?int &$z): Generator { foreach ($this->entries as $hash => $entry) { World::getBlockXYZ($hash, $x, $y, $z); yield $entry; } } public function getTotalCount(): int { return count($this->entries); } /** * String representation of object * @link https://php.net/manual/en/serializable.serialize.php * @return string the string representation of the object or null * @since 5.1 */ public function serialize() { // TODO: Implement serialize() method. return serialize([ $this->entries, $this->selection, $this->position ]); } /** * Constructs the object * @link https://php.net/manual/en/serializable.unserialize.php * @param string $serialized

* The string representation of the object. *

* @return void * @since 5.1 * @noinspection PhpMissingParamTypeInspection */ public function unserialize($serialized) { // TODO: Implement unserialize() method. [ $this->entries, $this->selection, $this->position ] = unserialize($serialized/*, ['allowed_classes' => [BlockEntry::class, Selection::class, Vector3::class]]*/); } } ================================================ FILE: src/xenialdan/MagicWE2/commands/DonateCommand.php ================================================ setPermission("we.command.donate"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } try { $name = TF::DARK_PURPLE . "[" . TF::GOLD . "XenialDan" . TF::DARK_PURPLE . "] "; $sender->sendMessage($name . "Greetings! Would you like to buy me an energy drink to stay awake during coding sessions?"); $sender->sendMessage($name . "Donations are welcomed! Consider donating on " . TF::DARK_AQUA . "Pay" . TF::AQUA . "Pal:"); $sender->sendMessage($name . TF::DARK_AQUA . "https://www.paypal.me/xenialdan"); $sender->sendMessage($name . "Thank you! With " . TF::BOLD . TF::RED . "<3" . TF::RESET . TF::DARK_PURPLE . " - MagicWE2 by https://github.com/thebigsmileXD"); $colorHeart = (random_int(0, 1) === 1 ? TF::DARK_RED : TF::DARK_PURPLE); $sender->sendMessage( TF::BOLD . $colorHeart . " **** **** " . TF::EOL . TF::BOLD . $colorHeart . " ** ** ** ** " . TF::EOL . TF::BOLD . $colorHeart . "** * **" . TF::EOL . TF::BOLD . $colorHeart . " ** " . TF::GOLD . "MWE" . $colorHeart . " ** " . TF::EOL . TF::BOLD . $colorHeart . " ** ** " . TF::EOL . TF::BOLD . $colorHeart . " ** ** " . TF::EOL . TF::BOLD . $colorHeart . " ** ** " . TF::EOL . TF::BOLD . $colorHeart . " *** " . TF::EOL . TF::BOLD . $colorHeart . " * " ); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/HelpCommand.php ================================================ registerArgument(0, new RawStringArgument("command", true)); $this->setPermission("we.command.help"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } try { $cmds = []; if (empty($args["command"])) { foreach (array_filter(Loader::getInstance()->getServer()->getCommandMap()->getCommands(), static function (Command $command) use ($sender) { return strpos($command->getName(), "/") !== false && $command->testPermissionSilent($sender); }) as $cmd) { /** @var Command $cmd */ $cmds[$cmd->getName()] = $cmd; } } else if (($cmd = Loader::getInstance()->getServer()->getCommandMap()->getCommand("/" . str_replace("/", "", TF::clean((string)$args["command"])))) instanceof Command) { /** @var Command $cmd */ $cmds[$cmd->getName()] = $cmd; } else { $sender->sendMessage(TF::RED . str_replace("/", "//", $lang->translateString("%commands.generic.notFound"))); return; } foreach ($cmds as $command) { $message = TF::LIGHT_PURPLE . "/" . $command->getName(); if (!empty(($aliases = $command->getAliases()))) { foreach ($aliases as $i => $alias) { $aliases[$i] = "/" . $alias; } $message .= TF::DARK_PURPLE . " [" . implode(",", $aliases) . "]"; } $message .= TF::AQUA . " " . $command->getDescription() . TF::EOL . " - " . $command->getUsage(); $sender->sendMessage($message); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/InfoCommand.php ================================================ setPermission("we.command.info"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } try { $sender->sendMessage(rtrim(Loader::PREFIX, " ") . " " . $lang->translateString('command.info.title')); foreach (Loader::getInfo() as $i => $line) { if ($i <= 1) continue; $sender->sendMessage($line); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/LanguageCommand.php ================================================ registerArgument(0, new LanguageArgument("language", true)); $this->setPermission("we.command.language"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } if (isset($args["language"])) { $session->setLanguage((string)$args["language"]); return; } $languages = Loader::getInstance()->getLanguageList(); $form = new CustomForm(Loader::PREFIX . TF::BOLD . TF::DARK_PURPLE . $lang->translateString('ui.language.title')); $form->addElement(new Label($lang->translateString('ui.language.label'))); $dropdown = new Dropdown($lang->translateString('ui.language.dropdown'), array_values($languages)); $dropdown->setOptionAsDefault($session->getLanguage()->getName()); $form->addElement($dropdown); $form->setCallable(function (Player $player, $data) use ($session, $languages) { $langShort = array_search($data[1], $languages, true); if (!is_string($langShort)) throw new InvalidArgumentException("Invalid data received"); $session->setLanguage($langShort); }); $sender->sendForm($form); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/LimitCommand.php ================================================ registerArgument(0, new IntegerArgument("limit", true)); $this->setPermission("we.command.limit"); $this->setUsage("//limit [limit: int|-1]"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } try { if (empty($args["limit"])) { $limit = Loader::getInstance()->getConfig()->get("limit", -1); $sender->sendMessage(Loader::PREFIX . TF::GREEN . $lang->translateString('command.limit.current', [($limit < 0 ? ucfirst(Loader::getInstance()->getLanguage()->translateString('disabled')) : $limit)])); } else { Loader::getInstance()->getConfig()->set("limit", (int)$args["limit"]); $sender->sendMessage(Loader::PREFIX . TF::GREEN . $lang->translateString('command.limit.set', [(int)$args["limit"]])); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/ReportCommand.php ================================================ registerArgument(0, new TextArgument("title", true)); $this->setPermission("we.command.report"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } try { $url = "Please report your bug with this link (link also in console)" . TF::EOL; $url .= "https://github.com/thebigsmileXD/MagicWE2/issues/new?labels=Bug&body="; $url .= urlencode( "### Description" . TF::EOL . "" . TF::EOL . TF::EOL . "" . TF::EOL . "---" . TF::EOL . TF::clean(implode(TF::EOL, Loader::getInfo()))); $url .= "&title=" . urlencode(TF::clean("[" . Loader::getInstance()->getDescription()->getVersion() . "] " . ((string)($args["title"] ?? "")))); if (!$sender instanceof ConsoleCommandSender) $sender->sendMessage(Loader::PREFIX . $url); Loader::getInstance()->getLogger()->alert($url); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/SetRangeCommand.php ================================================ registerArgument(0, new IntegerArgument("range", true)); $this->setPermission("we.command.setrange"); $this->setUsage("//setrange [range: int]"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } try { if (empty($args["range"])) { $range = Loader::getInstance()->getToolDistance(); $sender->sendMessage(Loader::PREFIX . TF::GREEN . $lang->translateString('command.setrange.current', [$range])); } else { Loader::getInstance()->getConfig()->set("tool-range", (int)$args["range"]); $sender->sendMessage(Loader::PREFIX . TF::GREEN . $lang->translateString('command.setrange.set', [(int)$args["range"]])); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/TestCommand.php ================================================ setPermission("we.command.test"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } try { //TODO REMOVE DEBUG $pluginSession = SessionHelper::createPluginSession(Loader::getInstance()); $selection = new Selection($pluginSession->getUUID(), Server::getInstance()->getWorldManager()->getDefaultWorld(), 0, 0, 0, 0, 0, 0); $pluginSession->addSelection($selection); Server::getInstance()->getAsyncPool()->submitTask( new AsyncActionTask( $pluginSession->getUUID(), $selection, new TestAction(), $selection->getShape()->getTouchedChunks($selection->getWorld()), "minecraft:snow_block", "minecraft:tnt" ) ); $selection = new Selection($pluginSession->getUUID(), Server::getInstance()->getWorldManager()->getDefaultWorld(), 0, 0, 0, 1, 1, 1); Server::getInstance()->getAsyncPool()->submitTask( new AsyncActionTask( $pluginSession->getUUID(), $selection, new TestAction(), $selection->getShape()->getTouchedChunks($selection->getWorld()), "minecraft:snow_block", "minecraft:tnt" ) ); $selection = new Selection($pluginSession->getUUID(), Server::getInstance()->getWorldManager()->getDefaultWorld(), 0, 0, 0, 2, 2, 2); Server::getInstance()->getAsyncPool()->submitTask( new AsyncActionTask( $pluginSession->getUUID(), $selection, new TestAction(), $selection->getShape()->getTouchedChunks($selection->getWorld()), "minecraft:snow_block", "minecraft:tnt" ) ); $selection = new Selection($pluginSession->getUUID(), Server::getInstance()->getWorldManager()->getDefaultWorld(), 0, 0, 0, 1, 2, 3); Server::getInstance()->getAsyncPool()->submitTask( new AsyncActionTask( $pluginSession->getUUID(), $selection, new TestAction(), $selection->getShape()->getTouchedChunks($selection->getWorld()), "minecraft:snow_block", "minecraft:tnt" ) ); } catch (Exception $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/VersionCommand.php ================================================ setPermission("we.command.version"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } try { $sender->sendMessage(Loader::PREFIX . TF::GREEN . Loader::getInstance()->getDescription()->getVersion()); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/args/LanguageArgument.php ================================================ getLanguageList(), true); } public function getEnumValues(): array { return array_values(Loader::getInstance()->getLanguageList()); } public function getEnumName(): string { return "language"; } } ================================================ FILE: src/xenialdan/MagicWE2/commands/args/MirrorAxisArgument.php ================================================ "x", "z" => "z", "y" => "y", "xz" => "xz"]; public function getTypeName(): string { return "string"; } public function getEnumName(): string { return "axis"; } /** * @param string $argument * @param CommandSender $sender * @return string //TODO consider changing to Axis */ public function parse(string $argument, CommandSender $sender) { return (string)$this->getValue($argument); } } ================================================ FILE: src/xenialdan/MagicWE2/commands/args/RotateAngleArgument.php ================================================ 90, "180" => 180, "270" => 270]; public function getTypeName(): string { return "int"; } public function getEnumName(): string { return "angle"; } /** * @param string $argument * @param CommandSender $sender * @return int */ public function parse(string $argument, CommandSender $sender) { return (int)$this->getValue($argument); } } ================================================ FILE: src/xenialdan/MagicWE2/commands/biome/BiomeInfoCommand.php ================================================ registerArgument(0, new TextArgument("flags", true)); $this->setPermission("we.command.biome.info"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $biomeNames = (new ReflectionClass(Biome::class))->getConstants(); $biomeNames = array_flip($biomeNames); unset($biomeNames[Biome::MAX_BIOMES]); array_walk($biomeNames, static function (&$value, $key) { $value = BiomeRegistry::getInstance()->getBiome($key)->getName(); }); if (!empty(($flags = ltrim((string)($args["flags"] ?? ""), "-")))) { $flagArray = str_split($flags); if (in_array(self::FLAG_T, $flagArray, true)) { $target = $sender->getTargetBlock(Loader::getInstance()->getToolDistance()); if ($target === null) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.notarget')); return; } $biomeId = $target->getPos()->getWorld()->getOrLoadChunkAtPosition($target->getPos())->getBiomeId($target->getPos()->getX() % 16, $target->getPos()->getZ() % 16); $session->sendMessage(TF::DARK_AQUA . $lang->translateString('command.biomeinfo.attarget')); $session->sendMessage(TF::AQUA . "ID: $biomeId Name: " . $biomeNames[$biomeId]); } if (in_array(self::FLAG_P, $flagArray, true)) { $biomeId = $sender->getWorld()->getOrLoadChunkAtPosition($sender->getPosition())->getBiomeId($sender->getPosition()->getX() % 16, $sender->getPosition()->getZ() % 16); $session->sendMessage(TF::DARK_AQUA . $lang->translateString('command.biomeinfo.atposition')); $session->sendMessage(TF::AQUA . "ID: $biomeId Name: " . $biomeNames[$biomeId]); } return; } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } $touchedChunks = $selection->getShape()->getTouchedChunks($selection->getWorld()); $biomes = []; foreach ($touchedChunks as $touchedChunk) { for ($x = 0; $x < 16; $x++) for ($z = 0; $z < 16; $z++) $biomes[] = (FastChunkSerializer::deserialize($touchedChunk)->getBiomeId($x, $z)); } $biomes = array_unique($biomes); $session->sendMessage(TF::DARK_AQUA . $lang->translateString('command.biomeinfo.result', [count($biomes)])); foreach ($biomes as $biomeId) { $session->sendMessage(TF::AQUA . $lang->translateString('command.biomeinfo.result.line', [$biomeId, $biomeNames[$biomeId]])); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (Error $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/biome/BiomeListCommand.php ================================================ setPermission("we.command.biome.list"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); /** @var Player $sender */ $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $session->sendMessage(TF::DARK_AQUA . $lang->translateString('command.biomelist.title')); foreach ((new ReflectionClass(Biome::class))->getConstants() as $name => $value) { if ($value === Biome::MAX_BIOMES) continue; $name = BiomeRegistry::getInstance()->getBiome($value)->getName(); $session->sendMessage(TF::AQUA . $lang->translateString('command.biomelist.result.line', [$value, $name])); } } catch (SessionException $e) { } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/biome/SetBiomeCommand.php ================================================ registerArgument(0, new IntegerArgument("biome", false));//TODO add BiomeArgument //TODO flags $this->setPermission("we.command.biome.set"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } $biomeId = (int)$args["biome"]; API::setBiomeAsync($selection, $session, $biomeId); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/brush/BrushCommand.php ================================================ registerSubCommand(new BrushNameCommand("name", "Get name or rename a brush")); $this->setPermission("we.command.brush"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $form = new SimpleForm(Loader::PREFIX . TF::BOLD . TF::DARK_PURPLE . $lang->translateString('ui.brush.title'), $lang->translateString('ui.brush.content')); $form->addButton(new Button($lang->translateString('ui.brush.create'))); $form->addButton(new Button($lang->translateString('ui.brush.getsession'))); $form->addButton(new Button($lang->translateString('ui.brush.edithand'))); $form->setCallable(function (Player $player, $data) use ($lang, $session) { try { switch ($data) { case $lang->translateString('ui.brush.create'): { $brush = new Brush(new BrushProperties()); if ($brush instanceof Brush) { $player->sendForm($brush->getForm()); } break; } case $lang->translateString('ui.brush.getsession'): { $menu = InvMenu::create(InvMenu::TYPE_DOUBLE_CHEST); foreach ($session->getBrushes() as $brush) { $menu->getInventory()->addItem($brush->toItem()); } $menu->send($player, "Session brushes"); break; } case $lang->translateString('ui.brush.edithand'): { $brush = $session->getBrushFromItem($player->getInventory()->getItemInHand()); if ($brush instanceof Brush) { $player->sendForm($brush->getForm(false)); } break; } } return null; } catch (Exception $error) { $session->sendMessage(TF::RED . $lang->translateString('error')); $session->sendMessage(TF::RED . $error->getMessage()); } }); $sender->sendForm($form); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } /** * @param UIElement[] $elements * @param array $data * @return array */ public static function generateLore(array $elements, array $data): array { $return = []; foreach ($elements as $i => $element) { if ($element instanceof Label) continue; if ($element instanceof Toggle) { $return[] = ($element->getText() . ": " . ($data[$i] ? "Yes" : "No")); continue; } $return[] = ($element->getText() . ": " . $data[$i]); } return $return; } } ================================================ FILE: src/xenialdan/MagicWE2/commands/brush/BrushNameCommand.php ================================================ registerArgument(0, new RawStringArgument("name", true)); $this->setPermission("we.command.brush.name"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $brush = $session->getBrushFromItem($sender->getInventory()->getItemInHand()); if ($brush instanceof Brush) { if (empty($args["name"])) { $sender->sendMessage($brush->getName()); return; } $brush->properties->setCustomName((string)$args["name"]); $session->sendMessage(TF::GREEN . $lang->translateString('command.brushname.set', [$brush->getName()])); $session->replaceBrush($brush); } } catch (Exception | TypeError $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsageMessage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/clipboard/ClearClipboardCommand.php ================================================ setPermission("we.command.clipboard.clear"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $session->clearClipboard(); $sender->sendMessage(Loader::PREFIX . TF::GREEN . $lang->translateString('command.clearclipboard.cleared')); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/clipboard/CopyCommand.php ================================================ registerArgument(0, new TextArgument("flags", true));//TODO add FlagArgument (parse returns array with flags) $this->setPermission("we.command.clipboard.copy"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } $hasFlags = isset($args["flags"]); API::copyAsync($selection, $session, $hasFlags ? API::flagParser(explode(" ", (string)$args["flags"])) : API::FLAG_BASE); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/clipboard/Cut2Command.php ================================================ registerArgument(0, new TextArgument("flags", true)); $this->setPermission("we.command.clipboard.cut"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } #$hasFlags = isset($args["flags"]); $action = new CutAction(); $offset = $selection->getShape()->getMinVec3()->subtractVector($session->getPlayer()->getPosition()->asVector3()->floor())->floor(); $action->setClipboardVector($offset); Server::getInstance()->getAsyncPool()->submitTask( new AsyncActionTask( $session->getUUID(), $selection, $action, $selection->getShape()->getTouchedChunks($selection->getWorld()), "air",//TODO option "" ) ); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/clipboard/CutCommand.php ================================================ registerArgument(0, new TextArgument("flags", true)); $this->setPermission("we.command.clipboard.cut"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } $hasFlags = isset($args["flags"]); //TODO Temp hack - add cutAsync - Update 9th Feb. 2020 LEAVE THAT ALONE! IT WORKS, DO NOT TOUCH IT! $flags = $hasFlags ? API::flagParser(explode(" ", (string)$args["flags"])) : API::FLAG_BASE; API::copyAsync($selection, $session, $flags); API::fillAsync($selection, $session, [BlockFactory::getInstance()->get(BlockLegacyIds::AIR, 0)], $flags); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/clipboard/FlipCommand.php ================================================ registerArgument(0, new MirrorAxisArgument("axis", false)); $this->setPermission("we.command.clipboard.flip"); //$this->setUsage("//flip "); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $axis = (string)$args["axis"];//TODO change to Axis[] $sender->sendMessage(Loader::PREFIX . $lang->translateString('command.flip.try', [$axis])); $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $clipboard = $session->getCurrentClipboard(); if (!$clipboard instanceof SingleClipboard) { throw new SessionException($lang->translateString('error.noclipboard')); } $action = new FlipAction($axis); #$offset = $selection->getShape()->getMinVec3()->subtract($session->getPlayer()->asVector3()->floor())->floor(); #$action->setClipboardVector($offset); Server::getInstance()->getAsyncPool()->submitTask( new AsyncClipboardActionTask( $session->getUUID(), $clipboard->selection, $action, $clipboard ) ); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/clipboard/PasteCommand.php ================================================ registerArgument(0, new TextArgument("flags", true)); $this->setPermission("we.command.clipboard.paste"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args * @throws AssumptionFailedError */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $clipboard = $session->getCurrentClipboard(); if (is_null($clipboard)) { throw new SelectionException($lang->translateString('error.noclipboard')); } if (!$clipboard instanceof SingleClipboard) {//TODO check if i want to pass ANY clipboard instead throw new SelectionException($lang->translateString('error.noclipboard')); } /*if (!API::hasFlag(API::flagParser(explode(" ", strval($args["flags"]))), API::FLAG_POSITION_RELATIVE)) { $clipboard->setOffset(new Vector3(0,0,0));//TODO fix? Move to API }*/ $hasFlags = isset($args["flags"]); API::pasteAsync($clipboard, $session, $sender->getPosition(), $hasFlags ? API::flagParser(explode(" ", (string)$args["flags"])) : API::FLAG_BASE); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/clipboard/RotateCommand.php ================================================ registerArgument(0, new RotateAngleArgument("angle", false)); $this->registerArgument(1, new BooleanArgument("aroundOrigin", true)); $this->setPermission("we.command.clipboard.rotate"); //$this->setUsage("//rotate "); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $angle = (int)$args["angle"]; $aroundOrigin = $args["aroundOrigin"] ?? true; $sender->sendMessage(Loader::PREFIX . $lang->translateString('command.rotate.try', [$angle])); $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $clipboard = $session->getCurrentClipboard(); if (!$clipboard instanceof SingleClipboard) { throw new SessionException($lang->translateString('error.noclipboard')); } $action = new RotateAction($angle/*, $aroundOrigin*/);//TODO reenable origin support if error fixed: does not rotate. Let's see if PHPStan find it for me! #$offset = $selection->getShape()->getMinVec3()->subtract($session->getPlayer()->asVector3()->floor())->floor(); #$action->setClipboardVector($offset); var_dump($action); Server::getInstance()->getAsyncPool()->submitTask( new AsyncClipboardActionTask( $session->getUUID(), $clipboard->selection, $action, $clipboard ) ); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/debug/PlaceAllBlockstatesCommand.php ================================================ setPermission("we.command.test"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { BlockStatesParser::placeAllBlockstates($sender->getPosition()); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/generation/CylinderCommand.php ================================================ registerArgument(0, new RawStringArgument("blocks", false)); $this->registerArgument(1, new IntegerArgument("diameter", false)); $this->registerArgument(2, new IntegerArgument("height", true)); $this->registerArgument(3, new TextArgument("flags", true)); $this->setPermission("we.command.generation.cyl"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args * @throws AssumptionFailedError */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $messages = []; $error = false; $blocks = (string)$args["blocks"];//TODO change to Palette $diameter = (int)$args["diameter"]; $height = (int)($args["height"] ?? 1); $newblocks = API::blockParser($blocks, $messages, $error); foreach ($messages as $message) { $sender->sendMessage($message); } if (!$error) { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $cyl = new Cylinder($sender->getPosition()->asVector3()->floor(), $height, $diameter); $cylSelection = new Selection($session->getUUID(), $sender->getWorld()); $cylSelection->setShape($cyl); $hasFlags = isset($args["flags"]); API::fillAsync($cylSelection, $session, $newblocks, $hasFlags ? API::flagParser(explode(" ", (string)$args["flags"])) : API::FLAG_BASE); } else { throw new InvalidArgumentException("Could not fill with the selected blocks"); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/history/ClearhistoryCommand.php ================================================ setPermission("we.command.history.clear"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $session->clearHistory(); $sender->sendMessage(Loader::PREFIX . TF::GREEN . $lang->translateString('command.history.cleared')); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/history/RedoCommand.php ================================================ setPermission("we.command.history.redo"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $session->redo(); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/history/UndoCommand.php ================================================ setPermission("we.command.history.undo"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $session->undo(); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/region/OverlayCommand.php ================================================ registerArgument(0, new RawStringArgument("blocks", false)); $this->setPermission("we.command.region.overlay"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $messages = []; $error = false; $blocks = API::blockParser((string)$args["blocks"], $messages, $error);//TODO change to Palette foreach ($messages as $message) { $sender->sendMessage($message); } $return = !$error; if ($return) { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } #API::overlayReplaceAsync($selection, $session, [], $blocks, API::flagParser(explode(" ", strval($args["flags"])))); } else { throw new InvalidArgumentException("Could not replace with the selected blocks"); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/region/ReplaceCommand.php ================================================ registerArgument(0, new RawStringArgument("findblocks", false)); $this->registerArgument(1, new RawStringArgument("replaceblocks", false)); $this->registerArgument(2, new TextArgument("flags", true)); $this->setPermission("we.command.region.replace"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $messages = []; $error = false; $findBlocks = API::blockParser((string)$args["findblocks"], $messages, $error);//TODO change to Palette $replaceBlocks = API::blockParser((string)$args["replaceblocks"], $messages, $error);//TODO change to Palette foreach ($messages as $message) { $sender->sendMessage($message); } $return = !$error; if ($return) { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } $hasFlags = isset($args["flags"]); API::replaceAsync($selection, $session, $findBlocks, $replaceBlocks, $hasFlags ? API::flagParser(explode(" ", (string)$args["flags"])) : API::FLAG_BASE); } else { throw new InvalidArgumentException("Could not replace with the selected blocks"); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/region/SetCommand.php ================================================ registerArgument(0, new RawStringArgument("blocks", false)); $this->registerArgument(1, new TextArgument("flags", true)); $this->setPermission("we.command.region.set"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $messages = []; $error = false; $replaceBlocks = API::blockParser((string)$args["blocks"], $messages, $error);//TODO change to Palette foreach ($messages as $message) { $sender->sendMessage($message); } if (!$error) { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } $hasFlags = isset($args["flags"]); API::fillAsync($selection, $session, $replaceBlocks, $hasFlags ? API::flagParser(explode(" ", (string)$args["flags"])) : API::FLAG_BASE); } else { throw new InvalidArgumentException("Could not fill with the selected blocks"); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/selection/ChunkCommand.php ================================================ setPermission("we.command.selection.chunk"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection() ?? $session->addSelection(new Selection($session->getUUID(), $sender->getWorld())); // TODO check if the selection inside of the session updates if (is_null($selection)) { throw new Error("No selection created - Check the console for errors"); } $chunk = $sender->getWorld()->getOrLoadChunkAtPosition($sender->getPosition()); if (is_null($chunk)) { throw new Error("Could not find a chunk at your position"); } $x = $sender->getPosition()->x >> 4; $z = $sender->getPosition()->x >> 4; $selection->setPos1(Position::fromObject(new Vector3($x * 16, 0, $z * 16), $sender->getWorld())); $selection->setPos2(Position::fromObject(new Vector3($x * 16 + 15, World::Y_MAX, $z * 16 + 15), $sender->getWorld())); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (Error $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/selection/HPos1Command.php ================================================ setPermission("we.command.selection.hpos"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection() ?? $session->addSelection(new Selection($session->getUUID(), $sender->getWorld())); // TODO check if the selection inside of the session updates if (is_null($selection)) { throw new Error("No selection created - Check the console for errors"); } $target = $sender->getTargetBlock(Loader::getInstance()->getToolDistance()); if ($target === null) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.notarget')); return; } $selection->setPos1($target->getPos()); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (Error $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/selection/HPos2Command.php ================================================ setPermission("we.command.selection.hpos"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection() ?? $session->addSelection(new Selection($session->getUUID(), $sender->getWorld())); // TODO check if the selection inside of the session updates if (is_null($selection)) { throw new Error("No selection created - Check the console for errors"); } $target = $sender->getTargetBlock(Loader::getInstance()->getToolDistance()); if ($target === null) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.notarget')); return; } $selection->setPos2($target->getPos()); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (Error $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/selection/Pos1Command.php ================================================ setPermission("we.command.selection.pos"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection() ?? $session->addSelection(new Selection($session->getUUID(), $sender->getWorld())); // TODO check if the selection inside of the session updates if (is_null($selection)) { throw new Error("No selection created - Check the console for errors"); } $selection->setPos1($sender->getPosition()); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (Error $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/selection/Pos2Command.php ================================================ setPermission("we.command.selection.pos"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (!$session instanceof UserSession) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection() ?? $session->addSelection(new Selection($session->getUUID(), $sender->getWorld())); // TODO check if the selection inside of the session updates if (is_null($selection)) { throw new Error("No selection created - Check the console for errors"); } $selection->setPos2($sender->getPosition()); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (Error $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/selection/info/CountCommand.php ================================================ registerArgument(0, new RawStringArgument("blocks", true)); $this->registerArgument(1, new TextArgument("flags", true)); $this->setPermission("we.command.selection.info.count"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $error = false; if (!empty($args["blocks"])) { $messages = []; API::blockParser(($filterBlocks = (string)$args["blocks"]), $messages, $error);//TODO change to Palette foreach ($messages as $message) { $sender->sendMessage($message); } } else $filterBlocks = ""; if (!$error) { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $session->sendMessage(TF::GOLD . $lang->translateString('warning.differentworld')); } Server::getInstance()->getAsyncPool()->submitTask( new AsyncActionTask( $session->getUUID(), $selection, new CountAction(), $selection->getShape()->getTouchedChunks($selection->getWorld()), "", $filterBlocks ) ); } else { throw new InvalidArgumentException("Could not count the selected blocks"); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/selection/info/ListChunksCommand.php ================================================ setPermission("we.command.selection.info.listchunks"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } $touchedChunks = $selection->getShape()->getTouchedChunks($selection->getWorld()); $session->sendMessage(TF::DARK_AQUA . $lang->translateString('command.listchunks.found', [count($touchedChunks)])); foreach ($touchedChunks as $chunkHash => $touchedChunk) { $chunk = FastChunkSerializer::deserialize($touchedChunk); $biomes = []; for ($x = 0; $x < 16; $x++) for ($z = 0; $z < 16; $z++) $biomes[] = (FastChunkSerializer::deserialize($touchedChunk)->getBiomeId($x, $z)); $biomes = array_unique($biomes); $biomecount = count($biomes); $biomes = implode(", ", $biomes); World::getXZ($chunkHash, $cx, $cz); $session->sendMessage(TF::AQUA . "ID: {$chunkHash} | X: {$cx} Z: {$cz} | Subchunks: {$chunk->getHeight()} | Biomes: ($biomecount) $biomes"); } } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/selection/info/SizeCommand.php ================================================ setPermission("we.command.selection.info.size"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $selection = $session->getLatestSelection(); if (is_null($selection)) { throw new SelectionException($lang->translateString('error.noselection')); } if (!$selection->isValid()) { throw new SelectionException($lang->translateString('error.selectioninvalid')); } if ($selection->getWorld() !== $sender->getWorld()) { $sender->sendMessage(Loader::PREFIX . TF::GOLD . $lang->translateString('warning.differentworld')); } $session->sendMessage(TF::DARK_AQUA . $lang->translateString('command.size')); $session->sendMessage(TF::AQUA . "Total: {$selection->getShape()->getTotalCount()} X: {$selection->getSizeX()} Y: {$selection->getSizeY()} Z: {$selection->getSizeZ()}"); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/tool/DebugCommand.php ================================================ setPermission("we.command.tool.debug"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $item = ItemFactory::getInstance()->get(ItemIds::STICK); $item->addEnchantment(new EnchantmentInstance(Loader::$ench)); $item->setCustomName(Loader::PREFIX . TF::BOLD . TF::DARK_PURPLE . $lang->translateString('tool.debug')); $item->setLore([ $lang->translateString('tool.debug.lore.1'), $lang->translateString('tool.debug.lore.2'), $lang->translateString('tool.debug.lore.3') ]); $item->getNamedTag()->setTag(API::TAG_MAGIC_WE, CompoundTag::create()); $sender->getInventory()->addItem($item); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (Error $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/tool/FloodCommand.php ================================================ setPermission("we.command.tool.floodfill"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $sender->sendMessage(TF::RED . "TEMPORARILY DISABLED!"); /* if (!$sender instanceof Player) return; /** @var Player $sender * / $lang = Loader::getInstance()->getLanguage(); try { if ($sender instanceof Player) { $form = new CustomForm(Loader::PREFIX . TF::BOLD . TF::DARK_PURPLE . $lang->translateString('ui.flood.title')); $form->addElement(new Slider($lang->translateString('ui.flood.options.limit'), 0, 5000, 500.0)); $form->addElement(new Input($lang->translateString('ui.flood.options.blocks'), $lang->translateString('ui.flood.options.blocks.placeholder'))); $form->addElement(new Label($lang->translateString('ui.flood.options.label.infoapply'))); $form->setCallable(function (Player $player, $data) use ($form) { $item = ItemFactory::get(ItemIds::BUCKET, 1); $item->addEnchantment(new EnchantmentInstance(Enchantment::getEnchantment(Loader::FAKE_ENCH_ID))); $item->setCustomName(Loader::PREFIX . TF::BOLD . TF::DARK_PURPLE . 'Flood'); $item->setLore(BrushCommand::generateLore($form->getContent(), $data)); $item->setNamedTagEntry(new CompoundTag(API::TAG_MAGIC_WE, [ new StringTag("blocks", $data[1]), new FloatTag("limit", $data[0]), ])); $player->getInventory()->addItem($item); }); $sender->sendForm($form); } else { $sender->sendMessage(TF::RED . "Console can not use this command."); } } catch (\Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . Loader::getInstance()->getLanguage()->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (\ArgumentCountError $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . Loader::getInstance()->getLanguage()->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (\Error $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); }*/ } } ================================================ FILE: src/xenialdan/MagicWE2/commands/tool/ToggledebugCommand.php ================================================ setPermission("we.command.tool.toggledebug"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $sender->sendMessage($session->setDebugToolEnabled(!$session->isDebugToolEnabled())); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/tool/TogglewandCommand.php ================================================ setPermission("we.command.tool.togglewand"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $sender->sendMessage($session->setWandEnabled(!$session->isWandEnabled())); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/tool/WandCommand.php ================================================ setPermission("we.command.tool.wand"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { /** @var Durable $item */ $item = ItemFactory::getInstance()->get(ItemIds::WOODEN_AXE); $item->addEnchantment(new EnchantmentInstance(Loader::$ench)); $item->setUnbreakable(true); $item->setCustomName(Loader::PREFIX . TF::BOLD . TF::DARK_PURPLE . $lang->translateString('tool.wand')); $item->setLore([ $lang->translateString('tool.wand.lore.1'), $lang->translateString('tool.wand.lore.2'), $lang->translateString('tool.wand.lore.3') ]); $item->getNamedTag()->setTag(API::TAG_MAGIC_WE, CompoundTag::create()); if (!$sender->getInventory()->contains($item)) $sender->getInventory()->addItem($item); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } catch (Error $error) { Loader::getInstance()->getLogger()->logException($error); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/utility/CalculateCommand.php ================================================ registerArgument(0, new TextArgument("expression", false)); $this->setPermission("we.command.utility.calculate"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } try { $sender->sendMessage((string)$args["expression"] . " = " . API::evalAsMath((string)$args["expression"])); } catch (CalculationException $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage(Loader::PREFIX . TF::RED . (string)$args["expression"]); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/commands/utility/ToggleWailaCommand.php ================================================ setPermission("we.command.utility.togglewaila"); } /** * @param CommandSender $sender * @param string $aliasUsed * @param mixed[] $args */ public function onRun(CommandSender $sender, string $aliasUsed, array $args): void { $lang = Loader::getInstance()->getLanguage(); if ($sender instanceof Player && SessionHelper::hasSession($sender)) { try { $lang = SessionHelper::getUserSession($sender)->getLanguage(); } catch (SessionException $e) { } } if (!$sender instanceof Player) { $sender->sendMessage(TF::RED . $lang->translateString('error.runingame')); return; } /** @var Player $sender */ try { $session = SessionHelper::getUserSession($sender); if (is_null($session)) { throw new SessionException($lang->translateString('error.nosession', [Loader::getInstance()->getName()])); } $sender->sendMessage($session->setWailaEnabled(!$session->isWailaEnabled())); } catch (Exception $error) { $sender->sendMessage(Loader::PREFIX . TF::RED . $lang->translateString('error.command-error')); $sender->sendMessage(Loader::PREFIX . TF::RED . $error->getMessage()); $sender->sendMessage($this->getUsage()); } } } ================================================ FILE: src/xenialdan/MagicWE2/event/MWEEditEvent.php ================================================ oldBlocks = $oldBlocks; $this->newBlocks = $newBlocks; $this->session = $session; } /** * @return null|Session */ public function getSession(): ?Session { return $this->session; } /** * @return null|Player */ public function getPlayer(): ?Player { if (($session = $this->getSession()) instanceof UserSession) /** @var UserSession $session */ $session->getPlayer(); return null; } /** * @param null|Player $player */ public function setPlayer(?Player $player): void { if (($session = $this->getSession()) instanceof UserSession) /** @var UserSession $session */ $session->setPlayer($player); } /** * @return Block[] */ public function getOldBlocks(): array { return $this->oldBlocks; } /** * @return Block[] */ public function getNewBlocks(): array { return $this->newBlocks; } /** * @param Block[] $newBlocks */ public function setNewBlocks(array $newBlocks): void { $this->newBlocks = $newBlocks; } } ================================================ FILE: src/xenialdan/MagicWE2/event/MWEEvent.php ================================================ selection = $selection; $this->type = $type; try { $this->session = SessionHelper::getSessionByUUID($selection->sessionUUID); } catch (SessionException $e) { } } /** * @return Selection */ public function getSelection(): Selection { return $this->selection; } /** * @param Selection $selection */ public function setSelection(Selection $selection): void { $this->selection = $selection; } /** * @return null|Session */ public function getSession(): ?Session { return $this->session; } /** * @return null|Player */ public function getPlayer(): ?Player { if (($session = $this->getSession()) instanceof UserSession) /** @var UserSession $session */ return $session->getPlayer(); return null; } /** * @return int */ public function getType(): int { return $this->type; } } ================================================ FILE: src/xenialdan/MagicWE2/event/MWESessionLoadEvent.php ================================================ session = $session; } /** * @return null|Session */ public function getSession(): ?Session { return $this->session; } /** * @return null|Player */ public function getPlayer(): ?Player { return $this->session instanceof UserSession ? $this->session->getPlayer() : null; } } ================================================ FILE: src/xenialdan/MagicWE2/event/MWESessionSettingChangeEvent.php ================================================ session = $session; $this->type = $type;//TODO use } /** * @return null|Session */ public function getSession(): ?Session { return $this->session; } /** * @return null|Player */ public function getPlayer(): ?Player { if (($session = $this->getSession()) instanceof UserSession) /** @var UserSession $session */ return $session->getPlayer(); return null; } /** * @return int */ public function getType(): int { return $this->type; } } ================================================ FILE: src/xenialdan/MagicWE2/exception/ActionNotFoundException.php ================================================ getBlockAt($x, $y, $z)->getId(), $this->getBlockAt($x, $y, $z)->getMeta()]; } /** * @return Chunk[] */ public function getChunks(): array { return $this->chunks; } } ================================================ FILE: src/xenialdan/MagicWE2/helper/BlockEntry.php ================================================ fullId = $fullId; $this->nbt = $nbt; } public function validate(): bool { /** @var BlockFactory $instance */ $instance = BlockFactory::getInstance(); $block = $instance->fromFullBlock($this->fullId); [$id, $meta] = [$block->getId(), $block->getMeta()]; if ($id === BlockLegacyIds::INFO_UPDATE) { return false; } if ($this->nbt instanceof CompoundTag && !$this->nbt->valid()) { return false; } return true; } public function __toString() { /** @var BlockFactory $instance */ $instance = BlockFactory::getInstance(); $block = $instance->fromFullBlock($this->fullId); $str = __CLASS__ . " " . $this->fullId . " [{$block->getId()}:{$block->getMeta()}]"; if ($this->nbt instanceof CompoundTag) { $str .= " " . str_replace("\n", "", $this->nbt->toString()); } return $str; } public function toBlock(): Block { /** @var BlockFactory $instance */ $instance = BlockFactory::getInstance(); return $instance->fromFullBlock($this->fullId); } public static function fromBlock(Block $block): self { BlockFactory::getInstance(); return new BlockEntry($block->getFullId()); } } ================================================ FILE: src/xenialdan/MagicWE2/helper/BlockPalette.php ================================================ getFullId(); return json_encode($e, JSON_THROW_ON_ERROR); } /** * @param string $blocks * @return array * @throws JsonException */ public static function decode(string $blocks): array { $e = []; foreach (json_decode($blocks, true, 512, JSON_THROW_ON_ERROR) as $block) $e[] = BlockFactory::getInstance()->fromFullBlock($block); return $e; } } ================================================ FILE: src/xenialdan/MagicWE2/helper/BlockStatesEntry.php ================================================ blockIdentifier = $blockIdentifier; $this->blockStates = $blockStates; $this->block = $block; try { if ($this->blockStates !== null) $this->blockFull = TextFormat::clean(BlockStatesParser::printStates($this, false)); else $this->blockFull = $this->blockIdentifier; } catch (Throwable $e) { GlobalLogger::get()->logException($e); $this->blockFull = $this->blockIdentifier; } } /** * @return string */ public function __toString() { return $this->blockFull; } /** * TODO hacky AF. clean up * @return Block * @throws InvalidArgumentException * @throws RuntimeException * @throws InvalidBlockStateException */ public function toBlock(): Block { if ($this->block instanceof Block) return $this->block; BlockFactory::getInstance(); $blocks = BlockStatesParser::getInstance()::fromString($this->blockFull, false); $block = reset($blocks); if($block instanceof Block) $this->block = $block; return $this->block; } /** * TODO Optimize (reduce getStateByBlock/fromString calls) * @param int $amount any of [90,180,270] * @return BlockStatesEntry * @throws InvalidArgumentException * @throws InvalidBlockStateException * @throws RuntimeException */ public function rotate(int $amount): BlockStatesEntry { //TODO validate $amount $clone = clone $this; $block = $clone->toBlock(); $idMapName = str_replace("minecraft:", "", BlockStatesParser::getBlockIdMapName($block)); $key = $idMapName . ":" . $block->getMeta(); if (strpos($idMapName, "_door") !== false) { $fromMap = BlockStatesParser::getDoorRotationFlipMap()[$block->getMeta()] ?? null; } else { $fromMap = BlockStatesParser::getRotationFlipMap()[$key] ?? null; } if ($fromMap === null) return $clone; $rotatedStates = $fromMap[$amount] ?? null; if ($rotatedStates === null) return $clone; //ugly hack to keep current ones //TODO use the states compound tag $bsCompound = $clone->blockStates; #$bsCompound->setName("minecraft:$key");//TODO this might cause issues with the parser since it stays same //seems to work ¯\_(ツ)_/¯ foreach ($rotatedStates as $tagName => $v) { //TODO clean up.. new method? $tag = $bsCompound->getTag($tagName); if ($tag === null) { throw new InvalidBlockStateException("Invalid state $tagName"); } if ($tag instanceof StringTag) { $bsCompound->setString($tagName, $v); } else if ($tag instanceof IntTag) { $bsCompound->setInt($tagName, (int)$v); } else if ($tag instanceof ByteTag) { if ($v === 1) $v = "true"; if ($v === 0) $v = "false"; if ($v !== "true" && $v !== "false") { throw new InvalidBlockStateException("Invalid value $v for blockstate $tagName, must be \"true\" or \"false\""); } $bsCompound->setByte($tagName, $v === "true" ? 1 : 0); } else { throw new InvalidBlockStateException("Unknown tag of type " . get_class($tag) . " detected"); } } $clone->blockStates = $bsCompound; $clone->blockFull = TextFormat::clean(BlockStatesParser::printStates($clone, false)); if (strpos($idMapName, "_door") !== false) { $clone->block = BlockStatesParser::fromString($clone->blockFull, false)[0]; } else $clone->block = null; return $clone; //TODO reduce useless calls. BSP::fromStates? #$blockFull = TextFormat::clean(BlockStatesParser::printStates($clone, false)); #return BlockStatesParser::getStateByBlock(BlockStatesParser::fromString($blockFull)[0]); } /** * TODO Optimize (reduce getStateByBlock/fromString calls) * @param string $axis any of ["x","y","z","xz"] * @return BlockStatesEntry * @throws InvalidArgumentException * @throws InvalidBlockStateException * @throws RuntimeException */ public function mirror(string $axis): BlockStatesEntry { //TODO validate $axis $clone = clone $this; $block = $clone->toBlock(); $idMapName = str_replace("minecraft:", "", BlockStatesParser::getBlockIdMapName($block)); $key = $idMapName . ":" . $block->getMeta(); if ($axis !== FlipAction::AXIS_Y) {//ugly hack for y flip $fromMap = BlockStatesParser::getRotationFlipMap()[$key] ?? null; if ($fromMap === null) { #var_dump("block not in mirror map"); return $clone; } $flippedStates = $fromMap[$axis] ?? null; if ($flippedStates === null /*&& $axis !== FlipAction::AXIS_Y*/) {//ugly hack for y flip #var_dump("axis not in mirror map"); return $clone; } } //ugly hack to keep current ones //TODO use the states compound tag $bsCompound = clone $clone->blockStates;//TODO check if clone is necessary #$bsCompound->setName("minecraft:$key");//TODO this might cause issues with the parser since it stays same //seems to work ¯\_(ツ)_/¯ if ($axis === FlipAction::AXIS_Y && !(//TODO maybe add vine + mushroom block directions $bsCompound->hasTag("attachment") || $bsCompound->hasTag("facing_direction") || $bsCompound->hasTag("hanging") || $bsCompound->hasTag("lever_direction") || $bsCompound->hasTag("rail_direction") || $bsCompound->hasTag("top_slot_bit") || $bsCompound->hasTag("torch_facing_direction") || $bsCompound->hasTag("upper_block_bit") || $bsCompound->hasTag("upside_down_bit") )) {//ugly hack for y flip #var_dump("nothing can be flipped around y axis"); return $clone; } foreach ($bsCompound as $tagName => $tag) { //TODO clean up.. new method? if ($axis === FlipAction::AXIS_Y) { $value = $tag->getValue(); switch ($tagName) {//TODO clean up oh my god case "attachment": { if ($value === "standing") $value = "hanging"; else if ($value === "hanging") $value = "standing"; break; } case "hanging": case "upside_down_bit": case "upper_block_bit": case "top_slot_bit": case "facing_direction": { if ($value === 0) $value = 1; else if ($value === 1) $value = 0; break; } case "lever_direction": { if ($value === "down_east_west") $value = "up_east_west"; else if ($value === "up_east_west") $value = "down_east_west"; else if ($value === "down_north_south") $value = "up_north_south"; else if ($value === "up_north_south") $value = "down_north_south"; break; } case "rail_direction": { //TODO break; } case "torch_facing_direction": { if ($value === "unknown") $value = "top"; else if ($value === "top") $value = "unknown"; break; }/* default: { $value = $flippedStates[$stateName]; }*/ } } else if (isset($flippedStates)) $value = $flippedStates[$tagName] ?? $tag->getValue(); else throw new InvalidArgumentException("flippedStates is not set. Error should never occur, please use //report and send a stack trace"); if ($tag instanceof StringTag) { $bsCompound->setString($tagName, $value); } else if ($tag instanceof IntTag) { $bsCompound->setInt($tagName, (int)$value); } else if ($tag instanceof ByteTag) { if ($value === 1) $value = "true"; if ($value === 0) $value = "false"; if ($value !== "true" && $value !== "false") { throw new InvalidBlockStateException("Invalid value $value for blockstate $tagName, must be \"true\" or \"false\""); } $bsCompound->setByte($tagName, $value === "true" ? 1 : 0); } else { throw new InvalidBlockStateException("Unknown tag of type " . get_class($tag) . " detected"); } } $clone->blockStates = $bsCompound; $clone->block = null; $clone->blockFull = TextFormat::clean(BlockStatesParser::printStates($clone, false)); #var_dump($clone->blockFull); return $clone; //TODO reduce useless calls. BSP::fromStates? #$blockFull = TextFormat::clean(BlockStatesParser::printStates($clone, false)); #return BlockStatesParser::getStateByBlock(BlockStatesParser::fromString($blockFull)[0]); } } ================================================ FILE: src/xenialdan/MagicWE2/helper/BlockStatesParser.php ================================================ loadRotationAndFlipData(Loader::getRotFlipPath()); // $this->loadDoorRotationAndFlipData(Loader::getDoorRotFlipPath()); $this->loadRotationAndFlipData(self::$rotPath); $this->loadDoorRotationAndFlipData(self::$doorRotPath); $this->loadLegacyMappings(); } private function loadLegacyMappings(): void { /** @var R12ToCurrentBlockMapEntry[][] $legacyStateMap */ self::$legacyStateMap = []; $contents = file_get_contents(RESOURCE_PATH . "vanilla/r12_to_current_block_map.bin"); if ($contents === false) throw new PluginException("Can not get contents of r12_to_current_block_map"); $legacyStateMapReader = new PacketSerializer($contents); $nbtReader = new NetworkNbtSerializer(); while (!$legacyStateMapReader->feof()) { $id = $legacyStateMapReader->getString(); $meta = $legacyStateMapReader->getLShort(); $offset = $legacyStateMapReader->getOffset(); $state = $nbtReader->read($legacyStateMapReader->getBuffer(), $offset)->mustGetCompoundTag(); $legacyStateMapReader->setOffset($offset); $r12ToCurrentBlockMapEntry = new R12ToCurrentBlockMapEntry($id, $meta, $state); self::$legacyStateMap[$id][$meta] = $r12ToCurrentBlockMapEntry; } ksort(self::$legacyStateMap, SORT_NUMERIC); } /** * @param string|null $path * @throws JsonException * @throws PluginException */ protected function loadRotationAndFlipData(?string $path = null): void { if ($path !== null) { $fileGetContents = file_get_contents($path); if ($fileGetContents === false) { throw new PluginException("rotation_flip_data.json could not be loaded! Rotation and flip support has been disabled!"); } self::$rotationFlipMap = json_decode($fileGetContents, true, 512, JSON_THROW_ON_ERROR); GlobalLogger::get()->debug("Successfully loaded rotation_flip_data.json"); } } /** * @param string|null $path * @throws JsonException * @throws PluginException */ protected function loadDoorRotationAndFlipData(?string $path = null): void { if ($path !== null) { $fileGetContents = file_get_contents($path); if ($fileGetContents === false) { throw new PluginException("door_data.json could not be loaded! Door rotation and flip support has been disabled!"); } self::$doorRotationFlipMap = json_decode($fileGetContents, true, 512, JSON_THROW_ON_ERROR); GlobalLogger::get()->debug("Successfully loaded door_data.json"); } } /** * @return array */ public static function getRotationFlipMap(): array { return self::$rotationFlipMap; } /** * @return array */ public static function getDoorRotationFlipMap(): array { return self::$doorRotationFlipMap; } /** * @param string $namespacedSelectedBlockName * @param CompoundTag $states * @return Door * @throws InvalidArgumentException * @throws InvalidBlockStateException * @throws RuntimeException * @throws \pocketmine\block\utils\InvalidBlockStateException */ private static function buildDoor(string $namespacedSelectedBlockName, CompoundTag $states): Door { /** @var Door $door */ $door = self::fromString($namespacedSelectedBlockName)[0]; $door->setOpen($states->getByte("open_bit") === 1); $door->setTop($states->getByte("upper_block_bit") === 1); $door->setHingeRight($states->getByte("door_hinge_bit") === 1); $direction = $states->getInt("direction"); $door->setFacing(Facing::rotateY(BlockDataSerializer::readLegacyHorizontalFacing($direction & 0x03), false)); return $door; } /** * @param array $aliasMap */ public function setAliasMap(array $aliasMap): void { self::$aliasMap = $aliasMap; } /** * @param Block $block * @return string|null */ public static function getBlockIdMapName(Block $block): ?string { return LegacyBlockIdToStringIdMap::getInstance()->legacyToString($block->getId()); } /** * @param string $blockIdentifier * @return CompoundTag */ protected static function getDefaultStates(string $blockIdentifier): CompoundTag { return self::$legacyStateMap[$blockIdentifier][0]->getBlockState()->getCompoundTag('states') ?? new CompoundTag(); } /** * @param string $query * @param bool $multiple * @return Block[] * @throws InvalidArgumentException * @throws InvalidBlockStateException * @throws RuntimeException */ public static function fromString(string $query, bool $multiple = false): array { #if (!BlockFactory::isInit()) BlockFactory::init(); $blocks = []; if ($multiple) { $pregSplit = preg_split('/,(?![^\[]*])/', trim($query), -1, PREG_SPLIT_NO_EMPTY); if (!is_array($pregSplit)) throw new InvalidArgumentException("Regex matching failed"); foreach ($pregSplit as $b) { /** @noinspection SlowArrayOperationsInLoopInspection */ $blocks = array_merge($blocks, self::fromString($b, false)); } return $blocks; } $blockData = strtolower(str_replace("minecraft:", "", $query));//TODO try to keep namespace "minecraft:" to support custom blocks $re = '/([\w:]+)(?:\[([\w=,]*)\])?/m'; preg_match_all($re, $blockData, $matches, PREG_SET_ORDER, 0); if (!isset($matches[0][1])) { throw new InvalidArgumentException("Could not detect block id"); } $selectedBlockName = $matches[0][1]; $namespacedSelectedBlockName = "minecraft:" . $selectedBlockName;//TODO try to keep namespace "minecraft:" to support custom blocks /** @var LegacyStringToItemParser $legacyStringToItemParser */ $legacyStringToItemParser = LegacyStringToItemParser::getInstance(); $block = $legacyStringToItemParser->parse($selectedBlockName)->getBlock(); if (count($matches[0]) < 3) { return [$block]; } $defaultStatesNamedTag = self::getDefaultStates($namespacedSelectedBlockName); if (!$defaultStatesNamedTag instanceof CompoundTag) { throw new InvalidArgumentException("Could not find default block states for $namespacedSelectedBlockName"); } $extraData = $matches[0][2] ?? ""; $statesExploded = explode(",", $extraData); $finalStatesList = clone $defaultStatesNamedTag; #var_dump($statesExploded, $finalStatesList->toString()); #$finalStatesList->setName("states"); $availableAliases = [];//TODO map in init()! No need to recreate every time! EDIT 2k20: uhm what? @ my past self, why can't you explain properly?! foreach ($finalStatesList as $stateName => $state) { if (array_key_exists($stateName, self::$aliasMap)) { foreach (self::$aliasMap[$stateName]["alias"] as $alias) { //todo maybe check for duplicated alias here? "block state mapping invalid: duplicated alias detected" $availableAliases[$alias] = $stateName; } } } foreach ($statesExploded as $stateKeyValuePair) { if (strpos($stateKeyValuePair, "=") === false) continue; [$stateName, $value] = explode("=", $stateKeyValuePair); $value = strtolower(trim((string)$value)); if ($value === '') { throw new InvalidBlockStateException("Empty value for state $stateName"); } //change blockstate alias to blockstate name $stateName = $availableAliases[$stateName] ?? $stateName; //TODO maybe validate wrong states here? i.e. stone[type=wrongtype] => Exception, "wrongtype" is invalid value $tag = $finalStatesList->getTag($stateName); if ($tag === null) { throw new InvalidBlockStateException("Invalid state $stateName"); } if ($tag instanceof StringTag) { $finalStatesList->setString($stateName, $value); } else if ($tag instanceof IntTag) { $finalStatesList->setInt($stateName, (int)$value); } else if ($tag instanceof ByteTag) { if ($value === '1' || $value === 'true') $value = 'true'; if ($value === '0' || $value === 'false') $value = 'false'; if ($value !== "true" && $value !== "false") { throw new InvalidBlockStateException("Invalid value $value for blockstate $stateName, must be \"true\" or \"false\""); } $finalStatesList->setByte($stateName, $value === "true" ? 1 : 0); } else { throw new InvalidBlockStateException("Unknown tag of type " . get_class($tag) . " detected"); } } #var_dump($finalStatesList->toString()); //print final list //TODO remove. This crashes in AsyncTasks and is just for debug #Loader::getInstance()->getLogger()->notice(self::printStates(new BlockStatesEntry($namespacedSelectedBlockName,$finalStatesList), false)); //return found block(s) $blocks = []; //doors.. special blocks annoying -.- $isDoor = strpos($namespacedSelectedBlockName, "_door") !== false; if ($isDoor) { return [self::buildDoor($namespacedSelectedBlockName, $finalStatesList)]; } #var_dump((string)$finalStatesList); foreach (self::$legacyStateMap[$namespacedSelectedBlockName] as $meta => $r12ToCurrentBlockMapEntry) { $clonedPrintedCompound = clone $r12ToCurrentBlockMapEntry->getBlockState()->getCompoundTag('states'); if ($clonedPrintedCompound->equals($finalStatesList)) { #Server::getInstance()->getLogger()->notice("FOUND!"); /** @var BlockFactory $blockFactory */ $blockFactory = BlockFactory::getInstance(); $block = $blockFactory->get($block->getId(), $meta & 0xf); #var_dump($oldNameAndMeta,$block); #var_dump($block, $finalStatesList); $blocks[] = $block; #Server::getInstance()->getLogger()->debug(TF::GREEN . "Found block: " . TF::GOLD . $block); #Server::getInstance()->getLogger()->notice(self::printStates(new BlockStatesEntry($namespacedSelectedBlockName, $clonedPrintedCompound), true));//might cause loop lol } } #if (empty($blocks)) return [Block::get(0)];//no block found //TODO r12 map only has blocks up to id 255. On 4.0.0, return Item::fromString()? if (empty($blocks)) throw new InvalidArgumentException("No block $namespacedSelectedBlockName matching $query could be found");//no block found //TODO r12 map only has blocks up to id 255. On 4.0.0, return Item::fromString()? if (count($blocks) === 1) return $blocks; //"Hack" to get just one block if multiple results have been found. Most times this results in the default one (meta:0) $smallestMeta = PHP_INT_MAX; $result = null; foreach ($blocks as $block) { if ($block->getMeta() < $smallestMeta) { $smallestMeta = $block->getMeta(); $result = $block; } } #Loader::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . "Final block: " . TF::AQUA . $result); /** @var Block $result */ return [$result]; } public static function getStateByBlock(Block $block): ?BlockStatesEntry { $name = self::getBlockIdMapName($block); if ($name === null) return null; $damage = $block->getMeta(); $blockStates = clone self::$legacyStateMap[$name][$damage]->getBlockState()->getCompoundTag('states'); if ($blockStates === null) return null; return new BlockStatesEntry($name, $blockStates, $block); } public static function getStateByCompound(CompoundTag $compoundTag): ?BlockStatesEntry { $namespacedSelectedBlockName = $compoundTag->getString('name', ""); if ($namespacedSelectedBlockName === "") return null; $states = $compoundTag->getCompoundTag('states') ?? self::getDefaultStates($namespacedSelectedBlockName); if (!$states instanceof CompoundTag) { throw new InvalidArgumentException("Could not find default block states for $namespacedSelectedBlockName"); } if (strpos($namespacedSelectedBlockName, "_door") !== false) { $door = self::buildDoor($namespacedSelectedBlockName, $states); //return self::getStateByBlock($door); return new BlockStatesEntry($namespacedSelectedBlockName, $states, $door); } foreach (self::$legacyStateMap[$namespacedSelectedBlockName] ?? [] as $meta => $r12ToCurrentBlockMapEntry) {//??[] is to avoid crashes on newer blocks like light block $clonedPrintedCompound = $r12ToCurrentBlockMapEntry->getBlockState()->getCompoundTag('states'); if ($clonedPrintedCompound->equals($states)) { #Server::getInstance()->getLogger()->notice(self::printStates(new BlockStatesEntry($namespacedSelectedBlockName, $clonedPrintedCompound), true));//might cause loop lol//todo rem return new BlockStatesEntry($namespacedSelectedBlockName, $clonedPrintedCompound); } } return null; } /** * @param BlockStatesEntry $entry * @param bool $skipDefaults * @return string * @throws RuntimeException */ public static function printStates(BlockStatesEntry $entry, bool $skipDefaults): string { $printedCompound = $entry->blockStates; $blockIdentifier = $entry->blockIdentifier; $s = []; foreach ($printedCompound as $statesTagEntryName => $statesTagEntry) { /** @var CompoundTag $defaultStatesNamedTag */ $defaultStatesNamedTag = self::getDefaultStates($blockIdentifier); $namedTag = $defaultStatesNamedTag->getTag($statesTagEntryName); if (!$namedTag instanceof ByteTag && !$namedTag instanceof StringTag && !$namedTag instanceof IntTag) { continue; } //skip defaults /** @var ByteTag|IntTag|StringTag $namedTag */ if ($skipDefaults && $namedTag->equals($statesTagEntry)) continue; //prepare string if ($statesTagEntry instanceof ByteTag) { $s[] = TF::RED . $statesTagEntryName . "=" . ($statesTagEntry->getValue() ? TF::GREEN . "true" : TF::RED . "false") . TF::RESET; } else if ($statesTagEntry instanceof IntTag) { $s[] = TF::BLUE . $statesTagEntryName . "=" . TF::BLUE . $statesTagEntry->getValue() . TF::RESET; } else if ($statesTagEntry instanceof StringTag) { $s[] = TF::LIGHT_PURPLE . $statesTagEntryName . "=" . TF::LIGHT_PURPLE . $statesTagEntry->getValue() . TF::RESET; } } if (count($s) === 0) { #Server::getInstance()->getLogger()->debug($blockIdentifier); return $blockIdentifier; } #Server::getInstance()->getLogger()->debug($blockIdentifier . "[" . implode(",", $s) . "]"); return $blockIdentifier . "[" . implode(",", $s) . "]"; } /** * Prints all blocknames with states (without default states) * @throws RuntimeException */ public static function printAllStates(): void { foreach (self::$legacyStateMap as $name => $v) { foreach ($v as $meta => $legacyMapEntry) { $currentoldName = $legacyMapEntry->getId(); $printedCompound = $legacyMapEntry->getBlockState()->getCompoundTag('states'); $bs = new BlockStatesEntry($currentoldName, $printedCompound); try { Server::getInstance()->getLogger()->debug(self::printStates($bs, true)); Server::getInstance()->getLogger()->debug((string)$bs); } catch (RuntimeException $e) { Server::getInstance()->getLogger()->logException($e); } } } } public static function runTests(): void { var_dump("Running tests"); //testing blockstate parser $tests = [ "minecraft:tnt", #"minecraft:wood", #"minecraft:log", "minecraft:wooden_slab", "minecraft:wooden_slab_wrongname", "minecraft:wooden_slab[foo=bar]", "minecraft:wooden_slab[top_slot_bit=]", "minecraft:wooden_slab[top_slot_bit=true]", "minecraft:wooden_slab[top_slot_bit=false]", "minecraft:wooden_slab[wood_type=oak]", #"minecraft:wooden_slab[wood_type=spruce]", "minecraft:wooden_slab[wood_type=spruce,top_slot_bit=false]", "minecraft:wooden_slab[wood_type=spruce,top_slot_bit=true]", "minecraft:end_rod[]", "minecraft:end_rod[facing_direction=1]", "minecraft:end_rod[block_light_level=14]", "minecraft:end_rod[block_light_level=13]", "minecraft:light_block[block_light_level=14]", "minecraft:stone[]", "minecraft:stone[stone_type=granite]", "minecraft:stone[stone_type=andesite]", "minecraft:stone[stone_type=wrongtag]",//seems to just not find a block at all. neat! #//alias testing "minecraft:wooden_slab[top=true]", "minecraft:wooden_slab[top=true,type=spruce]", "minecraft:stone[type=granite]", "minecraft:bedrock[burn=true]", "minecraft:lever[direction=1]", "minecraft:wheat[growth=3]", "minecraft:stone_button[direction=1,pressed=true]", "minecraft:stone_button[direction=0]", "minecraft:stone_brick_stairs[direction=0]", "minecraft:trapdoor[direction=0,open_bit=true,upside_down_bit=false]", "minecraft:birch_door", "minecraft:iron_door[direction=1]", "minecraft:birch_door[upper_block_bit=true]", "minecraft:birch_door[direction=1,door_hinge_bit=false,open_bit=false,upper_block_bit=true]", "minecraft:birch_door[door_hinge_bit=false,open_bit=true,upper_block_bit=true]", "minecraft:birch_door[direction=3,door_hinge_bit=false,open_bit=true,upper_block_bit=true]", "minecraft:campfire", ]; foreach ($tests as $test) { try { Loader::getInstance()->getLogger()->debug(TF::GOLD . "Search query: " . TF::LIGHT_PURPLE . $test); foreach (self::fromString($test) as $block) { assert($block instanceof Block); $blockStatesEntry = self::getStateByBlock($block); Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . self::printStates($blockStatesEntry, true)); Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . self::printStates($blockStatesEntry, false)); Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . "Final block: " . TF::AQUA . $block); } } catch (Exception $e) { Server::getInstance()->getLogger()->debug($e->getMessage()); continue; } } return;//TODO //test flip+rotation /** @noinspection PhpUnreachableStatementInspection */ // $tests2 = [ // #"minecraft:wooden_slab[wood_type=oak]", // #"minecraft:wooden_slab[wood_type=spruce,top_slot_bit=true]", // #"minecraft:end_rod[]", // #"minecraft:end_rod[facing_direction=1]", // #"minecraft:end_rod[facing_direction=2]", // #"minecraft:stone_brick_stairs[direction=0]", // #"minecraft:stone_brick_stairs[direction=1]", // #"minecraft:stone_brick_stairs[direction=1,upside_down_bit=true]", // #"stone_brick_stairs[direction=1,upside_down_bit=true]", // #"minecraft:ladder[facing_direction=3]", // #"minecraft:magenta_glazed_terracotta[facing_direction=2]", // #"minecraft:trapdoor[direction=3,open_bit=true,upside_down_bit=false]", // #"minecraft:birch_door", // #"minecraft:birch_door[direction=1]", // #"minecraft:birch_door[direction=1,door_hinge_bit=false,open_bit=false,upper_block_bit=true]", // #"minecraft:birch_door[door_hinge_bit=false,open_bit=true,upper_block_bit=true]", // "minecraft:birch_door[direction=3,door_hinge_bit=false,open_bit=true,upper_block_bit=true]", // ]; // foreach ($tests2 as $test) { // try { // Server::getInstance()->getLogger()->debug(TF::GOLD . "Rotation query: " . TF::LIGHT_PURPLE . $test); // $block = self::fromString($test)[0]; // Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . "From block: " . TF::AQUA . $block); // $state = self::getStateByBlock($block)->rotate(90); // assert($state->toBlock() instanceof Block); // Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . "Rotated block: " . TF::AQUA . $state->toBlock()); // Server::getInstance()->getLogger()->debug(TF::GOLD . "Mirror query x: " . TF::LIGHT_PURPLE . $test); // $state = self::getStateByBlock($block)->mirror("x"); // assert($state->toBlock() instanceof Block); // Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . "Flipped block x: " . TF::AQUA . $state->toBlock()); // Server::getInstance()->getLogger()->debug(TF::GOLD . "Mirror query y: " . TF::LIGHT_PURPLE . $test); // $state = self::getStateByBlock($block)->mirror("y"); // assert($state->toBlock() instanceof Block); // Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . "Flipped block y: " . TF::AQUA . $state->toBlock()); // } catch (Exception $e) { // Server::getInstance()->getLogger()->debug($e->getMessage()); // continue; // } // } // //test doors because WTF they are weird // try { // for ($i = 0; $i < 15; $i++) { // $block = BlockFactory::getInstance()->get(BlockLegacyIds::IRON_DOOR_BLOCK, $i); // Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . $block); // $entry = self::getStateByBlock($block); // Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . $entry); // Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . $entry->blockStates); // Server::getInstance()->getLogger()->debug(TF::LIGHT_PURPLE . self::printStates($entry, false)); // } // } catch (Exception $e) { // Server::getInstance()->getLogger()->debug($e->getMessage()); // } } public static function placeAllBlockstates(Position $position): void { $pasteY = $position->getFloorY(); $pasteX = $position->getFloorX(); $pasteZ = $position->getFloorZ(); $world = $position->getWorld(); $sorted = []; foreach (self::$legacyStateMap as $name => $v) { foreach ($v as $meta => $r12ToCurrentBlockMapEntry) { try { $sorted[] = (new BlockStatesEntry($name, $r12ToCurrentBlockMapEntry->getBlockState()->getCompoundTag('states')))->toBlock(); } catch (Exception $e) { //skip blocks that pm does not know about #$world->getServer()->broadcastMessage($e->getMessage()); } } } $i = 0; $limit = 50; foreach ($sorted as $blockStatesEntry) { /** @var BlockStatesEntry $blockStatesEntry */ $x = ($i % $limit) * 2; $z = ($i - ($i % $limit)) / $limit * 2; try { $block = $blockStatesEntry->toBlock(); #if($block->getId() !== $id || $block->getMeta() !== $meta) var_dump("error, $id:$meta does not match {$block->getId()}:{$block->getMeta()}"); #$world->setBlock(new Vector3($pasteX + $x, $pasteY, $pasteZ + $z), $block); $world->setBlockAt($pasteX + $x, $pasteY, $pasteZ + $z, $block, false); } catch (Exception $e) { $i++; continue; } $i++; } var_dump("DONE"); } /** @noinspection PhpUnusedPrivateMethodInspection */ private static function doorEquals(int $currentoldDamage, CompoundTag $defaultStatesNamedTag, CompoundTag $clonedPrintedCompound, CompoundTag $finalStatesList): bool { if ( /*( $isUp && $currentoldDamage === 8 && $finalStatesList->getByte("door_hinge_bit") === $defaultStatesNamedTag->getByte("door_hinge_bit") && $finalStatesList->getByte("open_bit") === $defaultStatesNamedTag->getByte("open_bit") && $finalStatesList->getInt("direction") === $defaultStatesNamedTag->getInt("direction") ) xor*/ ( #$finalStatesList->getByte("door_hinge_bit") === $clonedPrintedCompound->getByte("door_hinge_bit") && $finalStatesList->getByte("open_bit") === $clonedPrintedCompound->getByte("open_bit") && $finalStatesList->getInt("direction") === $clonedPrintedCompound->getInt("direction") ) ) return true; return false; } /** * Generates an alias map for blockstates * Only call from main thread! * @throws InvalidStateException * @throws AssumptionFailedError * @internal * @noinspection PhpUnusedPrivateMethodInspection */ private static function generateBlockStateAliasMapJson(): void { Loader::getInstance()->saveResource("blockstate_alias_map.json"); $config = new Config(Loader::getInstance()->getDataFolder() . "blockstate_alias_map.json"); $config->setAll([]); $config->save(); foreach (self::$legacyStateMap as $blockName => $v) { foreach ($v as $meta => $legacyMapEntry) { $states = clone $legacyMapEntry->getBlockState()->getCompoundTag('states'); foreach ($states as $stateName => $state) { if (!$config->exists($stateName)) { $alias = $stateName; $fullReplace = [ "top" => "top", "type" => "type", "_age" => "age", "age_" => "age", "directions" => "vine_b",//hack for vine_directions => directions "direction" => "direction", "vine_b" => "directions",//hack for vine_directions => directions "axis" => "axis", "delay" => "delay", "bite_counter" => "bites", "count" => "count", "pressed" => "pressed", "upper_block" => "top", "data" => "data", "extinguished" => "off", "color" => "color", "block_light" => "light", #"_lit"=>"lit", #"lit_"=>"lit", "liquid_depth" => "depth", "upside_down" => "flipped", "infiniburn" => "burn", ]; $partReplace = [ "_bit", "piece", "output_", "level", "amount", "cauldron", "allow", "state", "door", "redstone", "bamboo", #"head", "brewing_stand", "item_frame", "mushrooms", "composter", "coral", "_2", "_3", "_4", "end_portal", ]; foreach ($fullReplace as $stateAlias => $setTo) if (strpos($alias, $stateAlias) !== false) { $alias = $setTo; } foreach ($partReplace as $replace) $alias = trim(trim(str_replace($replace, "", $alias), "_")); $config->set($stateName, [ "alias" => [$alias], ]); } } } } $all = $config->getAll(); /** @var array $all */ ksort($all); $config->setAll($all); $config->save(); unset($config); } /** * Generates an alias map for blockstates * Only call from main thread! * @throws InvalidStateException * @internal */ public static function generatePossibleStatesJson(): void { $config = new Config(Loader::getInstance()->getDataFolder() . "possible_blockstates.json"); $config->setAll([]); $config->save(); $all = []; foreach (self::$legacyStateMap as $blockName => $v) { foreach ($v as $meta => $legacyMapEntry) { $states = clone $legacyMapEntry->getBlockState()->getCompoundTag('states'); foreach ($states as $stateName => $state) { if (!array_key_exists($stateName, $all)) { $all[(string)$stateName] = []; } if (!in_array($state->getValue(), $all[$stateName], true)) { $all[(string)$stateName][] = $state->getValue(); if (strpos($stateName, "_bit") !== false) { var_dump("_bit"); } else { var_dump("no _bit"); } } } } } ksort($all); $config->setAll($all); $config->save(); unset($config); } /** * Reads a value of an object, regardless of access modifiers * @param object $object * @param string $property * @return mixed */ public static function &readAnyValue(object $object, string $property) { $invoke = Closure::bind(function & () use ($property) { return $this->$property; }, $object, $object)->__invoke(); /** @noinspection PhpUnnecessaryLocalVariableInspection */ $value = &$invoke; return $value; } } ================================================ FILE: src/xenialdan/MagicWE2/helper/Progress.php ================================================ progress = $progress; $this->string = $info; } public function __toString() { return "Progress: " . $this->progress . " String: " . $this->string; } } ================================================ FILE: src/xenialdan/MagicWE2/helper/Scoreboard.php ================================================ getPlayer(); if ($session->isSidebarEnabled()) { ScoreFactory::setScore($player, Loader::PREFIX . TF::BOLD . TF::LIGHT_PURPLE . "Sidebar"); try { if ($session->getLatestSelection() !== null) { $line = 0; $selection = $session->getLatestSelection(); ScoreFactory::setScoreLine($player, ++$line, TF::GOLD . $session->getLanguage()->translateString("spacer", ["Selection"])); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Position: " . TF::RESET . "{$this->vecToString($selection->getPos1()->asVector3())} » {$this->vecToString($selection->getPos2()->asVector3())}"); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "World: " . TF::RESET . $selection->getWorld()->getFolderName()); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Shape: " . TF::RESET . (new ReflectionClass($selection->shape))->getShortName()); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Size: " . TF::RESET . "{$this->vecToString(new Vector3($selection->getSizeX(),$selection->getSizeY(),$selection->getSizeZ()))} ({$selection->getShape()->getTotalCount()})"); ScoreFactory::setScoreLine($player, ++$line, TF::GOLD . $session->getLanguage()->translateString("spacer", ["Settings"])); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Tool Range: " . TF::RESET . Loader::getInstance()->getToolDistance()); $editLimit = Loader::getInstance()->getEditLimit(); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Limit: " . TF::RESET . ($editLimit === -1 ? $this->boolToString(false) : $editLimit)); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Wand Tool: " . TF::RESET . $this->boolToString($session->isWandEnabled())); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Debug Tool: " . TF::RESET . $this->boolToString($session->isDebugToolEnabled())); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "WAILA: " . TF::RESET . $this->boolToString($session->isWailaEnabled())); if (($cb = $session->getCurrentClipboard()) instanceof SingleClipboard) { ScoreFactory::setScoreLine($player, ++$line, TF::GOLD . $session->getLanguage()->translateString("spacer", ["Clipboard"])); /** @var SingleClipboard $cb */ if ($cb->customName !== "") ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Name: " . TF::RESET . $cb->customName); if ($cb->selection instanceof Selection) { ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Shape: " . TF::RESET . (new ReflectionClass($cb->selection->shape))->getShortName()); ScoreFactory::setScoreLine($player, ++$line, TF::ITALIC . "Size: " . TF::RESET . "{$this->vecToString(new Vector3($cb->selection->getSizeX(),$cb->selection->getSizeY(),$cb->selection->getSizeZ()))} ({$cb->getTotalCount()})"); } } //todo current block palette, schematics, brushes } } catch (BadFunctionCallException | OutOfBoundsException | ReflectionException $e) { } } } private function vecToString(Vector3 $v): string { return TF::RESET . "[" . TF::RED . $v->getFloorX() . TF::RESET . ":" . TF::GREEN . $v->getFloorY() . TF::RESET . ":" . TF::BLUE . $v->getFloorZ() . TF::RESET . "]"; } private function boolToString(bool $b): string { return $b ? TF::RESET . TF::GREEN . "On" . TF::RESET : TF::RESET . TF::RED . "Off" . TF::RESET; } } ================================================ FILE: src/xenialdan/MagicWE2/helper/SessionHelper.php ================================================ */ private static $userSessions; /** @var Map */ private static $pluginSessions; public static function init(): void { if (!@mkdir($concurrentDirectory = Loader::getInstance()->getDataFolder() . "sessions") && !is_dir($concurrentDirectory)) { throw new RuntimeException(sprintf('Directory "%s" was not created', $concurrentDirectory)); } self::$userSessions = new Map(); self::$pluginSessions = new Map(); } /** * @param Session $session * @throws InvalidSkinException */ public static function addSession(Session $session): void { if ($session instanceof UserSession) { self::$userSessions->put($session->getUUID(), $session); if (!empty(Loader::getInstance()->donatorData) && (($player = $session->getPlayer())->hasPermission("we.donator") || in_array($player->getName(), Loader::getInstance()->donators))) { $oldSkin = $player->getSkin(); $newSkin = new Skin($oldSkin->getSkinId(), $oldSkin->getSkinData(), Loader::getInstance()->donatorData, $oldSkin->getGeometryName(), $oldSkin->getGeometryData()); $player->setSkin($newSkin); $player->sendSkin(); } } else if ($session instanceof PluginSession) self::$pluginSessions->put($session->getUUID(), $session); } /** * Destroys a session and removes it from cache. Saves to file if $save is true * @param Session $session * @param bool $save * @throws JsonException */ public static function destroySession(Session $session, bool $save = true): void { if ($session instanceof UserSession) { $session->cleanupInventory(); self::$userSessions->remove($session->getUUID()); } else if ($session instanceof PluginSession) self::$pluginSessions->remove($session->getUUID()); if ($save && $session instanceof UserSession) { $session->save(); } } /** * Creates an UserSession used to execute MagicWE2's functions * @param Player $player * @param bool $add If true, the session will be cached in SessionHelper * @return UserSession * @throws InvalidSkinException * @throws RuntimeException * @throws SessionException */ public static function createUserSession(Player $player, bool $add = true): UserSession { if (!$player->hasPermission("we.session")) throw new SessionException(TF::RED . "You do not have the permission \"magicwe.session\""); $session = new UserSession($player); if ($add) { self::addSession($session); (new MWESessionLoadEvent(Loader::getInstance(), $session))->call(); } return $session; } /** * Creates a PluginSession used to call API functions via a plugin * @param Plugin $plugin * @param bool $add If true, the session will be cached in SessionHelper * @return PluginSession * @throws InvalidSkinException */ public static function createPluginSession(Plugin $plugin, bool $add = true): PluginSession { $session = new PluginSession($plugin); if ($add) self::addSession($session); return $session; } /** * @param Player $player * @return bool */ public static function hasSession(Player $player): bool { try { return self::getUserSession($player) instanceof UserSession; } catch (SessionException $exception) { return false; } } /** * @param Player $player * @return null|UserSession * @throws SessionException */ public static function getUserSession(Player $player): ?UserSession { if (self::$userSessions->isEmpty()) return null; $filtered = self::$userSessions->filter(function (UUID $uuid, Session $session) use ($player) { return $session instanceof UserSession && $session->getPlayer() === $player; }); if ($filtered->isEmpty()) return null; if (count($filtered) > 1) throw new SessionException("Multiple sessions found for player {$player->getName()}. This should never happen!"); return $filtered->values()->first(); } /** * TODO cleanup or optimize * @param UUID $uuid * @return null|Session * @throws SessionException */ public static function getSessionByUUID(UUID $uuid): ?Session { $v = null; if (self::$userSessions->hasKey($uuid)) { $v = self::$userSessions->get($uuid, null); } else if (self::$pluginSessions->hasKey($uuid)) { $v = self::$pluginSessions->get($uuid, null); } else { /* * Sadly, this part is necessary. If you use UUID::fromString, the object "id" in the map does not match anymore */ $userFiltered = self::$userSessions->filter(function (UUID $uuid2, Session $session) use ($uuid) { return $uuid2->equals($uuid); }); if (!$userFiltered->isEmpty()) $v = $userFiltered->values()->first(); else { $pluginFiltered = self::$pluginSessions->filter(function (UUID $uuid2, Session $session) use ($uuid) { return $uuid2->equals($uuid); }); if (!$pluginFiltered->isEmpty()) $v = $pluginFiltered->values()->first(); } } if (!$v instanceof Session) throw new SessionException("Session with uuid {$uuid->toString()} not found"); return $v; } /** * @return array|UserSession[] */ public static function getUserSessions(): array { return self::$userSessions->values()->toArray(); } /** * @return array|PluginSession[] */ public static function getPluginSessions(): array { return self::$pluginSessions->values()->toArray(); } /** * @param Player $player * @return UserSession|null * @throws AssumptionFailedError * @throws InvalidSkinException * @throws JsonException * @throws RuntimeException */ public static function loadUserSession(Player $player): ?UserSession { $path = Loader::getInstance()->getDataFolder() . "sessions" . DIRECTORY_SEPARATOR . $player->getName() . ".json"; if (!file_exists($path)) return null; $contents = file_get_contents($path); if ($contents === false) return null; $data = json_decode($contents, true, 512, JSON_THROW_ON_ERROR); if (is_null($data) || json_last_error() !== JSON_ERROR_NONE) { Loader::getInstance()->getLogger()->error("Could not load user session from json file {$path}: " . json_last_error_msg()); #unlink($path);//TODO make safe return null; } $session = new UserSession($player); try { $session->setUUID(UUID::fromString($data["uuid"])); $session->setWandEnabled($data["wandEnabled"]); $session->setDebugToolEnabled($data["debugToolEnabled"]); $session->setWailaEnabled($data["wailaEnabled"]); $session->setSidebarEnabled($data["sidebarEnabled"]); $session->setLanguage($data["language"]); foreach ($data["brushes"] as $brushUUID => $brushJson) { try { $properties = BrushProperties::fromJson($brushJson["properties"]); $brush = new Brush($properties); $session->addBrush($brush); } catch (InvalidArgumentException $e) { continue; } } if (!is_null(($latestSelection = $data["latestSelection"] ?? null))) { try { $world = Server::getInstance()->getWorldManager()->getWorld($latestSelection["worldId"]); if (is_null($world)) { $session->sendMessage(TF::RED . "The world of the saved sessions selection is not loaded, the last selection was not restored.");//TODO translate better } else { $shapeClass = $latestSelection["shapeClass"] ?? Cuboid::class; $pasteVector = $latestSelection["shape"]["pasteVector"]; unset($latestSelection["shape"]["pasteVector"]); if (!is_null($pasteVector)) { $pasteV = new Vector3(...array_values($pasteVector)); $shape = new $shapeClass($pasteV, ...array_values($latestSelection["shape"])); } $selection = new Selection( $session->getUUID(), Server::getInstance()->getWorldManager()->getWorld($latestSelection["worldId"]), $latestSelection["pos1"]["x"], $latestSelection["pos1"]["y"], $latestSelection["pos1"]["z"], $latestSelection["pos2"]["x"], $latestSelection["pos2"]["y"], $latestSelection["pos2"]["z"], $shape ?? null ); if ($selection instanceof Selection && $selection->isValid()) { $session->addSelection($selection); } } } catch (RuntimeException $e) { } } //TODO clipboard } catch (Exception $exception) { return null; } self::addSession($session); (new MWESessionLoadEvent(Loader::getInstance(), $session))->call(); return $session; } } ================================================ FILE: src/xenialdan/MagicWE2/helper/StructureStore.php ================================================ getDataFolder() . 'structures'); @mkdir(Loader::getInstance()->getDataFolder() . 'schematics'); } /** * @param string $filename Filename without folder. Can have .mcstructure extension in the name * @param bool $override Use this if you want to reload the file * @return MCStructure * @throws InvalidArgumentException * @throws StructureFileException * @throws StructureFormatException */ public function loadStructure(string $filename, bool $override = true): MCStructure { $id = pathinfo($filename, PATHINFO_FILENAME); if (!$override && array_key_exists($id, $this->structures)) throw new InvalidArgumentException("Can not override $id"); $path = Loader::getInstance()->getDataFolder() . 'structures' . DIRECTORY_SEPARATOR . $id . '.mcstructure';//TODO redundant? $structure = new MCStructure(); $structure->parse($path); $this->structures[$id] = $structure; return $this->structures[$id]; } /** * @param string $id * @return MCStructure * @throws InvalidArgumentException */ public function getStructure(string $id): MCStructure { $structure = $this->structures[$id] ?? null; if ($structure === null) { throw new InvalidArgumentException("Structure $id is not loaded"); } return $structure; } /** * @param string $filename Filename without folder. Can have .schematic extension in the name * @param bool $override Use this if you want to reload the file * @return Schematic * @throws InvalidArgumentException */ public function loadSchematic(string $filename, bool $override = true): Schematic { $id = pathinfo($filename, PATHINFO_FILENAME); if (!$override && array_key_exists($id, $this->schematics)) throw new InvalidArgumentException("Can not override $id"); $path = Loader::getInstance()->getDataFolder() . 'schematics' . DIRECTORY_SEPARATOR . $id . '.schematic'; $schematic = new Schematic(); $schematic->parse($path); $this->schematics[$id] = $schematic; return $this->schematics[$id]; } /** * @param string $id * @return Schematic * @throws InvalidArgumentException */ public function getSchematic(string $id): Schematic { $schematic = $this->schematics[$id] ?? null; if ($schematic === null) { throw new InvalidArgumentException("Structure $id is not loaded"); } return $schematic; } } ================================================ FILE: src/xenialdan/MagicWE2/helper/blockstatesparsertest.log ================================================ 2020-10-07 [20:44:07.359] [Server thread/DEBUG]: [MWE2] Search query: minecraft:tnt 2020-10-07 [20:44:07.365] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:tnt" "states" => TAG_Compound: value={ "allow_underwater_bit" => TAG_Byte: value=0 "explode_bit" => TAG_Byte: value=0 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.365] [Server thread/DEBUG]: Final block: Block[TNT] (46:0) 2020-10-07 [20:44:07.366] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab 2020-10-07 [20:44:07.366] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:wooden_slab" "states" => TAG_Compound: value={ "top_slot_bit" => TAG_Byte: value=0 "wood_type" => TAG_String: value="oak" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.367] [Server thread/DEBUG]: Final block: Block[Oak Slab] (158:0) 2020-10-07 [20:44:07.367] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab_wrongname 2020-10-07 [20:44:07.368] [Server thread/DEBUG]: Unable to resolve "wooden_slab_wrongname" to a valid item 2020-10-07 [20:44:07.368] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab[foo=bar] 2020-10-07 [20:44:07.371] [Server thread/DEBUG]: Invalid state foo 2020-10-07 [20:44:07.372] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab[top_slot_bit=] 2020-10-07 [20:44:07.383] [Server thread/DEBUG]: Empty value for state top_slot_bit 2020-10-07 [20:44:07.384] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab[top_slot_bit=true] 2020-10-07 [20:44:07.513] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:wooden_slab" "states" => TAG_Compound: value={ "top_slot_bit" => TAG_Byte: value=1 "wood_type" => TAG_String: value="oak" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.513] [Server thread/DEBUG]: Final block: Block[Oak Slab] (158:8) 2020-10-07 [20:44:07.513] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab[top_slot_bit=false] 2020-10-07 [20:44:07.619] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:wooden_slab" "states" => TAG_Compound: value={ "top_slot_bit" => TAG_Byte: value=0 "wood_type" => TAG_String: value="oak" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.620] [Server thread/DEBUG]: Final block: Block[Oak Slab] (158:0) 2020-10-07 [20:44:07.620] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab[wood_type=oak] 2020-10-07 [20:44:07.638] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:wooden_slab" "states" => TAG_Compound: value={ "top_slot_bit" => TAG_Byte: value=0 "wood_type" => TAG_String: value="oak" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.639] [Server thread/DEBUG]: Final block: Block[Oak Slab] (158:0) 2020-10-07 [20:44:07.639] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab[wood_type=spruce,top_slot_bit=false] 2020-10-07 [20:44:07.650] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:wooden_slab" "states" => TAG_Compound: value={ "top_slot_bit" => TAG_Byte: value=0 "wood_type" => TAG_String: value="spruce" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.650] [Server thread/DEBUG]: Final block: Block[Spruce Slab] (158:1) 2020-10-07 [20:44:07.650] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab[wood_type=spruce,top_slot_bit=true] 2020-10-07 [20:44:07.656] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:wooden_slab" "states" => TAG_Compound: value={ "top_slot_bit" => TAG_Byte: value=1 "wood_type" => TAG_String: value="spruce" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.656] [Server thread/DEBUG]: Final block: Block[Spruce Slab] (158:9) 2020-10-07 [20:44:07.657] [Server thread/DEBUG]: [MWE2] Search query: minecraft:end_rod[] 2020-10-07 [20:44:07.666] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:end_rod" "states" => TAG_Compound: value={ "facing_direction" => TAG_Int: value=0 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.666] [Server thread/DEBUG]: Final block: Block[End Rod] (208:0) 2020-10-07 [20:44:07.666] [Server thread/DEBUG]: [MWE2] Search query: minecraft:end_rod[facing_direction=1] 2020-10-07 [20:44:07.671] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:end_rod" "states" => TAG_Compound: value={ "facing_direction" => TAG_Int: value=1 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.671] [Server thread/DEBUG]: Final block: Block[End Rod] (208:1) 2020-10-07 [20:44:07.671] [Server thread/DEBUG]: [MWE2] Search query: minecraft:end_rod[block_light_level=14] 2020-10-07 [20:44:07.672] [Server thread/DEBUG]: Invalid state block_light_level 2020-10-07 [20:44:07.672] [Server thread/DEBUG]: [MWE2] Search query: minecraft:end_rod[block_light_level=13] 2020-10-07 [20:44:07.672] [Server thread/DEBUG]: Invalid state block_light_level 2020-10-07 [20:44:07.673] [Server thread/DEBUG]: [MWE2] Search query: minecraft:light_block[block_light_level=14] 2020-10-07 [20:44:07.673] [Server thread/DEBUG]: Unable to resolve "light_block" to a valid item 2020-10-07 [20:44:07.673] [Server thread/DEBUG]: [MWE2] Search query: minecraft:stone[] 2020-10-07 [20:44:07.730] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:stone" "states" => TAG_Compound: value={ "stone_type" => TAG_String: value="stone" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.731] [Server thread/DEBUG]: Final block: Block[Stone] (1:0) 2020-10-07 [20:44:07.731] [Server thread/DEBUG]: [MWE2] Search query: minecraft:stone[stone_type=granite] 2020-10-07 [20:44:07.736] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:stone" "states" => TAG_Compound: value={ "stone_type" => TAG_String: value="granite" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.736] [Server thread/DEBUG]: Final block: Block[Granite] (1:1) 2020-10-07 [20:44:07.736] [Server thread/DEBUG]: [MWE2] Search query: minecraft:stone[stone_type=andesite] 2020-10-07 [20:44:07.749] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:stone" "states" => TAG_Compound: value={ "stone_type" => TAG_String: value="andesite" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.749] [Server thread/DEBUG]: Final block: Block[Andesite] (1:5) 2020-10-07 [20:44:07.749] [Server thread/DEBUG]: [MWE2] Search query: minecraft:stone[stone_type=wrongtag] 2020-10-07 [20:44:07.750] [Server thread/DEBUG]: No block minecraft:stone matching minecraft:stone[stone_type=wrongtag] could be found 2020-10-07 [20:44:07.750] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab[top=true] 2020-10-07 [20:44:07.777] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:wooden_slab" "states" => TAG_Compound: value={ "top_slot_bit" => TAG_Byte: value=1 "wood_type" => TAG_String: value="oak" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.777] [Server thread/DEBUG]: Final block: Block[Oak Slab] (158:8) 2020-10-07 [20:44:07.777] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wooden_slab[top=true,type=spruce] 2020-10-07 [20:44:07.783] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:wooden_slab" "states" => TAG_Compound: value={ "top_slot_bit" => TAG_Byte: value=1 "wood_type" => TAG_String: value="spruce" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.784] [Server thread/DEBUG]: Final block: Block[Spruce Slab] (158:9) 2020-10-07 [20:44:07.784] [Server thread/DEBUG]: [MWE2] Search query: minecraft:stone[type=granite] 2020-10-07 [20:44:07.794] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:stone" "states" => TAG_Compound: value={ "stone_type" => TAG_String: value="granite" } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.794] [Server thread/DEBUG]: Final block: Block[Granite] (1:1) 2020-10-07 [20:44:07.794] [Server thread/DEBUG]: [MWE2] Search query: minecraft:bedrock[burn=true] 2020-10-07 [20:44:07.810] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:bedrock" "states" => TAG_Compound: value={ "infiniburn_bit" => TAG_Byte: value=1 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.810] [Server thread/DEBUG]: Final block: Block[Bedrock] (7:1) 2020-10-07 [20:44:07.810] [Server thread/DEBUG]: [MWE2] Search query: minecraft:lever[direction=1] 2020-10-07 [20:44:07.811] [Server thread/DEBUG]: No block minecraft:lever matching minecraft:lever[direction=1] could be found 2020-10-07 [20:44:07.811] [Server thread/DEBUG]: [MWE2] Search query: minecraft:wheat[growth=3] 2020-10-07 [20:44:07.820] [Server thread/DEBUG]: Undefined offset: 3 2020-10-07 [20:44:07.820] [Server thread/DEBUG]: [MWE2] Search query: minecraft:stone_button[direction=1,pressed=true] 2020-10-07 [20:44:07.826] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:stone_button" "states" => TAG_Compound: value={ "button_pressed_bit" => TAG_Byte: value=1 "facing_direction" => TAG_Int: value=1 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.826] [Server thread/DEBUG]: Final block: Block[Stone Button] (77:9) 2020-10-07 [20:44:07.827] [Server thread/DEBUG]: [MWE2] Search query: minecraft:stone_button[direction=0] 2020-10-07 [20:44:07.852] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:stone_button" "states" => TAG_Compound: value={ "button_pressed_bit" => TAG_Byte: value=0 "facing_direction" => TAG_Int: value=0 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.852] [Server thread/DEBUG]: Final block: Block[Stone Button] (77:0) 2020-10-07 [20:44:07.853] [Server thread/DEBUG]: [MWE2] Search query: minecraft:stone_brick_stairs[direction=0] 2020-10-07 [20:44:07.858] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:stone_brick_stairs" "states" => TAG_Compound: value={ "upside_down_bit" => TAG_Byte: value=0 "weirdo_direction" => TAG_Int: value=0 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.859] [Server thread/DEBUG]: Final block: Block[Stone Brick Stairs] (109:0) 2020-10-07 [20:44:07.859] [Server thread/DEBUG]: [MWE2] Search query: minecraft:trapdoor[direction=0,open_bit=true,upside_down_bit=false] 2020-10-07 [20:44:07.874] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:trapdoor" "states" => TAG_Compound: value={ "direction" => TAG_Int: value=0 "open_bit" => TAG_Byte: value=1 "upside_down_bit" => TAG_Byte: value=0 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.874] [Server thread/DEBUG]: Final block: Block[Oak Trapdoor] (96:8) 2020-10-07 [20:44:07.874] [Server thread/DEBUG]: [MWE2] Search query: minecraft:birch_door 2020-10-07 [20:44:07.875] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:birch_door" "states" => TAG_Compound: value={ "direction" => TAG_Int: value=0 "door_hinge_bit" => TAG_Byte: value=0 "open_bit" => TAG_Byte: value=0 "upper_block_bit" => TAG_Byte: value=0 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.875] [Server thread/DEBUG]: Final block: Block[Birch Door] (194:0) 2020-10-07 [20:44:07.875] [Server thread/DEBUG]: [MWE2] Search query: minecraft:iron_door[direction=1] 2020-10-07 [20:44:07.876] [Server thread/DEBUG]: No block minecraft:iron_door matching minecraft:iron_door[direction=1] could be found 2020-10-07 [20:44:07.876] [Server thread/DEBUG]: [MWE2] Search query: minecraft:birch_door[upper_block_bit=true] 2020-10-07 [20:44:07.877] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:birch_door" "states" => TAG_Compound: value={ "direction" => TAG_Int: value=0 "door_hinge_bit" => TAG_Byte: value=0 "open_bit" => TAG_Byte: value=0 "upper_block_bit" => TAG_Byte: value=1 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.877] [Server thread/DEBUG]: Final block: Block[Birch Door] (194:8) 2020-10-07 [20:44:07.877] [Server thread/DEBUG]: [MWE2] Search query: minecraft:birch_door[direction=1,door_hinge_bit=false,open_bit=false,upper_block_bit=true] 2020-10-07 [20:44:07.881] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:birch_door" "states" => TAG_Compound: value={ "direction" => TAG_Int: value=0 "door_hinge_bit" => TAG_Byte: value=0 "open_bit" => TAG_Byte: value=0 "upper_block_bit" => TAG_Byte: value=1 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.882] [Server thread/DEBUG]: Final block: Block[Birch Door] (194:8) 2020-10-07 [20:44:07.882] [Server thread/DEBUG]: [MWE2] Search query: minecraft:birch_door[door_hinge_bit=false,open_bit=true,upper_block_bit=true] 2020-10-07 [20:44:07.883] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:birch_door" "states" => TAG_Compound: value={ "direction" => TAG_Int: value=0 "door_hinge_bit" => TAG_Byte: value=0 "open_bit" => TAG_Byte: value=0 "upper_block_bit" => TAG_Byte: value=1 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.883] [Server thread/DEBUG]: Final block: Block[Birch Door] (194:8) 2020-10-07 [20:44:07.883] [Server thread/DEBUG]: [MWE2] Search query: minecraft:birch_door[direction=3,door_hinge_bit=false,open_bit=true,upper_block_bit=true] 2020-10-07 [20:44:07.885] [Server thread/DEBUG]: TAG_Compound: value={ "name" => TAG_String: value="minecraft:birch_door" "states" => TAG_Compound: value={ "direction" => TAG_Int: value=0 "door_hinge_bit" => TAG_Byte: value=0 "open_bit" => TAG_Byte: value=0 "upper_block_bit" => TAG_Byte: value=1 } "version" => TAG_Int: value=17825806 } 2020-10-07 [20:44:07.885] [Server thread/DEBUG]: Final block: Block[Birch Door] (194:8) ================================================ FILE: src/xenialdan/MagicWE2/selection/Selection.php ================================================ sessionUUID = $sessionUUID; $this->worldId = $world->getId(); if (isset($minX, $minY, $minZ)) { $this->pos1 = (new Vector3($minX, $minY, $minZ))->floor(); } if (isset($maxX, $maxY, $maxZ)) { $this->pos2 = (new Vector3($maxX, $maxY, $maxZ))->floor(); } if ($shape !== null) $this->shape = $shape; $this->setUUID(UUID::fromRandom()); } /** * @return World * @throws Exception */ public function getWorld(): World { if (is_null($this->worldId)) { throw new SelectionException("World is not set!"); } $world = Server::getInstance()->getWorldManager()->getWorld($this->worldId); if (is_null($world)) { throw new SelectionException("World is not found!"); } return $world; } /** * @param World $world */ public function setWorld(World $world): void { $this->worldId = $world->getId(); try { ($ev = new MWESelectionChangeEvent($this, MWESelectionChangeEvent::TYPE_WORLD))->call(); } catch (RuntimeException $e) { } } /** * @return Position * @throws Exception */ public function getPos1(): Position { if (is_null($this->pos1)) { throw new SelectionException("Position 1 is not set!"); } return Position::fromObject($this->pos1, $this->getWorld()); } /** * @param Position $position * @throws AssumptionFailedError */ public function setPos1(Position $position): void { $this->pos1 = $position->asVector3()->floor(); if ($this->pos1->y >= World::Y_MAX) $this->pos1->y = World::Y_MAX; if ($this->pos1->y < 0) $this->pos1->y = 0; if ($this->worldId !== $position->getWorld()->getId()) {//reset other position if in different world $this->pos2 = null; } $this->setWorld($position->getWorld()); if (($this->shape instanceof Cuboid || $this->shape === null) && $this->isValid())//TODO test change $this->setShape(Cuboid::constructFromPositions($this->pos1, $this->pos2)); try { $session = SessionHelper::getSessionByUUID($this->sessionUUID); if ($session instanceof Session) { $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString('selection.pos1.set', [$this->pos1->getX(), $this->pos1->getY(), $this->pos1->getZ()])); try { ($ev = new MWESelectionChangeEvent($this, MWESelectionChangeEvent::TYPE_POS1))->call(); } catch (RuntimeException $e) { } } } catch (SessionException $e) { //TODO log? kick? } } /** * @return Position * @throws Exception */ public function getPos2(): Position { if (is_null($this->pos2)) { throw new SelectionException("Position 2 is not set!"); } return Position::fromObject($this->pos2, $this->getWorld()); } /** * @param Position $position * @throws AssumptionFailedError */ public function setPos2(Position $position): void { $this->pos2 = $position->asVector3()->floor(); if ($this->pos2->y >= World::Y_MAX) $this->pos2->y = World::Y_MAX; if ($this->pos2->y < 0) $this->pos2->y = 0; if ($this->worldId !== $position->getWorld()->getId()) { $this->pos1 = null; } $this->setWorld($position->getWorld()); if (($this->shape instanceof Cuboid || $this->shape === null) && $this->isValid()) $this->setShape(Cuboid::constructFromPositions($this->pos1, $this->pos2)); try { $session = SessionHelper::getSessionByUUID($this->sessionUUID); if ($session instanceof Session) { $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString('selection.pos2.set', [$this->pos2->getX(), $this->pos2->getY(), $this->pos2->getZ()])); try { ($ev = new MWESelectionChangeEvent($this, MWESelectionChangeEvent::TYPE_POS2))->call(); } catch (RuntimeException $e) { } } } catch (SessionException $e) { //TODO log? kick? } } /** * @return Shape * @throws Exception */ public function getShape(): Shape { if (!$this->shape instanceof Shape) throw new SelectionException("Shape is not valid"); return $this->shape; } /** * @param Shape $shape */ public function setShape(Shape $shape): void { $this->shape = $shape; try { ($ev = new MWESelectionChangeEvent($this, MWESelectionChangeEvent::TYPE_SHAPE))->call(); } catch (RuntimeException $e) { }//might cause duplicated call } /** * Checks if a Selection is valid. It is not valid if: * - The world is not set * - Any of the positions are not set * - The shape is not set / not a shape * - The positions are not in the same world * @return bool */ public function isValid(): bool { try { #$this->getShape(); $this->getWorld(); $this->getPos1(); $this->getPos2(); } catch (Exception $e) { return false; } return true; } /** * @return int */ public function getSizeX(): int { return (int)(abs($this->pos1->x - $this->pos2->x) + 1); } /** * @return int */ public function getSizeY(): int { return (int)(abs($this->pos1->y - $this->pos2->y) + 1); } /** * @return int */ public function getSizeZ(): int { return (int)(abs($this->pos1->z - $this->pos2->z) + 1); } /** * @param UUID $uuid */ public function setUUID(UUID $uuid): void { $this->uuid = $uuid; } /** * @return UUID */ public function getUUID(): UUID { return $this->uuid; } /** * String representation of object * @link http://php.net/manual/en/serializable.serialize.php * @return string the string representation of the object or null * @since 5.1.0 */ public function serialize() { return serialize([ $this->worldId, $this->pos1, $this->pos2, $this->uuid, $this->sessionUUID, $this->shape ]); } /** * Constructs the object * @link http://php.net/manual/en/serializable.unserialize.php * @param string $serialized

* The string representation of the object. *

* @return void * @since 5.1.0 * @noinspection PhpMissingParamTypeInspection */ public function unserialize($serialized) { var_dump($serialized); /** @var Vector3 $pos1 , $pos2 */ [ $this->worldId, $this->pos1, $this->pos2, $this->uuid, $this->sessionUUID, $this->shape ] = unserialize($serialized/*, ['allowed_classes' => [__CLASS__, Vector3::class,UUID::class,Shape::class]]*/);//TODO test pm4 } /** * Specify data which should be serialized to JSON * @link http://php.net/manual/en/jsonserializable.jsonserialize.php * @return mixed data which can be serialized by json_encode, * which is a value of any type other than a resource. * @since 5.4.0 */ public function jsonSerialize() { $arr = (array)$this; if ($this->shape !== null) $arr["shapeClass"] = get_class($this->shape); return $arr; } } ================================================ FILE: src/xenialdan/MagicWE2/selection/shape/Cone.php ================================================ pasteVector = $pasteVector; $this->height = $height; $this->diameter = $diameter; $this->flipped = $flipped; } /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $reducePerLayer = ($this->diameter / $this->height); $centerVec2 = new Vector2($this->getPasteVector()->getX(), $this->getPasteVector()->getZ()); for ($x = (int)floor($centerVec2->x - $this->diameter / 2 - 1); $x <= floor($centerVec2->x + $this->diameter / 2 + 1); $x++) { for ($y = (int)floor($this->getPasteVector()->y), $ry = 0; $y < floor($this->getPasteVector()->y + $this->height); $y++, $ry++) { for ($z = (int)floor($centerVec2->y - $this->diameter / 2 - 1); $z <= floor($centerVec2->y + $this->diameter / 2 + 1); $z++) { $vec2 = new Vector2($x, $z); $vec3 = new Vector3($x, $y, $z); if ($this->flipped) $radiusLayer = ($this->diameter - $reducePerLayer * ($this->height - $ry)) / 2; else $radiusLayer = ($this->diameter - $reducePerLayer * $ry) / 2; if ($vec2->distanceSquared($centerVec2) > ($radiusLayer ** 2) || (API::hasFlag($flags, API::FLAG_HOLLOW_CLOSED) && ($ry !== 0 && $ry !== $this->height - 1) && $vec2->distanceSquared($centerVec2) <= ((($this->diameter / 2) - 1) ** 2)) || ((API::hasFlag($flags, API::FLAG_HOLLOW) && $vec2->distanceSquared($centerVec2) <= ((($this->diameter / 2) - 1) ** 2)))) continue; $block = API::setComponents($manager->getBlockAt($vec3->getFloorX(), $vec3->getFloorY(), $vec3->getFloorZ()), (int)$vec3->x, (int)$vec3->y, (int)$vec3->z); if (API::hasFlag($flags, API::FLAG_KEEP_BLOCKS) && $block->getId() !== BlockLegacyIds::AIR) continue; if (API::hasFlag($flags, API::FLAG_KEEP_AIR) && $block->getId() === BlockLegacyIds::AIR) continue; if ($block->getPos()->y >= World::Y_MAX || $block->getPos()->y < 0) continue;//TODO fuufufufuuu if (empty($filterblocks)) yield $block; else { foreach ($filterblocks as $filterblock) { if (($block->getId() === $filterblock->getId()) && ((API::hasFlag($flags, API::FLAG_VARIANT) && $block->getIdInfo()->getVariant() === $filterblock->getIdInfo()->getVariant()) || (!API::hasFlag($flags, API::FLAG_VARIANT) && ($block->getMeta() === $filterblock->getMeta() || API::hasFlag($flags, API::FLAG_KEEP_META))))) yield $block; } } } } } } /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ public function getLayer($manager, int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $centerVec2 = new Vector2($this->getPasteVector()->getX(), $this->getPasteVector()->getZ()); for ($x = (int)floor($centerVec2->x - $this->diameter / 2 - 1); $x <= floor($centerVec2->x + $this->diameter / 2 + 1); $x++) { for ($z = (int)floor($centerVec2->y - $this->diameter / 2 - 1); $z <= floor($centerVec2->y + $this->diameter / 2 + 1); $z++) { $vec2 = new Vector2($x, $z); if ($vec2->distanceSquared($centerVec2) > (($this->diameter / 2) ** 2) || ((API::hasFlag($flags, API::FLAG_HOLLOW) && $vec2->distanceSquared($centerVec2) <= ((($this->diameter / 2) - 1) ** 2)))) continue; yield $vec2; } } } /** * @param World|AsyncChunkManager $manager * @return string[] fastSerialized chunks * @throws Exception */ public function getTouchedChunks($manager): array {//TODO optimize to remove "corner" chunks $this->validateChunkManager($manager); $maxX = ($this->getMaxVec3()->x + 1) >> 4; $minX = $this->getMinVec3()->x >> 4; $maxZ = ($this->getMaxVec3()->z + 1) >> 4; $minZ = $this->getMinVec3()->z >> 4; $touchedChunks = []; for ($x = $minX; $x <= $maxX; $x++) { for ($z = $minZ; $z <= $maxZ; $z++) { $chunk = $manager->getChunk($x, $z); if ($chunk === null) { continue; } print "Touched Chunk at: $x:$z" . PHP_EOL; $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } } print "Touched chunks count: " . count($touchedChunks) . PHP_EOL; return $touchedChunks; } public function getAABB(): AxisAlignedBB { return new AxisAlignedBB( floor($this->pasteVector->x - $this->diameter / 2), $this->pasteVector->y, floor($this->pasteVector->z - $this->diameter / 2), -1 + floor($this->pasteVector->x - $this->diameter / 2) + $this->diameter, -1 + $this->pasteVector->y + $this->height, -1 + floor($this->pasteVector->z - $this->diameter / 2) + $this->diameter ); } public function getTotalCount(): int { return (int)ceil((M_PI * (($this->diameter / 2) ** 2) * $this->height) / 3); } public static function getName(): string { return "Cone"; } } ================================================ FILE: src/xenialdan/MagicWE2/selection/shape/Cube.php ================================================ pasteVector = $pasteVector; $this->width = $width; } /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); for ($x = (int)floor($this->getMinVec3()->x), $rx = 0; $x <= floor($this->getMaxVec3()->x); $x++, $rx++) { for ($y = (int)floor($this->getMinVec3()->y), $ry = 0; $y <= floor($this->getMaxVec3()->y); $y++, $ry++) { for ($z = (int)floor($this->getMinVec3()->z), $rz = 0; $z <= floor($this->getMaxVec3()->z); $z++, $rz++) { $block = API::setComponents($manager->getBlockAt($x, $y, $z), (int)$x, (int)$y, (int)$z); if (API::hasFlag($flags, API::FLAG_KEEP_BLOCKS) && $block->getId() !== BlockLegacyIds::AIR) continue; if (API::hasFlag($flags, API::FLAG_KEEP_AIR) && $block->getId() === BlockLegacyIds::AIR) continue; if ($block->getPos()->y >= World::Y_MAX || $block->getPos()->y < 0) continue;//TODO check for removal because relative might be at other y if (API::hasFlag($flags, API::FLAG_HOLLOW) && ($block->getPos()->x > $this->getMinVec3()->getX() && $block->getPos()->x < $this->getMaxVec3()->getX()) && ($block->getPos()->y > $this->getMinVec3()->getY() && $block->getPos()->y < $this->getMaxVec3()->getY()) && ($block->getPos()->z > $this->getMinVec3()->getZ() && $block->getPos()->z < $this->getMaxVec3()->getZ())) continue; if (empty($filterblocks)) yield $block; else { foreach ($filterblocks as $filterblock) { if (($block->getId() === $filterblock->getId()) && ((API::hasFlag($flags, API::FLAG_VARIANT) && $block->getIdInfo()->getVariant() === $filterblock->getIdInfo()->getVariant()) || (!API::hasFlag($flags, API::FLAG_VARIANT) && ($block->getMeta() === $filterblock->getMeta() || API::hasFlag($flags, API::FLAG_KEEP_META))))) yield $block; } } } } } } /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ public function getLayer($manager, int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); for ($x = (int)floor($this->getMinVec3()->x); $x <= floor($this->getMaxVec3()->x); $x++) { for ($z = (int)floor($this->getMinVec3()->z); $z <= floor($this->getMaxVec3()->z); $z++) { yield new Vector2($x, $z); } } } /** * @param World|AsyncChunkManager $manager * @return string[] fastSerialized chunks * @throws Exception */ public function getTouchedChunks($manager): array { $this->validateChunkManager($manager); $maxX = ($this->getMaxVec3()->x + 1) >> 4; $minX = $this->getMinVec3()->x >> 4; $maxZ = ($this->getMaxVec3()->z + 1) >> 4; $minZ = $this->getMinVec3()->z >> 4; $touchedChunks = []; for ($x = $minX; $x <= $maxX; $x++) { for ($z = $minZ; $z <= $maxZ; $z++) { $chunk = $manager->getChunk($x, $z); if ($chunk === null) { continue; } print "Touched Chunk at: $x:$z" . PHP_EOL; $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } } print "Touched chunks count: " . count($touchedChunks) . PHP_EOL; return $touchedChunks; } public function getAABB(): AxisAlignedBB { return new AxisAlignedBB( ceil($this->pasteVector->x - $this->width / 2), $this->pasteVector->y, ceil($this->pasteVector->z - $this->width / 2), -1 + ceil($this->pasteVector->x - $this->width / 2) + $this->width, -1 + $this->pasteVector->y + $this->width, -1 + ceil($this->pasteVector->z - $this->width / 2) + $this->width ); } public function getTotalCount(): int { return $this->width ** 3; } public static function getName(): string { return "Cube"; } } ================================================ FILE: src/xenialdan/MagicWE2/selection/shape/Cuboid.php ================================================ pasteVector = $pasteVector; $this->width = $width; $this->height = $height; $this->depth = $depth; } public static function constructFromPositions(Vector3 $pos1, Vector3 $pos2): self { $width = (int)abs($pos1->getX() - $pos2->getX()) + 1; $height = (int)abs($pos1->getY() - $pos2->getY()) + 1; $depth = (int)abs($pos1->getZ() - $pos2->getZ()) + 1; return new Cuboid((new Vector3(($pos1->x + $pos2->x) / 2, min($pos1->y, $pos2->y), ($pos1->z + $pos2->z) / 2)), $width, $height, $depth); } /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); for ($x = (int)floor($this->getMinVec3()->x); $x <= floor($this->getMaxVec3()->x); $x++) { for ($y = (int)floor($this->getMinVec3()->y); $y <= floor($this->getMaxVec3()->y); $y++) { for ($z = (int)floor($this->getMinVec3()->z); $z <= floor($this->getMaxVec3()->z); $z++) { $block = API::setComponents($manager->getBlockAt($x, $y, $z), (int)$x, (int)$y, (int)$z); #var_dump("shape getblocks", $block); if (API::hasFlag($flags, API::FLAG_KEEP_BLOCKS) && $block->getId() !== BlockLegacyIds::AIR) continue; if (API::hasFlag($flags, API::FLAG_KEEP_AIR) && $block->getId() === BlockLegacyIds::AIR) continue; if ($block->getPos()->y >= World::Y_MAX || $block->getPos()->y < 0) continue;//TODO check for removal because relative might be at other y if (API::hasFlag($flags, API::FLAG_HOLLOW) && ($block->getPos()->x > $this->getMinVec3()->getX() && $block->getPos()->x < $this->getMaxVec3()->getX()) && ($block->getPos()->y > $this->getMinVec3()->getY() && $block->getPos()->y < $this->getMaxVec3()->getY()) && ($block->getPos()->z > $this->getMinVec3()->getZ() && $block->getPos()->z < $this->getMaxVec3()->getZ())) continue; if (empty($filterblocks)) yield $block; else { foreach ($filterblocks as $filterblock) { if (($block->getId() === $filterblock->getId()) && ((API::hasFlag($flags, API::FLAG_VARIANT) && $block->getIdInfo()->getVariant() === $filterblock->getIdInfo()->getVariant()) || (!API::hasFlag($flags, API::FLAG_VARIANT) && ($block->getMeta() === $filterblock->getMeta() || API::hasFlag($flags, API::FLAG_KEEP_META))))) yield $block; } } } } } } /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ public function getLayer($manager, int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); for ($x = (int)floor($this->getMinVec3()->x); $x <= floor($this->getMaxVec3()->x); $x++) { for ($z = (int)floor($this->getMinVec3()->z); $z <= floor($this->getMaxVec3()->z); $z++) { yield new Vector2($x, $z); } } } /** * @param World|AsyncChunkManager $manager * @return string[] fastSerialized chunks * @throws Exception */ public function getTouchedChunks($manager): array { $this->validateChunkManager($manager); $maxX = ($this->getMaxVec3()->x + 1) >> 4; $minX = $this->getMinVec3()->x >> 4; $maxZ = ($this->getMaxVec3()->z + 1) >> 4; $minZ = $this->getMinVec3()->z >> 4; $touchedChunks = []; for ($x = $minX; $x <= $maxX; $x++) { for ($z = $minZ; $z <= $maxZ; $z++) { $chunk = $manager->getChunk($x, $z); if ($chunk === null) { continue; } $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } } return $touchedChunks; } public function getAABB(): AxisAlignedBB { return new AxisAlignedBB( ceil($this->pasteVector->x - $this->width / 2), $this->pasteVector->y, ceil($this->pasteVector->z - $this->depth / 2), -1 + ceil($this->pasteVector->x - $this->width / 2) + $this->width, -1 + $this->pasteVector->y + $this->height, -1 + ceil($this->pasteVector->z - $this->depth / 2) + $this->depth ); } /** * @return int */ public function getTotalCount(): int { return $this->width * $this->height * $this->depth; } public static function getName(): string { return "Cuboid"; } } ================================================ FILE: src/xenialdan/MagicWE2/selection/shape/Custom.php ================================================ pasteVector = $pasteVector; $this->positions = $positions; } /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); foreach ($this->positions as $position) { //TODO filterblocks yield API::setComponents($manager->getBlockAt($position->getFloorX(), $position->getFloorY(), $position->getFloorZ()), (int)$position->x, (int)$position->y, (int)$position->z); } } /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ public function getLayer($manager, int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); /* Mapping: $walked[$hash]=true */ $walked = []; foreach ($this->positions as $position) { $hash = World::chunkHash($position->getFloorX(), $position->getFloorZ()); if (isset($walked[$hash])) continue; $walked[$hash] = true; yield new Vector2($position->x, $position->z); } } /** * @param World|AsyncChunkManager $manager * @return string[] fastSerialized chunks * @throws Exception */ public function getTouchedChunks($manager): array { $this->validateChunkManager($manager); $touchedChunks = []; foreach ($this->getLayer($manager) as $vector2) { $x = $vector2->getFloorX() >> 4; $z = $vector2->getFloorY() >> 4; if (isset($touchedChunks[World::chunkHash($x, $z)]) || ($chunk = $manager->getChunk($x, $z)) === null) { continue; } print "Touched Chunk at: $x:$z" . PHP_EOL; $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } print "Touched chunks count: " . count($touchedChunks) . PHP_EOL; return $touchedChunks; } public function getAABB(): AxisAlignedBB { $minX = $maxX = $minY = $maxY = $minZ = $maxZ = null; foreach ($this->positions as $position) { if (is_null($minX)) { $minX = $maxX = $position->x; $minY = $maxY = $position->y; $minZ = $maxZ = $position->z; continue; } $minX = min($minX, $position->x); $minY = min($minY, $position->y); $minZ = min($minZ, $position->z); $maxX = max($maxX, $position->x); $maxY = max($maxY, $position->y); $maxZ = max($maxZ, $position->z); } return new AxisAlignedBB($minX, $minY, $minZ, $maxX, $maxY, $maxZ); } public function getTotalCount(): int { return count($this->positions); } public static function getName(): string { return "Custom"; } } ================================================ FILE: src/xenialdan/MagicWE2/selection/shape/Cylinder.php ================================================ pasteVector = $pasteVector; $this->height = $height; $this->diameter = $diameter; } /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $centerVec2 = new Vector2($this->getPasteVector()->getX(), $this->getPasteVector()->getZ()); for ($x = (int)floor($centerVec2->x - $this->diameter / 2 - 1); $x <= floor($centerVec2->x + $this->diameter / 2 + 1); $x++) { for ($y = (int)floor($this->getPasteVector()->y), $ry = 0; $y < floor($this->getPasteVector()->y + $this->height); $y++, $ry++) { for ($z = (int)floor($centerVec2->y - $this->diameter / 2 - 1); $z <= floor($centerVec2->y + $this->diameter / 2 + 1); $z++) { $vec2 = new Vector2($x, $z); $vec3 = new Vector3($x, $y, $z); if ($vec2->distanceSquared($centerVec2) > (($this->diameter / 2) ** 2) || (API::hasFlag($flags, API::FLAG_HOLLOW_CLOSED) && ($ry !== 0 && $ry !== $this->height - 1) && $vec2->distanceSquared($centerVec2) <= ((($this->diameter / 2) - 1) ** 2)) || ((API::hasFlag($flags, API::FLAG_HOLLOW) && $vec2->distanceSquared($centerVec2) <= ((($this->diameter / 2) - 1) ** 2)))) continue; $block = API::setComponents($manager->getBlockAt($vec3->getFloorX(), $vec3->getFloorY(), $vec3->getFloorZ()), (int)$vec3->x, (int)$vec3->y, (int)$vec3->z); if (API::hasFlag($flags, API::FLAG_KEEP_BLOCKS) && $block->getId() !== BlockLegacyIds::AIR) continue; if (API::hasFlag($flags, API::FLAG_KEEP_AIR) && $block->getId() === BlockLegacyIds::AIR) continue; if ($block->getPos()->y >= World::Y_MAX || $block->getPos()->y < 0) continue;//TODO fuufufufuuu if (empty($filterblocks)) yield $block; else { foreach ($filterblocks as $filterblock) { if (($block->getId() === $filterblock->getId()) && ((API::hasFlag($flags, API::FLAG_VARIANT) && $block->getIdInfo()->getVariant() === $filterblock->getIdInfo()->getVariant()) || (!API::hasFlag($flags, API::FLAG_VARIANT) && ($block->getMeta() === $filterblock->getMeta() || API::hasFlag($flags, API::FLAG_KEEP_META))))) yield $block; } } } } } } /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ public function getLayer($manager, int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $centerVec2 = new Vector2($this->getPasteVector()->getX(), $this->getPasteVector()->getZ()); for ($x = (int)floor($centerVec2->x - $this->diameter / 2 - 1); $x <= floor($centerVec2->x + $this->diameter / 2 + 1); $x++) { for ($z = (int)floor($centerVec2->y - $this->diameter / 2 - 1); $z <= floor($centerVec2->y + $this->diameter / 2 + 1); $z++) { $vec2 = new Vector2($x, $z); if ($vec2->distanceSquared($centerVec2) > (($this->diameter / 2) ** 2) || ((API::hasFlag($flags, API::FLAG_HOLLOW) && $vec2->distanceSquared($centerVec2) <= ((($this->diameter / 2) - 1) ** 2)))) continue; yield $vec2; } } } /** * @param World|AsyncChunkManager $manager * @return string[] fastSerialized chunks * @throws Exception */ public function getTouchedChunks($manager): array {//TODO optimize to remove "corner" chunks $this->validateChunkManager($manager); $maxX = ($this->getMaxVec3()->x + 1) >> 4; $minX = $this->getMinVec3()->x >> 4; $maxZ = ($this->getMaxVec3()->z + 1) >> 4; $minZ = $this->getMinVec3()->z >> 4; $touchedChunks = []; for ($x = $minX; $x <= $maxX; $x++) { for ($z = $minZ; $z <= $maxZ; $z++) { $chunk = $manager->getChunk($x, $z); if ($chunk === null) { continue; } print "Touched Chunk at: $x:$z" . PHP_EOL; $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } } print "Touched chunks count: " . count($touchedChunks) . PHP_EOL; return $touchedChunks; } public function getAABB(): AxisAlignedBB { return new AxisAlignedBB( floor($this->pasteVector->x - $this->diameter / 2), $this->pasteVector->y, floor($this->pasteVector->z - $this->diameter / 2), -1 + floor($this->pasteVector->x - $this->diameter / 2) + $this->diameter, -1 + $this->pasteVector->y + $this->height, -1 + floor($this->pasteVector->z - $this->diameter / 2) + $this->diameter ); } public function getTotalCount(): int { return (int)ceil(M_PI * (($this->diameter / 2) ** 2) * $this->height); } public static function getName(): string { return "Cylinder"; } } ================================================ FILE: src/xenialdan/MagicWE2/selection/shape/Ellipsoid.php ================================================ pasteVector = $pasteVector; $this->width = $width; $this->height = $height; $this->depth = $depth; } /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $centerVec2 = new Vector2($this->getPasteVector()->getX(), $this->getPasteVector()->getZ()); $this->pasteVector = $this->getPasteVector()->add(0, -0.5, 0); $xrad = $this->width / 2; $yrad = $this->height / 2; $zrad = $this->depth / 2; $xradSquared = $xrad ** 2; $yradSquared = $yrad ** 2; $zradSquared = $zrad ** 2; $targetX = $this->pasteVector->getX(); $targetY = $this->pasteVector->getY(); $targetZ = $this->pasteVector->getZ(); for ($x = (int)floor($centerVec2->x - $this->width / 2 /*- 1*/); $x <= floor($centerVec2->x + $this->width / 2 /*+ 1*/); $x++) { $xSquared = ($targetX - $x) ** 2; for ($y = (int)floor($this->getPasteVector()->y) + 1, $ry = 0; $y <= floor($this->getPasteVector()->y + $this->height); $y++, $ry++) { $ySquared = ($targetY - $y + $yrad) ** 2; for ($z = (int)floor($centerVec2->y - $this->depth / 2 /*- 1*/); $z <= floor($centerVec2->y + $this->depth / 2 /*+ 1*/); $z++) { $zSquared = ($targetZ - $z) ** 2; $vec3 = new Vector3($x, $y, $z); //TODO hollow if ($xSquared / $xradSquared + $ySquared / $yradSquared + $zSquared / $zradSquared >= 1) continue; $block = API::setComponents($manager->getBlockAt($vec3->getFloorX(), $vec3->getFloorY(), $vec3->getFloorZ()), (int)$vec3->x, (int)$vec3->y, (int)$vec3->z); if (API::hasFlag($flags, API::FLAG_KEEP_BLOCKS) && $block->getId() !== BlockLegacyIds::AIR) continue; if (API::hasFlag($flags, API::FLAG_KEEP_AIR) && $block->getId() === BlockLegacyIds::AIR) continue; if ($block->getPos()->y >= World::Y_MAX || $block->getPos()->y < 0) continue;//TODO fuufufufuuu if (empty($filterblocks)) yield $block; else { foreach ($filterblocks as $filterblock) { if (($block->getId() === $filterblock->getId()) && ((API::hasFlag($flags, API::FLAG_VARIANT) && $block->getIdInfo()->getVariant() === $filterblock->getIdInfo()->getVariant()) || (!API::hasFlag($flags, API::FLAG_VARIANT) && ($block->getMeta() === $filterblock->getMeta() || API::hasFlag($flags, API::FLAG_KEEP_META))))) yield $block; } } } } } } /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ public function getLayer($manager, int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $centerVec2 = new Vector2($this->getPasteVector()->getX(), $this->getPasteVector()->getZ()); $xrad = $this->width / 2; $zrad = $this->depth / 2; $xradSquared = $xrad ** 2; $zradSquared = $zrad ** 2; $targetX = $this->pasteVector->getX(); $targetZ = $this->pasteVector->getZ(); for ($x = (int)floor($centerVec2->x - $this->width / 2 /*- 1*/); $x <= floor($centerVec2->x + $this->width / 2 /*+ 1*/); $x++) { $xSquared = ($targetX - $x) ** 2; for ($z = (int)floor($centerVec2->y - $this->depth / 2 /*- 1*/); $z <= floor($centerVec2->y + $this->depth / 2 /*+ 1*/); $z++) { $zSquared = ($targetZ - $z) ** 2; if ($xSquared / $xradSquared + $zSquared / $zradSquared >= 1) continue; //TODO hollow yield new Vector2($x, $z); } } } /** * @param World|AsyncChunkManager $manager * @return string[] fastSerialized chunks * @throws Exception */ public function getTouchedChunks($manager): array {//TODO optimize to remove "corner" chunks $this->validateChunkManager($manager); $maxX = ($this->getMaxVec3()->x + 1) >> 4; $minX = $this->getMinVec3()->x >> 4; $maxZ = ($this->getMaxVec3()->z + 1) >> 4; $minZ = $this->getMinVec3()->z >> 4; $touchedChunks = []; for ($x = $minX - 1; $x <= $maxX + 1; $x++) { for ($z = $minZ - 1; $z <= $maxZ + 1; $z++) { $chunk = $manager->getChunk($x, $z); if ($chunk === null) { continue; } print "Touched Chunk at: $x:$z" . PHP_EOL; $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } } print "Touched chunks count: " . count($touchedChunks) . PHP_EOL; return $touchedChunks; } public function getAABB(): AxisAlignedBB { return new AxisAlignedBB( floor($this->pasteVector->x - $this->width / 2), $this->pasteVector->y, floor($this->pasteVector->z - $this->depth / 2), -1 + floor($this->pasteVector->x - $this->width / 2) + $this->width, -1 + $this->pasteVector->y + $this->height, -1 + floor($this->pasteVector->z - $this->depth / 2) + $this->depth ); } public function getTotalCount(): int { return (int)floor(4 * M_PI * (($this->width / 2) + 1) * (($this->height / 2) + 1) * (($this->depth / 2) + 1) / 3); } public static function getName(): string { return "Ellipsoid"; } } ================================================ FILE: src/xenialdan/MagicWE2/selection/shape/Pyramid.php ================================================ pasteVector = $pasteVector; $this->width = $width; $this->height = $height; $this->depth = $depth; $this->flipped = $flipped; } /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $reduceXPerLayer = -($this->width / $this->height); $reduceZPerLayer = -($this->depth / $this->height); $centerVec2 = new Vector2($this->getPasteVector()->getX(), $this->getPasteVector()->getZ()); for ($x = (int)floor($centerVec2->x - $this->width / 2 - 1); $x <= floor($centerVec2->x + $this->width / 2 + 1); $x++) { for ($y = (int)floor($this->getPasteVector()->y), $ry = 0; $y < floor($this->getPasteVector()->y + $this->height); $y++, $ry++) { for ($z = (int)floor($centerVec2->y - $this->depth / 2 - 1); $z <= floor($centerVec2->y + $this->depth / 2 + 1); $z++) { $vec2 = new Vector2($x, $z); $vec3 = new Vector3($x, $y, $z); if ($this->flipped) { $radiusLayerX = ($this->width + $reduceXPerLayer * ($this->height - $ry)) / 2; $radiusLayerZ = ($this->depth + $reduceZPerLayer * ($this->height - $ry)) / 2; } else { $radiusLayerX = ($this->width + $reduceXPerLayer * $ry) / 2; $radiusLayerZ = ($this->depth + $reduceZPerLayer * $ry) / 2; } //TODO hollow if (floor(abs($centerVec2->x - $vec2->x)) >= $radiusLayerX || floor(abs($centerVec2->y - $vec2->y)) >= $radiusLayerZ) continue; $block = API::setComponents($manager->getBlockAt($vec3->getFloorX(), $vec3->getFloorY(), $vec3->getFloorZ()), (int)$vec3->x, (int)$vec3->y, (int)$vec3->z); if (API::hasFlag($flags, API::FLAG_KEEP_BLOCKS) && $block->getId() !== BlockLegacyIds::AIR) continue; if (API::hasFlag($flags, API::FLAG_KEEP_AIR) && $block->getId() === BlockLegacyIds::AIR) continue; if ($block->getPos()->y >= World::Y_MAX || $block->getPos()->y < 0) continue;//TODO fuufufufuuu if (empty($filterblocks)) yield $block; else { foreach ($filterblocks as $filterblock) { if (($block->getId() === $filterblock->getId()) && ((API::hasFlag($flags, API::FLAG_VARIANT) && $block->getIdInfo()->getVariant() === $filterblock->getIdInfo()->getVariant()) || (!API::hasFlag($flags, API::FLAG_VARIANT) && ($block->getMeta() === $filterblock->getMeta() || API::hasFlag($flags, API::FLAG_KEEP_META))))) yield $block; } } } } } } /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ public function getLayer($manager, int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $centerVec2 = new Vector2($this->getPasteVector()->getX(), $this->getPasteVector()->getZ()); for ($x = (int)floor($centerVec2->x - $this->width / 2 - 1); $x <= floor($centerVec2->x + $this->width / 2 + 1); $x++) { for ($z = (int)floor($centerVec2->y - $this->depth / 2 - 1); $z <= floor($centerVec2->y + $this->depth / 2 + 1); $z++) { //TODO hollow yield new Vector2($x, $z); } } } /** * @param World|AsyncChunkManager $manager * @return string[] fastSerialized chunks * @throws Exception */ public function getTouchedChunks($manager): array {//TODO optimize to remove "corner" chunks $this->validateChunkManager($manager); $maxX = ($this->getMaxVec3()->x + 1) >> 4; $minX = $this->getMinVec3()->x >> 4; $maxZ = ($this->getMaxVec3()->z + 1) >> 4; $minZ = $this->getMinVec3()->z >> 4; $touchedChunks = []; for ($x = $minX; $x <= $maxX; $x++) { for ($z = $minZ; $z <= $maxZ; $z++) { $chunk = $manager->getChunk($x, $z); if ($chunk === null) { continue; } print "Touched Chunk at: $x:$z" . PHP_EOL; $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } } print "Touched chunks count: " . count($touchedChunks) . PHP_EOL; return $touchedChunks; } public function getAABB(): AxisAlignedBB { return new AxisAlignedBB( floor($this->pasteVector->x - $this->width / 2), $this->pasteVector->y, floor($this->pasteVector->z - $this->depth / 2), -1 + floor($this->pasteVector->x - $this->width / 2) + $this->width, -1 + $this->pasteVector->y + $this->height, -1 + floor($this->pasteVector->z - $this->depth / 2) + $this->depth ); } public function getTotalCount(): int { return (int)ceil((1 / 3) * ($this->width * $this->depth) * $this->height); } public static function getName(): string { return "Pyramid"; } } ================================================ FILE: src/xenialdan/MagicWE2/selection/shape/Shape.php ================================================ pasteVector; } public function setPasteVector(Vector3 $pasteVector): void { $this->pasteVector = $pasteVector->asVector3(); } /** * Creates a chunk manager used for async editing * @param Chunk[] $chunks * @return AsyncChunkManager */ public static function getChunkManager(array $chunks): AsyncChunkManager { $manager = new AsyncChunkManager(); foreach ($chunks as $hash => $chunk) { World::getXZ($hash, $chunkX, $chunkZ); $manager->setChunk($chunkX, $chunkZ, $chunk); } return $manager; } /** * @param mixed $manager * @throws InvalidArgumentException */ public function validateChunkManager($manager): void { if (!$manager instanceof World && !$manager instanceof AsyncChunkManager) throw new InvalidArgumentException(get_class($manager) . " is not an instance of World or AsyncChunkManager"); } abstract public function getTotalCount(): int; /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ abstract public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator; /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ abstract public function getLayer($manager, int $flags = API::FLAG_BASE): Generator; /** * @param ChunkManager $manager * @return string[] fastSerialized chunks * @throws Exception */ abstract public function getTouchedChunks(ChunkManager $manager): array; abstract public function getAABB(): AxisAlignedBB; /** * @return Vector3 */ public function getMinVec3(): Vector3 { return new Vector3($this->getAABB()->minX, $this->getAABB()->minY, $this->getAABB()->minZ); } /** * @return Vector3 */ public function getMaxVec3(): Vector3 { return new Vector3($this->getAABB()->maxX, $this->getAABB()->maxY, $this->getAABB()->maxZ); } abstract public static function getName(): string; public function getShapeProperties(): array { return array_diff(get_object_vars($this), get_class_vars(__CLASS__)); } /** * String representation of object * @link http://php.net/manual/en/serializable.serialize.php * @return string the string representation of the object or null * @since 5.1.0 */ public function serialize() { return serialize((array)$this); } /** * Constructs the object * @link http://php.net/manual/en/serializable.unserialize.php * @param string $serialized

* The string representation of the object. *

* @return void * @since 5.1.0 * @noinspection PhpMissingParamTypeInspection */ public function unserialize($serialized) { $unserialize = unserialize($serialized/*, ['allowed_classes' => [__CLASS__]]*/);//TODO test pm4 array_walk($unserialize, function ($value, $key) { $this->$key = $value; }); } } ================================================ FILE: src/xenialdan/MagicWE2/selection/shape/ShapeRegistry.php ================================================ pasteVector = $pasteVector; $this->diameter = $diameter; } /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); for ($x = (int)floor($this->pasteVector->x - $this->diameter / 2 - 1); $x <= floor($this->pasteVector->x + $this->diameter / 2 + 1); $x++) { for ($y = (int)floor($this->pasteVector->y - $this->diameter / 2 - 1); $y <= floor($this->pasteVector->y + $this->diameter / 2 + 1); $y++) { for ($z = (int)floor($this->pasteVector->z - $this->diameter / 2 - 1); $z <= floor($this->pasteVector->z + $this->diameter / 2 + 1); $z++) { $vec3 = new Vector3($x, $y, $z); if ($vec3->distanceSquared($this->getPasteVector()) > (($this->diameter / 2) ** 2) || (API::hasFlag($flags, API::FLAG_HOLLOW) && $vec3->distanceSquared($this->getPasteVector()) <= ((($this->diameter / 2) - 1) ** 2))) continue; $block = API::setComponents($manager->getBlockAt($vec3->getFloorX(), $vec3->getFloorY(), $vec3->getFloorZ()), (int)$vec3->x, (int)$vec3->y, (int)$vec3->z); if (API::hasFlag($flags, API::FLAG_KEEP_BLOCKS) && $block->getId() !== BlockLegacyIds::AIR) continue; if (API::hasFlag($flags, API::FLAG_KEEP_AIR) && $block->getId() === BlockLegacyIds::AIR) continue; if ($block->getPos()->y >= World::Y_MAX || $block->getPos()->y < 0) continue;//TODO fufufufuuu if (empty($filterblocks)) yield $block; else { foreach ($filterblocks as $filterblock) { if (($block->getId() === $filterblock->getId()) && ((API::hasFlag($flags, API::FLAG_VARIANT) && $block->getIdInfo()->getVariant() === $filterblock->getIdInfo()->getVariant()) || (!API::hasFlag($flags, API::FLAG_VARIANT) && ($block->getMeta() === $filterblock->getMeta() || API::hasFlag($flags, API::FLAG_KEEP_META))))) yield $block; } } } } } } /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ public function getLayer($manager, int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $centerVec2 = new Vector2($this->getPasteVector()->getX(), $this->getPasteVector()->getZ()); for ($x = (int)floor($centerVec2->x - $this->diameter / 2 - 1); $x <= floor($centerVec2->x + $this->diameter / 2 + 1); $x++) { for ($z = (int)floor($centerVec2->y - $this->diameter / 2 - 1); $z <= floor($centerVec2->y + $this->diameter / 2 + 1); $z++) { $vec2 = new Vector2($x, $z); if ($vec2->distanceSquared($centerVec2) > (($this->diameter / 2) ** 2) || ((API::hasFlag($flags, API::FLAG_HOLLOW) && $vec2->distanceSquared($centerVec2) <= ((($this->diameter / 2) - 1) ** 2)))) continue; yield $vec2; } } } /** * @param World|AsyncChunkManager $manager * @return string[] fastSerialized chunks * @throws Exception */ public function getTouchedChunks($manager): array {//TODO optimize to remove "corner" chunks $this->validateChunkManager($manager); $maxX = ($this->getMaxVec3()->x + 1) >> 4; $minX = $this->getMinVec3()->x >> 4; $maxZ = ($this->getMaxVec3()->z + 1) >> 4; $minZ = $this->getMinVec3()->z >> 4; $touchedChunks = []; for ($x = $minX; $x <= $maxX; $x++) { for ($z = $minZ; $z <= $maxZ; $z++) { $chunk = $manager->getChunk($x, $z); if ($chunk === null) { continue; } print "Touched Chunk at: $x:$z" . PHP_EOL; $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } } print "Touched chunks count: " . count($touchedChunks) . PHP_EOL; return $touchedChunks; } public function getAABB(): AxisAlignedBB { return new AxisAlignedBB( floor($this->pasteVector->x - $this->diameter / 2), $this->pasteVector->y, floor($this->pasteVector->z - $this->diameter / 2), -1 + floor($this->pasteVector->x - $this->diameter / 2) + $this->diameter, -1 + $this->pasteVector->y + $this->diameter, -1 + floor($this->pasteVector->z - $this->diameter / 2) + $this->diameter ); } public function getTotalCount(): int { return (int)ceil((4 / 3) * M_PI * (($this->diameter / 2) ** 3)); } public static function getName(): string { return "Sphere"; } } ================================================ FILE: src/xenialdan/MagicWE2/session/PluginSession.php ================================================ plugin = $plugin; $this->setUUID(UUID::fromRandom()); $this->undoHistory = new Deque(); $this->redoHistory = new Deque(); } public function getPlugin(): Plugin { return $this->plugin; } public function __toString() { return __CLASS__ . " UUID: " . $this->getUUID()->__toString() . " Plugin: " . $this->getPlugin()->getName() . " Selections: " . count($this->getSelections()) . " Latest: " . $this->getLatestSelectionUUID() . " Clipboards: " . count($this->getClipboards()) . " Current: " . $this->getCurrentClipboardIndex() . " Undos: " . count($this->undoHistory) . " Redos: " . count($this->redoHistory); } public function sendMessage(string $message): void { $this->plugin->getLogger()->info(Loader::PREFIX . $message); } } ================================================ FILE: src/xenialdan/MagicWE2/session/Session.php ================================================ */ public $undoHistory; /** @var Deque */ public $redoHistory; /** * @return UUID */ public function getUUID(): UUID { return $this->uuid; } /** * @param UUID $uuid */ public function setUUID(UUID $uuid): void { $this->uuid = $uuid; } /** * @param Selection $selection * @return null|Selection */ public function &addSelection(Selection $selection): ?Selection { $this->selections[$selection->getUUID()->toString()] = $selection; $this->setLatestSelectionUUID($selection->getUUID()); $selection = $this->getLatestSelection(); return $selection; } /** * @param UUID $uuid * @return null|Selection */ public function &getSelectionByUUID(UUID $uuid): ?Selection { $selection = $this->selections[$uuid->toString()] ?? null; return $selection; } /** * @param string $uuid * @return null|Selection */ public function &getSelectionByString(string $uuid): ?Selection { $selection = $this->selections[$uuid] ?? null; return $selection; } /** * @return null|Selection */ public function &getLatestSelection(): ?Selection { $latestSelectionUUID = $this->getLatestSelectionUUID(); if (is_null($latestSelectionUUID)) { $selection = null; return $selection; } $selection = $this->selections[$latestSelectionUUID->toString()] ?? null; return $selection; } /** * @return Selection[] */ public function getSelections(): array { return $this->selections; } /** * @param mixed $selections */ public function setSelections($selections): void { $this->selections = $selections; } /** * @return UUID|null */ public function getLatestSelectionUUID(): ?UUID { return $this->latestselection; } /** * @param UUID $latestselection */ public function setLatestSelectionUUID(UUID $latestselection): void { $this->latestselection = $latestselection; } /** * @return int */ public function getCurrentClipboardIndex(): int { return $this->currentClipboard; } /** * @return null|Clipboard */ public function getCurrentClipboard(): ?Clipboard { return $this->clipboards[$this->currentClipboard] ?? null; } /** * @param string $name * @return null|Clipboard */ public function getClipboardByName(string $name): ?Clipboard { foreach ($this->clipboards as $clipboard) { if ($clipboard->getCustomName() === $name) return $clipboard; } return null; } /** * @param int $id * @return null|Clipboard */ public function getClipboardById(int $id): ?Clipboard { return $this->clipboards[$id] ?? null; } /** * TODO * @return Clipboard[] */ public function getClipboards(): array { return $this->clipboards; } /** * TODO * @param Clipboard[] $clipboards * @return bool */ public function setClipboards(array $clipboards): bool { $this->clipboards = $clipboards; return true; } /** * @param Clipboard $clipboard * @param bool $setAsCurrent * @return int The index of the clipboard */ public function addClipboard(Clipboard $clipboard, bool $setAsCurrent = true): int { $amount = array_push($this->clipboards, $clipboard); if ($amount > self::MAX_CLIPBOARDS) array_shift($this->clipboards); $i = array_search($clipboard, $this->clipboards, true); if ($i !== false) { if ($setAsCurrent) $this->currentClipboard = (int)$i; return (int)$i; } return -1; } /** * @param RevertClipboard $revertClipboard */ public function addRevert(RevertClipboard $revertClipboard): void { $this->redoHistory->clear(); $this->undoHistory->push($revertClipboard); while ($this->undoHistory->count() > self::MAX_HISTORY) { $this->undoHistory->shift(); } } /** * @throws Exception */ public function undo(): void { if ($this->undoHistory->count() === 0) { $this->sendMessage(TF::RED . $this->getLanguage()->translateString('session.undo.none')); return; } /** @var RevertClipboard $revertClipboard */ $revertClipboard = $this->undoHistory->pop(); $world = $revertClipboard->getWorld(); foreach ($revertClipboard->chunks as $hash => $chunk) { World::getXZ($hash, $x, $z); $revertClipboard->chunks[$hash] = $world->getChunk($x, $z); } Server::getInstance()->getAsyncPool()->submitTask(new AsyncRevertTask($this->getUUID(), $revertClipboard, AsyncRevertTask::TYPE_UNDO)); $this->sendMessage(TF::GREEN . $this->getLanguage()->translateString('session.undo.left', [count($this->undoHistory)])); } /** * @throws InvalidArgumentException * @throws RuntimeException */ public function redo(): void { if ($this->redoHistory->count() === 0) { $this->sendMessage(TF::RED . $this->getLanguage()->translateString('session.redo.none')); return; } /** @var RevertClipboard $revertClipboard */ $revertClipboard = $this->redoHistory->pop(); Server::getInstance()->getAsyncPool()->submitTask(new AsyncRevertTask($this->getUUID(), $revertClipboard, AsyncRevertTask::TYPE_REDO)); $this->sendMessage(TF::GREEN . $this->getLanguage()->translateString('session.redo.left', [count($this->redoHistory)])); } public function clearHistory(): void { $this->undoHistory->clear(); $this->redoHistory->clear(); } public function clearClipboard(): void { $this->setClipboards([]); $this->currentClipboard = -1; } /** * @return Language */ public function getLanguage(): Language { return Loader::getInstance()->getLanguage(); } abstract public function sendMessage(string $message): void; public function __toString() { return __CLASS__ . " UUID: " . $this->getUUID()->__toString() . " Selections: " . count($this->getSelections()) . " Latest: " . $this->getLatestSelectionUUID() . " Clipboards: " . count($this->getClipboards()) . " Current: " . $this->getCurrentClipboardIndex() . " Undos: " . count($this->undoHistory) . " Redos: " . count($this->redoHistory); } /* * TODO list: * session storing/recovering from file/cleanup if too old * session items * recover session items + commands to get back already created/configured items/tool/brushes * proper multi-selection-usage * setState/getState on big actions, status bar/boss bar/texts/titles/popups * inspect other player's sessions * destroy session if owning player lost permission/gets banned * optimise destroySession/__destruct of sessions * clipboard selection (renaming?) */ } ================================================ FILE: src/xenialdan/MagicWE2/session/UserSession.php ================================================ setPlayer($player); $this->cleanupInventory(); $this->setUUID($player->getUniqueId()); $this->bossBar = (new BossBar())->addPlayer($player); $this->bossBar->hideFrom([$player]); if (Loader::hasScoreboard()) { $this->sidebar = new Scoreboard(); } $this->undoHistory = new Deque(); $this->redoHistory = new Deque(); try { if (is_null($this->lang)) $this->lang = new Language(Language::FALLBACK_LANGUAGE, Loader::getInstance()->getLanguageFolder()); } catch (LanguageNotFoundException $e) { } Loader::getInstance()->getLogger()->debug("Created new session for player {$player->getName()}"); } public function __destruct() { Loader::getInstance()->getLogger()->debug("Destructing session {$this->getUUID()} for user " . $this->getPlayer()->getName()); $this->bossBar->removeAllPlayers(); if (Loader::hasScoreboard() && $this->sidebar !== null) { ScoreFactory::removeScore($this->getPlayer()); } } /** * @return Language */ public function getLanguage(): Language { return $this->lang; } /** * Set the language for the user. Uses iso639-2 language code * @param string $langShort iso639-2 conform language code (3 letter) * @throws LanguageNotFoundException */ public function setLanguage(string $langShort): void { $langShort = strtolower($langShort); if (isset(Loader::getInstance()->getLanguageList()[$langShort])) { $this->lang = new Language($langShort, Loader::getInstance()->getLanguageFolder()); $this->sendMessage(TF::GREEN . $this->getLanguage()->translateString("session.language.set", [$this->getLanguage()->getName()])); } else { $this->lang = new Language(Language::FALLBACK_LANGUAGE, Loader::getInstance()->getLanguageFolder()); $this->sendMessage(TF::RED . $this->getLanguage()->translateString("session.language.notfound", [$langShort])); } } /** * @param null|Player $player */ public function setPlayer(?Player $player): void { $this->player = $player; } /** * @return null|Player */ public function getPlayer(): ?Player { return $this->player; } /** * @return bool */ public function isWandEnabled(): bool { return $this->wandEnabled; } /** * @param bool $wandEnabled * @return string */ public function setWandEnabled(bool $wandEnabled): string { $this->wandEnabled = $wandEnabled; return Loader::PREFIX . $this->getLanguage()->translateString('tool.wand.setenabled', [($wandEnabled ? TF::GREEN . $this->getLanguage()->translateString('enabled') : TF::RED . $this->getLanguage()->translateString('disabled'))]); } /** * @return bool */ public function isDebugToolEnabled(): bool { return $this->debugToolEnabled; } /** * @param bool $debugToolEnabled * @return string */ public function setDebugToolEnabled(bool $debugToolEnabled): string { $this->debugToolEnabled = $debugToolEnabled; return Loader::PREFIX . $this->getLanguage()->translateString('tool.debug.setenabled', [($debugToolEnabled ? TF::GREEN . $this->getLanguage()->translateString('enabled') : TF::RED . $this->getLanguage()->translateString('disabled'))]); } /** * @return bool */ public function isSidebarEnabled(): bool { return $this->sidebarEnabled; } /** * @param bool $sidebarEnabled * @return string */ public function setSidebarEnabled(bool $sidebarEnabled): string { $player = $this->getPlayer(); if (!$player instanceof Player) return TF::RED . "Session has no player"; $this->sidebarEnabled = $sidebarEnabled; if ($sidebarEnabled) { $this->sidebar->handleScoreboard($this); } else { ScoreFactory::removeScore($player); } return Loader::PREFIX . $this->getLanguage()->translateString('tool.sidebar.setenabled', [($sidebarEnabled ? TF::GREEN . $this->getLanguage()->translateString('enabled') : TF::RED . $this->getLanguage()->translateString('disabled'))]); } /** * @return bool */ public function isWailaEnabled(): bool { return $this->wailaEnabled; } /** * @param bool $wailaEnabled * @return string */ public function setWailaEnabled(bool $wailaEnabled): string { $player = $this->getPlayer(); if (!$player instanceof Player) return TF::RED . "Session has no player"; $this->wailaEnabled = $wailaEnabled; if ($wailaEnabled) { Loader::getInstance()->wailaBossBar->showTo([$player]); } else { Loader::getInstance()->wailaBossBar->hideFrom([$player]); } return Loader::PREFIX . $this->getLanguage()->translateString('tool.waila.setenabled', [($wailaEnabled ? TF::GREEN . $this->getLanguage()->translateString('enabled') : TF::RED . $this->getLanguage()->translateString('disabled'))]); } /** * @return BossBar */ public function getBossBar(): BossBar { return $this->bossBar; } /** * TODO exception for not a brush * @param Item $item * @return Brush * @throws Exception */ public function getBrushFromItem(Item $item): Brush { if ((($entry = $item->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE_BRUSH))) instanceof CompoundTag) { $version = $entry->getInt("version", 0); if ($version !== BrushProperties::VERSION) { throw new BrushException("Brush can not be restored - version mismatch"); } /** @var BrushProperties $properties */ $properties = json_decode($entry->getString("properties"), false, 512, JSON_THROW_ON_ERROR); $uuid = UUID::fromString($properties->uuid); $brush = $this->getBrush($uuid); if ($brush instanceof Brush) { return $brush; } $brush = new Brush($properties); $this->addBrush($brush); return $brush; } throw new BrushException("The item is not a valid brush!"); } /** * TODO exception for not a brush * @param UUID $uuid * @return null|Brush */ public function getBrush(UUID $uuid): ?Brush { return $this->brushes[$uuid->toString()] ?? null; } /** * TODO exception for not a brush * @param Brush $brush UUID will be set automatically * @return void */ public function addBrush(Brush $brush): void { $this->brushes[$brush->properties->uuid] = $brush; $this->sendMessage($this->getLanguage()->translateString('session.brush.added', [$brush->getName()])); } /** * @param Brush $brush UUID will be set automatically * @param bool $delete If true, it will be removed from the session brushes * @return void */ public function removeBrush(Brush $brush, bool $delete = false): void { if ($delete) unset($this->brushes[$brush->properties->uuid]); foreach ($this->getPlayer()->getInventory()->getContents() as $slot => $item) { if (($entry = $item->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE_BRUSH)) instanceof CompoundTag) { if ($entry->getString("id") === $brush->properties->uuid) { $this->getPlayer()->getInventory()->clear($slot); } } } if ($delete) $this->sendMessage($this->getLanguage()->translateString('session.brush.deleted', [$brush->getName(), $brush->properties->uuid])); else $this->sendMessage($this->getLanguage()->translateString('session.brush.removed', [$brush->getName(), $brush->properties->uuid])); } /** * TODO exception for not a brush * @param Brush $brush UUID will be set automatically * @return void * @throws ActionNotFoundException * @throws InvalidArgumentException * @throws ShapeNotFoundException * @throws JsonException * @throws TypeError */ public function replaceBrush(Brush $brush): void { $this->brushes[$brush->properties->uuid] = $brush; $new = $brush->toItem(); foreach ($this->getPlayer()->getInventory()->getContents() as $slot => $item) { if (($entry = $item->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE_BRUSH)) instanceof CompoundTag) { if ($entry->getString("id") === $brush->properties->uuid) { $this->getPlayer()->getInventory()->setItem($slot, $new); } } } } /** * @return Brush[] */ public function getBrushes(): array { return $this->brushes; } public function cleanupInventory(): void { foreach ($this->getPlayer()->getInventory()->getContents() as $slot => $item) { /** @var CompoundTag $entry */ if (!is_null(($entry = $item->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE_BRUSH)))) { $this->getPlayer()->getInventory()->clear($slot); } if (!is_null(($entry = $item->getNamedTag()->getCompoundTag(API::TAG_MAGIC_WE)))) { $this->getPlayer()->getInventory()->clear($slot); } } } public function __toString() { return __CLASS__ . " UUID: " . $this->getUUID()->__toString() . " Player: " . $this->getPlayer()->getName() . " Wand tool enabled: " . ($this->isWandEnabled() ? "enabled" : "disabled") . " Debug tool enabled: " . ($this->isDebugToolEnabled() ? "enabled" : "disabled") . " WAILA enabled: " . ($this->isWailaEnabled() ? "enabled" : "disabled") . " Sidebar enabled: " . ($this->sidebarEnabled ? "enabled" : "disabled") . " BossBar: " . $this->getBossBar()->entityId . " Selections: " . count($this->getSelections()) . " Latest: " . $this->getLatestSelectionUUID() . " Clipboards: " . count($this->getClipboards()) . " Current: " . $this->getCurrentClipboardIndex() . " Undos: " . count($this->undoHistory) . " Redos: " . count($this->redoHistory) . " Brushes: " . count($this->brushes); } public function sendMessage(string $message): void { $this->player->sendMessage(Loader::PREFIX . $message); } /** * Specify data which should be serialized to JSON * @link http://php.net/manual/en/jsonserializable.jsonserialize.php * @return mixed data which can be serialized by json_encode, * which is a value of any type other than a resource. * @since 5.4.0 */ public function jsonSerialize() { return [ "uuid" => $this->getUUID()->toString(), "wandEnabled" => $this->wandEnabled, "debugToolEnabled" => $this->debugToolEnabled, "wailaEnabled" => $this->wailaEnabled, "sidebarEnabled" => $this->sidebarEnabled, "brushes" => $this->brushes, "latestSelection" => $this->getLatestSelection(), "currentClipboard" => $this->getCurrentClipboard(), "language" => $this->getLanguage()->getLang() ]; } public function save(): void { file_put_contents(Loader::getInstance()->getDataFolder() . "sessions" . DIRECTORY_SEPARATOR . $this->getPlayer()->getName() . ".json", json_encode($this, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT) ); } } ================================================ FILE: src/xenialdan/MagicWE2/task/AsyncActionTask.php ================================================ start = microtime(true); $this->sessionUUID = $sessionUUID->toString(); $this->selection = serialize($selection); $this->action = $action; $this->touchedChunks = serialize($touchedChunks); $this->newBlocks = $newBlocks; $this->blockFilter = $blockFilter; try { $session = SessionHelper::getSessionByUUID($sessionUUID); if ($session instanceof UserSession) { $player = $session->getPlayer(); /** @var Player $player */ $session->getBossBar()->showTo([$player]); $session->getBossBar()->setTitle("Running {$action::getName()} action");//TODO better string } } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); } } /** * Actions to execute when run * * @return void * @throws Exception */ public function onRun(): void { $this->publishProgress(new Progress(0, "Preparing {$this->action::getName()}")); $touchedChunks = unserialize($this->touchedChunks/*, ['allowed_classes' => false]*/); $touchedChunks = array_map(static function ($chunk) { return FastChunkSerializer::deserialize($chunk); }, $touchedChunks); $manager = Shape::getChunkManager($touchedChunks); unset($touchedChunks); /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/); $oldBlocks = new SingleClipboard($this->action->clipboardVector ?? new Vector3(0, 0, 0));//TODO Test if null V3 is ok //TODO test if the vector works $oldBlocks->selection = $selection;//TODO test. Needed to add this so that //paste works after //cut2 #$oldBlocks = []; $messages = []; $error = false; $newBlocks = API::blockParser($this->newBlocks, $messages, $error);//TODO error handling $blockFilter = API::blockParser($this->blockFilter, $messages, $error);//TODO error handling /** @var Progress $progress */ foreach ($this->action->execute($this->sessionUUID, $selection, $manager, $changed, $newBlocks, $blockFilter, $oldBlocks, $messages) as $progress) { $this->publishProgress($progress); } $resultChunks = $manager->getChunks(); $resultChunks = array_filter($resultChunks, static function (Chunk $chunk) { return $chunk->isDirty(); }); $this->setResult(compact("resultChunks", "oldBlocks", "changed", "messages")); } /** * @throws InvalidArgumentException * @throws AssumptionFailedError * @throws Exception * @throws Exception */ public function onCompletion(): void { try { $session = SessionHelper::getSessionByUUID(UUID::fromString($this->sessionUUID)); if ($session instanceof UserSession) $session->getBossBar()->hideFromAll(); } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); $session = null; } $result = $this->getResult(); /** @var Chunk[] $resultChunks */ $resultChunks = $result["resultChunks"]; $undoChunks = array_map(static function ($chunk) { return FastChunkSerializer::deserialize($chunk); }, unserialize($this->touchedChunks/*, ['allowed_classes' => false]*/));//TODO test pm4 /** @var SingleClipboard $oldBlocks *///TODO make sure changed everywhere $oldBlocks = $result["oldBlocks"]; //TODO Test this new behaviour! //TODO so here i turn SingleClipboard entries into the same $oldBlocks as before this commit $oldBlocksBlocks = []; $x = $y = $z = null; foreach ($oldBlocks->iterateEntries($x, $y, $z) as $entry) { $oldBlocksBlocks[] = API::setComponents($entry->toBlock(), (int)$x, (int)$y, (int)$z);//turn BlockEntry to blocks } $changed = $result["changed"]; /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 $totalCount = $selection->getShape()->getTotalCount(); $world = $selection->getWorld(); foreach ($resultChunks as $hash => $chunk) { World::getXZ($hash, $x, $z); $world->setChunk($x, $z, $chunk, false); } if (!is_null($session)) { $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString($this->action->completionString, ["name" => trim($this->action->prefix . " " . $this->action::getName()), "took" => $this->generateTookString(), "changed" => $changed, "total" => $totalCount])); foreach ($result["messages"] ?? [] as $message) $session->sendMessage($message); if ($this->action->addRevert) $session->addRevert(new RevertClipboard($selection->worldId, $undoChunks, self::multipleBlocksToData($oldBlocksBlocks))); if ($this->action->addClipboard) $session->addClipboard($oldBlocks); } } } ================================================ FILE: src/xenialdan/MagicWE2/task/AsyncClipboardActionTask.php ================================================ start = microtime(true); $this->sessionUUID = $sessionUUID->toString(); $this->selection = serialize($selection);//TODO check if needed, $clipboard already holds the selection $this->clipboard = serialize($clipboard);//TODO check if this even needs to be serialized $this->action = $action; $this->rotPath = Loader::getRotFlipPath(); $this->doorRotPath = Loader::getDoorRotFlipPath(); try { $session = SessionHelper::getSessionByUUID($sessionUUID); if ($session instanceof UserSession) { $player = $session->getPlayer(); /** @var Player $player */ $session->getBossBar()->showTo([$player]); $session->getBossBar()->setTitle("Running {$action::getName()} clipboard action");//TODO better string } } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); } } /** * Actions to execute when run * * @return void * @throws Exception */ public function onRun(): void { $this->publishProgress(new Progress(0, "Preparing {$this->action::getName()}")); BlockStatesParser::$doorRotPath = $this->doorRotPath; BlockStatesParser::$rotPath = $this->rotPath; /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 /** @var SingleClipboard $clipboard */ $clipboard = unserialize($this->clipboard/*, ['allowed_classes' => [SingleClipboard::class]]*/);//TODO test pm4 $clipboard->selection = $selection;//TODO test. Needed to add this so that //paste works after //cut2 $messages = []; /** @var Progress $progress */ foreach ($this->action->execute($this->sessionUUID, $selection, $changed, $clipboard, $messages) as $progress) { $this->publishProgress($progress); } //TODO $clipboard->selection shape might change when using rotate. Fix this, so //paste chunks are correct $this->setResult(compact("clipboard", "changed", "messages")); } /** * @throws InvalidArgumentException * @throws AssumptionFailedError * @throws Exception */ public function onCompletion(): void { try { $session = SessionHelper::getSessionByUUID(UUID::fromString($this->sessionUUID)); if ($session instanceof UserSession) $session->getBossBar()->hideFromAll(); } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); $session = null; } $result = $this->getResult(); /** @var SingleClipboard $clipboard */ $clipboard = $result["clipboard"]; $changed = $result["changed"]; /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 $totalCount = $selection->getShape()->getTotalCount(); if (!is_null($session)) { $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString($this->action->completionString, ["name" => trim($this->action->prefix . " " . $this->action::getName()), "took" => $this->generateTookString(), "changed" => $changed, "total" => $totalCount])); foreach ($result["messages"] ?? [] as $message) $session->sendMessage($message); if ($this->action->addClipboard) $session->addClipboard($clipboard); } } } ================================================ FILE: src/xenialdan/MagicWE2/task/AsyncCopyTask.php ================================================ start = microtime(true); $this->chunks = serialize($chunks); $this->sessionUUID = $sessionUUID->toString(); $this->selection = serialize($selection); $this->offset = $offset->asVector3()->floor(); $this->flags = $flags; } /** * Actions to execute when run * * @return void * @throws Exception */ public function onRun(): void { $this->publishProgress([0, "Start"]); $chunks = array_map(static function ($chunk) { return FastChunkSerializer::deserialize($chunk); }, unserialize($this->chunks/*, ['allowed_classes' => false]*/));//TODO test pm4 /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 #var_dump("shape", $selection->getShape()); $manager = Shape::getChunkManager($chunks); unset($chunks); #var_dump($this->offset); $clipboard = new SingleClipboard($this->offset); $clipboard->selection = $selection; #$clipboard->setCenter(unserialize($this->offset)); $totalCount = $selection->getShape()->getTotalCount(); $copied = $this->copyBlocks($selection, $manager, $clipboard); #$clipboard->setShape($selection->getShape()); #$clipboard->chunks = $manager->getChunks(); $this->setResult(compact("clipboard", "copied", "totalCount")); } /** * @param Selection $selection * @param AsyncChunkManager $manager * @param SingleClipboard $clipboard * @return int * @throws Exception */ private function copyBlocks(Selection $selection, AsyncChunkManager $manager, SingleClipboard $clipboard): int { $blockCount = $selection->getShape()->getTotalCount(); $i = 0; $lastprogress = 0; $this->publishProgress([0, "Running, copied $i blocks out of $blockCount"]); $min = $selection->getShape()->getMinVec3(); /** @var Block $block */ foreach ($selection->getShape()->getBlocks($manager, [], $this->flags) as $block) { #var_dump("copy chunk X: " . ($block->getX() >> 4) . " Y: " . ($block->getY() >> 4)); $newv3 = $block->getPos()->subtractVector($min)->floor(); $clipboard->addEntry($newv3->getFloorX(), $newv3->getFloorY(), $newv3->getFloorZ(), new BlockEntry($block->getFullId()));//TODO test tiles #var_dump("copied selection block", $block); $i++; $progress = floor($i / $blockCount * 100); if ($lastprogress < $progress) {//this prevents spamming packets $this->publishProgress([$progress, "Running, copied $i blocks out of $blockCount"]); $lastprogress = $progress; } } return $i; } public function onCompletion(): void { try { $session = SessionHelper::getSessionByUUID(UUID::fromString($this->sessionUUID)); if ($session instanceof UserSession) $session->getBossBar()->hideFromAll(); $result = $this->getResult(); $copied = $result["copied"]; /** @var SingleClipboard $clipboard */ $clipboard = $result["clipboard"]; $totalCount = $result["totalCount"]; $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString('task.copy.success', [$this->generateTookString(), $copied, $totalCount])); $session->addClipboard($clipboard); } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); } catch (InvalidArgumentException $e) { Loader::getInstance()->getLogger()->logException($e); } catch (AssumptionFailedError $e) { Loader::getInstance()->getLogger()->logException($e); } } } ================================================ FILE: src/xenialdan/MagicWE2/task/AsyncCountTask.php ================================================ start = microtime(true); $this->touchedChunks = serialize($touchedChunks); $this->sessionUUID = $sessionUUID->toString(); $this->selection = serialize($selection); $this->newBlocks = serialize($newBlocks); $this->flags = $flags; } /** * Actions to execute when run * * @return void * @throws Exception */ public function onRun(): void { $this->publishProgress([0, "Start"]); $chunks = unserialize($this->touchedChunks/*, ['allowed_classes' => [false]]*/);//TODO test pm4 foreach ($chunks as $hash => $data) { $chunks[$hash] = FastChunkSerializer::deserialize($data); } /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 $manager = Shape::getChunkManager($chunks); unset($chunks); /** @var Block[] $newBlocks */ $newBlocks = unserialize($this->newBlocks/*, ['allowed_classes' => [Block::class]]*/);//TODO test pm4 $totalCount = $selection->getShape()->getTotalCount(); $counts = $this->countBlocks($selection, $manager, $newBlocks); $this->setResult(compact("counts", "totalCount")); } /** * @param Selection $selection * @param AsyncChunkManager $manager * @param Block[] $newBlocks * @return array * @throws Exception */ private function countBlocks(Selection $selection, AsyncChunkManager $manager, array $newBlocks): array { $blockCount = $selection->getShape()->getTotalCount(); $changed = 0; $this->publishProgress([0, "Running, changed $changed blocks out of $blockCount"]); $lastchunkx = $lastchunkz = null; $lastprogress = 0; $counts = []; /** @var Block $block */ foreach ($selection->getShape()->getBlocks($manager, $newBlocks, $this->flags) as $block) { if (is_null($lastchunkx) || ($block->getPos()->x >> 4 !== $lastchunkx && $block->getPos()->z >> 4 !== $lastchunkz)) { $lastchunkx = $block->getPos()->x >> 4; $lastchunkz = $block->getPos()->z >> 4; if (is_null($manager->getChunk($block->getPos()->x >> 4, $block->getPos()->z >> 4))) { #print PHP_EOL . "Not found: " . strval($block->x >> 4) . ":" . strval($block->z >> 4) . PHP_EOL; continue; } } BlockFactory::getInstance(); $block1 = $manager->getBlockArrayAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()); $tostring = (BlockFactory::getInstance()->get($block1[0], $block1[1]))->getName() . " " . $block1[0] . ":" . $block1[1]; if (!array_key_exists($tostring, $counts)) $counts[$tostring] = 0; $counts[$tostring]++; $changed++; $progress = floor($changed / $blockCount * 100); if ($lastprogress < $progress) {//this prevents spamming packets $this->publishProgress([$progress, "Running, counting $changed blocks out of $blockCount"]); $lastprogress = $progress; } } return $counts; } /** * @throws InvalidArgumentException * @throws AssumptionFailedError */ public function onCompletion(): void { try { $session = SessionHelper::getSessionByUUID(UUID::fromString($this->sessionUUID)); if ($session instanceof UserSession) $session->getBossBar()->hideFromAll(); $result = $this->getResult(); $counts = $result["counts"]; $totalCount = $result["totalCount"]; $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString('task.count.success', [$this->generateTookString()])); $session->sendMessage(TF::DARK_AQUA . $session->getLanguage()->translateString('task.count.result', [count($counts), $totalCount])); uasort($counts, static function ($a, $b) { if ($a === $b) return 0; return ($a > $b) ? -1 : 1; }); foreach ($counts as $block => $count) { $session->sendMessage(TF::AQUA . $count . "x | " . round($count / $totalCount * 100) . "% | " . $block); } } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); } } } ================================================ FILE: src/xenialdan/MagicWE2/task/AsyncFillTask.php ================================================ start = microtime(true); $this->sessionUUID = $sessionUUID->toString(); $this->selection = igbinary_serialize($selection); $this->touchedChunks = igbinary_serialize($touchedChunks); $this->newBlocks = BlockPalette::encode($newBlocks); var_dump($this->newBlocks); $this->flags = $flags; } /** * Actions to execute when run * * @return void * @throws Exception */ public function onRun(): void { $this->publishProgress([0, "Start"]); $touchedChunks = array_map(static function ($chunk) { return FastChunkSerializer::deserialize($chunk); }, igbinary_unserialize($this->touchedChunks/*, ['allowed_classes' => false]*/));//TODO test pm4 $manager = Shape::getChunkManager($touchedChunks); unset($touchedChunks); /** @var Selection $selection */ $selection = igbinary_unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 /** @var Block[] $newBlocks */ $newBlocks = BlockPalette::decode($this->newBlocks);//TODO test pm4 $oldBlocks = iterator_to_array($this->execute($selection, $manager, $newBlocks, $changed)); $resultChunks = $manager->getChunks(); $resultChunks = array_filter($resultChunks, static function (Chunk $chunk) { return $chunk->isDirty(); }); #$this->setResult(compact("resultChunks", "oldBlocks", "changed")); $this->setResult([ "resultChunks" => $resultChunks, "oldBlocks" => $oldBlocks, "changed" => $changed ]); } /** * @param Selection $selection * @param AsyncChunkManager $manager * @param Block[] $newBlocks * @param null|int $changed * @return Generator|array[] * @phpstan-return Generator * @throws Exception */ private function execute(Selection $selection, AsyncChunkManager $manager, array $newBlocks, ?int &$changed): Generator { $blockCount = $selection->getShape()->getTotalCount(); $lastchunkx = $lastchunkz = null; $lastprogress = 0; $i = 0; $changed = 0; $this->publishProgress([0, "Running, changed $changed blocks out of $blockCount"]); /** @var Block $block */ foreach ($selection->getShape()->getBlocks($manager, [], $this->flags) as $block) { /*if (API::hasFlag($this->flags, API::FLAG_POSITION_RELATIVE)){ $rel = $block->subtract($selection->shape->getPasteVector()); $block = API::setComponents($block,$rel->x,$rel->y,$rel->z);//TODO COPY TO ALL TASKS }*/ if (is_null($lastchunkx) || ($block->getPos()->x >> 4 !== $lastchunkx && $block->getPos()->z >> 4 !== $lastchunkz)) { $lastchunkx = $block->getPos()->x >> 4; $lastchunkz = $block->getPos()->z >> 4; if (is_null($manager->getChunk($block->getPos()->x >> 4, $block->getPos()->z >> 4))) { #print PHP_EOL . "Not found: " . strval($block->x >> 4) . ":" . strval($block->z >> 4) . PHP_EOL; continue; } } $new = clone $newBlocks[array_rand($newBlocks)]; if ($new->getId() === $block->getId() && $new->getMeta() === $block->getMeta()) continue;//skip same blocks #yield self::undoBlockHackToArray($manager->getBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()),$block->getPos()); yield self::singleBlockToData(API::setComponents($manager->getBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()), (int)$block->getPos()->x, (int)$block->getPos()->y, (int)$block->getPos()->z)); #yield $block;//backup $manager->setBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ(), $new); if ($manager->getBlockArrayAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()) !== [$block->getId(), $block->getMeta()]) { $changed++; } /// $i++; $progress = floor($i / $blockCount * 100); if ($lastprogress < $progress) {//this prevents spamming packets $this->publishProgress([$progress, "Running, changed $changed blocks out of $blockCount"]); $lastprogress = $progress; } } } /** * @throws InvalidArgumentException * @throws AssumptionFailedError * @throws Exception * @throws Exception */ public function onCompletion(): void { try { $session = SessionHelper::getSessionByUUID(UUID::fromString($this->sessionUUID)); if ($session instanceof UserSession) $session->getBossBar()->hideFromAll(); } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); $session = null; } $result = $this->getResult(); /** @var Chunk[] $resultChunks */ $resultChunks = $result["resultChunks"]; $undoChunks = array_map(static function ($chunk) { return FastChunkSerializer::deserialize($chunk); }, igbinary_unserialize($this->touchedChunks/*, ['allowed_classes' => false]*/));//TODO test pm4) #$oldBlocks = igbinary_unserialize($result["oldBlocks"]); $oldBlocks = $result["oldBlocks"];//this is already a data map // $oldBlocks2 = []; // /** // * @var int $fullId // * @var Vector3 $pos // */ // foreach ($oldBlocks as [$fullId, $pos]) { // $b = BlockFactory::getInstance()->fromFullBlock($fullId); // $b->getPos()->x = $pos->x; // $b->getPos()->y = $pos->y; // $b->getPos()->z = $pos->z; // $oldBlocks2[] = $b; // } // var_dump($oldBlocks2); $changed = $result["changed"]; /** @var Selection $selection */ $selection = igbinary_unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 $totalCount = $selection->getShape()->getTotalCount(); $world = $selection->getWorld(); foreach ($resultChunks as $hash => $chunk) { World::getXZ($hash, $x, $z); $world->setChunk($x, $z, $chunk, false); } if (!is_null($session)) { $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString('task.fill.success', [$this->generateTookString(), $changed, $totalCount])); $session->addRevert(new RevertClipboard($selection->worldId, $undoChunks, $oldBlocks)); } } } ================================================ FILE: src/xenialdan/MagicWE2/task/AsyncPasteTask.php ================================================ start = microtime(true); $this->offset = $selection->getShape()->getPasteVector()->addVector($clipboard->position)->floor(); #var_dump("paste", $selection->getShape()->getPasteVector(), "cb position", $clipboard->position, "offset", $this->offset, $clipboard); $this->sessionUUID = $sessionUUID->toString(); $this->selection = serialize($selection); $this->touchedChunks = serialize($touchedChunks); $this->clipboard = serialize($clipboard); } /** * Actions to execute when run * * @return void * @throws InvalidArgumentException */ public function onRun(): void { $this->publishProgress([0, "Start"]); $touchedChunks = array_map(static function ($chunk) {//todo add hash as key return FastChunkSerializer::deserialize($chunk); }, unserialize($this->touchedChunks/*, ['allowed_classes' => false]*/));//TODO test pm4 $manager = Shape::getChunkManager($touchedChunks); unset($touchedChunks); /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 /** @var SingleClipboard $clipboard */ $clipboard = unserialize($this->clipboard/*, ['allowed_classes' => [SingleClipboard::class]]*/);//TODO test pm4 $oldBlocks = iterator_to_array($this->execute($selection, $manager, $clipboard, $changed)); $resultChunks = $manager->getChunks(); $resultChunks = array_filter($resultChunks, static function (Chunk $chunk) { return $chunk->isDirty(); }); $this->setResult(compact("resultChunks", "oldBlocks", "changed")); } /** * @param Selection $selection * @param AsyncChunkManager $manager * @param SingleClipboard $clipboard * @param null|int $changed * @return Generator|array[] * @phpstan-return Generator * @throws InvalidArgumentException */ private function execute(Selection $selection, AsyncChunkManager $manager, SingleClipboard $clipboard, ?int &$changed): Generator { $blockCount = $clipboard->getTotalCount(); $lastchunkx = $lastchunkz = $x = $y = $z = null; $lastprogress = 0; $i = 0; $changed = 0; $this->publishProgress([0, "Running, changed $changed blocks out of $blockCount"]); /** @var BlockEntry $entry */ foreach ($clipboard->iterateEntries($x, $y, $z) as $entry) { #var_dump("at cb xyz $x $y $z: $entry"); $x += $this->offset->getFloorX(); $y += $this->offset->getFloorY(); $z += $this->offset->getFloorZ(); #var_dump("add offset xyz $x $y $z"); if (($x >> 4 !== $lastchunkx && $z >> 4 !== $lastchunkz) || is_null($lastchunkx)) { $lastchunkx = $x >> 4; $lastchunkz = $z >> 4; if (is_null($manager->getChunk($x >> 4, $z >> 4))) { print PHP_EOL . "Paste chunk not found in async paste manager: " . ($x >> 4) . ":" . ($z >> 4) . PHP_EOL; continue; } } /*if (API::hasFlag($this->flags, API::FLAG_POSITION_RELATIVE)){ $rel = $block->subtract($selection->shape->getPasteVector()); $block = API::setComponents($block,$rel->x,$rel->y,$rel->z);//TODO COPY TO ALL TASKS }*/ $new = $entry->toBlock(); #$new->position(($pos = Position::fromObject(new Vector3($x, $y, $z)))->getWorld(), $pos->getX(), $pos->getY(), $pos->getZ()); #$old->position(($pos = Position::fromObject(new Vector3($x, $y, $z)))->getWorld(), $pos->getX(), $pos->getY(), $pos->getZ()); #var_dump("old", $old, "new", $new); yield self::singleBlockToData(API::setComponents($manager->getBlockAt($x, $y, $z), (int)$x, (int)$y, (int)$z)); $manager->setBlockAt($x, $y, $z, $new); if ($manager->getBlockArrayAt($x, $y, $z) !== [$manager->getBlockAt($x, $y, $z)->getId(), $manager->getBlockAt($x, $y, $z)->getMeta()]) {//TODO remove? Just useless waste imo $changed++; } /// $i++; $progress = floor($i / $blockCount * 100); if ($lastprogress < $progress) {//this prevents spamming packets $this->publishProgress([$progress, "Running, changed $changed blocks out of $blockCount"]); $lastprogress = $progress; } } } /** * @throws AssumptionFailedError * @throws InvalidArgumentException * @throws Exception * @throws Exception */ public function onCompletion(): void { try { $session = SessionHelper::getSessionByUUID(UUID::fromString($this->sessionUUID)); if ($session instanceof UserSession) $session->getBossBar()->hideFromAll(); } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); $session = null; } $result = $this->getResult(); /** @var Chunk[] $resultChunks */ $resultChunks = $result["resultChunks"]; $undoChunks = array_map(static function ($chunk) { return FastChunkSerializer::deserialize($chunk); }, unserialize($this->touchedChunks/*, ['allowed_classes' => false]*/));//TODO test pm4 $oldBlocks = $result["oldBlocks"];//already data array $changed = $result["changed"]; /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 $totalCount = $selection->getShape()->getTotalCount(); $world = $selection->getWorld(); foreach ($resultChunks as $hash => $chunk) { World::getXZ($hash, $x, $z); $world->setChunk($x, $z, $chunk, false); } if (!is_null($session)) { $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString('task.fill.success', [$this->generateTookString(), $changed, $totalCount])); $session->addRevert(new RevertClipboard($selection->worldId, $undoChunks, $oldBlocks)); } } } ================================================ FILE: src/xenialdan/MagicWE2/task/AsyncReplaceTask.php ================================================ start = microtime(true); $this->sessionUUID = $sessionUUID->toString(); $this->selection = serialize($selection); $this->touchedChunks = serialize($touchedChunks); $this->replaceBlocks = serialize($replaceBlocks); $this->newBlocks = serialize($newBlocks); $this->flags = $flags; } /** * Actions to execute when run * * @return void * @throws Exception */ public function onRun(): void { $this->publishProgress([0, "Start"]); $touchedChunks = array_map(static function ($chunk) { return FastChunkSerializer::deserialize($chunk); }, unserialize($this->touchedChunks/*, ['allowed_classes' => false]*/));//TODO test pm4 $manager = Shape::getChunkManager($touchedChunks); unset($touchedChunks); /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 /** @var Block[] $replaceBlocks */ $replaceBlocks = unserialize($this->replaceBlocks/*, ['allowed_classes' => [Block::class]]*/);//TODO test pm4 /** @var Block[] $newBlocks */ $newBlocks = unserialize($this->newBlocks/*, ['allowed_classes' => [Block::class]]*/);//TODO test pm4 $oldBlocks = iterator_to_array($this->execute($selection, $manager, $replaceBlocks, $newBlocks, $changed)); $resultChunks = $manager->getChunks(); $resultChunks = array_filter($resultChunks, static function (Chunk $chunk) { return $chunk->isDirty(); }); $this->setResult(compact("resultChunks", "oldBlocks", "changed")); } /** * @param Selection $selection * @param AsyncChunkManager $manager * @param array $replaceBlocks * @param Block[] $newBlocks * @param null|int $changed * @return Generator|array[] * @phpstan-return Generator * @throws Exception */ private function execute(Selection $selection, AsyncChunkManager $manager, array $replaceBlocks, array $newBlocks, ?int &$changed): Generator { $blockCount = $selection->getShape()->getTotalCount(); $lastchunkx = $lastchunkz = null; $lastprogress = 0; $i = 0; $changed = 0; $this->publishProgress([0, "Running, changed $changed blocks out of $blockCount"]); /** @var Block $block */ foreach ($selection->getShape()->getBlocks($manager, $replaceBlocks, $this->flags) as $block) { if (is_null($lastchunkx) || ($block->getPos()->x >> 4 !== $lastchunkx && $block->getPos()->z >> 4 !== $lastchunkz)) { $lastchunkx = $block->getPos()->x >> 4; $lastchunkz = $block->getPos()->z >> 4; if (is_null($manager->getChunk($block->getPos()->x >> 4, $block->getPos()->z >> 4))) { #print PHP_EOL . "Not found: " . strval($block->x >> 4) . ":" . strval($block->z >> 4) . PHP_EOL; continue; } } $new = clone $newBlocks[array_rand($newBlocks)]; if ($new->getId() === $block->getId() && $new->getMeta() === $block->getMeta()) continue;//skip same blocks yield self::singleBlockToData(API::setComponents($manager->getBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()), (int)$block->getPos()->x, (int)$block->getPos()->y, (int)$block->getPos()->z)); $manager->setBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ(), $new); if ($manager->getBlockArrayAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()) !== [$block->getId(), $block->getMeta()]) { $changed++; } /// $i++; $progress = floor($i / $blockCount * 100); if ($lastprogress < $progress) {//this prevents spamming packets $this->publishProgress([$progress, "Running, changed $changed blocks out of $blockCount"]); $lastprogress = $progress; } } } /** * @throws InvalidArgumentException * @throws AssumptionFailedError * @throws Exception * @throws Exception */ public function onCompletion(): void { try { $session = SessionHelper::getSessionByUUID(UUID::fromString($this->sessionUUID)); if ($session instanceof UserSession) $session->getBossBar()->hideFromAll(); } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); $session = null; } $result = $this->getResult(); /** @var Chunk[] $resultChunks */ $resultChunks = $result["resultChunks"]; $undoChunks = array_map(static function ($chunk) { return FastChunkSerializer::deserialize($chunk); }, unserialize($this->touchedChunks/*, ['allowed_classes' => false]*/));//TODO test pm4 $oldBlocks = $result["oldBlocks"];//this is already as data $changed = $result["changed"]; /** @var Selection $selection */ $selection = unserialize($this->selection/*, ['allowed_classes' => [Selection::class]]*/);//TODO test pm4 $totalCount = $selection->getShape()->getTotalCount(); $world = $selection->getWorld(); foreach ($resultChunks as $hash => $chunk) { World::getXZ($hash, $x, $z); $world->setChunk($x, $z, $chunk, false); } if (!is_null($session)) { $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString('task.replace.success', [$this->generateTookString(), $changed, $totalCount])); $session->addRevert(new RevertClipboard($selection->worldId, $undoChunks, $oldBlocks)); } } } ================================================ FILE: src/xenialdan/MagicWE2/task/AsyncRevertTask.php ================================================ sessionUUID = $sessionUUID->toString(); $this->start = microtime(true); $this->clipboard = serialize($clipboard); $this->type = $type; } /** * Actions to execute when run * * @return void * @throws Exception */ public function onRun(): void { $this->publishProgress([0, "Start"]); /** @var RevertClipboard $clipboard */ $clipboard = unserialize($this->clipboard/*, ['allowed_classes' => [RevertClipboard::class]]*/);//TODO test pm4 $totalCount = count($clipboard->blocksAfter); $manager = $clipboard::getChunkManager($clipboard->chunks); $oldBlocks = []; if ($this->type === self::TYPE_UNDO) $oldBlocks = iterator_to_array($this->undoChunks($manager, $clipboard)); if ($this->type === self::TYPE_REDO) $oldBlocks = iterator_to_array($this->redoChunks($manager, $clipboard)); $chunks = $manager->getChunks(); $this->setResult(compact("chunks", "oldBlocks", "totalCount")); } /** * @param AsyncChunkManager $manager * @param RevertClipboard $clipboard * @return Generator|array[] * @phpstan-return Generator * @throws InvalidArgumentException */ private function undoChunks(AsyncChunkManager $manager, RevertClipboard $clipboard): Generator { $count = count($clipboard->blocksAfter); $changed = 0; $this->publishProgress([0, "Reverted $changed blocks out of $count"]); //$block is "data" array foreach ($clipboard->blocksAfter as $block) { yield $block; $block = self::singleDataToBlock($block);//turn data into real block $manager->setBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ(), $block); $changed++; $this->publishProgress([$changed / $count, "Reverted $changed blocks out of $count"]); } } /** * @param AsyncChunkManager $manager * @param RevertClipboard $clipboard * @return Generator|array[] * @phpstan-return Generator * @throws InvalidArgumentException */ private function redoChunks(AsyncChunkManager $manager, RevertClipboard $clipboard): Generator { $count = count($clipboard->blocksAfter); $changed = 0; $this->publishProgress([0, "Redone $changed blocks out of $count"]); //$block is "data" array foreach ($clipboard->blocksAfter as $block) { yield $block; $block = self::singleDataToBlock($block);//turn data into real block $manager->setBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ(), $block); $changed++; $this->publishProgress([$changed / $count, "Redone $changed blocks out of $count"]); } } /** * @throws InvalidArgumentException * @throws AssumptionFailedError * @throws Exception */ public function onCompletion(): void { try { $session = SessionHelper::getSessionByUUID(UUID::fromString($this->sessionUUID)); if ($session instanceof UserSession) $session->getBossBar()->hideFromAll(); } catch (SessionException $e) { Loader::getInstance()->getLogger()->logException($e); $session = null; } $result = $this->getResult(); /** @var RevertClipboard $clipboard */ $clipboard = unserialize($this->clipboard/*, ['allowed_classes' => [RevertClipboard::class]]*/);//TODO test pm4 $clipboard->chunks = $result["chunks"]; $totalCount = $result["totalCount"]; $changed = count($result["oldBlocks"]); $clipboard->blocksAfter = $result["oldBlocks"];//already is a array of data $world = $clipboard->getWorld(); foreach ($clipboard->chunks as $hash => $chunk) { World::getXZ($hash, $x, $z); $world->setChunk($x, $z, $chunk, false); } if (!is_null($session)) { switch ($this->type) { case self::TYPE_UNDO: { $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString('task.revert.undo.success', [$this->generateTookString(), $changed, $totalCount])); $session->redoHistory->push($clipboard); break; } case self::TYPE_REDO: { $session->sendMessage(TF::GREEN . $session->getLanguage()->translateString('task.revert.redo.success', [$this->generateTookString(), $changed, $totalCount])); $session->undoHistory->push($clipboard); break; } } } } } ================================================ FILE: src/xenialdan/MagicWE2/task/MWEAsyncTask.php ================================================ sessionUUID)); /** @var Progress $progress */ if ($session instanceof UserSession) $session->getBossBar()->setPercentage($progress->progress)->setSubTitle(str_replace("%", "%%%%", $progress->string . " | " . floor($progress->progress * 100) . "%")); else $session->sendMessage($progress->string . " | " . floor($progress->progress * 100) . "%");//TODO remove, debug } catch (SessionException $e) { //TODO log? } } public function generateTookString(): string { return date("i:s:", (int)(microtime(true) - $this->start)) . round(microtime(true) - $this->start, 1, PHP_ROUND_HALF_DOWN); } /** * Turns A block into an array that doesn't get fucked by anonymous classes when serialized * @param Block $block * @param Position|null $position * @return array{int, Position|null} */ public static function singleBlockToData(Block $block, ?Position $position = null): array { /** @noinspection PhpInternalEntityUsedInspection */ return [$block->getFullId(), $position ?? $block->getPos()]; } /** * Turns ALL blocks into an array that doesn't get fucked by anonymous classes when serialized * @param Block[] $blocks * @return array */ public static function multipleBlocksToData(array $blocks): array { $a = []; foreach ($blocks as $block) $a[] = self::singleBlockToData($block); return $a; } /** * Turns a SINGLE array from singleBlockToData back into a block * @param array{int, Position|null} $data * @return Block */ protected static function singleDataToBlock(array $data): Block { $block = BlockFactory::getInstance()->fromFullBlock($data[0]); /** @var Position $pos */ $pos = $data[1]; $block->getPos()->world = $pos->world; $block->getPos()->x = $pos->x; $block->getPos()->y = $pos->y; $block->getPos()->z = $pos->z; return $block; } /** * Turns back MULTIPLE data from singleBlockToData into blocks * @param array $hackedBlockData * @return Block[] */ public static function multipleDataToBlocks(array $hackedBlockData): array { $a = []; foreach ($hackedBlockData as $datum) { $a[] = self::singleDataToBlock($datum); } return $a; } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/ActionRegistry.php ================================================ asVector3()->floor(); $this->clipboardVector = $clipboardVector; } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/CountAction.php ================================================ getShape()->getTotalCount(); $lastProgress = new Progress(0, ""); $counts = []; BlockFactory::getInstance(); foreach ($selection->getShape()->getBlocks($manager, $newBlocks) as $block) { $block1 = $manager->getBlockArrayAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()); $tostring = (BlockFactory::getInstance()->get($block1[0], $block1[1]))->getName() . " " . $block1[0] . ":" . $block1[1]; if (!array_key_exists($tostring, $counts)) $counts[$tostring] = 0; $counts[$tostring]++; $changed++; $progress = new Progress($changed / $count, "$changed blocks out of $count"); if (floor($progress->progress * 100) > floor($lastProgress->progress * 100)) { yield $progress; $lastProgress = $progress; } } $messages[] = TF::DARK_AQUA . count($counts) . " blocks found in a total of $count blocks"; uasort($counts, static function ($a, $b) { if ($a === $b) return 0; return ($a > $b) ? -1 : 1; }); foreach ($counts as $block => $countb) { $messages[] = TF::AQUA . $countb . "x | " . round($countb / $count * 100) . "% | " . $block; } } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/CutAction.php ================================================ getShape()->getTotalCount(); $lastProgress = new Progress(0, ""); $min = $selection->getShape()->getMinVec3(); foreach ($selection->getShape()->getBlocks($manager, $blockFilter) as $block) { $new = clone $newBlocks[array_rand($newBlocks)]; if ($new->getId() === $block->getId() && $new->getMeta() === $block->getMeta()) continue;//skip same blocks #$oldBlocks[] = API::setComponents($manager->getBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()),$block->x, $block->y, $block->z); $newv3 = $block->getPos()->subtractVector($min)->floor();//TODO check if only used for clipboard $oldBlocksSingleClipboard->addEntry($newv3->getFloorX(), $newv3->getFloorY(), $newv3->getFloorZ(), BlockEntry::fromBlock($block)); $manager->setBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ(), $new); if ($manager->getBlockArrayAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()) !== [$block->getId(), $block->getMeta()]) { $changed++; } $i++; $progress = new Progress($i / $count, "Changed {$changed} blocks out of {$count}"); if (floor($progress->progress * 100) > floor($lastProgress->progress * 100)) { yield $progress; $lastProgress = $progress; } } } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/FlipAction.php ================================================ axis = $axis; } public static function getName(): string { return "Flip"; } /** * @param string $sessionUUID * @param Selection $selection * @param null|int $changed * @param SingleClipboard $clipboard * @param string[] $messages * @return Generator|Progress[] * @throws Exception */ public function execute(string $sessionUUID, Selection $selection, ?int &$changed, SingleClipboard &$clipboard, array &$messages = []): Generator { //TODO modify position. For now, just flip the blocks around their own axis $changed = 0; #$oldBlocks = []; $count = $selection->getShape()->getTotalCount(); $lastProgress = new Progress(0, ""); BlockFactory::getInstance(); $clonedClipboard = clone $clipboard; $x = $y = $z = null; $maxX = $clipboard->selection->getSizeX() - 1; $maxY = $clipboard->selection->getSizeY() - 1; $maxZ = $clipboard->selection->getSizeZ() - 1; foreach ($clipboard->iterateEntries($x, $y, $z) as $blockEntry) { #var_dump("$x $y $z"); if ($this->axis === self::AXIS_Z || $this->axis === self::AXIS_XZ) $x = $maxX - $x; if ($this->axis === self::AXIS_X || $this->axis === self::AXIS_XZ) $z = $maxZ - $z; if ($this->axis === self::AXIS_Y) $y = $maxY - $y; #var_dump("$x $y $z"); $block1 = $blockEntry->toBlock(); $blockStatesEntry = BlockStatesParser::getInstance()::getStateByBlock($block1); $mirrored = $blockStatesEntry->mirror($this->axis); $block = $mirrored->toBlock(); $entry = BlockEntry::fromBlock($block); //var_dump($blockStatesEntry->__toString(), $mirrored->__toString(), $block); /** @var int $x */ /** @var int $y */ /** @var int $z */ $clonedClipboard->addEntry($x, $y, $z, $entry); $changed++; $progress = new Progress($changed / $count, "$changed/$count"); if (floor($progress->progress * 100) > floor($lastProgress->progress * 100)) { yield $progress; $lastProgress = $progress; } } $clipboard = $clonedClipboard; } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/RotateAction.php ================================================ rotation = $rotation; $this->addClipboard = $aroundOrigin; } public static function getName(): string { return "Rotate"; } /** * @param string $sessionUUID * @param Selection $selection * @param null|int $changed * @param SingleClipboard $clipboard * @param string[] $messages * @return Generator|Progress[] * @throws Exception */ public function execute(string $sessionUUID, Selection $selection, ?int &$changed, SingleClipboard &$clipboard, array &$messages = []): Generator { //TODO modify position. For now, just flip the blocks around their own axis $changed = 0; #$oldBlocks = []; $count = $selection->getShape()->getTotalCount(); $lastProgress = new Progress(0, ""); BlockFactory::getInstance(); $clonedClipboard = clone $clipboard; $clonedClipboard->clear(); $x = $y = $z = null; $maxX = $clipboard->selection->getSizeX() - 1; $maxZ = $clipboard->selection->getSizeZ() - 1; foreach ($clipboard->iterateEntries($x, $y, $z) as $blockEntry) {//only fully works if xyz is positive //TODO make sure this is always positive, see next comment #var_dump("$x $y $z"); $newX = $x; $newZ = $z; //TODO if aroundOrigin is true (or false, unsure right now), modify the paste vector instead, and always keep the blocks in the positive range? if ($this->rotation === self::ROTATE_90) { $newX = -$z; $newZ = $x; if ($this->aroundOrigin) { $newX += $maxZ; } } if ($this->rotation === self::ROTATE_180) { $newX = -$x; $newZ = -$z; if ($this->aroundOrigin) { $newX += $maxX; $newZ += $maxZ; } } if ($this->rotation === self::ROTATE_270) { $newX = $z; $newZ = -$x; if ($this->aroundOrigin) { $newZ += $maxX; } } #var_dump("$newX $y $newZ"); $block1 = $blockEntry->toBlock(); /** @var BlockStatesParser $instance */ $instance = BlockStatesParser::getInstance(); $blockStatesEntry = $instance::getStateByBlock($block1); $rotated = $blockStatesEntry->rotate($this->rotation); $block = $rotated->toBlock(); $entry = BlockEntry::fromBlock($block); #var_dump($blockStatesEntry->__toString(), $rotated->__toString(), $entry); /** @var int $y */ $clonedClipboard->addEntry($newX, $y, $newZ, $entry); $changed++; $progress = new Progress($changed / $count, "$changed/$count"); if (floor($progress->progress * 100) > floor($lastProgress->progress * 100)) { yield $progress; $lastProgress = $progress; } } $clonedSelection = $clonedClipboard->selection; $pos1 = $clonedSelection->pos1; $pos2 = $clonedSelection->pos2; if ($this->rotation === self::ROTATE_90) {//TODO rewrite to be cleaner #$pos2 = $pos2->setComponents($pos1->x, $pos2->y, $pos1->z + $maxX); $pos2 = new Vector3($pos1->x, $pos2->y, $pos1->z + $maxX); $pos1 = $pos1->subtract($maxZ, 0, 0); if ($this->aroundOrigin) { $pos1 = $pos1->add($maxZ, 0, 0); $pos2 = $pos2->add($maxZ, 0, 0); } } if ($this->rotation === self::ROTATE_180) { if (!$this->aroundOrigin) { $pos1 = $pos1->subtract($maxX, 0, $maxZ); $pos2 = $pos2->subtract($maxX, 0, $maxZ); } } if ($this->rotation === self::ROTATE_270) {//TODO rewrite to be cleaner #$pos2 = $pos2->setComponents($pos1->x + $maxZ, $pos2->y, $pos1->z); $pos2 = new Vector3($pos1->x + $maxZ, $pos2->y, $pos1->z); $pos1 = $pos1->subtract(0, 0, $maxX); if ($this->aroundOrigin) { $pos1 = $pos1->add(0, 0, $maxX); $pos2 = $pos2->add(0, 0, $maxX); } } $clonedSelection->shape = (Cuboid::constructFromPositions($pos1, $pos2));//TODO figure out how to keep the shape (not always Cuboid) $clonedClipboard->selection = $clonedSelection; $clipboard = $clonedClipboard; } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/SetBiomeAction.php ================================================ biomeId = $biomeId; } public static function getName(): string { return "Set biome"; } /** * @param string $sessionUUID * @param Selection $selection * @param AsyncChunkManager $manager * @param null|int $changed * @param Block[] $newBlocks * @param Block[] $blockFilter * @param SingleClipboard $oldBlocksSingleClipboard blocks before the change * @param string[] $messages * @return Generator|Progress[] * @throws Exception */ public function execute(string $sessionUUID, Selection $selection, AsyncChunkManager $manager, ?int &$changed, array $newBlocks, array $blockFilter, SingleClipboard $oldBlocksSingleClipboard, array &$messages = []): Generator { $changed = 0; #$oldBlocks = []; $count = null; $lastProgress = new Progress(0, ""); foreach (($all = $selection->getShape()->getLayer($manager)) as $vec2) { if (is_null($count)) $count = count(iterator_to_array($all)); $manager->getChunk($vec2->x >> 4, $vec2->y >> 4)->setBiomeId($vec2->x % 16, $vec2->y % 16, $this->biomeId); $changed++; $progress = new Progress($changed / $count, "Changed Biome for $changed/$count blocks"); if (floor($progress->progress * 100) > floor($lastProgress->progress * 100)) { yield $progress; $lastProgress = $progress; } } } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/SetBlockAction.php ================================================ getShape()->getTotalCount(); $lastProgress = new Progress(0, ""); foreach ($selection->getShape()->getBlocks($manager, $blockFilter) as $block) { $new = clone $newBlocks[array_rand($newBlocks)]; if ($new->getId() === $block->getId() && $new->getMeta() === $block->getMeta()) continue;//skip same blocks #$oldBlocks[] = API::setComponents($manager->getBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()),$block->x, $block->y, $block->z); $oldBlocksSingleClipboard->addEntry($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ(), BlockEntry::fromBlock($block)); $manager->setBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ(), $new); if ($manager->getBlockArrayAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()) !== [$block->getId(), $block->getMeta()]) { $changed++; } $i++; $progress = new Progress($i / $count, "Changed {$changed} blocks out of {$count}"); if (floor($progress->progress * 100) > floor($lastProgress->progress * 100)) { yield $progress; $lastProgress = $progress; } } } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/TaskAction.php ================================================ asVector3()->floor(); $this->clipboardVector = $clipboardVector; } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/TestAction.php ================================================ getShape()->getTotalCount(); $lastProgress = new Progress(0, ""); BlockFactory::getInstance(); foreach ($selection->getShape()->getBlocks($manager, []) as $block) { $changed++; $messages[] = $block->getPos()->asVector3()->__toString() . " " . $block->getName(); $progress = new Progress($changed / $count, "$changed/$count"); if (floor($progress->progress * 100) > floor($lastProgress->progress * 100)) { yield $progress; $lastProgress = $progress; } } } } ================================================ FILE: src/xenialdan/MagicWE2/task/action/ThawAction.php ================================================ getShape()->getTotalCount(); $lastProgress = new Progress(0, ""); $m = []; $e = false; $blockFilter = API::blockParser("snow_block,snow_layer,ice", $m, $e); $newBlocks = API::blockParser("air,air,water", $m, $e); foreach ($blockFilter as $ib => $blockF) { foreach ($selection->getShape()->getBlocks($manager, [$blockF]) as $block) { $new = clone $newBlocks[$ib]; #$oldBlocks[] = API::setComponents($manager->getBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ()),$block->x, $block->y, $block->z); $oldBlocksSingleClipboard->addEntry($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ(), BlockEntry::fromBlock($block)); $manager->setBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ(), $new); if ($manager->getBlockAt($block->getPos()->getFloorX(), $block->getPos()->getFloorY(), $block->getPos()->getFloorZ())->getId() !== $block->getId()) { $changed++; } $i++; $progress = new Progress($i / $count, "Changed {$changed} blocks out of {$count}"); if (floor($progress->progress * 100) > floor($lastProgress->progress * 100)) { yield $progress; $lastProgress = $progress; } } } } } ================================================ FILE: src/xenialdan/MagicWE2/tool/Brush.php ================================================ properties = $properties; } public function getName(): string { return $this->properties->getName(); } /** * @return Item * @throws ActionNotFoundException * @throws InvalidArgumentException * @throws ShapeNotFoundException * @throws JsonException * @throws TypeError */ public function toItem(): Item { /** @var Durable $item */ $item = ItemFactory::getInstance()->get(ItemIds::WOODEN_SHOVEL); $item->addEnchantment(new EnchantmentInstance(Loader::$ench)); $uuid = $this->properties->uuid ?? UUID::fromRandom()->toString(); $this->properties->uuid = $uuid; $properties = json_encode($this->properties, JSON_THROW_ON_ERROR); if (!is_string($properties)) throw new InvalidArgumentException("Brush properties could not be decoded"); $item->getNamedTag()->setTag(API::TAG_MAGIC_WE_BRUSH, CompoundTag::create() ->setString("id", $uuid) ->setInt("version", $this->properties->version) ->setString("properties", $properties) ); $item->setCustomName(Loader::PREFIX . TF::BOLD . TF::DARK_PURPLE . $this->getName()); $item->setLore($this->properties->generateLore()); $item->setUnbreakable(); return $item; } /** * @param bool $new true if creating new brush * @param array $errors * @return CustomForm * @throws Exception * @throws AssumptionFailedError */ public function getForm(bool $new = true, array $errors = []): CustomForm { try { $errors = array_map(static function ($value): string { return TF::EOL . TF::RED . $value; }, $errors); $brushProperties = $this->properties ?? new BrushProperties(); $form = new CustomForm("Brush settings"); // Shape #$form->addElement(new Label((isset($errors['shape']) ? TF::RED : "") . "Shape" . ($errors['shape'] ?? ""))); if ($new) { $dropdownShape = new Dropdown((isset($errors['shape']) ? TF::RED : "") . "Shape" . ($errors['shape'] ?? "")); foreach (Loader::getShapeRegistry()::getShapes() as $name => $class) { if ($name === ShapeRegistry::CUSTOM) continue; $dropdownShape->addOption($name, $class === $brushProperties->shape); } $form->addElement($dropdownShape); } else { $form->addElement(new Label($brushProperties->getShapeName())); } // Action $dropdownAction = new Dropdown("Action"); foreach (ActionRegistry::getActions() as $name => $class) { $dropdownAction->addOption($name, $class === $brushProperties->action); } $form->addElement($dropdownAction); // Name $form->addElement(new Input("Name", "Name", $new ? "" : $this->getName())); // Blocks $form->addElement(new Input((isset($errors['blocks']) ? TF::RED : "") . "Blocks" . ($errors['blocks'] ?? ""), "grass,stone:1", $brushProperties->blocks)); // Filter $form->addElement(new Input((isset($errors['filter']) ? TF::RED : "") . "Filter" . ($errors['filter'] ?? ""), "air", $brushProperties->filter)); // Biome $dropdownBiome = new Dropdown((isset($errors['biome']) ? TF::RED : "") . "Biome" . ($errors['biome'] ?? "")); foreach ((new ReflectionClass(BiomeIds::class))->getConstants() as $name => $value) { if ($value === BiomeIds::HELL) continue; $dropdownBiome->addOption(BiomeRegistry::getInstance()->getBiome($value)->getName(), $value === $brushProperties->biomeId); } $form->addElement($dropdownBiome); // Hollow $form->addElement(new Toggle("Hollow", $brushProperties->hollow)); // Extra properties if (!$new) { foreach ($this->getExtradataForm($brushProperties->shape)->getContent() as $element) { $form->addElement($element); } } // Function $form->setCallable(function (Player $player, $data) use ($form, $new) { #var_dump(__LINE__, $data); #$data = array_slice($data, 0, 7); [$shape, $action, $name, $blocks, $filter, $biome, $hollow] = $data; $extraData = []; #var_dump(__LINE__, array_slice($data, 7)); $base = ShapeRegistry::getDefaultShapeProperties(ShapeRegistry::getShape($shape)); foreach (array_slice($data, 7, null, true) as $i => $value) { #var_dump($i, $value, gettype($value), gettype($base[lcfirst($form->getElement($i)->getText())])); if (is_int($base[lcfirst($form->getElement($i)->getText())])) $value = (int)$value; $extraData[lcfirst($form->getElement($i)->getText())] = $value;//TODO } #var_dump(__LINE__, $extraData); //prepare data $blocks = trim(TF::clean($blocks)); $filter = trim(TF::clean($filter)); $biomeNames = (new ReflectionClass(BiomeIds::class))->getConstants(); $biomeNames = array_flip($biomeNames); unset($biomeNames[BiomeIds::HELL]); array_walk($biomeNames, static function (&$value, $key) { $value = BiomeRegistry::getInstance()->getBiome($key)->getName(); }); $biomeId = array_search($biome, $biomeNames, true); //error checks $error = []; try { $m = []; $e = false; API::blockParser($blocks, $m, $e); if ($e) throw new InvalidArgumentException(implode(TF::EOL, $m)); if (empty($blocks)) throw new AssumptionFailedError("Blocks cannot be empty!"); } catch (Exception $ex) { $error['blocks'] = $ex->getMessage(); } try { $m = []; $e = false; API::blockParser($filter, $m, $e); if ($e) throw new InvalidArgumentException(implode(TF::EOL, $m)); } catch (Exception $ex) { $error['filter'] = $ex->getMessage(); } try { $shape = Loader::getShapeRegistry()::getShape($shape); } catch (Exception $ex) { $error['shape'] = $ex->getMessage(); } try { $action = Loader::getActionRegistry()::getAction($action); } catch (Exception $ex) { $error['action'] = $ex->getMessage(); } try { if (!is_int($biomeId)) throw new AssumptionFailedError("Biome not found"); } catch (Exception $ex) { $error['biome'] = $ex->getMessage(); } //Set properties (called before resending, so form contains errors) if (!empty(trim(TF::clean($name)))) $this->properties->customName = $name; if (!isset($error['shape'])) { $this->properties->shape = $shape; if (!$new && !empty($extraData)) $this->properties->shapeProperties = $extraData; } if (!isset($error['action'])) $this->properties->action = $action; /*if (!isset($error['blocks']))*/ $this->properties->blocks = $blocks; /*if (!isset($error['filter']))*/ $this->properties->filter = $filter; $this->properties->hollow = $hollow; //Resend form upon error if (!empty($error)) { $player->sendForm($this->getForm($new, $error)); return; } //Debug #print_r($extraData); try { $brush = $this; $session = SessionHelper::getUserSession($player); if (!$session instanceof UserSession) { throw new SessionException(Loader::getInstance()->getLanguage()->translateString('error.nosession', [Loader::getInstance()->getName()])); } if (!$new) { $session->replaceBrush($brush); } else { $player->sendForm($this->getExtradataForm($this->properties->shape)); } } catch (Exception $ex) { $player->sendMessage($ex->getMessage()); Loader::getInstance()->getLogger()->logException($ex); } }); return $form; } catch (Exception $e) { throw new AssumptionFailedError("Could not create brush form"); } } private function getExtradataForm(string $shapeClass): CustomForm { $form = new CustomForm("Shape settings"); #foreach (($defaultReplaced = array_merge(ShapeRegistry::getDefaultShapeProperties($shapeClass), $this->properties->shapeProperties)) as $name => $value) { $base = ShapeRegistry::getDefaultShapeProperties($shapeClass); foreach (($defaultReplaced = array_replace($base, array_intersect_key($this->properties->shapeProperties, $base))) as $name => $value) { if (is_bool($value)) $form->addElement(new Toggle(ucfirst($name), $value)); else $form->addElement(new Input(ucfirst($name), $name . " (" . gettype($value) . ")", (string)$value)); } #var_dump($this->properties->shapeProperties); #var_dump('Base', $base); #var_dump('Default Replaced', $defaultReplaced); $form->setCallable(function (Player $player, $data) use ($defaultReplaced, $base) { //TODO validation, resending etc. $extraData = []; $names = array_keys($defaultReplaced); foreach ($data as $index => $value) { if (is_int($base[$names[$index]])) $value = (int)$value; $extraData[$names[$index]] = $value; } $this->properties->shapeProperties = $extraData; $brush = $this; $session = SessionHelper::getUserSession($player); if (!$session instanceof UserSession) { throw new SessionException(Loader::getInstance()->getLanguage()->translateString('error.nosession', [Loader::getInstance()->getName()])); } $this->properties->uuid = UUID::fromRandom()->toString(); $session->addBrush($brush); $player->getInventory()->addItem($brush->toItem()); }); return $form; } } ================================================ FILE: src/xenialdan/MagicWE2/tool/BrushProperties.php ================================================ json_encode, * which is a value of any type other than a resource. * @since 5.4.0 */ public function jsonSerialize() { return (array)$this; } /** * @param array $json * @return BrushProperties * @throws InvalidArgumentException */ public static function fromJson(array $json): BrushProperties { if (($json["version"] ?? 0) !== self::VERSION) throw new InvalidArgumentException("Version mismatch"); $properties = new self; foreach ($json as $key => $value) { $properties->$key = $value; } return $properties; } public function getName(): string { $str = ""; try { $str = trim(($this->hasCustomName() ? $this->customName : $this->getShapeName()) /*. " " . $this->action->getName() . */); } catch (ShapeNotFoundException $e) { } if (stripos(TF::clean($str), "brush") === false) { $str .= " Brush"; } return $str; } /** * @return string * @throws ShapeNotFoundException */ public function getShapeName(): string { return is_subclass_of($this->shape, Shape::class) ? ShapeRegistry::getShapeName($this->shape) : ""; } /** * @return string * @throws ActionNotFoundException */ public function getActionName(): string { return is_subclass_of($this->action, TaskAction::class) ? ActionRegistry::getActionName($this->action) : ""; } public function hasCustomName(): bool { return !empty($this->customName); } /** * @param string $customName If empty, the name will be reset */ public function setCustomName(string $customName = ""): void { $this->customName = $customName; } /** * @return array * @throws ActionNotFoundException * @throws ShapeNotFoundException * @noinspection NestedTernaryOperatorInspection */ public function generateLore(): array { $shapeProperties = array_map(static function ($k, $v): string { return TF::GOLD . " " . ucfirst($k) . " = " . (is_bool($v) ? ($v ? "Yes" : "No") : $v); }, array_keys($this->shapeProperties), $this->shapeProperties); $actionProperties = array_map(static function ($k, $v): string { return TF::GOLD . " " . ucfirst($k) . " = " . (is_bool($v) ? ($v ? "Yes" : "No") : $v); }, array_keys($this->actionProperties), $this->actionProperties); return array_merge( [ TF::GOLD . "Shape: {$this->getShapeName()}", ], $shapeProperties, [ TF::GOLD . "Action: {$this->getActionName()}", ], $actionProperties, [ TF::GOLD . "Blocks: {$this->blocks}", TF::GOLD . "Filter: {$this->filter}", TF::GOLD . "Biome: {$this->biomeId}", TF::GOLD . "Hollow: " . ($this->hollow ? "Yes" : "No"), //TF::GOLD . "UUID: {$this->uuid}", ] ); } } ================================================ FILE: src/xenialdan/MagicWE2/tool/Flood.php ================================================ limit = $limit; } /** * Returns the blocks by their actual position * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param Block[] $filterblocks If not empty, applying a filter on the block list * @param int $flags * @return Generator|Block[] * @throws Exception */ public function getBlocks($manager, array $filterblocks = [], int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); $this->y = $this->getCenter()->getFloorY(); $block = $manager->getBlockAt($this->getCenter()->getFloorX(), $this->getCenter()->getFloorY(), $this->getCenter()->getFloorZ()); //$block = API::setComponents($block,$this->getCenter()->getFloorX(), $this->getCenter()->getFloorY(), $this->getCenter()->getFloorZ()); $this->walked[] = $block; $this->nextToCheck = $this->walked; foreach ($this->walk($manager) as $block) { yield $block; } } /** * Returns a flat layer of all included x z positions in selection * @param World|AsyncChunkManager $manager The world or AsyncChunkManager * @param int $flags * @return Generator|Vector2[] * @throws Exception */ public function getLayer($manager, int $flags = API::FLAG_BASE): Generator { $this->validateChunkManager($manager); foreach ($this->getBlocks($manager, []) as $block) { yield new Vector2($block->getPos()->x, $block->getPos()->z); } } /** * @param World|AsyncChunkManager $manager * @return Block[] * @throws InvalidArgumentException * @noinspection SlowArrayOperationsInLoopInspection */ private function walk($manager): array { $this->validateChunkManager($manager); /** @var Block[] $walkTo */ $walkTo = []; foreach ($this->nextToCheck as $next) { $sides = iterator_to_array($this->getHorizontalSides($manager, $next->getPos())); $walkTo = array_merge($walkTo, array_filter($sides, function (Block $side) use ($walkTo) { return $side->getId() === 0 && !in_array($side, $walkTo, true) && !in_array($side, $this->walked, true) && !in_array($side, $this->nextToCheck, true) && $side->getPos()->distanceSquared($this->getCenter()) <= ($this->limit / M_PI); })); } $this->walked = array_merge($this->walked, $walkTo); $this->nextToCheck = $walkTo; if (!empty($this->nextToCheck)) $this->walk($manager); return $this->walked; } /** * @param World|AsyncChunkManager $manager * @param Vector3 $vector3 * @return Generator|Block[] * @throws InvalidArgumentException */ private function getHorizontalSides($manager, Vector3 $vector3): Generator { $this->validateChunkManager($manager); foreach ([Facing::NORTH, Facing::SOUTH, Facing::WEST, Facing::EAST] as $vSide) { $side = $vector3->getSide($vSide); if ($manager->getChunk($side->x >> 4, $side->z >> 4) === null) continue; //$block = API::setComponents($block,$side->x, $side->y, $side->z); yield $manager->getBlockAt($side->getFloorX(), $side->getFloorY(), $side->getFloorZ()); } } public function getTotalCount(): int { return $this->limit; } /** * @param World|AsyncChunkManager $chunkManager * @return array * @throws InvalidArgumentException */ public function getTouchedChunks($chunkManager): array { $this->validateChunkManager($chunkManager); $maxRadius = sqrt($this->limit / M_PI); $v2center = new Vector2($this->getCenter()->x, $this->getCenter()->z); $cv2center = new Vector2($this->getCenter()->x >> 4, $this->getCenter()->z >> 4); $maxX = ($v2center->x + $maxRadius) >> 4; $minX = ($v2center->x - $maxRadius) >> 4; $maxZ = ($v2center->y + $maxRadius) >> 4; $minZ = ($v2center->y - $maxRadius) >> 4; $cmaxRadius = $cv2center->distanceSquared($minX - 0.5, $minZ - 0.5); #print "from $minX:$minZ to $maxX:$maxZ" . PHP_EOL; $touchedChunks = []; for ($x = $minX - 1; $x <= $maxX + 1; $x++) { for ($z = $minZ - 1; $z <= $maxZ + 1; $z++) { if ($cv2center->distanceSquared($x, $z) > $cmaxRadius) continue; $chunk = $chunkManager->getChunk($x, $z); if ($chunk === null) { continue; } #print "Touched Chunk at: $x:$z" . PHP_EOL; $touchedChunks[World::chunkHash($x, $z)] = FastChunkSerializer::serialize($chunk); } } #print "Touched chunks count: " . count($touchedChunks) . PHP_EOL;; return $touchedChunks; } public function getName(): string { return "Flood Fill"; } /** * @param mixed $manager * @throws InvalidArgumentException */ public function validateChunkManager($manager): void { if (!$manager instanceof World && !$manager instanceof AsyncChunkManager) throw new InvalidArgumentException(get_class($manager) . " is not an instance of World or AsyncChunkManager"); } private function getCenter(): Vector3 { //UGLY HACK TO IGNORE ERRORS FOR NOW return new Vector3(0, 0, 0); } /** * Creates a chunk manager used for async editing * @param Chunk[] $chunks * @phpstan-param array $chunks * @return AsyncChunkManager */ public static function getChunkManager(array $chunks): AsyncChunkManager { $manager = new AsyncChunkManager(); foreach ($chunks as $hash => $chunk) { World::getXZ($hash, $x, $z); $manager->setChunk($x, $z, $chunk); } return $manager; } } ================================================ FILE: src/xenialdan/MagicWE2/tool/WETool.php ================================================