Compare commits

...

292 Commits

Author SHA1 Message Date
Michael Primm b434f09035 Band-aid up Forge 1.12.2 build 2024-04-29 15:06:37 -05:00
Michael Primm e21198d279 Back to SNAPSHOT 2024-04-28 15:30:36 -05:00
Michael Primm 1d6346b580 Handle tile entity lookup in 1.20.5 2024-04-28 14:01:07 -05:00
Michael Primm e086930133 Update README 2024-04-26 23:12:08 -05:00
Michael Primm 27526e64e5 Migrate to Gradle 8.7, JDK 21 compiler 2024-04-26 22:51:32 -05:00
Michael Primm 21369ec485 Migrate to Gradle 8.7 2024-04-26 22:50:43 -05:00
Michael Primm 120889b500 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2024-04-26 20:54:54 -05:00
Michael Primm 669c75322a Start 1.20.5 code 2024-04-26 20:54:41 -05:00
mikeprimm ea24554033
Merge pull request #4056 from JurgenKuyper/patch-2
Update DynmapBlockState.java
2024-01-23 09:26:06 -06:00
JurgenKuyper b9144e3609
Update DynmapBlockState.java
also hide nether_quartz_ore if hideores is true
2024-01-22 21:11:43 +01:00
Michael Primm 9878719337 Drop older 1.19 Forge and Fabric builds 2023-12-23 15:03:35 -06:00
Michael Primm 6746631758 Back to SNAPSHOT 2023-12-23 14:54:30 -06:00
Michael Primm 23cd60ba0a Switch to beta-4 2023-12-23 09:57:55 -06:00
Michael Primm 328954b256 Handle bogus gamma correction on new GRAY texturepack images 2023-12-22 11:08:10 -06:00
Michael Primm 574a400ada Back to SNAPSHOT 2023-12-15 00:16:37 -06:00
Michael Primm 84ee4cdf0c Prep for 3.7-beta-3 2023-12-14 22:49:51 -06:00
Michael Primm dea6a55acd Add Fabric 1.20.4 build 2023-12-14 22:47:56 -06:00
Michael Primm 87993219bb Add 1.20.3, 1.20.4 blocks 2023-12-14 22:19:53 -06:00
Michael Primm 7cdd90768e Fix S3 PR for 1.12 build 2023-12-12 22:13:44 -06:00
mikeprimm b0e56d3e5a
Merge pull request #4030 from ChimneySwift/generic-s3
Allow generic S3 endpoints for alternative services
2023-12-12 22:02:03 -06:00
Michael Primm 20700c21b8 Fix broken spectator/invisible PR on 1.12 2023-12-12 22:00:23 -06:00
Michael Primm 85885ced0e Add spigot-1.20.4 initial support 2023-12-12 21:22:38 -06:00
mikeprimm 06fbcb8d3d
Merge pull request #4036 from ApliNi/v3.0
Fix SQLite database size keeps increasing
2023-12-12 17:58:59 -06:00
mikeprimm b181607e5a
Merge pull request #4015 from JurgenKuyper/v3.0
implemented hide if spectator
2023-12-01 14:42:45 -06:00
mikeprimm bb1438b3c4
Merge pull request #4023 from Spongecade/patch-1
Update Minecraft wiki link to new domain
2023-12-01 11:43:12 -06:00
ChimneySwift 1ba6dd4683 Bundle xml.bind as this is used by s3-lite 2023-11-17 13:21:35 +10:00
ChimneySwift d16fdc8275 Add override_endpoint setting to configuration files 2023-11-16 22:07:28 +10:00
ChimneySwift 914fc5a10c Allow for custom S3 endpoints 2023-11-16 21:56:35 +10:00
ChimneySwift a669d75de0 Update s3-lite client to 0.0.2-SNAPSHOT version 2023-11-16 21:19:16 +10:00
Jurgen bc0117ac5a implemented hideifspectator switch, fully functional 2023-10-08 11:56:41 +02:00
Spongecade 298b31cdc8
Update Minecraft wiki link to new domain
The Minecraft Fandom wiki has been forked to a new domain: minecraft.wiki. Learn more here: https://minecraft.wiki/w/Minecraft_Wiki:Moving_from_Fandom. This PR updates the old wiki link accordingly.
2023-10-05 16:19:08 -05:00
ApliNi 5244e74d47 PRAGMA auto_vacuum = FULL; 2023-10-03 18:31:51 +08:00
JurgenKuyper 0d15ee5a46
Merge branch 'webbukkit:v3.0' into v3.0 2023-10-01 10:44:26 +02:00
Michael Primm ca80758605 Back to SNAPSHOT 2023-09-28 00:37:31 -05:00
Michael Primm 96554717f1 Switch to 3.7-beta-2 2023-09-27 22:06:10 -05:00
Michael Primm c807861859 Restrict /dmarker file imports to {dynmap-directory}/import 2023-09-27 21:35:40 -05:00
Michael Primm 65cca049ac Fix running on spigot/paper 1.20, 1.20.1 2023-09-27 16:35:44 -05:00
JurgenKuyper 0ba3c8008f
Merge pull request #1 from webbukkit/v3.0
align repo
2023-09-27 22:21:33 +02:00
Jurgen 030a0e1d24 implemented hideifspectator switch, still need to test fabric/forge 2023-09-27 22:22:00 +02:00
Michael Primm 79f354b111 Switch to SecureRandom for web auth token (avoid hugely unlikely
compromise during login register process...).
2023-09-27 12:25:14 -05:00
Michael Primm 92b9016c65 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2023-09-23 18:08:33 -05:00
Michael Primm e6a18f1029 Back to SNAPSHOT 2023-09-23 18:08:23 -05:00
mikeprimm ff87b9dd3e
Merge pull request #4017 from MuriloGhignatti/patch-1
Proper error catching (regarding Quilt)
2023-09-23 18:07:13 -05:00
Michael Primm 2d723afba1 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2023-09-23 17:03:43 -05:00
Michael Primm f5d2244450 Prep for 3.7-beta-1 release 2023-09-23 17:03:32 -05:00
mikeprimm e429a53d27
Update README.md 2023-09-23 13:08:32 -05:00
Michael Primm 169bb81ca7 Add Fabric 1.20.2 initial port 2023-09-23 13:03:21 -05:00
Michael Primm 91c4b23a0e Add forge 1.20.2 2023-09-21 21:31:24 -05:00
Michael Primm e2a5fc80d3 Add spigot 1.20.2 support 2023-09-21 20:13:15 -05:00
Michael Primm 736dd5a290 Add BufferedReader 2023-09-19 21:53:01 -05:00
Michael Primm 7905f76d51 Bump to 3.7-beta-q 2023-09-18 12:55:07 -05:00
Murilo Henrique Ghignatti b97d5045b6
Proper error catching (regarding Quilt)
When the mod is loaded by quilt and you try to get the path using this method an IllegalArgumentException is thrown, I think that quilt is not loading the mod as a file so this is why you are getting this error.
2023-09-13 21:53:17 -03:00
Michael Primm 85012ae478 Add buffered stream to texture reading 2023-09-10 14:49:22 -05:00
Michael Primm d1408b7bfd Adds I/O stream buffering 2023-09-10 10:56:40 -05:00
Jurgen c093a95bc0 implemented hide if spectator 2023-09-03 12:37:58 +02:00
Michael Primm 7ed6728e34 Avoid pan to 0,0 when followed player is not visible 2023-09-02 21:11:47 -05:00
Michael Primm eed1a2b444 Make readonly survive saving (dmap commands) 2023-08-30 10:59:46 -05:00
mikeprimm b8b1e8bd4e
Merge pull request #4007 from Jameskmonger/read-only-map-option
feat: add `readonly` map option
2023-08-30 09:25:06 -05:00
Michael Primm ae164f2993 Restore normal version of chunk handler 2023-08-29 21:49:12 -05:00
mikeprimm ebb9dc00d0
Merge pull request #4011 from stormboomer/Stormboomer-Performance-MySQL-Storage
Drasticly improve zoom tile calculation for larger maps when using MySQL/MariaDB storage Engine
2023-08-29 18:32:58 -05:00
mikeprimm 31d1b400f0
Merge pull request #3990 from Thorinwasher/v3.0
Disable the plugin if on the wrong platform
2023-08-29 13:14:01 -05:00
mikeprimm 105e3887a0
Merge pull request #4005 from JurgenKuyper/v3.0
Update dynmap_style.css
2023-08-29 13:13:20 -05:00
stormboomer 0120c135c4 Added JDK 8 version compatiblity for DynmapCoreAPI.
It seems that this is missing from latest release and causes incompatiblity with older versions. This should resolve this
2023-08-29 20:07:22 +02:00
stormboomer b8166a9122 Remove thread safety implementation for java 17, since it seems to not be needed anymore and improves render time by 8-10% 2023-08-29 13:23:54 +02:00
stormboomer 247e81bc61 Drasticly improve zoom tile calculation for larger maps when using MySQL storage engine. For Larger Tables doing Limit and Offset can have a big Impact on Statement execution because it is an IO heavy task.
This fixes the issue by not doing any limit / offset on the SQL statement but instead query for all the data at once, and let the JDBC handler do the resultset handling.
This can probably be adapted for MSSQL, PostgreSQL and SQLLite.
2023-08-28 08:03:43 +02:00
James Monger fe49d37fa9 feat: update template worlds.txt 2023-08-23 07:21:34 +01:00
James Monger 20592cd805 feat: add `readonly` map option
This option will prevent the map from being updated by the renderer. It can be used if you want a "natural" map, i.e. you want to generate a map and preserve it without being updated with users buildings.
2023-08-23 07:19:03 +01:00
Michael Primm b310a57b64 Shift old spigot/paper support to dynamic load to handle pedantic Paper
loader
2023-08-20 14:38:38 -05:00
JurgenKuyper 6b3e18c351
Update dynmap_style.css
patched issue where the chatbar would drop if login or customlink was enabled, but now the custom link and login overlap if they are set to be in the same area, I don't have enough frontend-knowledge to fix this sadly.
2023-08-18 19:47:13 +02:00
Michael Primm 105d4f1b62 Update bstats library 2023-07-17 18:33:26 -05:00
Thorinwasher 2503dbfdbb Update DynmapPlugin.java 2023-07-10 11:45:27 +02:00
Michael Primm 87d8c73941 Switch to 3.7-SNAPSHOT 2023-07-08 20:09:57 -05:00
Michael Primm cee25bc518 Add workaround for PaperMC's broken Ban API 2023-07-08 15:11:02 -05:00
Michael Primm 3715b114e9 Switch to 3.6 GA release candidate 2023-07-08 13:19:00 -05:00
Michael Primm 881b83b7f1 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2023-06-26 22:18:09 -05:00
Michael Primm 7f6dc1d52c Back to SNAPSHOT 2023-06-26 22:17:42 -05:00
mikeprimm 38ccb50d6a
Merge pull request #3978 from lewismoten/fix-template-spelling
Fix spelling of template
2023-06-21 00:18:11 -05:00
Lewie fa36d3fa38
Fix spelling of template 2023-06-21 00:11:29 -04:00
mikeprimm 983fda35b4
Update README.md 2023-06-20 22:38:58 -05:00
Michael Primm 4e7dcb2cfb Prep for beta-2 2023-06-20 22:32:49 -05:00
Michael Primm e0c02b1fc0 Fix spigot jar shading 2023-06-20 21:06:10 -05:00
Michael Primm b2f04ce112 Back to SNAPSHOT 2023-06-13 21:25:04 -05:00
Michael Primm 57093caa5f Bump to 3.6-beta-1 for release 2023-06-13 14:03:12 -05:00
mikeprimm 551b3adda7
Merge pull request #3974 from kosmolot-mods/fabric-1.20.1
fabric-1.20: mark as compatible with 1.20.1
2023-06-13 09:54:20 -05:00
Kosma Moczek f249ce60b5 fabric-1.20: mark as compatible with 1.20.1 2023-06-12 22:54:36 +02:00
Michael Primm 2f742734d0 Add missing 1.20 blocks 2023-06-10 00:17:07 -04:00
Michael Primm dd81ea2d87 More gradle updates 2023-06-09 23:42:40 -04:00
Michael Primm 126d8e5d05 Avoid jar bloat during shadow building 2023-06-09 03:47:31 -04:00
Michael Primm 6863243d49 More spigot 1.20 updates 2023-06-09 02:49:17 -04:00
Michael Primm 43a86b820c Initial Spigot/Paper 1.20 support 2023-06-09 02:05:17 -04:00
Michael Primm 130953bc12 Make fabric, forge consistent on block type logic 2023-06-08 16:00:47 -05:00
Michael Primm 2d835eaeec Forge 1.20 - start Spigot 1.20 2023-06-08 15:53:11 -05:00
mikeprimm 5aeca48e2b
Merge pull request #3970 from kosmolot-mods/fabric-1.20
Fabric 1.20
2023-06-08 14:32:35 -05:00
Kosma Moczek 427bd6d0ef fabric-1.20: update to 1.20 release 2023-06-08 17:06:16 +02:00
Kosma Moczek 05b751a60e fabric-1.20: update code to 1.20 2023-05-23 01:31:23 +02:00
Kosma Moczek 1450a57aba fabric-1.20: update Fabric to 1.20-pre4 2023-05-23 01:31:23 +02:00
Kosma Moczek 0ee1b6001a fabric-1.20: add to settings.gradle 2023-05-23 01:31:23 +02:00
Kosma Moczek 1d94af6a11 fabric-1.20: fixup package name 2023-05-23 01:31:23 +02:00
Kosma Moczek 8f10ece108 fabric-1.20: copy from fabric-1.19.4 2023-05-22 23:38:46 +02:00
Michael Primm 2456c36649 Update java version 2023-05-10 08:52:53 -05:00
Michael Primm 7bcce9c7e0 Fix cache poisoning on initial tiles on view 2023-05-09 20:47:23 -05:00
Michael Primm 3f2d9dd5df project file updates 2023-05-09 18:30:50 -05:00
Michael Primm 7218e56e5b Get './gradlew eclipse' working again 2023-05-09 18:29:43 -05:00
Michael Primm 4e61fa6b22 Use read API (avoid fixers running) 2023-05-09 14:24:15 -05:00
Michael Primm d1b95c9ae0 Update for 1.19.4 spigot change 2023-05-02 23:30:16 -05:00
Michael Primm 1ccffb7693 3.6-SNAPSHOT 2023-04-29 20:55:22 -05:00
Michael Primm 5bcfe052a5 Prep for 3.5 GA 2023-04-29 16:26:27 -05:00
Michael Primm 8b1b26c570 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2023-04-16 23:53:59 -05:00
Michael Primm 022a031829 Fix >8 bit palette handling 2023-04-16 23:53:45 -05:00
mikeprimm 9c0a1e45fc
Update index.html
Fix iOS viewing
2023-04-11 08:51:08 -05:00
mikeprimm 3b970c7119
Merge pull request #3951 from shaijana/v3.0
Fixed color of cherry-leaves
2023-04-11 08:50:06 -05:00
Shaijana 436dfa22a0 Fixed color of cherry-leaves 2023-03-28 00:34:30 +02:00
Michael Primm bcd4ed617a Missed checkin 2023-03-23 22:28:18 -05:00
Michael Primm ab900740b7 Rework cave shader - make default proportional for variable world height 2023-03-23 13:27:33 -05:00
Michael Primm 76649c6250 Add map data versions for 1.19.2, 1.19.3, 1.19.4 2023-03-21 18:55:29 -05:00
Michael Primm 89d06d158d Back to SNAPSHOT 2023-03-19 00:37:19 -05:00
Michael Primm 2c32cbc0d5 Finish 1.20 preview blocks 2023-03-18 19:52:09 -05:00
Michael Primm cc9f6f0bc4 Add cherry signs 2023-03-18 19:11:32 -05:00
Michael Primm 8dd9e6eb5a Add upcoming cherry wood blocks 2023-03-18 15:06:52 -05:00
Michael Primm ea21f4c4df Add chiseled_bookshelf 2023-03-18 14:44:59 -05:00
Michael Primm 485aec3c1c Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2023-03-18 13:22:08 -05:00
Michael Primm 0f0d4f2ce9 Update block textures 2023-03-18 13:21:50 -05:00
mikeprimm 83d9247f78
Update to beta-3 2023-03-18 11:38:42 -05:00
mikeprimm bfd43d678c
Switch to beta-3 2023-03-18 11:38:08 -05:00
Michael Primm 9a02868534 Update Forge 1.19.3 to also work with Forge 1.19.4 2023-03-16 17:46:18 -05:00
Michael Primm f25d17d3ce Turn fabric 1.19.4 back on 2023-03-16 16:03:57 -05:00
mikeprimm 4a0225bf83
Merge pull request #3946 from kosma/fabric-1.19.4-fix
fabric: fix build issues with 1.19.4 port
2023-03-16 09:44:09 -05:00
Kosma Moczek 7af46a04a6 fabric: fix build issues with 1.19.4 port 2023-03-16 14:20:38 +01:00
Michael Primm 2fd5db2835 Build without fabric 1.19.4 (debug later) 2023-03-16 01:28:30 -05:00
Michael Primm caef8f433e Initial Spigot/Paper 1.19.4 2023-03-16 00:55:32 -05:00
mikeprimm a52ea70b27
Merge pull request #3945 from kosma/fabric-1.19.4
Fabric 1.19.4
2023-03-15 21:05:31 -05:00
Kosma Moczek b4c4b21a04 fabric-1.19.4: adapt for 1.19.4 changes 2023-03-14 22:35:35 +01:00
Kosma Moczek 3bb74d41c2 fabric-1.19.4: update dependencies to 1.19.4 2023-03-14 21:14:14 +01:00
Kosma Moczek ff5f829f16 fabric-1.19.4: remap to yarn 1.19.4+build.1 2023-03-14 21:14:14 +01:00
Kosma Moczek eee5565f86 fabric-1.19.4: add to settings.gradle 2023-03-14 21:14:14 +01:00
Kosma Moczek d85be30e43 fabric-1.19.4: rename 1.19.3 -> 1.19.4 2023-03-14 21:14:14 +01:00
Kosma Moczek 098081f2f3 fabric-1.19.4: copy from fabric-1.19.3 2023-03-14 21:00:03 +01:00
mikeprimm bb0e9dada7
Merge pull request #3934 from Max-42/patch-1
Add comment in configuration.txt
2023-02-27 06:02:04 -06:00
mikeprimm fd2e4ba8c8
Merge pull request #3932 from JurgenKuyper/CaveGradients
implemented user configurable start and stop of cave render
2023-02-27 06:01:35 -06:00
mikeprimm c508711f1c
Merge pull request #3933 from shaijana/v3.0
Added some textures of 1.19.3
2023-02-27 06:00:31 -06:00
Max 52829462e9
fix typo 2023-02-18 22:40:13 +01:00
Max 1a261c6422
add a comment to prevent issues like this: https://github.com/webbukkit/dynmap/issues/2968#issuecomment-652205096 2023-02-16 10:28:44 +01:00
Shaijana bf8a8d9b45 Added some textures of 1.19.3
(Hanging Signs and chiseled bookshelfs are still missing)
2023-02-14 20:47:42 +01:00
Jurgen cc88883dc1 fixed imports, thanks intellij 2023-02-08 19:58:47 +01:00
Jurgen 7b82a9182e implemented user configurable start and stop of cave render 2023-02-08 19:43:20 +01:00
Michael Primm 4efc418691 Back to 3.5-SNAPSHOT 2023-01-29 17:31:17 -06:00
Michael Primm f773175a7b Switch to 3.5-beta-2 2023-01-28 14:56:07 -06:00
mikeprimm dbfcfe03d4
Merge pull request #3906 from jonasbn/spellcheck_gha_update
Update of spellcheck GitHub Action to version 0.29.0
2023-01-25 09:11:45 -06:00
mikeprimm 322c370bbc
Merge pull request #3915 from JurgenKuyper/JarInJarFix
implemented catch to prevent server crash when jar in jar methods are used
2023-01-25 09:10:56 -06:00
mikeprimm 6fd70b65fe
Merge pull request #3910 from JOO200/fix/skinsrestorercompile
Don't use reflections to access SkinsRestorer API
2023-01-25 09:09:25 -06:00
mikeprimm 202625ac23
Merge pull request #3917 from JurgenKuyper/fix_spaces_standalone_markers
Update markers.js
2023-01-25 09:00:32 -06:00
JurgenKuyper 8f62d8e57e
Update markers.js
fixed issue with standalone webserver and spaces in world name, double urlencode changed %20 to %2520 which didn't resolve to the proper address
2023-01-17 14:56:45 +01:00
Jurgen d681f05eeb implemented catch to prevent server crash when jar in jar methods are used 2023-01-12 16:07:17 +01:00
Joo200 ae9e144774 Don't use reflections to access SkinsRestorer API 2023-01-04 15:22:16 +01:00
jonasbn af930cd9d4 Bumped spellcheck version to latest release from version 0.20.0 which is EOL 2022-12-29 12:44:07 +01:00
Michael Primm a6548ec0b7 Drop Fabric and Forge 1.18 builds (just stick with 1.18.2) 2022-12-12 00:45:14 -06:00
Michael Primm 5ddcf1794e Back to SNAPSHOT 2022-12-12 00:40:34 -06:00
Michael Primm 9f9d12a580 Prevent rare shutdown exception 2022-12-11 21:10:52 -06:00
Michael Primm fe100abb51 Prep v3.5-beta-1 release candidate 2022-12-11 17:35:11 -06:00
Michael Primm edf6e256e1 Switch sanitizeHTML to marker load/create/update 2022-12-11 15:44:48 -06:00
Michael Primm 814068cf53 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2022-12-11 15:44:11 -06:00
Michael Primm 287d900047 Shift from Twitter to Mastodon 2022-12-11 15:43:57 -06:00
mikeprimm bc7ecb4f23
Merge pull request #3892 from JOO200/fix/buildfiles
Delete build files in wrong directory
2022-12-11 12:23:54 -06:00
Joo200 0122561150 Delete build files in wrong directory 2022-12-11 18:10:30 +01:00
mikeprimm e168e87bba
Merge pull request #3891 from mastermc05/fabric-1.19.3-colorful-biomes
Add the forgotten colorful biomes to 1.19.3
2022-12-10 14:57:11 -06:00
mastermc05 fe4ff57279 Add the forgotten colorful biomes to 1.19.3 2022-12-10 20:24:34 +02:00
Michael Primm 8af0ad8b8c Add forge 1.19.3 2022-12-08 20:07:05 -06:00
mikeprimm 9e58477f3d
Merge pull request #3888 from kosma/fabric-1.19.3
Fabric 1.19.3
2022-12-08 16:13:24 -06:00
Kosma Moczek 7dee2150b6 fabric-1.19.3: update to full release 2022-12-08 22:36:45 +01:00
Kosma Moczek 7a5440f32e fabric-1.19.3: fix compilation errors 2022-12-08 22:14:09 +01:00
Kosma Moczek c1fcfd15b6 fabric-1.19.3: migrateMappings to 1.19.3-pre2+build.6 2022-12-08 22:14:09 +01:00
Kosma Moczek 743c6ee946 fabric-1.19.3: add as Gradle subproject 2022-12-08 22:14:09 +01:00
Kosma Moczek 68a379cdd2 fabric-1.19.3: update to Loom 1.0-SNAPSHOT 2022-12-08 22:14:09 +01:00
Kosma Moczek 5795ebeac6 fabric-1.19.3: rename package references 2022-12-08 22:14:09 +01:00
Kosma Moczek 0f6c2520ff fabric-1.19.3: rename package folder 2022-12-08 22:14:09 +01:00
Kosma Moczek 2ed13761c4 fabric-1.19.3: copy from fabric-1.19.1 2022-12-08 22:14:09 +01:00
Michael Primm eca305c519 Add initial 1.19.3 for Spigot/PaperMC support 2022-12-08 13:45:18 -06:00
mikeprimm d048aad743
Merge pull request #3857 from Warriorrrr/feature/stringify-async
Stringify json for json file client async
2022-11-29 15:43:31 -06:00
mikeprimm e0cbd1fe8e
Merge pull request #3867 from surfrock66/dynamicfavicon
Add better favicon and code for progressive web apps, to improve shortcuts and icons.
2022-11-29 15:41:33 -06:00
mikeprimm e15f3f8460
Merge pull request #3844 from gmfamily/v3.0
fix(chnk visibility) Use long to avoid int overflow
2022-11-29 15:39:40 -06:00
mikeprimm 26fa3a24c5
Merge pull request #3861 from mastermc05/chunks
Update used paper chunk api
2022-11-29 15:37:59 -06:00
mikeprimm 7d1a273e6d
Merge pull request #3862 from mastermc05/colorful-biomes
Colorful biomes
2022-11-29 15:37:42 -06:00
mikeprimm 9f16074a75
Merge pull request #3863 from mastermc05/fix-colors
Fix colours
2022-11-29 15:36:46 -06:00
mikeprimm 9a8ef557af
Merge pull request #3866 from IMBArator/fix_locale_issue_ModelBlockModelImpl.getLine
fix locale issue in ModelBlockModelImpl getLine (closes:  #3854)
2022-11-29 15:35:49 -06:00
mikeprimm 7f71e7ef9b
Merge pull request #3869 from Captain-Chaos/v3.0
Typo in log message
2022-11-29 15:34:56 -06:00
mastermc05 a5e7ae1013 Fabric 1.16.5: Use BiomeEffectsAccessor to get foliage color 2022-11-18 14:53:24 +02:00
mastermc05 e3911b0d3b Add biome to cache 2022-11-18 13:44:59 +02:00
mastermc05 adc9e273ca Forge 1.16.5 2022-11-18 13:38:14 +02:00
mastermc05 4fdb04725d Forge 1.17.1 2022-11-18 13:32:35 +02:00
mastermc05 d434b33cfb Forge 1.18 2022-11-18 13:32:07 +02:00
mastermc05 1f352e0b11 Forge 1.18.2 2022-11-18 13:31:38 +02:00
mastermc05 ed9fb8614d Forge 1.19 2022-11-18 13:31:11 +02:00
mastermc05 9060c8f32b Forge 1.19.2 2022-11-18 13:30:13 +02:00
mastermc05 a6ead1bc3d Fabric 1.16.4 (1.16.5) 2022-11-18 13:27:07 +02:00
mastermc05 6245a18381 Fabric 1.17.1 2022-11-18 13:18:19 +02:00
mastermc05 0043a1e4fb Fabric 1.18.2 2022-11-18 13:17:21 +02:00
mastermc05 ec3c0e998b Fabric 1.19.1 2022-11-18 13:16:51 +02:00
mastermc05 c643430225 Fabric 1.18 2022-11-18 13:16:29 +02:00
mastermc05 64407e3ce1 Fabric 1.19 2022-11-18 13:16:02 +02:00
mastermc05 0f8174796c Cache biome object, further reduce diff 2022-11-18 13:12:40 +02:00
Captain Chaos 53b3b7c08b Typo in log message 2022-11-11 12:14:27 +01:00
Joseph Gullo ce54de0cd7 Using the icon for dynmap pulled from the patreon/discord, updated the favicon and related files to produce a more refined Progressive Web App which looks better as a bookmark on mobile operating systems. 2022-10-25 13:11:52 -07:00
mastermc05 0ebbc2bbe5 Support for 1.16.5 2022-10-22 14:24:49 +03:00
mastermc05 a40592021f Fix colours 2022-10-15 12:07:07 +03:00
mastermc05 053df84196 Clean up 2022-10-14 16:14:40 +03:00
mastermc05 97a82a3d1b Support 1.17 2022-10-14 16:06:15 +03:00
mastermc05 f34929c6cf Support 1.18 2022-10-14 15:59:20 +03:00
mastermc05 5f29846645 Support 1.18.2 2022-10-14 15:51:08 +03:00
mastermc05 8a8e2ecfcf Abstract for easier multiversion support, reduce diff 2022-10-14 15:37:36 +03:00
mastermc05 1f1a342777 1.19 support 2022-10-14 12:57:23 +03:00
mastermc05 59f44f7425
Change checked class 2022-10-13 21:08:22 +03:00
mastermc05 39adaeca56 Update used paper api 2022-10-10 19:56:37 +03:00
Warrior 8ce85322dd Stringify json for json file client async 2022-10-01 20:39:46 +02:00
Maximilian Zettler a70530edc8 fix locale issue in ModelBlockModelImpl getLine (closes: #3854)
add Locale.US to String.format() where float values are used
2022-09-29 21:02:18 +02:00
gmfamily 61bfe66430
fix(chnk visibility) Use long to avoid int overflow
Use long representation of the distance between tested chunk and center of tested limit to avoid int overflow while computing the distance compared to limit radius using square delta value
2022-08-31 19:35:18 +02:00
mikeprimm 66fe5d4a8b
Merge pull request #3833 from JurgenKuyper/v3.0
added switch on publicURL in webregister message
2022-08-29 08:29:37 -05:00
mikeprimm 5aaff7cea9
Merge pull request #3836 from JurgenKuyper/templateNotification
added notification on probable misconfiguration of deftemplatesuffix
2022-08-29 08:28:53 -05:00
mikeprimm 686d61c463
Merge pull request #3832 from kosma/dark-forest
Fix dark forest grass color
2022-08-29 08:27:30 -05:00
Jurgen d25040e1cf added notification on probable misconfiguration of deftemplatesuffix 2022-08-21 19:32:59 +02:00
Jurgen adfe0471e3 added switch on publicURL in webregister message 2022-08-19 12:29:14 +02:00
Kosma Moczek e32b8d0f77 BiomeMap: use hardcoded grass color in Dark Forest 2022-08-19 00:24:17 +02:00
mikeprimm 5d867239b2
Merge pull request #3826 from FedUpWith-Tech/v3.0
Fix bad readme links
2022-08-15 09:35:44 -05:00
FedUpWith-Tech aa4d50503e
Fix bad readme links 2022-08-15 09:29:15 -04:00
Mike Primm f96b4d2900 Drop 1.19.0, 1.18.0 for Forge and Fabric from builds 2022-08-14 16:02:47 -05:00
Mike Primm 2a10499325 Switch to v3.5-SNAPSHOT 2022-08-14 16:01:32 -05:00
Mike Primm a6b56dc36e Handle error loading texture pack image without aborting texture pack
load
2022-08-14 12:46:43 -05:00
Mike Primm 0445814ef5 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2022-08-14 00:37:29 -05:00
Mike Primm 4cd915e1ab Switch to 3.4 for release 2022-08-14 00:37:14 -05:00
mikeprimm 171b7c9e54
Merge pull request #3814 from Michele0303/v3.0
multiple cross-site scripting reflected fixed
2022-08-13 23:13:58 -05:00
mikeprimm 7ddecaa566
Merge pull request #3821 from stepech/bump-versions
Bump minimum spigot version, improve armor points counting
2022-08-13 23:12:28 -05:00
mikeprimm a2c1941585
Merge pull request #3820 from mastermc05/v3.0
Try to fix rendering at shutdown
2022-08-13 23:11:23 -05:00
mikeprimm b9e57e4e33
Merge pull request #3823 from kosma/fabric/version-lock
fabric: version-lock fabric.mod.json
2022-08-13 23:10:10 -05:00
Kosma Moczek 058599be77 fabric: version-lock fabric.mod.json
This is intended to reduce user errors where e.g. someone uses the
1.19 jar on 1.19.2. Previously this would lead to unspecific mixin
errors; with this change, a helpful message is shown:

Mod 'Dynmap' (dynmap) 3.4-SNAPSHOT requires version 1.19 of 'Minecraft' (minecraft), but only the wrong version is present: 1.19.2!
2022-08-11 20:13:22 +02:00
mastermc05 36924b4942 Clear scary stacktraces 2022-08-11 11:36:27 +03:00
stepech 0eb2dffac2
Update minimum spigot api, improve armor points counting 2022-08-08 22:40:27 +02:00
Michele e2da0efd8e
Merge branch 'webbukkit:v3.0' into v3.0 2022-08-08 11:26:06 +02:00
mastermc05 36ea4c3938 Merge branch 'v3.0' of https://github.com/mastermc05/dynmap into v3.0 2022-08-08 11:00:35 +03:00
mastermc05 d0e9b66d4a Try to fix https://github.com/webbukkit/dynmap/issues/3819 2022-08-08 11:00:32 +03:00
Mike Primm f89777a0dd Set to SNAPSHOT 2022-08-07 23:53:31 -05:00
Mike Primm 0ab9c9e47b Recycle JDBC connections idle for more than 60 seconds 2022-08-07 23:48:47 -05:00
Mike Primm 3b0814e853 Adjust biome mapping to handle pathological biome counts per segment 2022-08-06 17:48:27 -05:00
Mike Primm 46bd040981 Add Forge 1.19.2 build 2022-08-06 13:10:06 -05:00
Michele0303 8909fea4b1 multiple cross-site scripting reflected fixed 2022-08-02 19:55:09 +02:00
Michele0303 b5ac020a56 Update MySQL_markers.php
cross-site scripting reflected fixed
2022-08-02 19:32:21 +02:00
Mike Primm 7570cf5994 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2022-07-31 12:52:22 -05:00
Mike Primm 85f09b9c2f Prep for 3.4 release 2022-07-31 12:52:09 -05:00
mikeprimm fe97e28401
Merge pull request #3811 from JustZhenya/patch-1
Fix writing non-ascii files to postgresql database
2022-07-31 12:10:48 -05:00
Евгений 43c1159fae
Fix writing non-ascii files to postgresql database
This fixes non-ascii chat messages (for example cyrillic utf8) in PostgreSQL_sendmessage.php

Before fix PostgreSQL_sendmessage.php was returning this:

Fatal error:  Uncaught PDOException: SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input syntax for type bytea in /opt/minecraft/plugins/dynmap/web/standalone/PostgreSQL_funcs.php:81
Stack trace:
#0 /opt/minecraft/plugins/dynmap/web/standalone/PostgreSQL_funcs.php(81): PDOStatement->execute()
#1 /opt/minecraft/plugins/dynmap/web/standalone/PostgreSQL_funcs.php(99): updateStandaloneFileByServerId()
#2 /opt/minecraft/plugins/dynmap/web/standalone/PostgreSQL_sendmessage.php(60): updateStandaloneFile()
#3 {main}
thrown in /opt/minecraft/plugins/dynmap/web/standalone/PostgreSQL_funcs.php on line 81
2022-07-31 17:06:13 +03:00
Mike Primm b331cfaf27 Fix exception in processEnumMapTiles for Postgres 2022-07-30 21:13:59 -05:00
Mike Primm dc66d12916 Handle null image in MySQL 2022-07-30 18:49:55 -05:00
Mike Primm 082878aade Handle null images 2022-07-30 18:04:28 -05:00
Mike Primm bf8d5eb6cf Fix LIMIT OFFSET order sensitivity (MySQL is kind of dumb...) 2022-07-29 23:10:27 -05:00
mikeprimm 7dabbab8c9
Merge pull request #3809 from kosma/fabric-1.19.1
Fabric 1.19.1
2022-07-29 20:45:11 -05:00
Kosma Moczek e943a26a5b fabric-1.19.1: fix mixins for 1.19.1 2022-07-30 00:30:10 +02:00
Kosma Moczek 1de1c7ce69 fabric-1.19.1: update Minecraft/Fabric version 2022-07-30 00:30:10 +02:00
Kosma Moczek 682ed12c69 fabric-1.19.1: add to settings.gradle 2022-07-30 00:02:27 +02:00
Kosma Moczek dc0296f845 fabric-1.19.1: s/1.19/1.19.1/g 2022-07-29 23:58:21 +02:00
Kosma Moczek 9cd7a3489a fabric-1.19.1: rename fabric_1_19 -> fabric_1_19_1 2022-07-29 23:55:55 +02:00
Kosma Moczek 4ec0d5af37 fabric-1.19.1: copy from fabric-1.19 2022-07-29 23:53:11 +02:00
Mike Primm 47f5779e6f Back to SNAPSHOT 2022-07-26 17:44:10 -05:00
Mike Primm 937ab7cee7 Finish fix 2022-07-24 17:54:09 -05:00
Mike Primm a71348c3c8 Add cooment for https://minecraft.fandom.com/wiki/Data_version 2022-07-24 17:52:00 -05:00
Mike Primm 9648457727 Update chunk version color map 2022-07-24 17:50:33 -05:00
Mike Primm e0619ec650 Add ClientWorld hack 2022-07-24 17:24:19 -05:00
Mike Primm 8e27d5defd Handle AOOBX (not sure why yet) 2022-07-24 17:06:28 -05:00
Mike Primm d88ebb0d20 More resume fixes 2022-07-24 15:32:16 -05:00
Mike Primm e13a515baf More SQLite fixes for scan 2022-07-24 15:11:05 -05:00
Mike Primm 8beba92f8e Fix offset/limit on enums 2022-07-24 14:56:25 -05:00
Mike Primm c80f7adb23 Use limit on enum tiles (for cleaner behavior on purge for large maps) 2022-07-24 13:52:49 -05:00
Mike Primm ab54919956 Add more orderly storage shutdown 2022-07-24 13:09:52 -05:00
Mike Primm e68f628131 Merge branch 'v3.0' of git@github-home:webbukkit/dynmap.git into v3.0 2022-07-22 21:51:51 -05:00
Mike Primm 00a0d3ed37 Set to SNAPSHOT 2022-07-22 21:51:22 -05:00
mikeprimm fc678a056f
Merge pull request #3782 from PssbleTrngle/v3.0
add support for fabric permissions & LuckPerms
2022-07-22 20:59:47 -05:00
mikeprimm 2d6bcbbca2
Merge pull request #3783 from JurgenKuyper/v3.0
updated deprecated interfaces where possible
2022-07-22 20:59:02 -05:00
mikeprimm c248ce3275
Merge pull request #3784 from JurgenKuyper/brick_fix
Mud Brick fix in texture_1.txt
2022-07-22 20:56:51 -05:00
mikeprimm 8f70d5fc3c
Merge pull request #3794 from mastermc05/v3.0
Fix and improve async chunk load
2022-07-22 20:56:24 -05:00
mikeprimm 4d34510c8b
Merge pull request #3797 from reitermarkus/patch-1
Fix broken tiles caused by implicit cast on PHP 8.
2022-07-22 20:54:45 -05:00
mastermc05 075b27a2c4
Merge branch 'webbukkit:v3.0' into v3.0 2022-07-18 17:39:40 +03:00
Mike Primm 425c870895 Update Forge 1.19 to 41.0.100, handle breaking changes by Forge updates 2022-07-17 18:25:42 -05:00
Markus Reiter 8e02c21a36
Fix implicit cast. 2022-07-15 03:30:26 +02:00
Markus Reiter ca5d2f4990
Fix implicit cast. 2022-07-15 03:29:16 +02:00
mastermc05 b933f6b21c Readd fix to copied code 2022-07-07 16:21:22 +03:00
mastermc05 17e60cff40 fix 1.19 2022-07-07 15:34:16 +03:00
mastermc05 8d8a4d088e fix 1.18.2 2022-07-07 15:26:23 +03:00
JurgenKuyper dd789b3a41
Merge branch 'v3.0' into brick_fix 2022-06-21 21:58:36 +02:00
Jurgen a8af8037cb fixed mud_bricks sides so it is no longer transparent. thanks BlargCraft on Reddit. 2022-06-21 19:58:17 +02:00
JurgenKuyper d93a014c99
Merge branch 'webbukkit:v3.0' into v3.0 2022-06-21 13:59:54 +02:00
PssbleTrngle 3b1cbdca09 usercache filename 2022-06-21 12:07:48 +02:00
PssbleTrngle c25945ea13 add missing import 2022-06-21 12:06:26 +02:00
PssbleTrngle 9f865fa5bd fix imports 2022-06-21 11:51:08 +02:00
PssbleTrngle 53f048ac86 add fabric-permissions & luckperms provider 2022-06-21 11:44:17 +02:00
Jurgen b3169a6442 updated deprecated interfaces where possible, there are still many left, like ForgeRegistry.BIOME, ForgeRegistry.BLOCK_STATE_IDS, and many more I couln't find a fix for. 2022-05-01 16:24:34 +02:00
1273 changed files with 21498 additions and 1285 deletions

View File

@ -11,4 +11,4 @@ jobs:
- name: actions/checkout
uses: actions/checkout@v2
- name: rojopolis/spellcheck - actually doing something
uses: rojopolis/spellcheck-github-actions@0.20.0
uses: rojopolis/spellcheck-github-actions@0.29.0

View File

@ -1,3 +1,4 @@
{
"java.configuration.updateBuildConfiguration": "automatic"
"java.configuration.updateBuildConfiguration": "automatic",
"java.compile.nullAnalysis.mode": "automatic"
}

View File

@ -8,20 +8,24 @@ eclipse {
}
}
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
dependencies {
implementation project(path: ':DynmapCoreAPI', configuration: 'shadow')
implementation project(':DynmapCoreAPI')
implementation 'javax.servlet:javax.servlet-api:3.1'
implementation 'org.eclipse.jetty:jetty-server:9.4.26.v20200117'
implementation'org.eclipse.jetty:jetty-server:9.4.26.v20200117'
implementation 'org.eclipse.jetty:jetty-servlet:9.4.26.v20200117'
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
implementation 'org.yaml:snakeyaml:1.23' // DON'T UPDATE - NEWER ONE TRIPS ON WINDOWS ENCODED FILES
implementation 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20180219.1'
implementation 'org.postgresql:postgresql:42.2.18'
implementation 'io.github.linktosriram:s3-lite-core:0.2.0'
implementation 'io.github.linktosriram:s3-lite-api:0.2.0'
implementation 'io.github.linktosriram:s3-lite-http-client-url-connection:0.2.0'
implementation 'io.github.linktosriram:s3-lite-http-client-spi:0.2.0'
implementation 'io.github.linktosriram:s3-lite-util:0.2.0'
implementation 'io.github.linktosriram.s3lite:core:0.0.2-SNAPSHOT'
implementation 'io.github.linktosriram.s3lite:api:0.0.2-SNAPSHOT'
implementation 'io.github.linktosriram.s3lite:http-client-url-connection:0.0.2-SNAPSHOT'
implementation 'io.github.linktosriram.s3lite:http-client-spi:0.0.2-SNAPSHOT'
implementation 'io.github.linktosriram.s3lite:util:0.0.2-SNAPSHOT'
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:3.0.1'
implementation 'com.sun.xml.bind:jaxb-impl:3.0.0'
}
processResources {
@ -44,7 +48,7 @@ processResources {
}
jar {
classifier = 'unshaded'
archiveClassifier = 'unshaded'
}
shadowJar {
@ -56,11 +60,13 @@ shadowJar {
include(dependency('org.eclipse.jetty::'))
include(dependency('org.eclipse.jetty.orbit:javax.servlet:'))
include(dependency('org.postgresql:postgresql:'))
include(dependency('io.github.linktosriram:s3-lite-core:'))
include(dependency('io.github.linktosriram:s3-lite-api:'))
include(dependency('io.github.linktosriram:s3-lite-http-client-url-connection:'))
include(dependency('io.github.linktosriram:s3-lite-http-client-spi:'))
include(dependency('io.github.linktosriram:s3-lite-util:'))
include(dependency('io.github.linktosriram.s3lite:core:'))
include(dependency('io.github.linktosriram.s3lite:api:'))
include(dependency('io.github.linktosriram.s3lite:http-client-url-connection:'))
include(dependency('io.github.linktosriram.s3lite:http-client-spi:'))
include(dependency('io.github.linktosriram.s3lite:util:'))
include(dependency('jakarta.xml.bind::'))
include(dependency('com.sun.xml.bind::'))
include(dependency(':DynmapCoreAPI'))
exclude("META-INF/maven/**")
exclude("META-INF/services/**")
@ -73,8 +79,8 @@ shadowJar {
relocate('org.postgresql', 'org.dynmap.org.postgresql')
relocate('io.github.linktosriram.s3lite', 'org.dynmap.s3lite')
destinationDir = file '../target'
classifier = ''
destinationDirectory = file '../target'
archiveClassifier = ''
}
artifacts {

View File

@ -286,6 +286,8 @@ public class Client {
private static PolicyFactory sanitizer = null;
private static PolicyFactory OLDTAGS = new HtmlPolicyBuilder().allowElements("center", "basefont", "hr").toFactory();
public static String sanitizeHTML(String html) {
// Don't sanitize if null or no html markup
if ((html == null) || (html.indexOf('<') < 0)) return html;
PolicyFactory s = sanitizer;
if (s == null) {
// Generous but safe html formatting allowances

View File

@ -12,6 +12,7 @@ public class ClientUpdateComponent extends Component {
private int hideifshadow;
private int hideifunder;
private boolean hideifsneaking;
private boolean hideifspectator;
private boolean hideifinvisiblepotion;
private boolean is_protected;
public static boolean usePlayerColors;
@ -24,6 +25,7 @@ public class ClientUpdateComponent extends Component {
hideifshadow = configuration.getInteger("hideifshadow", 15);
hideifunder = configuration.getInteger("hideifundercover", 15);
hideifsneaking = configuration.getBoolean("hideifsneaking", false);
hideifspectator = configuration.getBoolean("hideifspectator", false);
hideifinvisiblepotion = configuration.getBoolean("hide-if-invisiblity-potion", true);
is_protected = configuration.getBoolean("protected-player-info", false);
usePlayerColors = configuration.getBoolean("use-name-colors", false);
@ -100,6 +102,9 @@ public class ClientUpdateComponent extends Component {
if((!hide) && hideifsneaking && p.isSneaking()) {
hide = true;
}
if((!hide) && hideifspectator && p.isSpectator()) {
hide = true;
}
if((!hide) && is_protected && (!see_all)) {
if(e.user != null) {
hide = !core.testIfPlayerVisibleToPlayer(e.user, p.getName());

View File

@ -1,11 +1,15 @@
package org.dynmap;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
@ -82,13 +86,13 @@ public class ConfigurationNode implements Map<String, Object> {
initparse();
// If no file to read, just return false
if (!f.canRead()) { return false; }
FileInputStream fis = null;
Reader fr = null;
try {
fis = new FileInputStream(f);
Object o = yaml.load(new UnicodeReader(fis));
fr = new UnicodeReader(new BufferedInputStream(new FileInputStream(f)));
Object o = yaml.load(fr);
if((o != null) && (o instanceof Map))
entries = (Map<String, Object>)o;
fis.close();
fr.close();
}
catch (YAMLException e) {
Log.severe("Error parsing " + f.getPath() + ". Use http://yamllint.com to debug the YAML syntax." );
@ -97,8 +101,8 @@ public class ConfigurationNode implements Map<String, Object> {
Log.severe("Error reading " + f.getPath());
return false;
} finally {
if(fis != null) {
try { fis.close(); } catch (IOException x) {}
if(fr != null) {
try { fr.close(); } catch (IOException x) {}
}
}
return (entries != null);
@ -111,7 +115,7 @@ public class ConfigurationNode implements Map<String, Object> {
public boolean save(File file) {
initparse();
FileOutputStream stream = null;
OutputStream stream = null;
File parent = file.getParentFile();
@ -120,7 +124,7 @@ public class ConfigurationNode implements Map<String, Object> {
}
try {
stream = new FileOutputStream(file);
stream = new BufferedOutputStream(new FileOutputStream(file));
OutputStreamWriter writer = new OutputStreamWriter(stream, "UTF-8");
yaml.dump(entries, writer);
return true;

View File

@ -164,6 +164,7 @@ public class DynmapCore implements DynmapCommonAPI {
private File dataDirectory;
private File tilesDirectory;
private File exportDirectory;
private File importDirectory;
private String plugin_ver;
private MapStorage defaultStorage;
@ -177,6 +178,8 @@ public class DynmapCore implements DynmapCommonAPI {
private Boolean webserverCompConfigWarn = false;
private final String CompConfigWiki = "https://github.com/webbukkit/dynmap/wiki/Component-Configuration";
private final String[] defaultTemplates = {"vlowres", "lowres", "medres", "hires", "low_boost_hi",
"hi_boost_vhi", "hi_boost_xhi"};
/* Constructor for core */
public DynmapCore() {
}
@ -222,6 +225,9 @@ public class DynmapCore implements DynmapCommonAPI {
public final File getExportFolder() {
return exportDirectory;
}
public final File getImportFolder() {
return importDirectory;
}
public void setMinecraftVersion(String mcver) {
this.platformVersion = mcver;
}
@ -426,6 +432,11 @@ public class DynmapCore implements DynmapCommonAPI {
if (!exportDirectory.isDirectory() && !exportDirectory.mkdirs()) {
Log.warning("Could not create directory for exports ('" + exportDirectory + "').");
}
// Prime the imports directory
importDirectory = getFile(configuration.getString("importpath", "import"));
if (!importDirectory.isDirectory() && !importDirectory.mkdirs()) {
Log.warning("Could not create directory for imports ('" + importDirectory + "').");
}
// Create default storage handler
String storetype = configuration.getString("storage/type", "filetree");
if (storetype.equals("filetree")) {
@ -701,7 +712,7 @@ public class DynmapCore implements DynmapCommonAPI {
/* Print version info */
Log.info("version " + plugin_ver + " is enabled - core version " + version );
Log.info("For support, visit our Discord at https://discord.gg/s3rd5qn");
Log.info("For news, visit https://reddit.com/r/Dynmap or follow https://twitter.com/Dynmap");
Log.info("For news, visit https://reddit.com/r/Dynmap or follow https://universeodon.com/@dynmap");
Log.info("To report or track bugs, visit https://github.com/webbukkit/dynmap/issues");
Log.info("If you'd like to donate, please visit https://www.patreon.com/dynmap or https://ko-fi.com/michaelprimm");
@ -1113,7 +1124,9 @@ public class DynmapCore implements DynmapCommonAPI {
mapManager.stopRendering();
mapManager = null;
}
if (defaultStorage != null) {
defaultStorage.shutdownStorage();
}
playerfacemgr = null;
/* Clean up registered listeners */
listenerManager.cleanup();
@ -1355,7 +1368,7 @@ public class DynmapCore implements DynmapCommonAPI {
new CommandInfo("dmap", "mapadd", "<world>:<map> <attrib>:<value> <attrib>:<value>", "Create map for world <world> with name <map> using provided attributes."),
new CommandInfo("dmap", "mapset", "<world>:<map> <attrib>:<value> <attrib>:<value>", "Update map <map> of world <world> with new attribute values."),
new CommandInfo("dmap", "worldreset", "<world>", "Reset world <world> to default template for world type"),
new CommandInfo("dmap", "worldreset", "<world> <templatename>", "Reset world <world> to temaplte <templatename>."),
new CommandInfo("dmap", "worldreset", "<world> <templatename>", "Reset world <world> to template <templatename>."),
new CommandInfo("dmap", "worldgetlimits", "<world>", "List visibity and hidden limits for world"),
new CommandInfo("dmap", "worldaddlimit", "<world> corner1:<x>/<z> corner2:<x>/<z>", "Add rectangular visibilty limit"),
new CommandInfo("dmap", "worldaddlimit", "<world> type:round center:<x>/<z> radius:<radius>", "Add round visibilty limit"),
@ -2165,6 +2178,9 @@ public class DynmapCore implements DynmapCommonAPI {
ConfigurationNode getDefaultTemplateConfigurationNode(DynmapWorld world) {
String environmentName = world.getEnvironment();
if(deftemplatesuffix.length() > 0) {
if(!Arrays.asList(defaultTemplates).contains(deftemplatesuffix)) {
Log.warning("Not using a default defined template, worlds might not be accessible.");
}
environmentName += "-" + deftemplatesuffix;
}
Log.verboseinfo("Using environment as template: " + environmentName);

View File

@ -92,6 +92,7 @@ public class DynmapMapCommands {
mapSetArgs.put("boostzoom", emptySupplier);
mapSetArgs.put("tilescale", emptySupplier);
mapSetArgs.put("tileupdatedelay", emptySupplier);
mapSetArgs.put("readonly", booleanSupplier);
tabCompletions = new HashMap<>();
tabCompletions.put("worldaddlimit", worldAddLimitArgs);
@ -696,7 +697,7 @@ public class DynmapMapCommands {
sb.append(", lighting=").append(hdmt.getLighting().getName()).append(", mapzoomin=").append(hdmt.getMapZoomIn()).append(", mapzoomout=").append(hdmt.getMapZoomOutLevels());
sb.append(", img-format=").append(hdmt.getImageFormatSetting()).append(", icon=").append(hdmt.getIcon());
sb.append(", append-to-world=").append(hdmt.getAppendToWorld()).append(", boostzoom=").append(hdmt.getBoostZoom());
sb.append(", protected=").append(hdmt.isProtected()).append(", tilescale=").append(hdmt.getTileScale());
sb.append(", protected=").append(hdmt.isProtected()).append(", tilescale=").append(hdmt.getTileScale()).append(", readonly=").append(hdmt.isReadOnly());
if(hdmt.tileupdatedelay > 0) {
sb.append(", tileupdatedelay=").append(hdmt.tileupdatedelay);
}
@ -996,6 +997,9 @@ public class DynmapMapCommands {
else if(tok[0].equalsIgnoreCase("protected")) {
did_update |= mt.setProtected(Boolean.parseBoolean(tok[1]));
}
else if(tok[0].equalsIgnoreCase("readonly")) {
did_update |= mt.setReadOnly(Boolean.parseBoolean(tok[1]));
}
}
if(did_update) {
if(core.updateWorldConfig(w)) {

View File

@ -27,6 +27,7 @@ import org.json.simple.parser.ParseException;
import static org.dynmap.JSONUtils.*;
import java.nio.charset.Charset;
import java.util.concurrent.CompletableFuture;
public class JsonFileClientUpdateComponent extends ClientUpdateComponent {
protected long jsonInterval;
@ -338,9 +339,12 @@ public class JsonFileClientUpdateComponent extends ClientUpdateComponent {
else {
outputFile = "dynmap_" + dynmapWorld.getName() + ".json";
}
byte[] content = Json.stringifyJson(update).getBytes(cs_utf8);
enqueueFileWrite(outputFile, content, dowrap);
CompletableFuture.runAsync(() -> {
byte[] content = Json.stringifyJson(update).getBytes(cs_utf8);
enqueueFileWrite(outputFile, content, dowrap);
});
}
}

View File

@ -293,6 +293,7 @@ public class MapManager {
boolean pausedforworld = false;
boolean updaterender = false;
boolean resume = false;
boolean resumeInitDone = false;
boolean quiet = false;
String mapname;
AtomicLong total_render_ns = new AtomicLong(0L);
@ -311,32 +312,6 @@ public class MapManager {
rendertype = RENDERTYPE_FULLRENDER;
}
this.resume = resume;
final CountDownLatch latch = new CountDownLatch(1);
if (resume) { // if resume render
final MapStorage ms = world.getMapStorage();
ms.enumMapBaseTiles(world, map, new MapStorageBaseTileEnumCB() {
@Override
public void tileFound(MapStorageTile tile, MapType.ImageEncoding enc) {
String tileId = String.format("%s_%s_%d_%d", tile.world.getName(), tile.map.getName(), tile.x, tile.y);
//sender.sendMessage("Tile found: " + tileId);
storedTileIds.add(tileId);
}
}, new MapStorageTileSearchEndCB() {
@Override
public void searchEnded() {
latch.countDown();
}
});
try {
latch.await(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
sender.sendMessage(e.toString());
}
}
}
/* Full world, all maps render, with optional render radius */
@ -528,6 +503,27 @@ public class MapManager {
}
return;
}
// If doing resume, load existing tile IDs here (constructor was stupid, and caused timeouts for non-trivial maps - need to check PRs better....
if (resume && (!resumeInitDone)) { // if resume render AND init not completed
sendMessage(String.format("Scanning map to find existing tiles for resume..."));
final MapStorage ms = world.getMapStorage();
ms.enumMapBaseTiles(world, map, new MapStorageBaseTileEnumCB() {
@Override
public void tileFound(MapStorageTile tile, MapType.ImageEncoding enc) {
String tileId = String.format("%s_%s_%d_%d", tile.world.getName(), tile.map.getName(), tile.x, tile.y);
//sender.sendMessage("Tile found: " + tileId);
storedTileIds.add(tileId);
}
}, new MapStorageTileSearchEndCB() {
@Override
public void searchEnded() {
}
});
sendMessage(String.format("Scan complete - starting render"));
resumeInitDone = true; // Only due on first run
}
if(tile0 == null) { /* Not single tile render */
if (saverestorepending && world.isLoaded() && (savependingperiod > 0) && ((lastPendingSaveTS + (1000 *savependingperiod)) < System.currentTimeMillis())) {
savePending(this.world, true); // Save the pending data for the given world
@ -633,10 +629,12 @@ public class MapManager {
renderedmaps.addAll(map.getMapsSharingRender(world));
/* Now, prime the render queue */
for (MapTile mt : map.getTiles(world, (int)loc.x, (int)loc.y, (int)loc.z)) {
if (!found.getFlag(mt.tileOrdinalX(), mt.tileOrdinalY())) {
found.setFlag(mt.tileOrdinalX(), mt.tileOrdinalY(), true);
renderQueue.add(mt);
if (map.isReadOnly() == false) {
for (MapTile mt : map.getTiles(world, (int)loc.x, (int)loc.y, (int)loc.z)) {
if (!found.getFlag(mt.tileOrdinalX(), mt.tileOrdinalY())) {
found.setFlag(mt.tileOrdinalX(), mt.tileOrdinalY(), true);
renderQueue.add(mt);
}
}
}
if(!updaterender) { /* Only add other seed points for fullrender */
@ -696,6 +694,7 @@ public class MapManager {
}
});
rslt.add(future);
}
}
/* Now, do our render (first one) */
@ -1075,6 +1074,10 @@ public class MapManager {
tiles.clear();
for(DynmapWorld w : worlds) {
for(MapTypeState mts : w.mapstate) {
if (mts.type.isReadOnly()) {
continue;
}
if(mts.getNextInvalidTileCoord(coord)) {
mts.type.addMapTiles(tiles, w, coord.x, coord.y);
mts.validateTile(coord.x, coord.y);
@ -1906,6 +1909,10 @@ public class MapManager {
}
if(world == null) continue;
for (MapTypeState mts : world.mapstate) {
if (mts.type.isReadOnly()) {
continue;
}
List<TileFlags.TileCoord> tiles = mts.type.getTileCoords(world, evt.x, evt.y, evt.z);
invalidates += mts.invalidateTiles(tiles);
}
@ -1938,6 +1945,10 @@ public class MapManager {
if(world == null) continue;
int invalidates = 0;
for (MapTypeState mts : world.mapstate) {
if (mts.type.isReadOnly()) {
continue;
}
List<TileFlags.TileCoord> tiles = mts.type.getTileCoords(world, evt.xmin, evt.ymin, evt.zmin, evt.xmax, evt.ymax, evt.zmax);
invalidates += mts.invalidateTiles(tiles);
}

View File

@ -10,6 +10,10 @@ import org.json.simple.JSONObject;
public abstract class MapType {
private boolean is_protected;
/**
* Is the map type read-only? (i.e. should not be updated by renderer)
*/
private boolean is_readonly;
protected int tileupdatedelay;
public enum ImageVariant {
@ -207,6 +211,26 @@ public abstract class MapType {
}
return false;
}
/**
* Is the map type read-only? (i.e. should not be updated by renderer)
* @return true if read-only
*/
public boolean isReadOnly() {
return is_readonly;
}
/**
* Set read-only state of map type
* @param r - true if read-only
* @return true if state changed
*/
public boolean setReadOnly(boolean r) {
if(is_readonly != r) {
is_readonly = r;
return true;
}
return false;
}
public abstract String getPrefix();
public int getTileUpdateDelay(DynmapWorld w) {

View File

@ -7,11 +7,11 @@ import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Properties;
import java.util.Random;
import java.util.Set;
import org.dynmap.common.DynmapCommandSender;
@ -26,8 +26,9 @@ public class WebAuthManager {
public static final String WEBAUTHFILE = "webauth.txt";
private static final String HASHSALT = "$HASH_SALT$";
private static final String PWDHASH_PREFIX = "hash.";
private Random rnd = new Random();
private SecureRandom rnd = new SecureRandom();
private DynmapCore core;
private String publicRegistrationURL;
public WebAuthManager(DynmapCore core) {
this.core = core;
@ -202,7 +203,8 @@ public class WebAuthManager {
pending_registrations.put(uid.toLowerCase(), regkey.toLowerCase());
sender.sendMessage("Registration pending for user ID: " + uid);
sender.sendMessage("Registration code: " + regkey);
sender.sendMessage("Enter ID and code on registration web page (login.html) to complete registration");
publicRegistrationURL = core.configuration.getString("publicURL", "index.html");
sender.sendMessage("Enter ID and code on registration web page (" + publicRegistrationURL.toString() + ") to complete registration");
if(other) {
DynmapPlayer p = core.getServer().getPlayer(uid);
if(p != null) {

View File

@ -3,6 +3,7 @@ package org.dynmap.common;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import org.dynmap.hdmap.HDBlockModels;
@ -19,7 +20,7 @@ public class BiomeMap {
public static final BiomeMap EXTREME_HILLS = new BiomeMap(3, "EXTREME_HILLS", 0.2, 0.3, "minecraft:mountains");
public static final BiomeMap FOREST = new BiomeMap(4, "FOREST", 0.7, 0.8, "minecraft:forest");
public static final BiomeMap TAIGA = new BiomeMap(5, "TAIGA", 0.05, 0.8, "minecraft:taiga");
public static final BiomeMap SWAMPLAND = new BiomeMap(6, "SWAMPLAND", 0.8, 0.9, 0xE0FFAE, 0x4E0E4E, 0x4E0E4E, "minecraft:swamp");
public static final BiomeMap SWAMPLAND = new BiomeMap(6, "SWAMPLAND", 0.8, 0.9, 0xE0FFAE, 0x2e282a, 0x902c52, "minecraft:swamp");
public static final BiomeMap RIVER = new BiomeMap(7, "RIVER", "minecraft:river");
public static final BiomeMap HELL = new BiomeMap(8, "HELL", 2.0, 0.0, "minecraft:nether");
public static final BiomeMap SKY = new BiomeMap(9, "SKY", "minecraft:the_end");
@ -44,6 +45,7 @@ public class BiomeMap {
private int watercolormult;
private int grassmult;
private int foliagemult;
private Optional<?> biomeObj = Optional.empty();
private final String id;
private final String resourcelocation;
private final int index;
@ -61,7 +63,7 @@ public class BiomeMap {
new BiomeMap(26, "COLD_BEACH", 0.05, 0.3, "minecraft:snowy_beach");
new BiomeMap(27, "BIRCH_FOREST", 0.6, 0.6, "minecraft:birch_forest");
new BiomeMap(28, "BIRCH_FOREST_HILLS", 0.6, 0.6, "minecraft:birch_forest_hills");
new BiomeMap(29, "ROOFED_FOREST", 0.7, 0.8, "minecraft:dark_forest");
new BiomeMap(29, "ROOFED_FOREST", 0.7, 0.8, 0xFFFFFF, 0x28340A, 0, "minecraft:dark_forest");
new BiomeMap(30, "COLD_TAIGA", -0.5, 0.4, "minecraft:snowy_taiga");
new BiomeMap(31, "COLD_TAIGA_HILLS", -0.5, 0.4, "minecraft:snowy_taiga_hills");
new BiomeMap(32, "MEGA_TAIGA", 0.3, 0.8, "minecraft:giant_tree_taiga");
@ -69,30 +71,32 @@ public class BiomeMap {
new BiomeMap(34, "EXTREME_HILLS_PLUS", 0.2, 0.3, "minecraft:wooded_mountains");
new BiomeMap(35, "SAVANNA", 1.2, 0.0, "minecraft:savanna");
new BiomeMap(36, "SAVANNA_PLATEAU", 1.0, 0.0, "minecraft:savanna_plateau");
new BiomeMap(37, "MESA", 2.0, 0.0, "minecraft:badlands");
new BiomeMap(38, "MESA_PLATEAU_FOREST", 2.0, 0.0, "minecraft:wooded_badlands_plateau");
new BiomeMap(39, "MESA_PLATEAU", 2.0, 0.0, "minecraft:badlands_plateau");
new BiomeMap(37, "MESA", 2.0, 0.0, 0xFFFFFF, 0x624c46, 0x8e5e70, "minecraft:badlands");
new BiomeMap(129, "SUNFLOWER_PLAINS", 0.8, 0.4, "minecraft:sunflower_plains");
new BiomeMap(130, "DESERT_MOUNTAINS", 2.0, 0.0, "minecraft:desert_lakes");
new BiomeMap(131, "EXTREME_HILLS_MOUNTAINS", 0.2, 0.3, "minecraft:gravelly_mountains");
new BiomeMap(132, "FLOWER_FOREST", 0.7, 0.8, "minecraft:flower_forest");
new BiomeMap(133, "TAIGA_MOUNTAINS", 0.05, 0.8, "minecraft:taiga_mountains");
new BiomeMap(134, "SWAMPLAND_MOUNTAINS", 0.8, 0.9, 0xE0FFAE, 0x4E0E4E, 0x4E0E4E, "minecraft:swamp_hills");
new BiomeMap(140, "ICE_PLAINS_SPIKES", 0.0, 0.5, "minecraft:ice_spikes");
new BiomeMap(149, "JUNGLE_MOUNTAINS", 1.2, 0.9, "minecraft:modified_jungle");
new BiomeMap(151, "JUNGLE_EDGE_MOUNTAINS", 0.95, 0.8, "minecraft:modified_jungle_edge");
new BiomeMap(155, "BIRCH_FOREST_MOUNTAINS", 0.6, 0.6, "minecraft:tall_birch_forest");
new BiomeMap(156, "BIRCH_FOREST_HILLS_MOUNTAINS", 0.6, 0.6, "minecraft:tall_birch_hills");
new BiomeMap(157, "ROOFED_FOREST_MOUNTAINS", 0.7, 0.8, "minecraft:dark_forest_hills");
new BiomeMap(157, "ROOFED_FOREST_MOUNTAINS", 0.7, 0.8, 0xFFFFFF, 0x28340A, 0, "minecraft:dark_forest_hills");
new BiomeMap(158, "COLD_TAIGA_MOUNTAINS", -0.5, 0.4, "minecraft:snowy_taiga_mountains");
new BiomeMap(160, "MEGA_SPRUCE_TAIGA", 0.25, 0.8, "minecraft:giant_spruce_taiga");
new BiomeMap(161, "MEGA_SPRUCE_TAIGA_HILLS", 0.3, 0.8, "minecraft:giant_spruce_taiga_hills");
new BiomeMap(162, "EXTREME_HILLS_PLUS_MOUNTAINS", 0.2, 0.3, "minecraft:modified_gravelly_mountains");
new BiomeMap(163, "SAVANNA_MOUNTAINS", 1.2, 0.0, "minecraft:shattered_savanna");
new BiomeMap(164, "SAVANNA_PLATEAU_MOUNTAINS", 1.0, 0.0, "minecraft:shattered_savanna_plateau");
new BiomeMap(165, "MESA_BRYCE", 2.0, 0.0, "minecraft:eroded_badlands");
new BiomeMap(166, "MESA_PLATEAU_FOREST_MOUNTAINS", 2.0, 0.0, "minecraft:modified_wooded_badlands_plateau");
new BiomeMap(167, "MESA_PLATEAU_MOUNTAINS", 2.0, 0.0, "minecraft:modified_badlands_plateau");
new BiomeMap(165, "MESA_BRYCE", 2.0, 0.0,0xFFFFFF, 0x624c46, 0x8e5e70, "minecraft:eroded_badlands");
}
if (HDBlockModels.checkVersionRange(mcver, "1.7.0-1.17.1")) {
new BiomeMap(38, "MESA_PLATEAU_FOREST", 2.0, 0.0, 0xFFFFFF, 0x624c46, 0x8e5e70, "minecraft:wooded_badlands_plateau");
new BiomeMap(39, "MESA_PLATEAU", 2.0, 0.0, 0xFFFFFF, 0x624c46, 0x8e5e70, "minecraft:badlands_plateau");
new BiomeMap(134, "SWAMPLAND_MOUNTAINS", 0.8, 0.9, 0xE0FFAE, 0x2e282a, 0x902c52, "minecraft:swamp_hills");
new BiomeMap(166, "MESA_PLATEAU_FOREST_MOUNTAINS", 2.0, 0.0,0xFFFFFF, 0x624c46, 0x8e5e70, "minecraft:modified_wooded_badlands_plateau");
new BiomeMap(167, "MESA_PLATEAU_MOUNTAINS", 2.0, 0.0,0xFFFFFF, 0x624c46, 0x8e5e70, "minecraft:modified_badlands_plateau");
}
if (HDBlockModels.checkVersionRange(mcver, "1.9.0-")) {
new BiomeMap(127, "THE_VOID", "minecraft:the_void");
@ -124,6 +128,9 @@ public class BiomeMap {
new BiomeMap(174, "DRIPSTONE_CAVES", "minecraft:dripstone_caves");
new BiomeMap(175, "LUSH_CAVES", "minecraft:lush_caves");
}
if (HDBlockModels.checkVersionRange(mcver, "1.18.0-")) {
new BiomeMap(38, "MESA_FOREST", 2.0, 0.0, 0xFFFFFF, 0x624c46, 0x8e5e70, "minecraft:wooded_badlands");
}
loadDone = true;
}
@ -303,4 +310,10 @@ public class BiomeMap {
public String toString() {
return String.format("%s(%s)", id, resourcelocation);
}
public @SuppressWarnings("unchecked") <T> Optional<T> getBiomeObject() {
return (Optional<T>) biomeObj;
}
public void setBiomeObject(Object biomeObj) {
this.biomeObj = Optional.of(biomeObj);
}
}

View File

@ -44,6 +44,12 @@ public interface DynmapPlayer extends DynmapCommandSender {
* @return true if sneaking
*/
public boolean isSneaking();
/**
* get spectator gamemode
* @return true if gamemode spectator
*/
public boolean isSpectator();
/**
* Get health
* @return health points

View File

@ -18,6 +18,7 @@ public class GenericChunkCache {
};
private CacheHashMap snapcache;
private final Object snapcachelock;
private ReferenceQueue<ChunkCacheRec> refqueue;
private long cache_attempts;
private long cache_success;
@ -50,6 +51,7 @@ public class GenericChunkCache {
* Create snapshot cache
*/
public GenericChunkCache(int max_size, boolean softref) {
snapcachelock = new Object();
snapcache = new CacheHashMap(max_size);
refqueue = new ReferenceQueue<ChunkCacheRec>();
this.softref = softref;
@ -62,8 +64,8 @@ public class GenericChunkCache {
*/
public void invalidateSnapshot(String w, int x, int y, int z) {
String key = getKey(w, x>>4, z>>4);
synchronized(snapcache) {
CacheRec rec = snapcache.remove(key);
synchronized(snapcachelock) {
CacheRec rec = (snapcache != null) ? snapcache.remove(key) : null;
if(rec != null) {
snapcache.reverselookup.remove(rec.ref);
rec.ref.clear();
@ -78,8 +80,8 @@ public class GenericChunkCache {
for(int xx = (x0>>4); xx <= (x1>>4); xx++) {
for(int zz = (z0>>4); zz <= (z1>>4); zz++) {
String key = getKey(w, xx, zz);
synchronized(snapcache) {
CacheRec rec = snapcache.remove(key);
synchronized(snapcachelock) {
CacheRec rec = (snapcache != null) ? snapcache.remove(key) : null;
if(rec != null) {
snapcache.reverselookup.remove(rec.ref);
rec.ref.clear();
@ -97,8 +99,8 @@ public class GenericChunkCache {
processRefQueue();
ChunkCacheRec ss = null;
CacheRec rec;
synchronized(snapcache) {
rec = snapcache.get(key);
synchronized(snapcachelock) {
rec = (snapcache != null) ? snapcache.get(key) : null;
if(rec != null) {
ss = rec.ref.get();
if(ss == null) {
@ -123,8 +125,8 @@ public class GenericChunkCache {
rec.ref = new SoftReference<ChunkCacheRec>(ss, refqueue);
else
rec.ref = new WeakReference<ChunkCacheRec>(ss, refqueue);
synchronized(snapcache) {
CacheRec prevrec = snapcache.put(key, rec);
synchronized(snapcachelock) {
CacheRec prevrec = (snapcache != null) ? snapcache.put(key, rec) : null;
if(prevrec != null) {
snapcache.reverselookup.remove(prevrec.ref);
}
@ -137,8 +139,8 @@ public class GenericChunkCache {
private void processRefQueue() {
Reference<? extends ChunkCacheRec> ref;
while((ref = refqueue.poll()) != null) {
synchronized(snapcache) {
String k = snapcache.reverselookup.remove(ref);
synchronized(snapcachelock) {
String k = (snapcache != null) ? snapcache.reverselookup.remove(ref) : null;
if(k != null) {
snapcache.remove(k);
}
@ -164,11 +166,13 @@ public class GenericChunkCache {
* Cleanup
*/
public void cleanup() {
if(snapcache != null) {
snapcache.clear();
snapcache.reverselookup.clear();
snapcache.reverselookup = null;
snapcache = null;
}
synchronized(snapcachelock) {
if(snapcache != null) {
snapcache.clear();
snapcache.reverselookup.clear();
snapcache.reverselookup = null;
snapcache = null;
}
}
}
}

View File

@ -54,11 +54,13 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
private DynmapBlockState blk;
private final int worldheight;
private final int ymin;
private final int sealevel;
OurMapIterator(int x0, int y0, int z0) {
initialize(x0, y0, z0);
worldheight = dw.worldheight;
ymin = dw.minY;
sealevel = dw.sealevel;
}
@Override
@ -181,7 +183,7 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
for (int dz = -1; dz <= 1; dz++) {
BiomeMap bm = getBiomeRel(dx, dz);
if (bm == BiomeMap.NULL) continue;
int rmult = bm.getModifiedGrassMultiplier(colormap[bm.biomeLookup()]);
int rmult = getGrassColor(bm, colormap, getX() + dx, getZ() + dz);
raccum += (rmult >> 16) & 0xFF;
gaccum += (rmult >> 8) & 0xFF;
baccum += rmult & 0xFF;
@ -212,7 +214,7 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
for (int dz = -1; dz <= 1; dz++) {
BiomeMap bm = getBiomeRel(dx, dz);
if (bm == BiomeMap.NULL) continue;
int rmult = bm.getModifiedFoliageMultiplier(colormap[bm.biomeLookup()]);
int rmult = getFoliageColor(bm, colormap, getX() + dx, getZ() + dz);
raccum += (rmult >> 16) & 0xFF;
gaccum += (rmult >> 8) & 0xFF;
baccum += rmult & 0xFF;
@ -483,7 +485,16 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
public final int getWorldHeight() {
return worldheight;
}
@Override
public final int getWorldYMin() {
return ymin;
}
/**
* Get world sealevel
*/
public final int getWorldSeaLevel() {
return sealevel;
}
@Override
public final long getBlockKey() {
return (((chunkindex * (worldheight - ymin)) + (y - ymin)) << 8) | (bx << 4) | bz;
@ -546,6 +557,14 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
}
}
public int getGrassColor(BiomeMap bm, int[] colormap, int x, int z) {
return bm.getModifiedGrassMultiplier(colormap[bm.biomeLookup()]);
}
public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) {
return bm.getModifiedFoliageMultiplier(colormap[bm.biomeLookup()]);
}
private class OurEndMapIterator extends OurMapIterator {
OurEndMapIterator(int x0, int y0, int z0) {
super(x0, y0, z0);
@ -766,7 +785,7 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
}
/**
* Read NBT data from loaded chunks - do not needs to be called from server/world
* Read NBT data from loaded chunks - do not needs to be called from server/world <p>
* Will throw {@link IllegalStateException} if not supporting
*/
public void getLoadedChunksAsync() {
@ -836,7 +855,9 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
}
/**
* Prepare the chunks async
* Loads all chunks in the world asynchronously.
* <p>
* If it is not supported, it will throw {@link IllegalStateException}
*/
public void loadChunksAsync() {
getLoadedChunksAsync();
@ -923,6 +944,12 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
return cnt;
}
/**
* It loads chunks from the cache or from the world, and if the chunk is not visible, it fills it with stone, ocean or
* empty chunk
* <p>
* if it's not supported, will throw {@link IllegalStateException}
*/
public void readChunksAsync() {
class SimplePair { //pair of the chunk and the data which is readed async
private final Supplier<GenericChunk> supplier;
@ -1268,19 +1295,19 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
bitsperblock = (statelist.length * 64) / 4096;
dbp = new DataBitsPacked(bitsperblock, 4096, statelist);
}
if (bitsperblock > 8) { // Not palette
for (int j = 0; j < 4096; j++) {
int v = db != null ? db.get(j) : dbp.getAt(j);
sbld.xyzBlockState(j & 0xF, (j & 0xF00) >> 8, (j & 0xF0) >> 4, DynmapBlockState.getStateByGlobalIndex(v));
}
}
else {
//if (bitsperblock > 8) { // Not palette
// for (int j = 0; j < 4096; j++) {
// int v = db != null ? db.get(j) : dbp.getAt(j);
// sbld.xyzBlockState(j & 0xF, (j & 0xF00) >> 8, (j & 0xF0) >> 4, DynmapBlockState.getStateByGlobalIndex(v));
// }
//}
//else {
sbld.xyzBlockStatePalette(palette); // Set palette
for (int j = 0; j < 4096; j++) {
int v = db != null ? db.get(j) : dbp.getAt(j);
sbld.xyzBlockStateInPalette(j & 0xF, (j & 0xF00) >> 8, (j & 0xF0) >> 4, (short)v);
}
}
//}
}
}
if (sec.contains("BlockLight")) {
@ -1296,8 +1323,10 @@ public abstract class GenericMapChunkCache extends MapChunkCache {
long[] bdataPacked = nbtbiomes.getLongArray("data");
GenericNBTList bpalette = nbtbiomes.getList("palette", 8);
GenericBitStorage bdata = null;
if (bdataPacked.length > 0)
bdata = nbt.makeBitStorage(bdataPacked.length, 64, bdataPacked);
if (bdataPacked.length > 0) {
int valsPerLong = (64 / bdataPacked.length);
bdata = nbt.makeBitStorage((64 + valsPerLong - 1) / valsPerLong, 64, bdataPacked);
}
for (int j = 0; j < 64; j++) {
int b = bdata != null ? bdata.get(j) : 0;
sbld.xyzBiome(j & 0x3, (j & 0x30) >> 4, (j & 0xC) >> 2, BiomeMap.byBiomeResourceLocation(bpalette.getString(b)));

View File

@ -22,6 +22,8 @@ import org.json.simple.JSONObject;
public class CaveHDShader implements HDShader {
private String name;
private boolean iflit;
private Color startColor;
private Color endColor;
private BitSet hiddenids = new BitSet();
private void setHidden(DynmapBlockState blk) {
@ -41,7 +43,8 @@ public class CaveHDShader implements HDShader {
public CaveHDShader(DynmapCore core, ConfigurationNode configuration) {
name = (String) configuration.get("name");
iflit = configuration.getBoolean("onlyiflit", false);
startColor = configuration.getColor("startColor", null);
endColor = configuration.getColor("endColor", null);
for (int i = 0; i < DynmapBlockState.getGlobalIndexMax(); i++) {
DynmapBlockState bs = DynmapBlockState.getStateByGlobalIndex(i);
if (bs.isAir() || bs.isWater()) {
@ -115,19 +118,17 @@ public class CaveHDShader implements HDShader {
protected MapIterator mapiter;
protected HDMap map;
private boolean air;
private int yshift;
private final int sealevel;
private final int ymax, ymin;
final int[] lightingTable;
private OurShaderState(MapIterator mapiter, HDMap map, MapChunkCache cache) {
this.mapiter = mapiter;
this.map = map;
this.color = new Color();
int wheight = mapiter.getWorldHeight();
yshift = 0;
while(wheight > 128) {
wheight >>= 1;
yshift++;
}
this.ymax = mapiter.getWorldHeight() - 1;
this.ymin = mapiter.getWorldYMin();
this.sealevel = mapiter.getWorldSeaLevel();
if (MapManager.mapman.useBrightnessTable()) {
lightingTable = cache.getWorld().getBrightnessTable();
}
@ -187,17 +188,27 @@ public class CaveHDShader implements HDShader {
return false;
}
int cr, cg, cb;
int mult = 256;
int mult;
int ys = mapiter.getY() >> yshift;
if (ys < 64) {
cr = 0;
cg = 64 + ys * 3;
cb = 255 - ys * 4;
} else {
cr = (ys - 64) * 4;
cg = 255;
cb = 0;
int y = mapiter.getY();
if((startColor != null) && (endColor != null))
{
double interp = ((double)(y - this.ymin)) / (this.ymax - this.ymin);
cr = (int)(((1.0 - interp) * startColor.getRed()) + (interp * endColor.getRed()));
cg = (int)(((1.0 - interp) * startColor.getGreen()) + (interp * endColor.getGreen()));
cb = (int)(((1.0 - interp) * startColor.getBlue()) + (interp * endColor.getBlue()));
}
else
{
if (y < this.sealevel) {
cr = 0;
cg = 64 + ((192 * (y - this.ymin)) / (this.sealevel - this.ymin));
cb = 255 - (255 * (y - this.ymin)) / (this.sealevel - this.ymin);
} else {
cr = (255 * (y - this.sealevel)) / (this.ymax - this.sealevel);
cg = 255;
cb = 0;
}
}
/* Figure out which color to use */
switch(ps.getLastBlockStep()) {

View File

@ -34,6 +34,7 @@ public class ChunkVersionHDShader implements HDShader {
}
};
// Mapping from https://minecraft.wiki/w/Data_version
final static DataVersionMap[] versionmap = {
new DataVersionMap(0, "unknown", 0x202020),
new DataVersionMap(1519, "1.13.0", 0xF9E79F),
@ -57,6 +58,13 @@ public class ChunkVersionHDShader implements HDShader {
new DataVersionMap(2730, "1.17.1", 0xEB984E),
new DataVersionMap(2860, "1.18.0", 0xA3E4D7),
new DataVersionMap(2865, "1.18.1", 0x48C9B0),
new DataVersionMap(2975, "1.18.2", 0x38bfa5),
new DataVersionMap(3105, "1.19", 0xd56f82),
new DataVersionMap(3116, "1.19.1", 0xe196a4),
new DataVersionMap(3120, "1.19.2", 0xe7aeb8),
new DataVersionMap(3218, "1.19.3", 0xf8c0c8),
new DataVersionMap(3337, "1.19.4", 0xffb6c1),
};
final static Color unknown_color = new Color(255, 255, 255);

View File

@ -16,7 +16,7 @@ public class CustomBlockModel extends HDBlockModel {
super(bstate, databits, blockset);
try {
Class<?> cls = Class.forName(classname); /* Get class */
render = (CustomRenderer) cls.newInstance();
render = (CustomRenderer) cls.getDeclaredConstructor().newInstance();
if(render.initializeRenderer(HDBlockModels.pdf, bstate.blockName, databits, classparm) == false) {
Log.severe("Error loading custom renderer - " + classname);
render = null;

View File

@ -1,5 +1,6 @@
package org.dynmap.hdmap;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@ -255,7 +256,7 @@ public class HDBlockModels {
}
}
} catch (IOException iox) {
Log.severe("Error processing nodel files");
Log.severe("Error processing model files");
} finally {
if (in != null) {
try { in.close(); } catch (IOException iox) {}
@ -356,7 +357,7 @@ public class HDBlockModels {
int layerbits = 0;
int rownum = 0;
int scale = 0;
rdr = new LineNumberReader(new InputStreamReader(in));
rdr = new LineNumberReader(new BufferedReader(new InputStreamReader(in)));
while ((line = rdr.readLine()) != null) {
boolean skip = false;
int lineNum = rdr.getLineNumber();

View File

@ -153,6 +153,7 @@ public class HDMap extends MapType {
this.append_to_world = configuration.getString("append_to_world", "");
setProtected(configuration.getBoolean("protected", false));
setTileUpdateDelay(configuration.getInteger("tileupdatedelay", -1));
setReadOnly(configuration.getBoolean("readonly", false));
}
public ConfigurationNode saveConfiguration() {
@ -180,6 +181,7 @@ public class HDMap extends MapType {
cn.put("backgroundnight", bg_night_cfg);
cn.put("append_to_world", append_to_world);
cn.put("protected", isProtected());
cn.put("readonly", isReadOnly());
if(this.tileupdatedelay > 0) {
cn.put("tileupdatedelay", this.tileupdatedelay);
}

View File

@ -131,6 +131,12 @@ public class HDMapManager {
/* If limited to one map, and this isn't it, skip */
if((mapname != null) && (!hdmap.getName().equals(mapname)))
continue;
// Maps can be set to read-only, which means they don't get re-rendered
if (map.isReadOnly()) {
continue;
}
shaders.add(hdmap.getShader().getStateInstance(hdmap, cache, mapiter, scale));
}
}

View File

@ -18,7 +18,6 @@ import org.dynmap.Log;
import org.dynmap.MapManager;
import org.dynmap.MapTile;
import org.dynmap.MapType;
import org.dynmap.MapType.ImageFormat;
import org.dynmap.MapTypeState;
import org.dynmap.markers.impl.MarkerAPIImpl;
import org.dynmap.renderer.DynmapBlockState;
@ -1269,7 +1268,7 @@ public class IsoHDPerspective implements HDPerspective {
// Mark the tiles we're going to render as validated
for (int i = 0; i < numshaders; i++) {
MapTypeState mts = world.getMapState(shaderstate[i].getMap());
if (mts != null) {
if (mts != null && mts.type.isReadOnly() == false) {
mts.validateTile(tile.tx, tile.ty);
}
}

View File

@ -1,6 +1,7 @@
package org.dynmap.hdmap;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@ -1254,8 +1255,13 @@ public class TexturePack {
/* Load image */
if(is != null) {
ImageIO.setUseCache(false);
img = ImageIO.read(is);
if(img == null) { throw new FileNotFoundException(); }
try {
img = ImageIO.read(is);
} catch (IOException iox) {
}
if (img == null) {
Log.warning(String.format("Error loading image %s from module %s", fname, modid));
}
}
if(idx >= imgs.length) {
LoadedImage[] newimgs = new LoadedImage[idx+1];
@ -1267,7 +1273,17 @@ public class TexturePack {
imgs[idx].width = img.getWidth();
imgs[idx].height = img.getHeight();
imgs[idx].argb = new int[imgs[idx].width * imgs[idx].height];
img.getRGB(0, 0, imgs[idx].width, imgs[idx].height, imgs[idx].argb, 0, imgs[idx].width);
if (img.getType() == BufferedImage.TYPE_BYTE_GRAY) { // We don't want alpha correction, apparently
float[] buffer = new float[imgs[idx].width * imgs[idx].height];
img.getData().getPixels(0, 0, imgs[idx].width, imgs[idx].height, buffer);
for (int i = 0; i < imgs[idx].argb.length; i++) {
int v = (int) buffer[i];
imgs[idx].argb[i] = 0xFF000000 | (v << 16) | (v << 8) | v;
}
}
else {
img.getRGB(0, 0, imgs[idx].width, imgs[idx].height, imgs[idx].argb, 0, imgs[idx].width);
}
img.flush();
imgs[idx].isLoaded = true;
}
@ -1818,7 +1834,7 @@ public class TexturePack {
try {
String line;
rdr = new LineNumberReader(new InputStreamReader(txtfile));
rdr = new LineNumberReader(new BufferedReader(new InputStreamReader(txtfile)));
while((line = rdr.readLine()) != null) {
if(line.startsWith("#")) {
}
@ -1917,7 +1933,7 @@ public class TexturePack {
Map<DynmapBlockState, BitSet> bsprslt;
try {
String line;
rdr = new LineNumberReader(new InputStreamReader(txtfile));
rdr = new LineNumberReader(new BufferedReader(new InputStreamReader(txtfile)));
while((line = rdr.readLine()) != null) {
boolean skip = false;
int lineNum = rdr.getLineNumber();
@ -2097,7 +2113,7 @@ public class TexturePack {
else if(av[0].equals("custColorMult")) {
try {
Class<?> cls = Class.forName(av[1]);
custColorMult = (CustomColorMultiplier)cls.newInstance();
custColorMult = (CustomColorMultiplier)cls.getDeclaredConstructor().newInstance();
} catch (Exception x) {
Log.severe("Error loading custom color multiplier - " + av[1] + ": " + x.getMessage());
}
@ -2263,7 +2279,7 @@ public class TexturePack {
else if(av[0].equals("custColorMult")) {
try {
Class<?> cls = Class.forName(av[1]);
custColorMult = (CustomColorMultiplier)cls.newInstance();
custColorMult = (CustomColorMultiplier)cls.getDeclaredConstructor().newInstance();
} catch (Exception x) {
Log.severe("Error loading custom color multiplier - " + av[1] + ": " + x.getMessage());
}
@ -2542,7 +2558,11 @@ public class TexturePack {
else {
faceindex = laststep.ordinal();
}
textid = map.faces[faceindex];
try {
textid = map.faces[faceindex];
} catch (ArrayIndexOutOfBoundsException aioob) {
textid = -1;
}
if (ctm != null) {
int mod = 0;
if(textid >= COLORMOD_MULT_INTERNAL) {

View File

@ -1,5 +1,6 @@
package org.dynmap.hdmap;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@ -61,13 +62,13 @@ public class TexturePackLoader {
if (zf != null) {
ZipEntry ze = zf.getEntry(rname);
if ((ze != null) && (!ze.isDirectory())) {
return zf.getInputStream(ze);
return new BufferedInputStream(zf.getInputStream(ze));
}
}
else if (tpdir != null) {
File f = new File(tpdir, rname);
if (f.isFile() && f.canRead()) {
return new FileInputStream(f);
return new BufferedInputStream(new FileInputStream(f));
}
}
} catch (IOException iox) {
@ -75,7 +76,7 @@ public class TexturePackLoader {
// Fall through - load as resource from mod, if possible, or from jar
InputStream is = dsi.openResource(modname, rname);
if (is != null) {
return is;
return new BufferedInputStream(is);
}
if (modname != null) {
ModSource ms = src_by_mod.get(modname);
@ -118,7 +119,7 @@ public class TexturePackLoader {
Log.warning("Resource " + rname + " for mod " + modname + " not found");
}
return is;
return (is != null) ? new BufferedInputStream(is) : null;
}
public void close() {
if(zf != null) {

View File

@ -72,9 +72,9 @@ class AreaMarkerImpl implements AreaMarker, EnterExitMarker {
AreaMarkerImpl(String id, String lbl, boolean markup, String world, double x[], double z[], boolean persistent, MarkerSetImpl set) {
markerid = id;
if(lbl != null)
label = markup ? lbl : Client.encodeForHTML(lbl);
label = markup ? Client.sanitizeHTML(lbl) : Client.encodeForHTML(lbl);
else
label = markup ? id : Client.encodeForHTML(id);
label = markup ? Client.sanitizeHTML(id) : Client.encodeForHTML(id);
this.markup = markup;
this.corners = new ArrayList<Coord>();
for(int i = 0; i < x.length; i++) {
@ -118,9 +118,10 @@ class AreaMarkerImpl implements AreaMarker, EnterExitMarker {
* Load marker from configuration node
* @param node - configuration node
*/
boolean loadPersistentData(ConfigurationNode node) {
boolean loadPersistentData(ConfigurationNode node, boolean isSafe) {
markup = node.getBoolean("markup", false);
label = MarkerAPIImpl.escapeForHTMLIfNeeded(node.getString("label", markerid), markup);
if (!isSafe) label = Client.sanitizeHTML(label);
ytop = node.getDouble("ytop", 64.0);
ybottom = node.getDouble("ybottom", 64.0);
List<Double> xx = node.getList("x");
@ -133,6 +134,7 @@ class AreaMarkerImpl implements AreaMarker, EnterExitMarker {
world = node.getString("world", "world");
normalized_world = DynmapWorld.normalizeWorldName(world);
desc = node.getString("desc", null);
if (!isSafe) desc = Client.sanitizeHTML(desc);
lineweight = node.getInteger("strokeWeight", -1);
if(lineweight == -1) { /* Handle typo-saved value */
lineweight = node.getInteger("stokeWeight", 3);
@ -215,12 +217,7 @@ class AreaMarkerImpl implements AreaMarker, EnterExitMarker {
@Override
public void setLabel(String lbl, boolean markup) {
if(markerset == null) return;
if (markup) {
label = lbl;
}
else { // If not markup, escape any HTML-active characters (<>&"')
label = Client.encodeForHTML(lbl);
}
label = markup ? Client.sanitizeHTML(lbl) : Client.encodeForHTML(lbl);
this.markup = markup;
MarkerAPIImpl.areaMarkerUpdated(this, MarkerUpdate.UPDATED);
if(ispersistent)
@ -298,6 +295,7 @@ class AreaMarkerImpl implements AreaMarker, EnterExitMarker {
@Override
public void setDescription(String desc) {
if(markerset == null) return;
desc = Client.sanitizeHTML(desc);
if((this.desc == null) || (this.desc.equals(desc) == false)) {
this.desc = desc;
MarkerAPIImpl.areaMarkerUpdated(this, MarkerUpdate.UPDATED);

View File

@ -67,6 +67,7 @@ class CircleMarkerImpl implements CircleMarker, EnterExitMarker {
label = markup ? lbl : Client.encodeColorInHTML(lbl);
else
label = markup ? id : Client.encodeColorInHTML(id);
label = Client.sanitizeHTML(label);
this.markup = markup;
this.x = x; this.y = y; this.z = z;
this.xr = xr; this.zr = zr;
@ -86,7 +87,7 @@ class CircleMarkerImpl implements CircleMarker, EnterExitMarker {
CircleMarkerImpl(String id, MarkerSetImpl set) {
markerid = id;
markerset = set;
label = Client.encodeForHTML(id);
label = Client.sanitizeHTML(Client.encodeForHTML(id));
markup = false;
desc = null;
world = normalized_world = "world";
@ -100,9 +101,10 @@ class CircleMarkerImpl implements CircleMarker, EnterExitMarker {
* Load marker from configuration node
* @param node - configuration node
*/
boolean loadPersistentData(ConfigurationNode node) {
boolean loadPersistentData(ConfigurationNode node, boolean isSafe) {
markup = node.getBoolean("markup", false);
label = MarkerAPIImpl.escapeForHTMLIfNeeded(node.getString("label", markerid), markup);
if (!isSafe) label = Client.sanitizeHTML(label);
world = node.getString("world", "world");
normalized_world = DynmapWorld.normalizeWorldName(world);
x = node.getDouble("x", 0);
@ -111,6 +113,7 @@ class CircleMarkerImpl implements CircleMarker, EnterExitMarker {
xr = node.getDouble("xr", 0);
zr = node.getDouble("zr", 0);
desc = node.getString("desc", null);
if (!isSafe) desc = Client.sanitizeHTML(desc);
lineweight = node.getInteger("strokeWeight", -1);
if(lineweight == -1) { /* Handle typo-saved value */
lineweight = node.getInteger("stokeWeight", 3);
@ -192,6 +195,7 @@ class CircleMarkerImpl implements CircleMarker, EnterExitMarker {
@Override
public void setLabel(String lbl, boolean markup) {
label = markup ? lbl : Client.encodeForHTML(lbl);
label = Client.sanitizeHTML(label);
this.markup = markup;
MarkerAPIImpl.circleMarkerUpdated(this, MarkerUpdate.UPDATED);
if(ispersistent)
@ -262,6 +266,7 @@ class CircleMarkerImpl implements CircleMarker, EnterExitMarker {
}
@Override
public void setDescription(String desc) {
desc = Client.sanitizeHTML(desc);
if((this.desc == null) || (this.desc.equals(desc) == false)) {
this.desc = desc;
MarkerAPIImpl.circleMarkerUpdated(this, MarkerUpdate.UPDATED);

View File

@ -102,14 +102,14 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
public MarkerUpdated(Marker m, boolean deleted) {
this.id = m.getMarkerID();
this.label = Client.sanitizeHTML(m.getLabel());
this.label = m.getLabel();
this.x = m.getX();
this.y = m.getY();
this.z = m.getZ();
this.set = m.getMarkerSet().getMarkerSetID();
this.icon = m.getMarkerIcon().getMarkerIconID();
this.markup = true; // We are markup format all the time now
this.desc = Client.sanitizeHTML(m.getDescription());
this.desc = m.getDescription();
this.dim = m.getMarkerIcon().getMarkerIconSize().getSize();
this.minzoom = m.getMinZoom();
this.maxzoom = m.getMaxZoom();
@ -153,7 +153,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
public AreaMarkerUpdated(AreaMarker m, boolean deleted) {
this.id = m.getMarkerID();
this.label = Client.sanitizeHTML(m.getLabel());
this.label = m.getLabel();
this.ytop = m.getTopY();
this.ybottom = m.getBottomY();
int cnt = m.getCornerCount();
@ -168,7 +168,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
opacity = m.getLineOpacity();
fillcolor = String.format("#%06X", m.getFillColor());
fillopacity = m.getFillOpacity();
desc = Client.sanitizeHTML(m.getDescription());
desc = m.getDescription();
this.minzoom = m.getMinZoom();
this.maxzoom = m.getMaxZoom();
this.markup = true; // We are markup format all the time now
@ -211,7 +211,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
public PolyLineMarkerUpdated(PolyLineMarker m, boolean deleted) {
this.id = m.getMarkerID();
this.label = Client.sanitizeHTML(m.getLabel());
this.label = m.getLabel();
this.markup = true; // We are markup format all the time now
int cnt = m.getCornerCount();
x = new double[cnt];
@ -225,7 +225,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
color = String.format("#%06X", m.getLineColor());
weight = m.getLineWeight();
opacity = m.getLineOpacity();
desc = Client.sanitizeHTML(m.getDescription());
desc = m.getDescription();
this.minzoom = m.getMinZoom();
this.maxzoom = m.getMaxZoom();
@ -271,7 +271,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
public CircleMarkerUpdated(CircleMarker m, boolean deleted) {
this.id = m.getMarkerID();
this.label = Client.sanitizeHTML(m.getLabel());
this.label = m.getLabel();
this.x = m.getCenterX();
this.y = m.getCenterY();
this.z = m.getCenterZ();
@ -283,7 +283,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
opacity = m.getLineOpacity();
fillcolor = String.format("#%06X", m.getFillColor());
fillopacity = m.getFillOpacity();
desc = Client.sanitizeHTML(m.getDescription());
desc = m.getDescription();
this.minzoom = m.getMinZoom();
this.maxzoom = m.getMaxZoom();
@ -822,6 +822,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
final ConfigurationNode conf = new ConfigurationNode(api.markerpersist); /* Make configuration object */
/* First, save icon definitions */
HashMap<String, Object> icons = new HashMap<String,Object>();
conf.put("isSafe", true); // Mark as safe (sanitized)
for(String id : api.markericons.keySet()) {
MarkerIconImpl ico = api.markericons.get(id);
Map<String,Object> dat = ico.getPersistentData();
@ -885,13 +886,14 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
ConfigurationNode conf = new ConfigurationNode(api.markerpersist); /* Make configuration object */
conf.load(); /* Load persistence */
lock.writeLock().lock();
boolean isSafe = conf.getBoolean("isSafe", false);
try {
/* Get icons */
ConfigurationNode icons = conf.getNode("icons");
if(icons == null) return false;
for(String id : icons.keySet()) {
MarkerIconImpl ico = new MarkerIconImpl(id);
if(ico.loadPersistentData(icons.getNode(id))) {
if(ico.loadPersistentData(icons.getNode(id), isSafe)) {
markericons.put(id, ico);
}
}
@ -900,7 +902,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
if(sets != null) {
for(String id: sets.keySet()) {
MarkerSetImpl set = new MarkerSetImpl(id);
if(set.loadPersistentData(sets.getNode(id))) {
if(set.loadPersistentData(sets.getNode(id), isSafe)) {
markersets.put(id, set);
}
}
@ -910,7 +912,7 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
if(psets != null) {
for(String id: psets.keySet()) {
PlayerSetImpl set = new PlayerSetImpl(id);
if(set.loadPersistentData(sets.getNode(id))) {
if(set.loadPersistentData(sets.getNode(id), isSafe)) {
playersets.put(id, set);
}
}
@ -2174,6 +2176,10 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
sender.sendMessage("file:\"filename\" required");
return true;
}
if (!validateImportFile(file)) {
sender.sendMessage("Error: '" + ARG_FILE + "' cannot include directory separators - must be just filename in " + plugin.getImportFolder().getAbsolutePath() + " directory");
return true;
}
if(label == null)
label = id;
MarkerIcon ico = MarkerAPIImpl.getMarkerIconImpl(id);
@ -2182,10 +2188,9 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
return true;
}
/* Open stream to filename */
File iconf = new File(file);
FileInputStream fis = null;
try {
fis = new FileInputStream(iconf);
fis = new FileInputStream(new File(plugin.getImportFolder(), file));
/* Create new icon */
MarkerIcon mi = api.createMarkerIcon(id, label, fis);
if(mi == null) {
@ -3199,6 +3204,12 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
}
return true;
}
private static boolean validateImportFile(String fname) {
if ((fname.indexOf('/') >= 0) || (fname.indexOf('\\') >= 0)) {
return false;
}
return true;
}
/** Process importdesc for given item */
private static boolean processImportDesc(DynmapCore plugin, DynmapCommandSender sender, String cmd, String commandLabel, String[] args) {
if(args.length > 1) {
@ -3212,13 +3223,17 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
}
String f = parms.get(ARG_FILE);
if (f == null) {
sender.sendMessage("Error: no '" + ARG_FILE + "' parameter");
sender.sendMessage("file:\"filename\" required");
return true;
}
if (!validateImportFile(f)) {
sender.sendMessage("Error: '" + ARG_FILE + "' cannot include directory separators - must be just filename in " + plugin.getImportFolder().getAbsolutePath() + " directory");
return true;
}
FileReader fr = null;
String val = null;
try {
fr = new FileReader(f);
fr = new FileReader(new File(plugin.getImportFolder(), f));
StringBuilder sb = new StringBuilder();
char[] buf = new char[512];
int len;
@ -3259,13 +3274,17 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
}
String f = parms.get(ARG_FILE);
if (f == null) {
sender.sendMessage("Error: no '" + ARG_FILE + "' parameter");
sender.sendMessage("file:\"filename\" required");
return true;
}
if (!validateImportFile(f)) {
sender.sendMessage("Error: '" + ARG_FILE + "' cannot include directory separators - must be just filename in " + plugin.getImportFolder().getAbsolutePath() + " directory");
return true;
}
FileReader fr = null;
String val = null;
try {
fr = new FileReader(f);
fr = new FileReader(new File(plugin.getImportFolder(), f));
StringBuilder sb = new StringBuilder();
char[] buf = new char[512];
int len;
@ -3329,10 +3348,10 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
mi = MarkerAPIImpl.getMarkerIconImpl(MarkerIcon.DEFAULT);
mdata.put("icon", mi.getMarkerIconID());
mdata.put("dim", mi.getMarkerIconSize().getSize());
mdata.put("label", Client.sanitizeHTML(m.getLabel()));
mdata.put("label", m.getLabel());
mdata.put("markup", m.isLabelMarkup());
if(m.getDescription() != null)
mdata.put("desc", Client.sanitizeHTML(m.getDescription()));
mdata.put("desc", m.getDescription());
if (m.getMinZoom() >= 0) {
mdata.put("minzoom", m.getMinZoom());
}
@ -3365,10 +3384,10 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
mdata.put("opacity", m.getLineOpacity());
mdata.put("fillopacity", m.getFillOpacity());
mdata.put("weight", m.getLineWeight());
mdata.put("label", Client.sanitizeHTML(m.getLabel()));
mdata.put("label", m.getLabel());
mdata.put("markup", m.isLabelMarkup());
if(m.getDescription() != null)
mdata.put("desc", Client.sanitizeHTML(m.getDescription()));
mdata.put("desc", m.getDescription());
if (m.getMinZoom() >= 0) {
mdata.put("minzoom", m.getMinZoom());
}
@ -3400,10 +3419,10 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
mdata.put("color", String.format("#%06X", m.getLineColor()));
mdata.put("opacity", m.getLineOpacity());
mdata.put("weight", m.getLineWeight());
mdata.put("label", Client.sanitizeHTML(m.getLabel()));
mdata.put("label", m.getLabel());
mdata.put("markup", m.isLabelMarkup());
if(m.getDescription() != null)
mdata.put("desc", Client.sanitizeHTML(m.getDescription()));
mdata.put("desc", m.getDescription());
if (m.getMinZoom() >= 0) {
mdata.put("minzoom", m.getMinZoom());
}
@ -3430,10 +3449,10 @@ public class MarkerAPIImpl implements MarkerAPI, Event.Listener<DynmapWorld> {
mdata.put("opacity", m.getLineOpacity());
mdata.put("fillopacity", m.getFillOpacity());
mdata.put("weight", m.getLineWeight());
mdata.put("label", Client.sanitizeHTML(m.getLabel()));
mdata.put("label", m.getLabel());
mdata.put("markup", m.isLabelMarkup());
if(m.getDescription() != null)
mdata.put("desc", Client.sanitizeHTML(m.getDescription()));
mdata.put("desc", m.getDescription());
if (m.getMinZoom() >= 0) {
mdata.put("minzoom", m.getMinZoom());
}

View File

@ -81,7 +81,7 @@ class MarkerIconImpl implements MarkerIcon {
return node;
}
boolean loadPersistentData(ConfigurationNode node) {
boolean loadPersistentData(ConfigurationNode node, boolean isSafe) {
if(is_builtin)
return false;

View File

@ -63,7 +63,7 @@ class MarkerImpl implements Marker {
MarkerImpl(String id, MarkerSetImpl set) {
markerid = id;
markerset = set;
label = Client.encodeForHTML(id);
label = Client.sanitizeHTML(Client.encodeForHTML(id));
markup = false;
desc = null;
x = z = 0; y = 64; world = normalized_world = "world";
@ -75,15 +75,17 @@ class MarkerImpl implements Marker {
* Load marker from configuration node
* @param node - configuration node
*/
boolean loadPersistentData(ConfigurationNode node) {
boolean loadPersistentData(ConfigurationNode node, boolean isSafe) {
markup = node.getBoolean("markup", false);
label = MarkerAPIImpl.escapeForHTMLIfNeeded(node.getString("label", markerid), markup);
if (!isSafe) label = Client.sanitizeHTML(label);
x = node.getDouble("x", 0);
y = node.getDouble("y", 64);
z = node.getDouble("z", 0);
world = node.getString("world", "world");
normalized_world = DynmapWorld.normalizeWorldName(world);
desc = node.getString("desc", null);
if (!isSafe) desc = Client.sanitizeHTML(desc);
minzoom = node.getInteger("minzoom", -1);
maxzoom = node.getInteger("maxzoom", -1);
icon = MarkerAPIImpl.getMarkerIconImpl(node.getString("icon", MarkerIcon.DEFAULT));
@ -168,7 +170,7 @@ class MarkerImpl implements Marker {
@Override
public void setLabel(String lbl, boolean markup) {
if(markerset == null) return;
label = markup ? lbl : Client.encodeForHTML(lbl);
label = Client.sanitizeHTML(markup ? lbl : Client.encodeForHTML(lbl));
this.markup = markup;
MarkerAPIImpl.markerUpdated(this, MarkerUpdate.UPDATED);
if(ispersistent)
@ -239,6 +241,7 @@ class MarkerImpl implements Marker {
@Override
public void setDescription(String desc) {
if(markerset == null) return;
desc = Client.sanitizeHTML(desc);
if((this.desc == null) || (this.desc.equals(desc) == false)) {
this.desc = desc;
MarkerAPIImpl.markerUpdated(this, MarkerUpdate.UPDATED);

View File

@ -449,14 +449,14 @@ class MarkerSetImpl implements MarkerSet {
* Load marker from configuration node
* @param node - configuration node
*/
boolean loadPersistentData(ConfigurationNode node) {
boolean loadPersistentData(ConfigurationNode node, boolean isSafe) {
label = node.getString("label", setid); /* Get label */
ConfigurationNode markernode = node.getNode("markers");
if (markernode != null) {
for(String id : markernode.keySet()) {
MarkerImpl marker = new MarkerImpl(id, this); /* Make and load marker */
ConfigurationNode cfg = markernode.getNode(id);
if ((cfg != null) && marker.loadPersistentData(cfg)) {
if ((cfg != null) && marker.loadPersistentData(cfg, isSafe)) {
markers.put(id, marker);
}
else {
@ -470,7 +470,7 @@ class MarkerSetImpl implements MarkerSet {
for(String id : areamarkernode.keySet()) {
AreaMarkerImpl marker = new AreaMarkerImpl(id, this); /* Make and load marker */
ConfigurationNode cfg = areamarkernode.getNode(id);
if ((cfg != null) && marker.loadPersistentData(cfg)) {
if ((cfg != null) && marker.loadPersistentData(cfg, isSafe)) {
areamarkers.put(id, marker);
if(marker.getBoostFlag()) {
if(boostingareamarkers == null) {
@ -496,7 +496,7 @@ class MarkerSetImpl implements MarkerSet {
for(String id : linemarkernode.keySet()) {
PolyLineMarkerImpl marker = new PolyLineMarkerImpl(id, this); /* Make and load marker */
ConfigurationNode cfg = linemarkernode.getNode(id);
if ((cfg != null) && marker.loadPersistentData(cfg)) {
if ((cfg != null) && marker.loadPersistentData(cfg, isSafe)) {
linemarkers.put(id, marker);
}
else {
@ -510,7 +510,7 @@ class MarkerSetImpl implements MarkerSet {
for(String id : circlemarkernode.keySet()) {
CircleMarkerImpl marker = new CircleMarkerImpl(id, this); /* Make and load marker */
ConfigurationNode cfg = circlemarkernode.getNode(id);
if ((cfg != null) && marker.loadPersistentData(cfg)) {
if ((cfg != null) && marker.loadPersistentData(cfg, isSafe)) {
circlemarkers.put(id, marker);
if(marker.getBoostFlag()) {
if(boostingcirclemarkers == null) {

View File

@ -71,7 +71,7 @@ class PlayerSetImpl implements PlayerSet {
* Load marker from configuration node
* @param node - configuration node
*/
boolean loadPersistentData(ConfigurationNode node) {
boolean loadPersistentData(ConfigurationNode node, boolean isSafe) {
List<String> plist = node.getList("players");
if(plist != null) {
players.clear();

View File

@ -53,6 +53,7 @@ class PolyLineMarkerImpl implements PolyLineMarker {
label = markup ? lbl : Client.encodeForHTML(lbl);
else
label = markup ? id : Client.encodeForHTML(id);
label = Client.sanitizeHTML(label);
this.markup = markup;
this.corners = new ArrayList<Coord>();
for(int i = 0; i < x.length; i++) {
@ -74,7 +75,7 @@ class PolyLineMarkerImpl implements PolyLineMarker {
PolyLineMarkerImpl(String id, MarkerSetImpl set) {
markerid = id;
markerset = set;
label = Client.encodeForHTML(id);
label = Client.sanitizeHTML(Client.encodeForHTML(id));
markup = false;
desc = null;
corners = new ArrayList<Coord>();
@ -86,9 +87,10 @@ class PolyLineMarkerImpl implements PolyLineMarker {
* Load marker from configuration node
* @param node - configuration node
*/
boolean loadPersistentData(ConfigurationNode node) {
boolean loadPersistentData(ConfigurationNode node, boolean isSafe) {
markup = node.getBoolean("markup", false);
label = MarkerAPIImpl.escapeForHTMLIfNeeded(node.getString("label", markerid), markup);
if (!isSafe) label = Client.sanitizeHTML(label);
List<Double> xx = node.getList("x");
List<Double> yy = node.getList("y");
List<Double> zz = node.getList("z");
@ -101,6 +103,7 @@ class PolyLineMarkerImpl implements PolyLineMarker {
world = node.getString("world", "world");
normalized_world = DynmapWorld.normalizeWorldName(world);
desc = node.getString("desc", null);
if (!isSafe) desc = Client.sanitizeHTML(desc);
lineweight = node.getInteger("strokeWeight", -1);
if(lineweight == -1) { /* Handle typo-saved value */
lineweight = node.getInteger("stokeWeight", 3);
@ -164,7 +167,7 @@ class PolyLineMarkerImpl implements PolyLineMarker {
@Override
public void setLabel(String lbl, boolean markup) {
if(markerset == null) return;
label = markup ? lbl : Client.encodeForHTML(lbl);
label = markup ? Client.sanitizeHTML(lbl) : Client.encodeForHTML(lbl);
this.markup = markup;
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);
if(ispersistent)
@ -223,6 +226,7 @@ class PolyLineMarkerImpl implements PolyLineMarker {
@Override
public void setDescription(String desc) {
if(markerset == null) return;
desc = Client.sanitizeHTML(desc);
if((this.desc == null) || (this.desc.equals(desc) == false)) {
this.desc = desc;
MarkerAPIImpl.polyLineMarkerUpdated(this, MarkerUpdate.UPDATED);

View File

@ -1,8 +1,10 @@
package org.dynmap.modsupport.impl;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Locale;
@ -274,9 +276,9 @@ public class ModModelDefinitionImpl implements ModModelDefinition {
return;
}
File f = new File(destdir, this.txtDef.getModID() + "-models.txt");
FileWriter fw = null;
Writer fw = null;
try {
fw = new FileWriter(f);
fw = new BufferedWriter(new FileWriter(f));
// Write modname line
String s = "modname:" + this.txtDef.getModID();
fw.write(s + "\n\n");

View File

@ -1,8 +1,10 @@
package org.dynmap.modsupport.impl;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
@ -278,9 +280,9 @@ public class ModTextureDefinitionImpl implements ModTextureDefinition {
public void writeToFile(File destdir) throws IOException {
File f = new File(destdir, this.modid + "-texture.txt");
FileWriter fw = null;
Writer fw = null;
try {
fw = new FileWriter(f);
fw = new BufferedWriter(new FileWriter(f));
// Write modname line
String s = "modname:" + this.modid;
fw.write(s + "\n\n");

View File

@ -3,6 +3,7 @@ package org.dynmap.modsupport.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Locale;
import org.dynmap.modsupport.BlockSide;
import org.dynmap.modsupport.ModelBlockModel;
@ -69,16 +70,16 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod
String line;
line = String.format("modellist:%s", ids);
for (ModelBlockImpl mb: boxes) {
line += String.format(",box=%f/%f/%f", mb.from[0], mb.from[1], mb.from[2]);
line += String.format(Locale.US, ",box=%f/%f/%f", mb.from[0], mb.from[1], mb.from[2]);
if (!mb.shade) { // if shade=false
line += "/false";
}
line += String.format(":%f/%f/%f", mb.to[0], mb.to[1], mb.to[2]);
line += String.format(Locale.US, ":%f/%f/%f", mb.to[0], mb.to[1], mb.to[2]);
if ((mb.xrot != 0) || (mb.yrot != 0) || (mb.zrot != 0)) { // If needed, add rotation
line += String.format("/%f/%f/%f", mb.xrot, mb.yrot, mb.zrot);
line += String.format(Locale.US, "/%f/%f/%f", mb.xrot, mb.yrot, mb.zrot);
// If origin also defined, add it
if (mb.rotorigin != null) {
line += String.format("/%f/%f/%f", mb.rotorigin[0], mb.rotorigin[1], mb.rotorigin[2]);
line += String.format(Locale.US, "/%f/%f/%f", mb.rotorigin[0], mb.rotorigin[1], mb.rotorigin[2]);
}
}
for (BlockSide bs : fromBlockSide.keySet()) {
@ -101,7 +102,7 @@ public class ModelBlockModelImpl extends BlockModelImpl implements ModelBlockMod
break;
}
if (mside.uv != null) {
line += String.format(":%s/%d/%f/%f/%f/%f", rval, mside.textureid, mside.uv[0], mside.uv[1], mside.uv[2], mside.uv[3]);
line += String.format(Locale.US, ":%s/%d/%f/%f/%f/%f", rval, mside.textureid, mside.uv[0], mside.uv[1], mside.uv[2], mside.uv[3]);
}
else {
line += String.format(":%s/%d", rval, mside.textureid);

View File

@ -22,7 +22,6 @@ import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;

View File

@ -26,13 +26,18 @@ public abstract class MapStorage {
private static HashMap<String, Integer> filelocks = new HashMap<String, Integer>();
private static final Integer WRITELOCK = (-1);
protected File baseStandaloneDir;
protected boolean isShutdown;
protected long serverID;
protected MapStorage() {
this.serverID = 0;
this.isShutdown = false;
}
public void shutdownStorage() {
this.isShutdown = true;
}
// Proper modulo - versus the bogus Java behavior of negative modulo for negative numerators
protected static final int modulo(int x, int y) {
return ((x % y) + y) % y;
@ -475,6 +480,7 @@ public abstract class MapStorage {
}
public void logSQLException(String opmsg, SQLException x) {
if (isShutdown) return;
Log.severe("SQLException: " + opmsg);
Log.severe(" ErrorCode: " + x.getErrorCode() + ", SQLState=" + x.getSQLState());
Log.severe(" Message: " + x.getMessage());
@ -485,4 +491,11 @@ public abstract class MapStorage {
cause = cause.getCause();
}
}
public static class StorageShutdownException extends Exception {
private static final long serialVersionUID = 8961471920726795043L;
public StorageShutdownException() {}
}
}

View File

@ -1,6 +1,7 @@
package org.dynmap.storage.aws_s3;
import java.io.IOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@ -66,8 +67,9 @@ public class AWSS3MapStorage extends MapStorage {
@Override
public boolean exists() {
boolean exists = false;
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
ListObjectsV2Request req = ListObjectsV2Request.builder().bucketName(bucketname).prefix(baseKey).maxKeys(1).build();
ListObjectsV2Response rslt = s3.listObjectsV2(req);
if ((rslt != null) && (rslt.getKeyCount() > 0))
@ -76,6 +78,8 @@ public class AWSS3MapStorage extends MapStorage {
if (!x.getCode().equals("SignatureDoesNotMatch")) { // S3 behavior when no object match....
Log.severe("AWS Exception", x);
}
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
@ -89,15 +93,17 @@ public class AWSS3MapStorage extends MapStorage {
@Override
public TileRead read() {
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
GetObjectRequest req = GetObjectRequest.builder().bucketName(bucketname).key(baseKey).build();
ResponseBytes<GetObjectResponse> obj = s3.getObjectAsBytes(req);
if (obj != null) {
GetObjectResponse rsp = obj.getResponse();
TileRead tr = new TileRead();
byte[] buf = obj.getBytes();
tr.image = new BufferInputStream(buf);
if (buf == null) { return null; }
tr.image = new BufferInputStream(buf);
tr.format = ImageEncoding.fromContentType(rsp.getContentType());
Map<String, String> meta = rsp.getMetadata();
String v = meta.get("x-dynmap-hash");
@ -114,6 +120,7 @@ public class AWSS3MapStorage extends MapStorage {
return null; // Nominal case if it doesn't exist
} catch (S3Exception x) {
Log.severe("AWS Exception", x);
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
@ -123,8 +130,9 @@ public class AWSS3MapStorage extends MapStorage {
@Override
public boolean write(long hash, BufferOutputStream encImage, long timestamp) {
boolean done = false;
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
if (encImage == null) { // Delete?
DeleteObjectRequest req = DeleteObjectRequest.builder().bucketName(bucketname).key(baseKey).build();
s3.deleteObject(req);
@ -132,11 +140,12 @@ public class AWSS3MapStorage extends MapStorage {
else {
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType(map.getImageFormat().getEncoding().getContentType())
.addMetadata("x-dynmap-hash", Long.toHexString(hash)).addMetadata("x-dynmap-ts", Long.toString(timestamp)).build();
s3.putObject(req, RequestBody.fromBytes(encImage.buf, encImage.len));
s3.putObject(req, RequestBody.fromBytes(encImage.buf));
}
done = true;
} catch (S3Exception x) {
Log.severe("AWS Exception", x);
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
@ -213,7 +222,7 @@ public class AWSS3MapStorage extends MapStorage {
}
private String bucketname;
private String region;
private Region region;
private String access_key_id;
private String secret_access_key;
private String prefix;
@ -240,21 +249,32 @@ public class AWSS3MapStorage extends MapStorage {
}
// Get our settings
bucketname = core.configuration.getString("storage/bucketname", "dynmap");
region = core.configuration.getString("storage/region", "us-east-1");
access_key_id = core.configuration.getString("storage/aws_access_key_id", System.getenv("AWS_ACCESS_KEY_ID"));
secret_access_key = core.configuration.getString("storage/aws_secret_access_key", System.getenv("AWS_SECRET_ACCESS_KEY"));
prefix = core.configuration.getString("storage/prefix", "");
// Either use a custom region, or one of the default AWS regions
String region_name = core.configuration.getString("storage/region", "us-east-1");
String region_endpoint = core.configuration.getString("storage/override_endpoint", "");
if (region_endpoint.length() > 0) {
region = Region.of(region_name, URI.create(region_endpoint));
} else {
region = Region.fromString(region_name);
}
if ((prefix.length() > 0) && (prefix.charAt(prefix.length()-1) != '/')) {
prefix += '/';
}
// Now creste the access client for the S3 service
Log.info("Using AWS S3 storage: web site at S3 bucket " + bucketname + " in region " + region);
S3Client s3 = getConnection();
if (s3 == null) {
Log.severe("Error creating S3 access client");
return false;
}
S3Client s3 = null;
try {
s3 = getConnection();
if (s3 == null) {
Log.severe("Error creating S3 access client");
return false;
}
// Make sure bucket exists (do list)
ListObjectsV2Request listreq = ListObjectsV2Request.builder()
.bucketName(bucketname)
@ -270,6 +290,8 @@ public class AWSS3MapStorage extends MapStorage {
} catch (S3Exception s3x) {
Log.severe("AWS Exception", s3x);
return false;
} catch (StorageShutdownException x) {
return false;
} finally {
releaseConnection(s3);
}
@ -334,8 +356,9 @@ public class AWSS3MapStorage extends MapStorage {
String basekey = prefix + "tiles/" + world.getName() + "/" + map.getPrefix() + var.variantSuffix + "/";
ListObjectsV2Request req = ListObjectsV2Request.builder().bucketName(bucketname).prefix(basekey).maxKeys(1000).build();
boolean done = false;
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
while (!done) {
ListObjectsV2Response result = s3.listObjectsV2(req);
List<S3Object> objects = result.getContents();
@ -395,6 +418,7 @@ public class AWSS3MapStorage extends MapStorage {
Log.severe("AWS Exception", x);
Log.severe("req=" + req);
}
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
@ -442,8 +466,9 @@ public class AWSS3MapStorage extends MapStorage {
private void processPurgeMapTiles(DynmapWorld world, MapType map, ImageVariant var) {
String basekey = prefix + "tiles/" + world.getName() + "/" + map.getPrefix() + var.variantSuffix + "/";
ListObjectsV2Request req = ListObjectsV2Request.builder().bucketName(bucketname).prefix(basekey).delimiter("").maxKeys(1000).encodingType("url").requestPayer("requester").build();
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
boolean done = false;
while (!done) {
ListObjectsV2Response result = s3.listObjectsV2(req);
@ -466,6 +491,7 @@ public class AWSS3MapStorage extends MapStorage {
Log.severe("AWS Exception", x);
Log.severe("req=" + req);
}
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
@ -494,19 +520,21 @@ public class AWSS3MapStorage extends MapStorage {
BufferOutputStream encImage) {
boolean done = false;
String baseKey = prefix + "tiles/faces/" + facetype.id + "/" + playername + ".png";
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
if (encImage == null) { // Delete?
DeleteObjectRequest delreq = DeleteObjectRequest.builder().bucketName(bucketname).key(baseKey).build();
s3.deleteObject(delreq);
}
else {
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType("image/png").build();
s3.putObject(req, RequestBody.fromBytes(encImage.buf, encImage.len));
s3.putObject(req, RequestBody.fromBytes(encImage.buf));
}
done = true;
} catch (S3Exception x) {
Log.severe("AWS Exception", x);
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
@ -523,8 +551,9 @@ public class AWSS3MapStorage extends MapStorage {
public boolean hasPlayerFaceImage(String playername, FaceType facetype) {
String baseKey = prefix + "tiles/faces/" + facetype.id + "/" + playername + ".png";
boolean exists = false;
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
ListObjectsV2Request req = ListObjectsV2Request.builder().bucketName(bucketname).prefix(baseKey).maxKeys(1).build();
ListObjectsV2Response rslt = s3.listObjectsV2(req);
if ((rslt != null) && (rslt.getKeyCount() > 0))
@ -533,6 +562,7 @@ public class AWSS3MapStorage extends MapStorage {
if (!x.getCode().equals("SignatureDoesNotMatch")) { // S3 behavior when no object match....
Log.severe("AWS Exception", x);
}
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
@ -543,19 +573,21 @@ public class AWSS3MapStorage extends MapStorage {
public boolean setMarkerImage(String markerid, BufferOutputStream encImage) {
boolean done = false;
String baseKey = prefix + "tiles/_markers_/" + markerid + ".png";
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
if (encImage == null) { // Delete?
DeleteObjectRequest delreq = DeleteObjectRequest.builder().bucketName(bucketname).key(baseKey).build();
s3.deleteObject(delreq);
}
else {
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType("image/png").build();
s3.putObject(req, RequestBody.fromBytes(encImage.buf, encImage.len));
s3.putObject(req, RequestBody.fromBytes(encImage.buf));
}
done = true;
} catch (S3Exception x) {
Log.severe("AWS Exception", x);
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
@ -571,8 +603,9 @@ public class AWSS3MapStorage extends MapStorage {
public boolean setMarkerFile(String world, String content) {
boolean done = false;
String baseKey = prefix + "tiles/_markers_/marker_" + world + ".json";
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
if (content == null) { // Delete?
DeleteObjectRequest delreq = DeleteObjectRequest.builder().bucketName(bucketname).key(baseKey).build();
s3.deleteObject(delreq);
@ -584,6 +617,7 @@ public class AWSS3MapStorage extends MapStorage {
done = true;
} catch (S3Exception x) {
Log.severe("AWS Exception", x);
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
@ -668,8 +702,9 @@ public class AWSS3MapStorage extends MapStorage {
boolean done = false;
String baseKey = prefix + fileid;
S3Client s3 = getConnection();
S3Client s3 = null;
try {
s3 = getConnection();
byte[] cacheval = standalone_cache.get(fileid);
if (content == null) { // Delete?
@ -710,20 +745,22 @@ public class AWSS3MapStorage extends MapStorage {
ct = "application/x-javascript";
}
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType(ct).build();
s3.putObject(req, RequestBody.fromBytes(content.buf, content.len));
s3.putObject(req, RequestBody.fromBytes(content.buf));
standalone_cache.put(fileid, digest);
}
done = true;
} catch (S3Exception x) {
Log.severe("AWS Exception", x);
} catch (StorageShutdownException x) {
} finally {
releaseConnection(s3);
}
return done;
}
private S3Client getConnection() throws S3Exception {
private S3Client getConnection() throws S3Exception, StorageShutdownException {
S3Client c = null;
if (isShutdown) throw new StorageShutdownException();
synchronized (cpool) {
while (c == null) {
for (int i = 0; i < cpool.length; i++) { // See if available connection
@ -737,7 +774,7 @@ public class AWSS3MapStorage extends MapStorage {
if (cpoolCount < POOLSIZE) { // Still more we can have
c = new DefaultS3ClientBuilder()
.credentialsProvider(() -> AwsBasicCredentials.create(access_key_id, secret_access_key))
.region(Region.fromString(region))
.region(region)
.httpClient(URLConnectionSdkHttpClient.create())
.build();
if (c == null) {

View File

@ -49,6 +49,8 @@ public class MicrosoftSQLMapStorage extends MapStorage {
protected int port;
private static final int POOLSIZE = 5;
private Connection[] cpool = new Connection[POOLSIZE];
private long[] cpoolLastUseTS = new long[POOLSIZE]; // Time when last returned to pool
private static final long IDLE_TIMEOUT = 60000; // Use 60 second timeout
private int cpoolCount = 0;
private static final Charset UTF8 = Charset.forName("UTF-8");
@ -132,7 +134,11 @@ public class MicrosoftSQLMapStorage extends MapStorage {
rslt.lastModified = rs.getLong("LastUpdate");
rslt.format = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
byte[] img = rs.getBytes("Image");
rslt.image = new BufferInputStream(img);
if (img == null) {
rslt = null;
} else {
rslt.image = new BufferInputStream(img);
}
}
rs.close();
stmt.close();
@ -523,12 +529,22 @@ public class MicrosoftSQLMapStorage extends MapStorage {
private Connection getConnection() throws SQLException {
Connection c = null;
synchronized (cpool) {
long now = System.currentTimeMillis();
while (c == null) {
for (int i = 0; i < cpool.length; i++) { // See if available connection
if (cpool[i] != null) { // Found one
c = cpool[i];
cpool[i] = null;
break;
// If in pool too long, close it and move on
if ((now - cpoolLastUseTS[i]) > IDLE_TIMEOUT) {
try { cpool[i].close(); } catch (SQLException x) {}
cpool[i] = null;
cpoolCount--;
}
else { // Else, use the connection
c = cpool[i];
cpool[i] = null;
cpoolLastUseTS[i] = now;
break;
}
}
}
if (c == null) {
@ -561,6 +577,7 @@ public class MicrosoftSQLMapStorage extends MapStorage {
for (int i = 0; i < POOLSIZE; i++) {
if (cpool[i] == null) {
cpool[i] = c;
cpoolLastUseTS[i] = System.currentTimeMillis(); // Record last use time
c = null; // Mark it recovered (no close needed
cpool.notifyAll();
break;
@ -672,22 +689,32 @@ public class MicrosoftSQLMapStorage extends MapStorage {
}
try {
c = getConnection();
// Query tiles for given mapkey
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery("SELECT x,y,zoom,Format FROM " + tableTiles + " WHERE MapID=" + mapkey + ";");
while (rs.next()) {
StorageTile st = new StorageTile(world, map, rs.getInt("x"), rs.getInt("y"), rs.getInt("zoom"), var);
final MapType.ImageEncoding encoding = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
if(cb != null)
cb.tileFound(st, encoding);
if(cbBase != null && st.zoom == 0)
cbBase.tileFound(st, encoding);
st.cleanup();
boolean done = false;
int offset = 0;
int limit = 100;
while (!done) {
// Query tiles for given mapkey
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery(String.format("SELECT x,y,zoom,Format FROM %s WHERE MapID=%d OFFSET %d LIMIT %d;", tableTiles, mapkey, offset, limit));
int cnt = 0;
while (rs.next()) {
StorageTile st = new StorageTile(world, map, rs.getInt("x"), rs.getInt("y"), rs.getInt("zoom"), var);
final MapType.ImageEncoding encoding = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
if(cb != null)
cb.tileFound(st, encoding);
if(cbBase != null && st.zoom == 0)
cbBase.tileFound(st, encoding);
st.cleanup();
cnt++;
}
rs.close();
stmt.close();
if (cnt < limit) done = true;
offset += cnt;
}
if(cbEnd != null)
cbEnd.searchEnded();
rs.close();
stmt.close();
} catch (SQLException x) {
logSQLException("Tile enum error", x);
err = true;

View File

@ -49,6 +49,8 @@ public class MySQLMapStorage extends MapStorage {
protected int port;
private static final int POOLSIZE = 5;
private Connection[] cpool = new Connection[POOLSIZE];
private long[] cpoolLastUseTS = new long[POOLSIZE]; // Time when last returned to pool
private static final long IDLE_TIMEOUT = 60000; // Use 60 second timeout
private int cpoolCount = 0;
private static final Charset UTF8 = Charset.forName("UTF-8");
@ -85,6 +87,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile exists error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -110,6 +114,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile matches hash error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -133,13 +139,19 @@ public class MySQLMapStorage extends MapStorage {
rslt.format = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
byte[] img = rs.getBytes("NewImage");
if (img == null) img = rs.getBytes("Image");
rslt.image = new BufferInputStream(img);
if (img == null) {
rslt = null;
} else {
rslt.image = new BufferInputStream(img);
}
}
rs.close();
stmt.close();
} catch (SQLException x) {
logSQLException("Tile read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -196,6 +208,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -382,6 +396,8 @@ public class MySQLMapStorage extends MapStorage {
stmt.close();
} catch (SQLException x) {
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (c != null) { releaseConnection(c, err); }
}
@ -421,6 +437,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Error loading map table", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
c = null;
@ -460,6 +478,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Error updating Maps table", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -492,6 +512,9 @@ public class MySQLMapStorage extends MapStorage {
logSQLException("Error creating tables", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -509,6 +532,9 @@ public class MySQLMapStorage extends MapStorage {
logSQLException("Error updating tables to version=2", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -527,6 +553,9 @@ public class MySQLMapStorage extends MapStorage {
logSQLException("Error updating tables to version=3", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -545,6 +574,9 @@ public class MySQLMapStorage extends MapStorage {
logSQLException("Error updating tables to version=4", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -579,6 +611,9 @@ public class MySQLMapStorage extends MapStorage {
logSQLException("Error updating tables to version=5", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -595,6 +630,9 @@ public class MySQLMapStorage extends MapStorage {
logSQLException("Error updating tables to version=5", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -607,15 +645,26 @@ public class MySQLMapStorage extends MapStorage {
return true;
}
private Connection getConnection() throws SQLException {
private Connection getConnection() throws SQLException, StorageShutdownException {
Connection c = null;
if (isShutdown) { throw new StorageShutdownException(); }
synchronized (cpool) {
long now = System.currentTimeMillis();
while (c == null) {
for (int i = 0; i < cpool.length; i++) { // See if available connection
if (cpool[i] != null) { // Found one
c = cpool[i];
cpool[i] = null;
break;
// If in pool too long, close it and move on
if ((now - cpoolLastUseTS[i]) > IDLE_TIMEOUT) {
try { cpool[i].close(); } catch (SQLException x) {}
cpool[i] = null;
cpoolCount--;
}
else { // Else, use the connection
c = cpool[i];
cpool[i] = null;
cpoolLastUseTS[i] = now;
break;
}
}
}
if (c == null) {
@ -648,6 +697,7 @@ public class MySQLMapStorage extends MapStorage {
for (int i = 0; i < POOLSIZE; i++) {
if (cpool[i] == null) {
cpool[i] = c;
cpoolLastUseTS[i] = System.currentTimeMillis(); // Record last use time
c = null; // Mark it recovered (no close needed
cpool.notifyAll();
break;
@ -759,9 +809,10 @@ public class MySQLMapStorage extends MapStorage {
}
try {
c = getConnection();
// Query tiles for given mapkey
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery("SELECT x,y,zoom,Format FROM " + tableTiles + " WHERE MapID=" + mapkey + ";");
Statement stmt = c.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, //we want to stream our resultset one row at a time, we are not interessted in going back
java.sql.ResultSet.CONCUR_READ_ONLY); //since we do not handle the entire resultset in memory -> tell the statement that we are going to work read only
stmt.setFetchSize(100); //we can change the jdbc "retrieval chunk size". Basicly we limit how much rows are kept in memory. Bigger value = less network calls to DB, but more memory consumption
ResultSet rs = stmt.executeQuery(String.format("SELECT x,y,zoom,Format FROM %s WHERE MapID=%d;", tableTiles, mapkey)); //we do the query, but do not set any limit / offset. Since data is not kept in memory, just streamed from DB this should not be a problem, only the rows from setFetchSize are kept in memory.
while (rs.next()) {
StorageTile st = new StorageTile(world, map, rs.getInt("x"), rs.getInt("y"), rs.getInt("zoom"), var);
final MapType.ImageEncoding encoding = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
@ -771,13 +822,15 @@ public class MySQLMapStorage extends MapStorage {
cbBase.tileFound(st, encoding);
st.cleanup();
}
if(cbEnd != null)
cbEnd.searchEnded();
rs.close();
stmt.close();
if(cbEnd != null)
cbEnd.searchEnded();
} catch (SQLException x) {
logSQLException("Tile enum error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -816,6 +869,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile purge error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -855,6 +910,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Face write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -882,6 +939,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Face reqd error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -907,6 +966,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Face exists error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -954,6 +1015,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (rs != null) { try { rs.close(); } catch (SQLException sx) {} }
if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} }
@ -981,6 +1044,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -1027,6 +1092,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker file write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (rs != null) { try { rs.close(); } catch (SQLException sx) {} }
if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} }
@ -1054,6 +1121,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker file read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -1110,6 +1179,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Standalone file read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -1160,6 +1231,8 @@ public class MySQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Standalone file write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (rs != null) { try { rs.close(); } catch (SQLException sx) {} }
if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} }

View File

@ -49,6 +49,8 @@ public class PostgreSQLMapStorage extends MapStorage {
private int port;
private static final int POOLSIZE = 5;
private Connection[] cpool = new Connection[POOLSIZE];
private long[] cpoolLastUseTS = new long[POOLSIZE]; // Time when last returned to pool
private static final long IDLE_TIMEOUT = 60000; // Use 60 second timeout
private int cpoolCount = 0;
private static final Charset UTF8 = Charset.forName("UTF-8");
@ -87,6 +89,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile exists error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -112,6 +116,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile matches hash error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -134,13 +140,19 @@ public class PostgreSQLMapStorage extends MapStorage {
rslt.lastModified = rs.getLong("LastUpdate");
rslt.format = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
byte[] img = rs.getBytes("Image");
rslt.image = new BufferInputStream(img);
if (img == null) {
rslt = null;
} else {
rslt.image = new BufferInputStream(img);
}
}
rs.close();
stmt.close();
} catch (SQLException x) {
logSQLException("Tile read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -197,6 +209,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -366,6 +380,8 @@ public class PostgreSQLMapStorage extends MapStorage {
stmt.close();
} catch (SQLException x) {
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (c != null) { releaseConnection(c, err); }
}
@ -403,6 +419,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Error loading map table", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
c = null;
@ -442,6 +460,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Error updating Maps table", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -474,6 +494,9 @@ public class PostgreSQLMapStorage extends MapStorage {
logSQLException("Error creating tables", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -491,6 +514,9 @@ public class PostgreSQLMapStorage extends MapStorage {
logSQLException("Error upgrading tables to version=2", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -509,6 +535,9 @@ public class PostgreSQLMapStorage extends MapStorage {
logSQLException("Error upgrading tables to version=3", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -525,6 +554,9 @@ public class PostgreSQLMapStorage extends MapStorage {
logSQLException("Error upgrading tables to version=4", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -537,15 +569,26 @@ public class PostgreSQLMapStorage extends MapStorage {
return true;
}
private Connection getConnection() throws SQLException {
private Connection getConnection() throws SQLException, StorageShutdownException {
Connection c = null;
if (isShutdown) throw new StorageShutdownException();
synchronized (cpool) {
long now = System.currentTimeMillis();
while (c == null) {
for (int i = 0; i < cpool.length; i++) { // See if available connection
if (cpool[i] != null) { // Found one
c = cpool[i];
cpool[i] = null;
break;
// If in pool too long, close it and move on
if ((now - cpoolLastUseTS[i]) > IDLE_TIMEOUT) {
try { cpool[i].close(); } catch (SQLException x) {}
cpool[i] = null;
cpoolCount--;
}
else { // Else, use the connection
c = cpool[i];
cpool[i] = null;
cpoolLastUseTS[i] = now;
break;
}
}
}
if (c == null) {
@ -577,6 +620,7 @@ public class PostgreSQLMapStorage extends MapStorage {
for (int i = 0; i < POOLSIZE; i++) {
if (cpool[i] == null) {
cpool[i] = c;
cpoolLastUseTS[i] = System.currentTimeMillis(); // Record last use time
c = null; // Mark it recovered (no close needed
cpool.notifyAll();
break;
@ -671,25 +715,36 @@ public class PostgreSQLMapStorage extends MapStorage {
}
try {
c = getConnection();
// Query tiles for given mapkey
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery("SELECT x,y,zoom,Format FROM " + tableTiles + " WHERE MapID=" + mapkey + ";");
while (rs.next()) {
StorageTile st = new StorageTile(world, map, rs.getInt("x"), rs.getInt("y"), rs.getInt("zoom"), var);
final MapType.ImageEncoding encoding = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
if(cb != null)
cb.tileFound(st, encoding);
if(cbBase != null && st.zoom == 0)
cbBase.tileFound(st, encoding);
st.cleanup();
boolean done = false;
int offset = 0;
int limit = 100;
while (!done) {
// Query tiles for given mapkey
Statement stmt = c.createStatement();
ResultSet rs = stmt.executeQuery(String.format("SELECT x,y,zoom,Format FROM %s WHERE MapID=%d OFFSET %d LIMIT %d;", tableTiles, mapkey, offset, limit));
int cnt = 0;
while (rs.next()) {
StorageTile st = new StorageTile(world, map, rs.getInt("x"), rs.getInt("y"), rs.getInt("zoom"), var);
final MapType.ImageEncoding encoding = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
if(cb != null)
cb.tileFound(st, encoding);
if(cbBase != null && st.zoom == 0)
cbBase.tileFound(st, encoding);
st.cleanup();
cnt++;
}
rs.close();
stmt.close();
if (cnt < limit) done = true;
offset += cnt;
}
if(cbEnd != null)
cbEnd.searchEnded();
rs.close();
stmt.close();
} catch (SQLException x) {
logSQLException("Tile enum error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -744,6 +799,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile purge error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -783,6 +840,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Face write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -810,6 +869,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Face read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -835,6 +896,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Face exists error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -882,6 +945,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (rs != null) { try { rs.close(); } catch (SQLException sx) {} }
if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} }
@ -909,6 +974,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -955,6 +1022,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker file write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (rs != null) { try { rs.close(); } catch (SQLException sx) {} }
if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} }
@ -982,6 +1051,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker file read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -1038,6 +1109,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Standalone file read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -1088,6 +1161,8 @@ public class PostgreSQLMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Standalone file write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (rs != null) { try { rs.close(); } catch (SQLException sx) {} }
if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} }

View File

@ -33,6 +33,8 @@ public class SQLiteMapStorage extends MapStorage {
private String databaseFile;
private static final int POOLSIZE = 1; // SQLite is really not thread safe... 1 at a time works best
private Connection[] cpool = new Connection[POOLSIZE];
private long[] cpoolLastUseTS = new long[POOLSIZE]; // Time when last returned to pool
private static final long IDLE_TIMEOUT = 60000; // Use 60 second timeout
private int cpoolCount = 0;
private static final Charset UTF8 = Charset.forName("UTF-8");
@ -70,6 +72,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile exists error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -96,6 +100,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile matches hash error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -125,13 +131,19 @@ public class SQLiteMapStorage extends MapStorage {
// Trim trailing zeros from padding by BLOB field
while((len > 0) && (img[len-1] == '\0')) len--;
}
rslt.image = new BufferInputStream(img, len);
if (img == null) {
rslt = null;
} else {
rslt.image = new BufferInputStream(img, len);
}
}
rs.close();
stmt.close();
} catch (SQLException x) {
logSQLException("Tile read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -191,6 +203,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -269,6 +283,7 @@ public class SQLiteMapStorage extends MapStorage {
@Override
public boolean init(DynmapCore core) {
if (!super.init(core)) {
isShutdown = true;
return false;
}
File dbfile = core.getFile(core.configuration.getString("storage/dbfile", "dynmap.db"));
@ -281,6 +296,7 @@ public class SQLiteMapStorage extends MapStorage {
return initializeTables();
} catch (ClassNotFoundException cnfx) {
Log.severe("SQLite-JDBC classes not found - sqlite data source not usable");
isShutdown = true;
return false;
}
}
@ -301,6 +317,8 @@ public class SQLiteMapStorage extends MapStorage {
stmt.close();
} catch (SQLException x) {
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (c != null) { releaseConnection(c, err); }
}
@ -339,6 +357,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Error loading map table", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
c = null;
@ -378,6 +398,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Error updating Maps table", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -410,6 +432,9 @@ public class SQLiteMapStorage extends MapStorage {
logSQLException("Error creating tables", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -428,6 +453,9 @@ public class SQLiteMapStorage extends MapStorage {
logSQLException("Error updating tables to version=2", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -445,6 +473,9 @@ public class SQLiteMapStorage extends MapStorage {
logSQLException("Error updating tables to version=3", x);
err = true;
return false;
} catch (StorageShutdownException x) {
err = true;
return false;
} finally {
releaseConnection(c, err);
c = null;
@ -457,14 +488,28 @@ public class SQLiteMapStorage extends MapStorage {
return true;
}
private Connection getConnection() throws SQLException {
private Connection getConnection() throws SQLException, StorageShutdownException {
Connection c = null;
if (isShutdown) {
throw new StorageShutdownException();
}
synchronized (cpool) {
long now = System.currentTimeMillis();
while (c == null) {
for (int i = 0; i < cpool.length; i++) { // See if available connection
if (cpool[i] != null) { // Found one
c = cpool[i];
cpool[i] = null;
// If in pool too long, close it and move on
if ((now - cpoolLastUseTS[i]) > IDLE_TIMEOUT) {
try { cpool[i].close(); } catch (SQLException x) {}
cpool[i] = null;
cpoolCount--;
}
else { // Else, use the connection
c = cpool[i];
cpool[i] = null;
cpoolLastUseTS[i] = now;
break;
}
}
}
if (c == null) {
@ -488,6 +533,7 @@ public class SQLiteMapStorage extends MapStorage {
private static Connection configureConnection(Connection conn) throws SQLException {
final Statement statement = conn.createStatement();
statement.execute("PRAGMA auto_vacuum = FULL;");
statement.execute("PRAGMA journal_mode = WAL;");
statement.close();
return conn;
@ -500,6 +546,7 @@ public class SQLiteMapStorage extends MapStorage {
for (int i = 0; i < POOLSIZE; i++) {
if (cpool[i] == null) {
cpool[i] = c;
cpoolLastUseTS[i] = System.currentTimeMillis(); // Record last use time
c = null; // Mark it recovered (no close needed
cpool.notifyAll();
break;
@ -612,27 +659,39 @@ public class SQLiteMapStorage extends MapStorage {
return;
}
try {
c = getConnection();
// Query tiles for given mapkey
Statement stmt = c.createStatement();
//ResultSet rs = stmt.executeQuery("SELECT x,y,zoom,Format FROM Tiles WHERE MapID=" + mapkey + ";");
ResultSet rs = doExecuteQuery(stmt, "SELECT x,y,zoom,Format FROM Tiles WHERE MapID=" + mapkey + ";");
while (rs.next()) {
StorageTile st = new StorageTile(world, map, rs.getInt("x"), rs.getInt("y"), rs.getInt("zoom"), var);
final MapType.ImageEncoding encoding = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
if(cb != null)
cb.tileFound(st, encoding);
if(cbBase != null && st.zoom == 0)
cbBase.tileFound(st, encoding);
st.cleanup();
boolean done = false;
int offset = 0;
int limit = 100;
while (!done) {
c = getConnection(); // Do inside loop - single threaded sqlite will have issues otherwise....
// Query tiles for given mapkey
Statement stmt = c.createStatement();
ResultSet rs = doExecuteQuery(stmt, String.format("SELECT x,y,zoom,Format FROM Tiles WHERE MapID=%d LIMIT %d OFFSET %d;", mapkey, limit, offset));
int cnt = 0;
while (rs.next()) {
StorageTile st = new StorageTile(world, map, rs.getInt("x"), rs.getInt("y"), rs.getInt("zoom"), var);
final MapType.ImageEncoding encoding = MapType.ImageEncoding.fromOrd(rs.getInt("Format"));
if(cb != null)
cb.tileFound(st, encoding);
if(cbBase != null && st.zoom == 0)
cbBase.tileFound(st, encoding);
st.cleanup();
cnt++;
}
rs.close();
stmt.close();
if (cnt < limit) done = true;
offset += cnt;
releaseConnection(c, err);
c = null;
}
if(cbEnd != null)
cbEnd.searchEnded();
rs.close();
stmt.close();
} catch (SQLException x) {
logSQLException("Tile enum error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -670,6 +729,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Tile purge error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -712,6 +773,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Face write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -746,6 +809,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Face read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -772,6 +837,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Face exists error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -823,6 +890,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (rs != null) { try { rs.close(); } catch (SQLException sx) {} }
if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} }
@ -857,6 +926,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -904,6 +975,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker file write error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
if (rs != null) { try { rs.close(); } catch (SQLException sx) {} }
if (stmt != null) { try { stmt.close(); } catch (SQLException sx) {} }
@ -932,6 +1005,8 @@ public class SQLiteMapStorage extends MapStorage {
} catch (SQLException x) {
logSQLException("Marker file read error", x);
err = true;
} catch (StorageShutdownException x) {
err = true;
} finally {
releaseConnection(c, err);
}
@ -1004,4 +1079,11 @@ public class SQLiteMapStorage extends MapStorage {
}
}
}
public void logSQLException(String opmsg, SQLException x) {
// Ignore interrupted
if (x.getMessage().equals("Interrupted")) return;
super.logSQLException(opmsg, x);
}
}

View File

@ -107,68 +107,126 @@ public class ImageIOManager {
}
public static BufferOutputStream imageIOEncode(BufferedImage img, ImageFormat fmt) {
BufferOutputStream bos = new BufferOutputStream();
if(isRequiredJDKVersion(17,-1,-1)){
return imageIOEncodeUnsafe(img, fmt); //we can skip Thread safety for more performance
}
synchronized(imageioLock) {
try {
ImageIO.setUseCache(false); /* Don't use file cache - too small to be worth it */
fmt = validateFormat(fmt);
if(fmt.getEncoding() == ImageEncoding.JPG) {
WritableRaster raster = img.getRaster();
WritableRaster newRaster = raster.createWritableChild(0, 0, img.getWidth(),
img.getHeight(), 0, 0, new int[] {0, 1, 2});
DirectColorModel cm = (DirectColorModel)img.getColorModel();
DirectColorModel newCM = new DirectColorModel(cm.getPixelSize(),
cm.getRedMask(), cm.getGreenMask(), cm.getBlueMask());
// now create the new buffer that is used ot write the image:
BufferedImage rgbBuffer = new BufferedImage(newCM, newRaster, false, null);
return imageIOEncodeUnsafe(img, fmt);
}
}
private static BufferOutputStream imageIOEncodeUnsafe(BufferedImage img, ImageFormat fmt) {
BufferOutputStream bos = new BufferOutputStream();
try {
ImageIO.setUseCache(false); /* Don't use file cache - too small to be worth it */
// Find a jpeg writer
ImageWriter writer = null;
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");
if (iter.hasNext()) {
writer = iter.next();
}
if(writer == null) {
Log.severe("No JPEG ENCODER - Java VM does not support JPEG encoding");
return null;
}
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(fmt.getQuality());
fmt = validateFormat(fmt);
ImageOutputStream ios;
ios = ImageIO.createImageOutputStream(bos);
writer.setOutput(ios);
if(fmt.getEncoding() == ImageEncoding.JPG) {
WritableRaster raster = img.getRaster();
WritableRaster newRaster = raster.createWritableChild(0, 0, img.getWidth(),
img.getHeight(), 0, 0, new int[] {0, 1, 2});
DirectColorModel cm = (DirectColorModel)img.getColorModel();
DirectColorModel newCM = new DirectColorModel(cm.getPixelSize(),
cm.getRedMask(), cm.getGreenMask(), cm.getBlueMask());
// now create the new buffer that is used ot write the image:
BufferedImage rgbBuffer = new BufferedImage(newCM, newRaster, false, null);
writer.write(null, new IIOImage(rgbBuffer, null, null), iwp);
writer.dispose();
rgbBuffer.flush();
// Find a jpeg writer
ImageWriter writer = null;
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");
if (iter.hasNext()) {
writer = iter.next();
}
else if (fmt.getEncoding() == ImageEncoding.WEBP) {
doWEBPEncode(img, fmt, bos);
if(writer == null) {
Log.severe("No JPEG ENCODER - Java VM does not support JPEG encoding");
return null;
}
else {
ImageIO.write(img, fmt.getFileExt(), bos); /* Write to byte array stream - prevent bogus I/O errors */
}
} catch (IOException iox) {
Log.info("Error encoding image - " + iox.getMessage());
return null;
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(fmt.getQuality());
ImageOutputStream ios;
ios = ImageIO.createImageOutputStream(bos);
writer.setOutput(ios);
writer.write(null, new IIOImage(rgbBuffer, null, null), iwp);
writer.dispose();
rgbBuffer.flush();
}
else if (fmt.getEncoding() == ImageEncoding.WEBP) {
doWEBPEncode(img, fmt, bos);
}
else {
ImageIO.write(img, fmt.getFileExt(), bos); /* Write to byte array stream - prevent bogus I/O errors */
}
} catch (IOException iox) {
Log.info("Error encoding image - " + iox.getMessage());
return null;
}
return bos;
}
public static BufferedImage imageIODecode(MapStorageTile.TileRead tr) throws IOException {
if(isRequiredJDKVersion(17,-1,-1)){
return imageIODecodeUnsafe(tr); //we can skip Thread safety for more performance
}
synchronized(imageioLock) {
ImageIO.setUseCache(false); /* Don't use file cache - too small to be worth it */
if (tr.format == ImageEncoding.WEBP) {
return doWEBPDecode(tr.image);
}
return ImageIO.read(tr.image);
return imageIODecodeUnsafe(tr);
}
}
private static BufferedImage imageIODecodeUnsafe(MapStorageTile.TileRead tr) throws IOException {
ImageIO.setUseCache(false); /* Don't use file cache - too small to be worth it */
if (tr.format == ImageEncoding.WEBP) {
return doWEBPDecode(tr.image);
}
return ImageIO.read(tr.image);
}
/**
* Checks if the current JDK is running at least a specific version
* targetMinor and targetBuild can be set to -1, if the java.version only provides a Major release this will then only check for the major release
* @param targetMajor the required minimum major version
* @param targetMinor the required minimum minor version
* @param targetBuild the required minimum build version
* @return true if the current JDK version is the required minimum version
*/
private static boolean isRequiredJDKVersion(int targetMajor, int targetMinor, int targetBuild){
String javaVersion = System.getProperty("java.version");
String[] versionParts = javaVersion.split("\\.");
if(versionParts.length < 3){
if(versionParts.length == 1
&& targetMinor == -1
&& targetBuild == -1
&& parseInt(versionParts[0], -1) >= targetMajor){
return true;//we only have a major version and thats ok
}
return false; //can not evaluate
}
int major = parseInt(versionParts[0], -1);
int minor = parseInt(versionParts[1], -1);
int build = parseInt(versionParts[2], -1);
if(major != -1 && major >= targetMajor &&
minor != -1 && minor >= targetMinor &&
build != -1 && build >= targetBuild
){
return true;
}
return false;
}
/**
* Parses a string to int, with a dynamic fallback value if not parsable
* @param input the String to parse
* @param fallback the Fallback value to use
* @return the parsed integer or the fallback value if unparsable
*/
private static int parseInt(String input, int fallback){
int output = fallback;
try{
output = Integer.parseInt(input);
} catch (NumberFormatException e) {}
return output;
}
}

View File

@ -106,10 +106,18 @@ public interface MapIterator extends MapDataContext {
*/
BlockStep getLastStep();
/**
* Get world height
* Get world height (yMax+1)
* @return height
*/
int getWorldHeight();
/**
* Get world bottom (yMin)
*/
int getWorldYMin();
/**
* Get world sealevel
*/
int getWorldSeaLevel();
/**
* Get block key for current position (unique ID for block within cache being iterated)
* @return block key

View File

@ -25,7 +25,11 @@ public class RoundVisibilityLimit implements VisibilityLimit {
else
chunk_corner_z = chunk_z * 16 + 15;
return (chunk_corner_x - x_center) * (chunk_corner_x - x_center) + (chunk_corner_z - z_center) * (chunk_corner_z - z_center) < radius * radius;
// By gmfamily - Use long representation of the distance between tested chunk and center of tested limit
// to avoid int overflow while computing the distance compared to limit radius using square delta value
long chunk_delta_x = chunk_corner_x - x_center;
long chunk_delta_z = chunk_corner_z - z_center;
return chunk_delta_x * chunk_delta_x + chunk_delta_z * chunk_delta_z < (long) radius * radius;
}
@Override

View File

@ -411,7 +411,7 @@
.dynmap .sublist .item > a {
display: block;
text-indent: -99999px;
outline: none;
}
@ -806,10 +806,10 @@
}
.chatinput {
position: absolute;
width: 608px;
height: 16px;
bottom: 8px;
outline: none;
color: #fff;
background-color: #000000;
@ -829,6 +829,9 @@
}
.loginbutton {
position: absolute;
bottom: 0px;
right: 4px;
color: #000;
font-family: sans-serif;
font-size: 11px;

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="images/icons/mstile-150x150.png"/>
<TileColor>#ffffff</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,112 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="200.000000pt" height="200.000000pt" viewBox="0 0 200.000000 200.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.14, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1205 1970 c3 -5 8 -10 11 -10 2 0 4 5 4 10 0 6 -5 10 -11 10 -5 0
-7 -4 -4 -10z"/>
<path d="M1170 1940 c0 -4 7 -10 15 -14 8 -3 15 -10 15 -15 0 -6 -7 -8 -15 -5
-8 4 -15 1 -15 -5 0 -6 6 -11 13 -11 6 0 12 -12 13 -28 2 -51 15 -103 25 -97
5 4 7 11 3 17 -5 8 -8 40 -13 144 -1 13 -41 27 -41 14z"/>
<path d="M1250 1880 c-21 -21 -28 -80 -10 -80 6 0 10 9 10 19 0 11 8 26 18 33
18 14 26 48 11 48 -5 0 -18 -9 -29 -20z"/>
<path d="M701 1785 c-18 -8 -44 -15 -58 -15 -17 0 -24 -5 -22 -17 3 -34 -1
-41 -21 -36 -11 3 -20 9 -20 14 0 5 -10 9 -23 9 -27 0 -77 -21 -77 -33 0 -13
-27 -37 -42 -37 -10 0 -12 -11 -10 -40 2 -22 9 -40 16 -40 6 0 17 -9 24 -20 7
-11 19 -20 28 -20 11 0 14 -8 12 -26 -3 -29 -17 -39 -61 -49 -15 -3 -25 -10
-22 -15 3 -5 -21 -14 -54 -21 l-60 -11 5 -42 c56 -444 70 -582 62 -587 -5 -3
-4 -41 3 -97 9 -73 9 -95 -1 -107 -10 -12 -9 -15 4 -15 10 0 15 -4 11 -9 -3
-5 5 -17 17 -27 18 -12 19 -15 4 -10 -14 5 -17 2 -12 -9 3 -8 9 -22 13 -31 4
-12 2 -15 -8 -12 -8 2 -15 16 -17 31 -5 39 -25 50 -49 27 -12 -10 -23 -17 -26
-14 -2 3 -7 -2 -10 -10 -4 -9 -2 -18 3 -21 6 -4 10 -13 10 -22 0 -13 -3 -13
-15 -3 -17 14 -38 2 -56 -32 -9 -16 -6 -18 27 -13 21 2 41 10 46 17 7 12 9 11
12 -11 0 -5 4 -13 8 -16 4 -4 3 -16 -3 -26 -9 -17 -6 -19 27 -14 21 2 41 10
46 17 6 9 10 7 14 -9 7 -25 34 -32 34 -9 0 10 14 16 43 18 41 3 42 4 45 43 2
22 7 44 12 49 5 5 58 -26 129 -77 66 -48 125 -87 130 -87 16 0 13 17 -4 24
-23 8 -21 105 3 122 20 15 52 18 52 5 0 -5 10 -13 22 -17 19 -6 20 -7 4 -16
-12 -7 -14 -13 -7 -22 8 -10 4 -16 -14 -24 -38 -17 -33 -50 11 -68 36 -15 36
-16 15 -30 -14 -11 -21 -26 -21 -50 0 -19 -4 -34 -10 -34 -5 0 -10 5 -10 10 0
6 -4 10 -8 10 -4 0 -8 -11 -8 -25 0 -31 7 -31 38 0 l25 25 48 -35 c36 -25 52
-31 61 -24 7 6 18 8 24 4 6 -4 20 1 30 10 11 10 26 14 38 11 16 -5 19 -2 17
25 -2 29 7 37 112 115 62 46 113 88 113 92 0 11 196 153 232 169 15 7 28 17
28 23 0 6 4 9 9 6 15 -9 40 28 43 64 2 25 -1 35 -12 35 -37 2 -49 16 -43 48 3
18 12 37 19 43 8 6 12 19 8 28 -3 9 -1 16 4 16 12 0 10 34 -3 63 -9 22 11 155
28 175 7 9 11 48 9 110 -1 67 2 102 12 116 7 12 17 44 20 71 l7 51 -45 12
c-25 6 -46 16 -46 22 0 5 -7 10 -15 10 -9 0 -15 9 -15 21 0 13 -8 23 -21 26
-12 3 -16 9 -10 12 6 4 13 21 17 38 5 28 3 31 -25 36 -17 4 -38 4 -46 1 -18
-7 -20 -55 -3 -72 8 -8 8 -15 -3 -28 -10 -12 -24 -15 -59 -11 -24 3 -52 1 -62
-4 -14 -7 -19 0 -33 44 -10 28 -33 82 -52 120 -35 67 -36 67 -78 67 -41 0 -43
-1 -60 -47 -10 -27 -27 -63 -37 -81 -18 -29 -24 -32 -52 -27 -57 12 -66 16
-66 35 0 28 -11 51 -21 44 -5 -3 -9 -21 -9 -40 0 -48 -16 -43 -24 8 -5 29 -10
38 -15 29 -5 -8 -7 -27 -4 -42 3 -20 -1 -31 -11 -35 -9 -3 -16 -13 -16 -21 0
-11 -6 -14 -22 -9 -13 3 -38 6 -56 6 l-33 0 3 48 c3 42 6 47 28 50 23 3 25 7
24 49 -1 39 -5 48 -25 55 -13 5 -27 16 -32 24 -10 18 -42 17 -86 -1z m-5 -131
c6 -7 16 -14 23 -14 14 0 15 -86 1 -95 -6 -4 -33 -7 -60 -8 -27 -1 -52 -6 -56
-10 -17 -17 -34 -6 -34 22 0 63 11 90 41 96 20 5 26 11 22 22 -5 13 -1 15 23
9 16 -4 34 -14 40 -22z m509 6 c3 -5 1 -10 -4 -10 -6 0 -11 5 -11 10 0 6 2 10
4 10 3 0 8 -4 11 -10z m-167 -97 c46 -6 52 -18 23 -50 -17 -18 -24 -19 -60
-10 -49 13 -54 25 -8 21 17 -2 23 -1 12 2 -11 3 -27 8 -35 11 -8 3 -21 7 -29
7 -8 1 -16 6 -18 13 -5 13 33 23 57 15 8 -2 34 -7 58 -9z m167 -73 c3 -5 1
-10 -4 -10 -6 0 -11 5 -11 10 0 6 2 10 4 10 3 0 8 -4 11 -10z m211 -15 c-21
-16 -32 -13 -21 4 3 6 14 11 23 11 15 -1 15 -2 -2 -15z m-786 -21 c0 -31 -23
-28 -28 4 -2 15 2 22 12 22 11 0 16 -9 16 -26z m583 -6 c6 -22 1 -38 -11 -38
-10 0 -31 48 -24 55 12 12 30 4 35 -17z m137 -8 c-8 -5 -13 -10 -10 -11 3 0
14 -2 25 -5 64 -13 156 -23 169 -18 9 3 16 1 16 -5 0 -6 -7 -11 -15 -11 -8 0
-15 -7 -15 -15 0 -8 -4 -15 -10 -15 -5 0 -10 4 -10 9 0 5 -15 12 -32 16 -95
23 -159 33 -180 27 -26 -6 -23 11 5 24 29 15 79 18 57 4z m-262 -19 c19 -12
10 -47 -11 -43 -18 3 -23 -13 -7 -23 12 -7 4 -25 -11 -25 -5 0 -9 14 -9 30 0
17 -5 30 -11 30 -5 0 -7 5 -4 10 4 6 11 8 16 5 5 -4 9 1 9 9 0 18 8 20 28 7z
m52 -71 l-8 -35 -1 31 c-1 17 2 34 6 37 11 12 12 3 3 -33z m80 24 c0 -8 -4
-12 -10 -9 -5 3 -10 10 -10 16 0 5 5 9 10 9 6 0 10 -7 10 -16z m-605 -27 c6
-7 55 -28 110 -47 55 -18 107 -40 116 -47 8 -7 21 -13 28 -13 10 0 11 -10 7
-35 -6 -32 -3 -39 23 -63 22 -18 31 -36 31 -57 0 -16 7 -43 15 -59 8 -15 15
-35 15 -42 0 -8 6 -14 14 -14 7 0 19 -7 26 -15 7 -8 8 -15 3 -15 -6 0 -22 -11
-37 -25 -23 -21 -30 -23 -46 -12 -11 6 -20 19 -20 29 0 9 -9 19 -20 23 -12 4
-24 21 -30 45 -6 22 -15 42 -20 45 -6 3 -10 13 -10 20 0 18 -31 55 -45 55 -6
0 -15 15 -20 32 -8 26 -20 37 -55 51 l-46 19 -33 -31 -33 -31 7 -113 c8 -130
10 -133 75 -204 11 -13 20 -35 21 -50 1 -28 15 -74 35 -106 14 -23 51 -30 58
-10 5 11 14 14 36 10 16 -4 32 -2 35 2 3 5 16 8 30 6 14 -1 28 2 31 6 8 13 48
11 62 -3 7 -7 12 -25 12 -40 0 -21 5 -28 20 -28 16 0 20 7 20 33 0 17 7 41 15
51 8 11 15 28 15 38 0 9 8 25 19 35 10 10 21 39 25 68 6 51 26 87 26 48 0 -12
-4 -25 -10 -28 -5 -3 -10 -21 -10 -39 0 -20 -8 -40 -20 -51 -11 -10 -20 -25
-20 -34 0 -9 -7 -26 -15 -38 -9 -12 -15 -26 -14 -30 5 -31 -3 -55 -21 -60 -12
-3 -20 -14 -20 -25 0 -17 5 -19 28 -14 26 6 26 6 8 -9 -11 -8 -23 -15 -28 -15
-4 0 -8 -10 -8 -22 0 -18 -2 -20 -9 -9 -5 8 -21 16 -35 18 -20 3 -27 -2 -32
-21 -8 -35 -38 -42 -72 -17 l-29 20 -26 -32 c-25 -31 -26 -31 -46 -13 -11 10
-20 21 -19 25 2 19 -5 33 -37 65 -19 20 -35 43 -35 52 0 8 -7 29 -16 45 -8 17
-13 37 -10 45 8 22 -12 65 -43 94 -16 14 -31 39 -34 55 -3 17 -13 62 -21 100
-23 112 -22 268 3 314 8 14 11 38 8 59 -6 34 -6 34 26 28 18 -3 37 -12 42 -19z
m593 -36 c15 -47 15 -51 1 -51 -5 0 -7 5 -3 11 4 7 -3 19 -16 29 -15 11 -21
23 -17 34 10 26 23 18 35 -23z m69 17 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3
4 -12 1 -19z m-36 -51 c-13 -13 -15 11 -4 40 7 16 8 15 11 -6 2 -13 -1 -28 -7
-34z m396 1 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-72 -43
c-2 -31 -8 -61 -13 -68 -6 -7 -14 -47 -18 -90 -4 -43 -10 -80 -15 -83 -12 -7
2 165 17 210 7 22 11 44 8 48 -5 8 13 38 22 38 1 0 1 -25 -1 -55z m-48 -17
c-3 -7 -5 -2 -5 12 0 14 2 19 5 13 2 -7 2 -19 0 -25z m-130 -34 c2 -5 -24 -20
-57 -33 -54 -21 -81 -50 -47 -51 6 0 4 -5 -6 -11 -14 -8 -22 -8 -30 0 -14 14
-18 69 -6 77 5 3 9 -3 9 -13 0 -14 2 -15 9 -4 5 8 7 21 4 30 -4 14 -3 14 6 1
9 -13 15 -12 53 2 45 17 60 18 65 2z m-153 -131 c-4 -16 -10 -30 -13 -33 -3
-3 -6 -11 -7 -17 -2 -30 -4 -36 -11 -30 -10 10 -32 -13 -27 -28 3 -7 1 -16 -5
-20 -17 -10 -24 21 -11 44 8 16 8 21 -1 21 -7 0 -9 3 -5 8 4 4 12 7 18 7 6 0
12 8 14 18 3 21 32 57 46 57 4 0 5 -12 2 -27z m306 -79 c0 -8 -5 -12 -10 -9
-6 4 -8 11 -5 16 9 14 15 11 15 -7z m-996 -248 c8 -18 22 -40 33 -47 10 -8 18
-20 17 -26 -1 -7 -2 -17 -3 -23 0 -5 -5 -10 -10 -10 -5 0 -7 9 -4 20 3 11 1
20 -4 20 -4 0 -17 15 -27 34 -10 19 -25 37 -33 40 -8 3 -11 10 -8 16 11 18 25
10 39 -24z m566 -5 c0 -17 -4 -33 -10 -36 -5 -3 -10 -21 -10 -40 0 -40 -8 -65
-22 -65 -10 0 -4 70 13 133 12 44 29 49 29 8z m-626 -26 c19 -28 21 -44 4 -27
-7 7 -17 8 -30 1 -14 -7 -18 -6 -18 6 0 8 5 15 10 15 6 0 10 5 10 11 0 5 -4 7
-10 4 -5 -3 -10 -1 -10 4 0 20 28 11 44 -14z m6 -60 c11 -13 10 -14 -4 -9 -9
3 -16 10 -16 15 0 13 6 11 20 -6z m-50 1 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1
-10 4 0 6 5 11 10 11 6 0 10 -2 10 -4z m180 -102 c0 -28 -2 -32 -13 -23 -14
14 -10 72 4 63 5 -3 9 -21 9 -40z m-216 -90 c17 -16 21 -34 9 -34 -17 1 -45
29 -38 39 8 14 11 14 29 -5z m651 -153 c-6 -5 -25 10 -25 20 0 5 6 4 14 -3 8
-7 12 -15 11 -17z"/>
<path d="M579 1193 c-13 -16 -12 -17 4 -4 9 7 17 15 17 17 0 8 -8 3 -21 -13z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@ -0,0 +1,13 @@
{
"name": "",
"short_name": "",
"icons": [
{
"src": "android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff"
}

View File

@ -11,9 +11,16 @@
<!-- These 2 lines make us fullscreen on apple mobile products - remove if you don't like that -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="theme-color" content="#000000">
<link rel="icon" href="images/dynmap.ico" type="image/ico" />
<link rel="apple-touch-icon" sizes="180x180" href="images/icons/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="images/icons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="images/icons/favicon-16x16.png">
<link rel="manifest" href="images/icons/site.webmanifest">
<link rel="mask-icon" href="images/icons/safari-pinned-tab.svg" color="#000000">
<link rel="shortcut icon" href="images/icons/favicon.ico">
<meta name="msapplication-TileColor" content="#000000">
<meta name="msapplication-config" content="images/icons/browserconfig.xml">
<meta name="theme-color" content="#000000">
<script type="text/javascript" src="js/jquery-3.5.1.js?_=${version}-${buildnumber}"></script>
<link rel="stylesheet" type="text/css" href="css/leaflet.css?_=${version}-${buildnumber}" />

View File

@ -194,7 +194,9 @@ var DynmapTileLayer = L.TileLayer.extend({
if (!url) {
this._cachedTileUrls[tileName] = url = this.options.dynmap.getTileUrl(tileName);
}
if (typeof timestamp === 'undefined') {
timestamp = this.options.dynmap.inittime
}
if(typeof timestamp !== 'undefined') {
url += (url.indexOf('?') === -1 ? '?timestamp=' + timestamp : '&timestamp=' + timestamp);
}

View File

@ -592,9 +592,6 @@ DynMap.prototype = {
me.selectWorldAndPan(location.world, location, function() {
if(completed) completed();
});
} else {
var latlng = me.maptype.getProjection().fromLocationToLatLng(location);
me.panToLatLng(latlng, completed);
}
},
panToLayerPoint: function(point, completed) {
@ -779,8 +776,7 @@ DynMap.prototype = {
if (me.followingPlayer !== player) {
me.followPlayer(null);
}
if(player.location.world)
me.panToLocation(player.location);
me.panToLocation(player.location);
});
player.menuname.data('sort', player.sort);
// Inject into playerlist alphabetically

View File

@ -27,7 +27,7 @@ componentconstructors['markers'] = function(dynmap, configuration) {
function loadmarkers(world) {
removeAllMarkers();
var url = concatURL(dynmap.options.url.markers, '_markers_/marker_' + encodeURIComponent(world) + '.json');
var url = concatURL(dynmap.options.url.markers, '_markers_/marker_' + world + '.json');
$.getJSON(url, function(data) {
var ts = data.timestamp;

View File

@ -19,7 +19,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
$path = $_REQUEST['marker'];
$path = htmlspecialchars($_REQUEST['marker']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "<h1>500 Error</h1>";

View File

@ -19,7 +19,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
$path = $_REQUEST['tile'];
$path = htmlspecialchars($_REQUEST['tile']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "<h1>500 Error</h1>";
@ -94,7 +94,7 @@ if ($stmt->fetch()) {
header('Content-Type: image/jpeg');
}
header('ETag: \'' . $thash . '\'');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $tlast / 1000) . ' GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', (int) ($tlast / 1000)) . ' GMT');
if (is_null($tnewimage)) {
echo $timage;
} else {

View File

@ -75,7 +75,7 @@ function updateStandaloneFileByServerId($fname, $sid, $content)
initDbIfNeeded();
$stmt = $db->prepare('UPDATE ' . $dbprefix . 'StandaloneFiles SET Content=:content WHERE FileName=:fname AND ServerID=:sid');
$stmt->bindParam(':content', $content, PDO::PARAM_STR);
$stmt->bindParam(':content', $content, PDO::PARAM_LOB);
$stmt->bindParam(':fname', $fname, PDO::PARAM_STR);
$stmt->bindParam(':sid', $sid, PDO::PARAM_INT);
$res = $stmt->execute();

View File

@ -19,7 +19,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
$path = $_REQUEST['marker'];
$path = htmlspecialchars($_REQUEST['marker']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "<h1>500 Error</h1>";

View File

@ -19,7 +19,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
$path = $_REQUEST['tile'];
$path = htmlspecialchars($_REQUEST['tile']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "<h1>500 Error</h1>";
@ -99,7 +99,7 @@ if ($res && $timage) {
header('Content-Type: image/jpeg');
}
header('ETag: \'' . $thash . '\'');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $tlast / 1000) . ' GMT');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', (int) ($tlast / 1000)) . ' GMT');
echo stream_get_contents($timage);
} else {
header('Location: ../images/blank.png');

View File

@ -17,7 +17,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
$path = $_REQUEST['marker'];
$path = htmlspecialchars($_REQUEST['marker']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "<h1>500 Error</h1>";

View File

@ -17,7 +17,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
$path = $_REQUEST['tile'];
$path = htmlspecialchars($_REQUEST['tile']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "<h1>500 Error</h1>";

View File

@ -24,7 +24,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
$path = $_REQUEST['marker'];
$path = htmlspecialchars($_REQUEST['marker']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "<h1>500 Error</h1>";

View File

@ -24,7 +24,7 @@ if (strcmp($userid, '-guest-')) {
$loggedin = true;
}
$path = $_REQUEST['tile'];
$path = htmlspecialchars($_REQUEST['tile']);
if ((!isset($path)) || strstr($path, "..")) {
header('HTTP/1.0 500 Error');
echo "<h1>500 Error</h1>";

File diff suppressed because one or more lines are too long

View File

@ -814,7 +814,8 @@ block:id=detector_rail,state=powered:false,patch0=0:detector_rail,transparency=T
# Web
block:id=cobweb,patch0-1=0:cobweb,transparency=TRANSPARENT
# Grass
block:id=grass,patch0-1=1000:grass,transparency=TRANSPARENT
[-1.20.2]block:id=grass,patch0-1=1000:grass,transparency=TRANSPARENT
[1.20.3-]block:id=short_grass,patch0-1=1000:grass,transparency=TRANSPARENT
# Fern
block:id=fern,patch0-1=1000:fern,transparency=TRANSPARENT
# Dead shrub
@ -3431,7 +3432,7 @@ block:id=%melon_stem,patch0=0:melon_stem,blockcolor=foliagebiome,transparency=TR
[1.19-]block:id=%mangrove_sign,patch0=0,patch1=1,patch2=2,patch3=3,patch4=4,patch5=5,patch6=6,patch7=7,patch8=8,patch9=9,transparency=TRANSPARENT,txtid=mangrove_sign
[1.19-]block:id=%mangrove_wall_sign,patch0=0,patch1=1,patch2=2,patch3=3,patch4=4,patch5=5,transparency=TRANSPARENT,txtid=mangrove_sign
[1.19-]block:id=%packed_mud,patch0=0:packed_mud,patch1=0:packed_mud,patch2=0:packed_mud,patch3=0:packed_mud,patch4=0:packed_mud,patch5=0:packed_mud,stdrot=true
[1.19-]block:id=%mud_bricks,patch0=0:mud_bricks,stdrot=true
[1.19-]block:id=%mud_bricks,patch0=0:mud_bricks,patch1=0:mud_bricks,patch2=0:mud_bricks,patch3=0:mud_bricks,patch4=0:mud_bricks,patch5=0:mud_bricks,stdrot=true
[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:top/shape:straight,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true
[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:top/shape:inner_left,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true
[1.19-]block:id=%mud_brick_stairs,state=facing:north/half:top/shape:inner_right,patch0=0:mud_bricks,transparency=SEMITRANSPARENT,stdrot=true
@ -3733,3 +3734,868 @@ block:id=%melon_stem,patch0=0:melon_stem,blockcolor=foliagebiome,transparency=TR
[1.19-]block:id=%lightning_rod,state=powered:false/facing:up,patch0=0:lightning_rod,transparency=SEMITRANSPARENT,stdrot=true
[1.19-]block:id=%lightning_rod,state=powered:true/facing:down,patch0=0:lightning_rod_on,transparency=SEMITRANSPARENT,stdrot=true
[1.19-]block:id=%lightning_rod,state=powered:false/facing:down,patch0=0:lightning_rod,transparency=SEMITRANSPARENT,stdrot=true
# 1.19.3
[1.19.3-]texture:id=bamboo_block,filename=assets/minecraft/textures/block/bamboo_block.png,xcount=1,ycount=1
[1.19.3-]texture:id=bamboo_block_top,filename=assets/minecraft/textures/block/bamboo_block_top.png,xcount=1,ycount=1
[1.19.3-]texture:id=stripped_bamboo_block,filename=assets/minecraft/textures/block/stripped_bamboo_block.png,xcount=1,ycount=1
[1.19.3-]texture:id=stripped_bamboo_block_top,filename=assets/minecraft/textures/block/stripped_bamboo_block_top.png,xcount=1,ycount=1
[1.19.3-]texture:id=stripped_bamboo_block,filename=assets/minecraft/textures/block/stripped_bamboo_block.png,xcount=1,ycount=1
[1.19.3-]texture:id=stripped_bamboo_block_top,filename=assets/minecraft/textures/block/stripped_bamboo_block_top.png,xcount=1,ycount=1
[1.19.3-]texture:id=bamboo_planks,filename=assets/minecraft/textures/block/bamboo_planks.png,xcount=1,ycount=1
[1.19.3-]texture:id=bamboo_mosaic,filename=assets/minecraft/textures/block/bamboo_mosaic.png,xcount=1,ycount=1
[1.19.3-]texture:id=bamboo_door_top,filename=assets/minecraft/textures/block/bamboo_door_top.png,xcount=1,ycount=1
[1.19.3-]texture:id=bamboo_door_bottom,filename=assets/minecraft/textures/block/bamboo_door_bottom.png,xcount=1,ycount=1
[1.19.3-]texture:id=bamboo_trapdoor,filename=assets/minecraft/textures/block/bamboo_trapdoor.png,xcount=1,ycount=1
[1.19.3-]texturefile:id=bamboo_sign,filename=assets/minecraft/textures/entity/signs/bamboo.png,format=SIGN
[1.19.3-]texturefile:id=piglin,filename=assets/minecraft/textures/entity/piglin/piglin.png,format=SKIN
[1.19.3-]texture:id=chiseled_bookshelf_side,filename=assets/minecraft/textures/block/chiseled_bookshelf_side.png,xcount=1,ycount=1
[1.19.3-]texture:id=chiseled_bookshelf_top,filename=assets/minecraft/textures/block/chiseled_bookshelf_top.png,xcount=1,ycount=1
[1.19.3-]texture:id=chiseled_bookshelf_occupied,filename=assets/minecraft/textures/block/chiseled_bookshelf_occupied.png,xcount=1,ycount=1
[1.19.3-]texture:id=chiseled_bookshelf_empty,filename=assets/minecraft/textures/block/chiseled_bookshelf_empty.png,xcount=1,ycount=1
[1.19.3-]texturefile:id=acacia_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/acacia.png,format=SIGN
[1.19.3-]texturefile:id=bamboo_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/bamboo.png,format=SIGN
[1.19.3-]texturefile:id=birch_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/birch.png,format=SIGN
[1.19.3-]texturefile:id=crimson_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/crimson.png,format=SIGN
[1.19.3-]texturefile:id=dark_oak_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/dark_oak.png,format=SIGN
[1.19.3-]texturefile:id=jungle_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/jungle.png,format=SIGN
[1.19.3-]texturefile:id=mangrove_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/mangrove.png,format=SIGN
[1.19.3-]texturefile:id=oak_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/oak_hanging_sign.png,format=SIGN
[1.19.3-]texturefile:id=spruce_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/spruce_hanging_sign.png,format=SIGN
[1.19.3-]texturefile:id=warped_hanging_sign,filename=assets/minecraft/textures/entity/signs/hanging/warped.png,format=SIGN
[1.19.3-]block:id=%bamboo_block,state=axis:x,patch0=0:bamboo_block,patch1=0:bamboo_block_top,stdrot=true
[1.19.3-]block:id=%bamboo_block,state=axis:y,patch0=0:bamboo_block,patch1=0:bamboo_block_top,patch2=0:bamboo_block,patch3=0:bamboo_block,patch4=0:bamboo_block_top,patch5=0:bamboo_block,stdrot=true
[1.19.3-]block:id=%bamboo_block,state=axis:z,patch0=0:bamboo_block,patch1=0:bamboo_block_top,stdrot=true
[1.19.3-]block:id=%stripped_bamboo_block,state=axis:x,patch0=0:stripped_bamboo_block,patch1=0:stripped_bamboo_block_top,stdrot=true
[1.19.3-]block:id=%stripped_bamboo_block,state=axis:y,patch0=0:stripped_bamboo_block,patch1=0:stripped_bamboo_block_top,patch2=0:stripped_bamboo_block,patch3=0:stripped_bamboo_block,patch4=0:stripped_bamboo_block_top,patch5=0:stripped_bamboo_block,stdrot=true
[1.19.3-]block:id=%stripped_bamboo_block,state=axis:z,patch0=0:stripped_bamboo_block,patch1=0:stripped_bamboo_block_top,stdrot=true
[1.19.3-]block:id=%bamboo_planks,patch0=0:bamboo_planks,patch1=0:bamboo_planks,patch2=0:bamboo_planks,patch3=0:bamboo_planks,patch4=0:bamboo_planks,patch5=0:bamboo_planks,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic,patch0=0:bamboo_mosaic,patch1=0:bamboo_mosaic,patch2=0:bamboo_mosaic,patch3=0:bamboo_mosaic,patch4=0:bamboo_mosaic,patch5=0:bamboo_mosaic,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:top/shape:straight,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:top/shape:inner_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:top/shape:inner_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:top/shape:outer_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:top/shape:outer_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:bottom/shape:straight,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:bottom/shape:inner_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:bottom/shape:inner_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:bottom/shape:outer_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:north/half:bottom/shape:outer_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:top/shape:straight,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:top/shape:inner_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:top/shape:inner_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:top/shape:outer_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:top/shape:outer_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:bottom/shape:straight,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:bottom/shape:inner_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:bottom/shape:inner_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:bottom/shape:outer_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:south/half:bottom/shape:outer_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:top/shape:straight,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:top/shape:inner_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:top/shape:inner_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:top/shape:outer_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:top/shape:outer_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:bottom/shape:straight,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:bottom/shape:inner_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:bottom/shape:inner_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:bottom/shape:outer_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:west/half:bottom/shape:outer_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:top/shape:straight,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:top/shape:inner_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:top/shape:inner_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:top/shape:outer_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:top/shape:outer_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:bottom/shape:straight,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:bottom/shape:inner_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:bottom/shape:inner_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:bottom/shape:outer_left,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_stairs,state=facing:east/half:bottom/shape:outer_right,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:top/shape:straight,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:top/shape:inner_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:top/shape:inner_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:top/shape:outer_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:top/shape:outer_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:bottom/shape:straight,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:bottom/shape:inner_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:bottom/shape:inner_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:bottom/shape:outer_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:north/half:bottom/shape:outer_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:top/shape:straight,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:top/shape:inner_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:top/shape:inner_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:top/shape:outer_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:top/shape:outer_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:bottom/shape:straight,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:bottom/shape:inner_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:bottom/shape:inner_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:bottom/shape:outer_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:south/half:bottom/shape:outer_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:top/shape:straight,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:top/shape:inner_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:top/shape:inner_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:top/shape:outer_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:top/shape:outer_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:bottom/shape:straight,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:bottom/shape:inner_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:bottom/shape:inner_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:bottom/shape:outer_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:west/half:bottom/shape:outer_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:top/shape:straight,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:top/shape:inner_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:top/shape:inner_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:top/shape:outer_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:top/shape:outer_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:bottom/shape:straight,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:bottom/shape:inner_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:bottom/shape:inner_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:bottom/shape:outer_left,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_stairs,state=facing:east/half:bottom/shape:outer_right,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_slab,state=type:top,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_slab,state=type:bottom,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_slab,state=type:double,patch0=0:bamboo_planks,patch1=0:bamboo_planks,patch2=0:bamboo_planks,patch3=0:bamboo_planks,patch4=0:bamboo_planks,patch5=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_slab,state=type:top,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_slab,state=type:bottom,patch0=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_mosaic_slab,state=type:double,patch0=0:bamboo_mosaic,patch1=0:bamboo_mosaic,patch2=0:bamboo_mosaic,patch3=0:bamboo_mosaic,patch4=0:bamboo_mosaic,patch5=0:bamboo_mosaic,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:true/east:true/south:true/north:true,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:false/east:true/south:true/north:true,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:true/east:true/south:false/north:true,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:false/east:true/south:false/north:true,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:true/east:true/south:true/north:false,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:false/east:true/south:true/north:false,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:true/east:true/south:false/north:false,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:false/east:true/south:false/north:false,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:true/east:false/south:true/north:true,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:false/east:false/south:true/north:true,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:true/east:false/south:false/north:true,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:false/east:false/south:false/north:true,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:true/east:false/south:true/north:false,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:false/east:false/south:true/north:false,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:true/east:false/south:false/north:false,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence,state=west:false/east:false/south:false/north:false,patch0=0:bamboo_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:north/in_wall:true/open:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:north/in_wall:true/open:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:north/in_wall:false/open:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:north/in_wall:false/open:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:south/in_wall:true/open:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:south/in_wall:true/open:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:south/in_wall:false/open:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:south/in_wall:false/open:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:west/in_wall:true/open:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:west/in_wall:true/open:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:west/in_wall:false/open:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:west/in_wall:false/open:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:east/in_wall:true/open:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:east/in_wall:true/open:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:east/in_wall:false/open:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_fence_gate,state=facing:east/in_wall:false/open:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:north/hinge:left/half:upper/open:true,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:north/hinge:left/half:upper/open:false,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:north/hinge:right/half:upper/open:true,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:north/hinge:right/half:upper/open:false,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:north/hinge:left/half:lower/open:true,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:north/hinge:left/half:lower/open:false,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:north/hinge:right/half:lower/open:true,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:north/hinge:right/half:lower/open:false,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:south/hinge:left/half:upper/open:true,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:south/hinge:left/half:upper/open:false,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:south/hinge:right/half:upper/open:true,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:south/hinge:right/half:upper/open:false,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:south/hinge:left/half:lower/open:true,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:south/hinge:left/half:lower/open:false,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:south/hinge:right/half:lower/open:true,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:south/hinge:right/half:lower/open:false,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:west/hinge:left/half:upper/open:true,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:west/hinge:left/half:upper/open:false,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:west/hinge:right/half:upper/open:true,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:west/hinge:right/half:upper/open:false,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:west/hinge:left/half:lower/open:true,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:west/hinge:left/half:lower/open:false,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:west/hinge:right/half:lower/open:true,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:west/hinge:right/half:lower/open:false,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:east/hinge:left/half:upper/open:true,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:east/hinge:left/half:upper/open:false,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:east/hinge:right/half:upper/open:true,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:east/hinge:right/half:upper/open:false,patch0=0:bamboo_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:east/hinge:left/half:lower/open:true,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:east/hinge:left/half:lower/open:false,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:east/hinge:right/half:lower/open:true,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_door,state=facing:east/hinge:right/half:lower/open:false,patch0=0:bamboo_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:north/half:top/open:true,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:north/half:top/open:false,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:north/half:bottom/open:true,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:north/half:bottom/open:false,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:south/half:top/open:true,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:south/half:top/open:false,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:south/half:bottom/open:true,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:south/half:bottom/open:false,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:west/half:top/open:true,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:west/half:top/open:false,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:west/half:bottom/open:true,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:west/half:bottom/open:false,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:east/half:top/open:true,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:east/half:top/open:false,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:east/half:bottom/open:true,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_trapdoor,state=facing:east/half:bottom/open:false,patch0=0:bamboo_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_pressure_plate,state=powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_pressure_plate,state=powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:north/face:floor/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:north/face:floor/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:south/face:floor/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:south/face:floor/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:west/face:floor/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:west/face:floor/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:east/face:floor/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:east/face:floor/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:north/face:wall/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:north/face:wall/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:south/face:wall/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:south/face:wall/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:west/face:wall/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:west/face:wall/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:east/face:wall/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:east/face:wall/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:north/face:ceiling/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:north/face:ceiling/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:south/face:ceiling/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:south/face:ceiling/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:west/face:ceiling/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:west/face:ceiling/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:east/face:ceiling/powered:true,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_button,state=facing:east/face:ceiling/powered:false,patch0=0:bamboo_planks,transparency=TRANSPARENT,stdrot=true
[1.19.3-]block:id=%bamboo_sign,patch0=0,patch1=1,patch2=2,patch3=3,patch4=4,patch5=5,patch6=6,patch7=7,patch8=8,patch9=9,transparency=TRANSPARENT,txtid=bamboo_sign
[1.19.3-]block:id=%bamboo_wall_sign,patch0=0,patch1=1,patch2=2,patch3=3,patch4=4,patch5=5,transparency=TRANSPARENT,txtid=bamboo_sign
[1.19.3-]block:id=piglin_wall_head,patch0=5:piglin,patch1=4:piglin,patch2=1:piglin,patch3=0:piglin,patch4=2:piglin,patch5=3:piglin,transparency=TRANSPARENT
[1.19.3-]block:id=piglin_head,patch0=5:piglin,patch1=4:piglin,patch2=1:piglin,patch3=0:piglin,patch4=2:piglin,patch5=3:piglin,transparency=TRANSPARENT
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:north/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:south/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:west/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:true/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:true/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_occupied,patch3=0:chiseled_bookshelf_empty,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:true/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:true,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:true/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:true/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,patch3=0:chiseled_bookshelf_occupied,stdrot=true
[1.19.3-]block:id=%chiseled_bookshelf,state=slot_2_occupied:false/slot_5_occupied:false/slot_4_occupied:false/slot_0_occupied:false/facing:east/slot_1_occupied:false/slot_3_occupied:false,patch0=0:chiseled_bookshelf_side,patch1=0:chiseled_bookshelf_top,patch2=0:chiseled_bookshelf_empty,stdrot=true
# 1.19.4
[1.19.4-]texture:id=cherry_planks,filename=assets/minecraft/textures/block/cherry_planks.png,xcount=1,ycount=1
[1.19.4-]texture:id=cherry_sapling,filename=assets/minecraft/textures/block/cherry_sapling.png,xcount=1,ycount=1
[1.19.4-]texture:id=cherry_log,filename=assets/minecraft/textures/block/cherry_log.png,xcount=1,ycount=1
[1.19.4-]texture:id=cherry_log_top,filename=assets/minecraft/textures/block/cherry_log_top.png,xcount=1,ycount=1
[1.19.4-]texture:id=stripped_cherry_log,filename=assets/minecraft/textures/block/stripped_cherry_log.png,xcount=1,ycount=1
[1.19.4-]texture:id=stripped_cherry_log_top,filename=assets/minecraft/textures/block/stripped_cherry_log_top.png,xcount=1,ycount=1
[1.19.4-]texture:id=cherry_leaves,filename=assets/minecraft/textures/block/cherry_leaves.png,xcount=1,ycount=1
[1.19.4-]texture:id=cherry_trapdoor,filename=assets/minecraft/textures/block/cherry_trapdoor.png,xcount=1,ycount=1
[1.19.4-]texture:id=cherry_door_top,filename=assets/minecraft/textures/block/cherry_door_top.png,xcount=1,ycount=1
[1.19.4-]texture:id=cherry_door_bottom,filename=assets/minecraft/textures/block/cherry_door_bottom.png,xcount=1,ycount=1
[1.19.4-]texturefile:id=cherry_sign,filename=assets/minecraft/textures/entity/signs/cherry.png,format=SIGN
[1.19.4-]texture:id=suspicious_sand_0,filename=assets/minecraft/textures/block/suspicious_sand_0.png,xcount=1,ycount=1
[1.19.4-]texture:id=suspicious_sand_1,filename=assets/minecraft/textures/block/suspicious_sand_1.png,xcount=1,ycount=1
[1.19.4-]texture:id=suspicious_sand_2,filename=assets/minecraft/textures/block/suspicious_sand_2.png,xcount=1,ycount=1
[1.19.4-]texture:id=suspicious_sand_3,filename=assets/minecraft/textures/block/suspicious_sand_3.png,xcount=1,ycount=1
[1.19.4-]texture:id=torchflower,filename=assets/minecraft/textures/block/torchflower.png,xcount=1,ycount=1
[1.19.4-]texture:id=torchflower_crop_stage0,filename=assets/minecraft/textures/block/torchflower_crop_stage0.png,xcount=1,ycount=1
[1.19.4-]texture:id=torchflower_crop_stage1,filename=assets/minecraft/textures/block/torchflower_crop_stage1.png,xcount=1,ycount=1
[1.19.4-]texture:id=torchflower_crop_stage2,filename=assets/minecraft/textures/block/torchflower_crop_stage2.png,xcount=1,ycount=1
[1.19.4-]texture:id=pink_petals,filename=assets/minecraft/textures/block/pink_petals.png,xcount=1,ycount=1
[1.19.4-]texture:id=pink_petals_stem,filename=assets/minecraft/textures/block/pink_petals_stem.png,xcount=1,ycount=1
[1.19.4-]block:id=%cherry_planks,patch0=0:cherry_planks,patch1=0:cherry_planks,patch2=0:cherry_planks,patch3=0:cherry_planks,patch4=0:cherry_planks,patch5=0:cherry_planks,stdrot=true
[1.19.4-]block:id=%cherry_sapling,patch0=0:cherry_sapling,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_planks,patch0=0:cherry_planks,patch1=0:cherry_planks,patch2=0:cherry_planks,patch3=0:cherry_planks,patch4=0:cherry_planks,patch5=0:cherry_planks,stdrot=true
[1.19.4-]block:id=%cherry_sapling,patch0=0:cherry_sapling,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_log,state=axis:x,patch0=0:cherry_log_top,patch1=6000:cherry_log,patch2=6000:cherry_log,patch3=0:cherry_log_top,patch4=6000:cherry_log,patch5=6000:cherry_log,stdrot=true
[1.19.4-]block:id=%cherry_log,state=axis:y,patch0=0:cherry_log,patch1=0:cherry_log_top,patch2=0:cherry_log,patch3=0:cherry_log,patch4=0:cherry_log_top,patch5=0:cherry_log,stdrot=true
[1.19.4-]block:id=%cherry_log,state=axis:z,patch0=6000:cherry_log,patch1=0:cherry_log,patch2=0:cherry_log_top,patch3=6000:cherry_log,patch4=0:cherry_log,patch5=0:cherry_log_top,stdrot=true
[1.19.4-]block:id=%stripped_cherry_log,state=axis:x,patch0=0:stripped_cherry_log_top,patch1=6000:stripped_cherry_log,patch2=6000:stripped_cherry_log,patch3=0:stripped_cherry_log_top,patch4=6000:stripped_cherry_log,patch5=6000:stripped_cherry_log,stdrot=true
[1.19.4-]block:id=%stripped_cherry_log,state=axis:y,patch0=0:stripped_cherry_log,patch1=0:stripped_cherry_log_top,patch2=0:stripped_cherry_log,patch3=0:stripped_cherry_log,patch4=0:stripped_cherry_log_top,patch5=0:stripped_cherry_log,stdrot=true
[1.19.4-]block:id=%stripped_cherry_log,state=axis:z,patch0=6000:stripped_cherry_log,patch1=0:stripped_cherry_log,patch2=0:stripped_cherry_log_top,patch3=6000:stripped_cherry_log,patch4=0:stripped_cherry_log,patch5=0:stripped_cherry_log_top,stdrot=true
[1.19.4-]block:id=%cherry_wood,state=axis:x,patch0=0:cherry_log,stdrot=true
[1.19.4-]block:id=%cherry_wood,state=axis:y,patch0=0:cherry_log,patch1=0:cherry_log,patch2=0:cherry_log,patch3=0:cherry_log,patch4=0:cherry_log,patch5=0:cherry_log,stdrot=true
[1.19.4-]block:id=%cherry_wood,state=axis:z,patch0=0:cherry_log,stdrot=true
[1.19.4-]block:id=%stripped_cherry_wood,state=axis:x,patch0=0:stripped_cherry_log,stdrot=true
[1.19.4-]block:id=%stripped_cherry_wood,state=axis:y,patch0=0:stripped_cherry_log,patch1=0:stripped_cherry_log,patch2=0:stripped_cherry_log,patch3=0:stripped_cherry_log,patch4=0:stripped_cherry_log,patch5=0:stripped_cherry_log,stdrot=true
[1.19.4-]block:id=%stripped_cherry_wood,state=axis:z,patch0=0:stripped_cherry_log,stdrot=true
[1.19.4-]block:id=%cherry_leaves,patch0=0:cherry_leaves,patch1=0:cherry_leaves,patch2=0:cherry_leaves,patch3=0:cherry_leaves,patch4=0:cherry_leaves,patch5=0:cherry_leaves,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_pressure_plate,state=powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_pressure_plate,state=powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:north/half:top/open:true,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:north/half:top/open:false,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:north/half:bottom/open:true,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:north/half:bottom/open:false,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:south/half:top/open:true,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:south/half:top/open:false,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:south/half:bottom/open:true,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:south/half:bottom/open:false,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:west/half:top/open:true,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:west/half:top/open:false,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:west/half:bottom/open:true,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:west/half:bottom/open:false,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:east/half:top/open:true,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:east/half:top/open:false,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:east/half:bottom/open:true,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_trapdoor,state=facing:east/half:bottom/open:false,patch0=0:cherry_trapdoor,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%potted_cherry_sapling,patch0=0:flower_pot,patch1=0:dirt,patch2=0:cherry_sapling,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:north/face:floor/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:north/face:floor/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:south/face:floor/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:south/face:floor/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:west/face:floor/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:west/face:floor/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:east/face:floor/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:east/face:floor/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:north/face:wall/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:north/face:wall/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:south/face:wall/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:south/face:wall/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:west/face:wall/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:west/face:wall/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:east/face:wall/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:east/face:wall/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:north/face:ceiling/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:north/face:ceiling/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:south/face:ceiling/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:south/face:ceiling/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:west/face:ceiling/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:west/face:ceiling/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:east/face:ceiling/powered:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_button,state=facing:east/face:ceiling/powered:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:top/shape:straight,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:top/shape:inner_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:top/shape:inner_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:top/shape:outer_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:top/shape:outer_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:bottom/shape:straight,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:bottom/shape:inner_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:bottom/shape:inner_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:bottom/shape:outer_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:north/half:bottom/shape:outer_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:top/shape:straight,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:top/shape:inner_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:top/shape:inner_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:top/shape:outer_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:top/shape:outer_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:bottom/shape:straight,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:bottom/shape:inner_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:bottom/shape:inner_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:bottom/shape:outer_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:south/half:bottom/shape:outer_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:top/shape:straight,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:top/shape:inner_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:top/shape:inner_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:top/shape:outer_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:top/shape:outer_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:bottom/shape:straight,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:bottom/shape:inner_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:bottom/shape:inner_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:bottom/shape:outer_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:west/half:bottom/shape:outer_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:top/shape:straight,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:top/shape:inner_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:top/shape:inner_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:top/shape:outer_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:top/shape:outer_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:bottom/shape:straight,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:bottom/shape:inner_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:bottom/shape:inner_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:bottom/shape:outer_left,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_stairs,state=facing:east/half:bottom/shape:outer_right,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_slab,state=type:top,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_slab,state=type:bottom,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_slab,state=type:double,patch0=0:cherry_planks,patch1=0:cherry_planks,patch2=0:cherry_planks,patch3=0:cherry_planks,patch4=0:cherry_planks,patch5=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:north/in_wall:true/open:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:north/in_wall:true/open:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:north/in_wall:false/open:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:north/in_wall:false/open:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:south/in_wall:true/open:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:south/in_wall:true/open:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:south/in_wall:false/open:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:south/in_wall:false/open:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:west/in_wall:true/open:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:west/in_wall:true/open:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:west/in_wall:false/open:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:west/in_wall:false/open:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:east/in_wall:true/open:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:east/in_wall:true/open:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:east/in_wall:false/open:true,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence_gate,state=facing:east/in_wall:false/open:false,patch0=0:cherry_planks,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:true/east:true/south:true/north:true,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:false/east:true/south:true/north:true,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:true/east:true/south:false/north:true,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:false/east:true/south:false/north:true,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:true/east:true/south:true/north:false,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:false/east:true/south:true/north:false,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:true/east:true/south:false/north:false,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:false/east:true/south:false/north:false,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:true/east:false/south:true/north:true,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:false/east:false/south:true/north:true,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:true/east:false/south:false/north:true,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:false/east:false/south:false/north:true,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:true/east:false/south:true/north:false,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:false/east:false/south:true/north:false,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:true/east:false/south:false/north:false,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_fence,state=west:false/east:false/south:false/north:false,patch0=0:cherry_planks,transparency=SEMITRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:north/hinge:left/half:upper/open:true,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:north/hinge:left/half:upper/open:false,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:north/hinge:right/half:upper/open:true,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:north/hinge:right/half:upper/open:false,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:north/hinge:left/half:lower/open:true,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:north/hinge:left/half:lower/open:false,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:north/hinge:right/half:lower/open:true,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:north/hinge:right/half:lower/open:false,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:south/hinge:left/half:upper/open:true,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:south/hinge:left/half:upper/open:false,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:south/hinge:right/half:upper/open:true,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:south/hinge:right/half:upper/open:false,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:south/hinge:left/half:lower/open:true,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:south/hinge:left/half:lower/open:false,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:south/hinge:right/half:lower/open:true,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:south/hinge:right/half:lower/open:false,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:west/hinge:left/half:upper/open:true,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:west/hinge:left/half:upper/open:false,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:west/hinge:right/half:upper/open:true,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:west/hinge:right/half:upper/open:false,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:west/hinge:left/half:lower/open:true,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:west/hinge:left/half:lower/open:false,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:west/hinge:right/half:lower/open:true,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:west/hinge:right/half:lower/open:false,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:east/hinge:left/half:upper/open:true,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:east/hinge:left/half:upper/open:false,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:east/hinge:right/half:upper/open:true,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:east/hinge:right/half:upper/open:false,patch0=0:cherry_door_top,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:east/hinge:left/half:lower/open:true,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:east/hinge:left/half:lower/open:false,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:east/hinge:right/half:lower/open:true,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%cherry_door,state=facing:east/hinge:right/half:lower/open:false,patch0=0:cherry_door_bottom,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=cherry_sign,patch0=0,patch1=1,patch2=2,patch3=3,patch4=4,patch5=5,patch6=6,patch7=7,patch8=8,patch9=9,transparency=TRANSPARENT,txtid=cherry_sign
[1.19.4-]block:id=cherry_wall_sign,patch0=0,patch1=1,patch2=2,patch3=3,patch4=4,patch5=5,transparency=TRANSPARENT,txtid=cherry_sign
[1.19.4-]block:id=%suspicious_sand,state=dusted:0,patch0=0:suspicious_sand_0,patch1=0:suspicious_sand_0,patch2=0:suspicious_sand_0,patch3=0:suspicious_sand_0,patch4=0:suspicious_sand_0,patch5=0:suspicious_sand_0,stdrot=true
[1.19.4-]block:id=%suspicious_sand,state=dusted:1,patch0=0:suspicious_sand_1,patch1=0:suspicious_sand_1,patch2=0:suspicious_sand_1,patch3=0:suspicious_sand_1,patch4=0:suspicious_sand_1,patch5=0:suspicious_sand_1,stdrot=true
[1.19.4-]block:id=%suspicious_sand,state=dusted:2,patch0=0:suspicious_sand_2,patch1=0:suspicious_sand_2,patch2=0:suspicious_sand_2,patch3=0:suspicious_sand_2,patch4=0:suspicious_sand_2,patch5=0:suspicious_sand_2,stdrot=true
[1.19.4-]block:id=%suspicious_sand,state=dusted:3,patch0=0:suspicious_sand_3,patch1=0:suspicious_sand_3,patch2=0:suspicious_sand_3,patch3=0:suspicious_sand_3,patch4=0:suspicious_sand_3,patch5=0:suspicious_sand_3,stdrot=true
[1.19.4-]block:id=%torchflower,patch0=0:torchflower,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%potted_torchflower,patch0=0:flower_pot,patch1=0:dirt,patch2=0:torchflower,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%torchflower_crop,state=age:0,patch0=0:torchflower_crop_stage0,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%torchflower_crop,state=age:1,patch0=0:torchflower_crop_stage1,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%torchflower_crop,state=age:2,patch0=0:torchflower_crop_stage2,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:north/flower_amount:1,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:north/flower_amount:2,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:north/flower_amount:3,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:north/flower_amount:4,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:south/flower_amount:1,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:south/flower_amount:2,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:south/flower_amount:3,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:south/flower_amount:4,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:west/flower_amount:1,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:west/flower_amount:2,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:west/flower_amount:3,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:west/flower_amount:4,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:east/flower_amount:1,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:east/flower_amount:2,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:east/flower_amount:3,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
[1.19.4-]block:id=%pink_petals,state=facing:east/flower_amount:4,patch0=0:pink_petals,patch1=2000:pink_petals_stem,transparency=TRANSPARENT,stdrot=true
# 1.20
[1.20-]texture:id=pitcher_crop_side,filename=assets/minecraft/textures/block/pitcher_crop_side.png,xcount=1,ycount=1
[1.20-]texture:id=pitcher_crop_bottom,filename=assets/minecraft/textures/block/pitcher_crop_bottom.png,xcount=1,ycount=1
[1.20-]texture:id=pitcher_crop_top,filename=assets/minecraft/textures/block/pitcher_crop_top.png,xcount=1,ycount=1
[1.20-]texture:id=pitcher_crop_bottom_stage_1,filename=assets/minecraft/textures/block/pitcher_crop_bottom_stage_1.png,xcount=1,ycount=1
[1.20-]texture:id=pitcher_crop_bottom_stage_2,filename=assets/minecraft/textures/block/pitcher_crop_bottom_stage_2.png,xcount=1,ycount=1
[1.20-]texture:id=pitcher_crop_top_stage_3,filename=assets/minecraft/textures/block/pitcher_crop_top_stage_3.png,xcount=1,ycount=1
[1.20-]texture:id=pitcher_crop_bottom_stage_3,filename=assets/minecraft/textures/block/pitcher_crop_bottom_stage_3.png,xcount=1,ycount=1
[1.20-]texture:id=pitcher_crop_top_stage_4,filename=assets/minecraft/textures/block/pitcher_crop_top_stage_4.png,xcount=1,ycount=1
[1.20-]texture:id=pitcher_crop_bottom_stage_4,filename=assets/minecraft/textures/block/pitcher_crop_bottom_stage_4.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_not_cracked_south,filename=assets/minecraft/textures/block/sniffer_egg_not_cracked_south.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_not_cracked_bottom,filename=assets/minecraft/textures/block/sniffer_egg_not_cracked_bottom.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_not_cracked_east,filename=assets/minecraft/textures/block/sniffer_egg_not_cracked_east.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_not_cracked_west,filename=assets/minecraft/textures/block/sniffer_egg_not_cracked_west.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_not_cracked_north,filename=assets/minecraft/textures/block/sniffer_egg_not_cracked_north.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_not_cracked_top,filename=assets/minecraft/textures/block/sniffer_egg_not_cracked_top.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_slightly_cracked_south,filename=assets/minecraft/textures/block/sniffer_egg_slightly_cracked_south.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_slightly_cracked_bottom,filename=assets/minecraft/textures/block/sniffer_egg_slightly_cracked_bottom.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_slightly_cracked_east,filename=assets/minecraft/textures/block/sniffer_egg_slightly_cracked_east.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_slightly_cracked_west,filename=assets/minecraft/textures/block/sniffer_egg_slightly_cracked_west.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_slightly_cracked_north,filename=assets/minecraft/textures/block/sniffer_egg_slightly_cracked_north.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_slightly_cracked_top,filename=assets/minecraft/textures/block/sniffer_egg_slightly_cracked_top.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_very_cracked_south,filename=assets/minecraft/textures/block/sniffer_egg_very_cracked_south.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_very_cracked_bottom,filename=assets/minecraft/textures/block/sniffer_egg_very_cracked_bottom.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_very_cracked_east,filename=assets/minecraft/textures/block/sniffer_egg_very_cracked_east.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_very_cracked_west,filename=assets/minecraft/textures/block/sniffer_egg_very_cracked_west.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_very_cracked_north,filename=assets/minecraft/textures/block/sniffer_egg_very_cracked_north.png,xcount=1,ycount=1
[1.20-]texture:id=sniffer_egg_very_cracked_top,filename=assets/minecraft/textures/block/sniffer_egg_very_cracked_top.png,xcount=1,ycount=1
[1.20-]texture:id=calibrated_sculk_sensor_input_side,filename=assets/minecraft/textures/block/calibrated_sculk_sensor_input_side.png,xcount=1,ycount=1
[1.20-]texture:id=calibrated_sculk_sensor_top,filename=assets/minecraft/textures/block/calibrated_sculk_sensor_top.png,xcount=1,ycount=1
[1.20-]texture:id=calibrated_sculk_sensor_amethyst,filename=assets/minecraft/textures/block/calibrated_sculk_sensor_amethyst.png,xcount=1,ycount=1
[1.20-]block:id=%pitcher_crop,state=age:0/half:upper,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_crop,state=age:0/half:lower,patch0=0:pitcher_crop_side,patch1=0:pitcher_crop_bottom,patch2=0:pitcher_crop_top,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_crop,state=age:1/half:upper,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_crop,state=age:1/half:lower,patch0=0:pitcher_crop_bottom_stage_1,patch1=0:pitcher_crop_side,patch2=0:pitcher_crop_bottom,patch3=0:pitcher_crop_top,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_crop,state=age:2/half:upper,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_crop,state=age:2/half:lower,patch0=0:pitcher_crop_bottom_stage_2,patch1=0:pitcher_crop_side,patch2=0:pitcher_crop_bottom,patch3=0:pitcher_crop_top,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_crop,state=age:3/half:upper,patch0=0:pitcher_crop_top_stage_3,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_crop,state=age:3/half:lower,patch0=0:pitcher_crop_bottom_stage_3,patch1=0:pitcher_crop_side,patch2=0:pitcher_crop_bottom,patch3=0:pitcher_crop_top,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_crop,state=age:4/half:upper,patch0=0:pitcher_crop_top_stage_4,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_crop,state=age:4/half:lower,patch0=0:pitcher_crop_bottom_stage_4,patch1=0:pitcher_crop_side,patch2=0:pitcher_crop_bottom,patch3=0:pitcher_crop_top,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_plant,state=half:upper,patch0=0:pitcher_crop_top_stage_4,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%pitcher_plant,state=half:lower,patch0=0:pitcher_crop_bottom_stage_4,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%sniffer_egg,state=hatch:0,patch0=0:sniffer_egg_not_cracked_south,patch1=0:sniffer_egg_not_cracked_bottom,patch2=0:sniffer_egg_not_cracked_east,patch3=0:sniffer_egg_not_cracked_west,patch4=0:sniffer_egg_not_cracked_north,patch5=0:sniffer_egg_not_cracked_top,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%sniffer_egg,state=hatch:1,patch0=0:sniffer_egg_slightly_cracked_south,patch1=0:sniffer_egg_slightly_cracked_bottom,patch2=0:sniffer_egg_slightly_cracked_east,patch3=0:sniffer_egg_slightly_cracked_west,patch4=0:sniffer_egg_slightly_cracked_north,patch5=0:sniffer_egg_slightly_cracked_top,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%sniffer_egg,state=hatch:2,patch0=0:sniffer_egg_very_cracked_south,patch1=0:sniffer_egg_very_cracked_bottom,patch2=0:sniffer_egg_very_cracked_east,patch3=0:sniffer_egg_very_cracked_west,patch4=0:sniffer_egg_very_cracked_north,patch5=0:sniffer_egg_very_cracked_top,transparency=TRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:north/sculk_sensor_phase:inactive,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_inactive,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:north/sculk_sensor_phase:active,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:north/sculk_sensor_phase:cooldown,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:south/sculk_sensor_phase:inactive,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_inactive,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:south/sculk_sensor_phase:active,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:south/sculk_sensor_phase:cooldown,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:west/sculk_sensor_phase:inactive,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_inactive,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:west/sculk_sensor_phase:active,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:west/sculk_sensor_phase:cooldown,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:east/sculk_sensor_phase:inactive,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_inactive,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:east/sculk_sensor_phase:active,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
[1.20-]block:id=%calibrated_sculk_sensor,state=facing:east/sculk_sensor_phase:cooldown,patch0=0:calibrated_sculk_sensor_input_side,patch1=0:sculk_sensor_bottom,patch2=0:sculk_sensor_side,patch3=0:calibrated_sculk_sensor_top,patch4=0:sculk_sensor_tendril_active,patch5=0:calibrated_sculk_sensor_amethyst,transparency=SEMITRANSPARENT,stdrot=true
# 1.20.3
[1.20.3-]texture:id=suspicious_gravel_0,filename=assets/minecraft/textures/block/suspicious_gravel_0.png,xcount=1,ycount=1
[1.20.3-]texture:id=suspicious_gravel_1,filename=assets/minecraft/textures/block/suspicious_gravel_1.png,xcount=1,ycount=1
[1.20.3-]texture:id=suspicious_gravel_2,filename=assets/minecraft/textures/block/suspicious_gravel_2.png,xcount=1,ycount=1
[1.20.3-]texture:id=suspicious_gravel_3,filename=assets/minecraft/textures/block/suspicious_gravel_3.png,xcount=1,ycount=1
[1.20.3-]texture:id=tuff,filename=assets/minecraft/textures/block/tuff.png,xcount=1,ycount=1
[1.20.3-]texture:id=polished_tuff,filename=assets/minecraft/textures/block/polished_tuff.png,xcount=1,ycount=1
[1.20.3-]texture:id=chiseled_tuff,filename=assets/minecraft/textures/block/chiseled_tuff.png,xcount=1,ycount=1
[1.20.3-]texture:id=chiseled_tuff_top,filename=assets/minecraft/textures/block/chiseled_tuff_top.png,xcount=1,ycount=1
[1.20.3-]texture:id=tuff_bricks,filename=assets/minecraft/textures/block/tuff_bricks.png,xcount=1,ycount=1
[1.20.3-]texture:id=chiseled_tuff_bricks,filename=assets/minecraft/textures/block/chiseled_tuff_bricks.png,xcount=1,ycount=1
[1.20.3-]texture:id=chiseled_tuff_bricks_top,filename=assets/minecraft/textures/block/chiseled_tuff_bricks_top.png,xcount=1,ycount=1
[1.20.3-]texture:id=oxidized_chiseled_copper,filename=assets/minecraft/textures/block/oxidized_chiseled_copper.png,xcount=1,ycount=1
[1.20.3-]texture:id=weathered_chiseled_copper,filename=assets/minecraft/textures/block/weathered_chiseled_copper.png,xcount=1,ycount=1
[1.20.3-]texture:id=exposed_chiseled_copper,filename=assets/minecraft/textures/block/exposed_chiseled_copper.png,xcount=1,ycount=1
[1.20.3-]texture:id=chiseled_copper,filename=assets/minecraft/textures/block/chiseled_copper.png,xcount=1,ycount=1
[1.20.3-]texture:id=copper_door_top,filename=assets/minecraft/textures/block/copper_door_top.png,xcount=1,ycount=1
[1.20.3-]texture:id=copper_door_bottom,filename=assets/minecraft/textures/block/copper_door_bottom.png,xcount=1,ycount=1
[1.20.3-]texture:id=exposed_copper_door_top,filename=assets/minecraft/textures/block/exposed_copper_door_top.png,xcount=1,ycount=1
[1.20.3-]texture:id=exposed_copper_door_bottom,filename=assets/minecraft/textures/block/exposed_copper_door_bottom.png,xcount=1,ycount=1
[1.20.3-]texture:id=oxidized_copper_door_top,filename=assets/minecraft/textures/block/oxidized_copper_door_top.png,xcount=1,ycount=1
[1.20.3-]texture:id=oxidized_copper_door_bottom,filename=assets/minecraft/textures/block/oxidized_copper_door_bottom.png,xcount=1,ycount=1
[1.20.3-]texture:id=weathered_copper_door_top,filename=assets/minecraft/textures/block/weathered_copper_door_top.png,xcount=1,ycount=1
[1.20.3-]texture:id=weathered_copper_door_bottom,filename=assets/minecraft/textures/block/weathered_copper_door_bottom.png,xcount=1,ycount=1
[1.20.3-]texture:id=copper_trapdoor,filename=assets/minecraft/textures/block/copper_trapdoor.png,xcount=1,ycount=1
[1.20.3-]texture:id=exposed_copper_trapdoor,filename=assets/minecraft/textures/block/exposed_copper_trapdoor.png,xcount=1,ycount=1
[1.20.3-]texture:id=oxidized_copper_trapdoor,filename=assets/minecraft/textures/block/oxidized_copper_trapdoor.png,xcount=1,ycount=1
[1.20.3-]texture:id=weathered_copper_trapdoor,filename=assets/minecraft/textures/block/weathered_copper_trapdoor.png,xcount=1,ycount=1
[1.20.3-]texture:id=copper_grate,filename=assets/minecraft/textures/block/copper_grate.png,xcount=1,ycount=1
[1.20.3-]texture:id=exposed_copper_grate,filename=assets/minecraft/textures/block/exposed_copper_grate.png,xcount=1,ycount=1
[1.20.3-]texture:id=weathered_copper_grate,filename=assets/minecraft/textures/block/weathered_copper_grate.png,xcount=1,ycount=1
[1.20.3-]texture:id=oxidized_copper_grate,filename=assets/minecraft/textures/block/oxidized_copper_grate.png,xcount=1,ycount=1
[1.20.3-]block:id=%suspicious_gravel,state=dusted:0,patch0=0:suspicious_gravel_0,patch1=0:suspicious_gravel_0,patch2=0:suspicious_gravel_0,patch3=0:suspicious_gravel_0,patch4=0:suspicious_gravel_0,patch5=0:suspicious_gravel_0,stdrot=true
[1.20.3-]block:id=%suspicious_gravel,state=dusted:1,patch0=0:suspicious_gravel_1,patch1=0:suspicious_gravel_1,patch2=0:suspicious_gravel_1,patch3=0:suspicious_gravel_1,patch4=0:suspicious_gravel_1,patch5=0:suspicious_gravel_1,stdrot=true
[1.20.3-]block:id=%suspicious_gravel,state=dusted:2,patch0=0:suspicious_gravel_2,patch1=0:suspicious_gravel_2,patch2=0:suspicious_gravel_2,patch3=0:suspicious_gravel_2,patch4=0:suspicious_gravel_2,patch5=0:suspicious_gravel_2,stdrot=true
[1.20.3-]block:id=%suspicious_gravel,state=dusted:3,patch0=0:suspicious_gravel_3,patch1=0:suspicious_gravel_3,patch2=0:suspicious_gravel_3,patch3=0:suspicious_gravel_3,patch4=0:suspicious_gravel_3,patch5=0:suspicious_gravel_3,stdrot=true
[1.20.3-]block:id=%tuff,patch0-5=0:tuff,stdrot=true
[1.20.3-]block:id=%tuff_slab,state=type:top,patch0=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%tuff_slab,state=type:bottom,patch0=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%tuff_slab,state=type:double,patch0-5=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%tuff_stairs,patch0-2=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%tuff_wall,patch0-2=0:tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%polished_tuff,patch0-5=0:polished_tuff,stdrot=true
[1.20.3-]block:id=%polished_tuff_slab,state=type:top,patch0=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%polished_tuff_slab,state=type:bottom,patch0=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%polished_tuff_slab,state=type:double,patch0-5=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%polished_tuff_stairs,patch0-2=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%polished_tuff_wall,patch0-2=0:polished_tuff,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%chiseled_tuff,patch0=0:chiseled_tuff,patch1=0:chiseled_tuff_top,patch2=0:chiseled_tuff,patch3=0:chiseled_tuff,patch4=0:chiseled_tuff_top,patch5=0:chiseled_tuff,stdrot=true
[1.20.3-]block:id=%tuff_bricks,patch0-5=0:tuff_bricks,stdrot=true
[1.20.3-]block:id=%tuff_brick_slab,state=type:top,patch0=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%tuff_brick_slab,state=type:bottom,patch0=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%tuff_brick_slab,state=type:double,patch0-5=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%tuff_brick_stairs,patch0-2=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%tuff_brick_wall,patch0-2=0:tuff_bricks,transparency=SEMITRANSPARENT,stdrot=true
[1.20.3-]block:id=%chiseled_tuff_bricks,patch0-5=0:chiseled_tuff_bricks,stdrot=true
[1.20.3-]block:id=%oxidized_chiseled_copper,patch0-5=0:oxidized_chiseled_copper,stdrot=true
[1.20.3-]block:id=%weathered_chiseled_copper,patch0-5=0:weathered_chiseled_copper,stdrot=true
[1.20.3-]block:id=%exposed_chiseled_copper,patch0-5=0:exposed_chiseled_copper,stdrot=true
[1.20.3-]block:id=%chiseled_copper,patch0-5=0:chiseled_copper,stdrot=true
[1.20.3-]block:id=%waxed_oxidized_chiseled_copper,patch0-5=0:oxidized_chiseled_copper,stdrot=true
[1.20.3-]block:id=%waxed_weathered_chiseled_copper,patch0-5=0:weathered_chiseled_copper,stdrot=true
[1.20.3-]block:id=%waxed_exposed_chiseled_copper,patch0-5=0:exposed_chiseled_copper,stdrot=true
[1.20.3-]block:id=%waxed_chiseled_copper,patch0-5=0:chiseled_copper,stdrot=true
[1.20.3-]block:id=%copper_door,data=*,patch0=0:copper_door_top,patch1=0:copper_door_bottom,transparency=TRANSPARENT
[1.20.3-]block:id=%exposed_copper_door,data=*,patch0=0:exposed_copper_door_top,patch1=0:exposed_copper_door_bottom,transparency=TRANSPARENT
[1.20.3-]block:id=%oxidized_copper_door,data=*,patch0=0:oxidized_copper_door_top,patch1=0:oxidized_copper_door_bottom,transparency=TRANSPARENT
[1.20.3-]block:id=%weathered_copper_door,data=*,patch0=0:weathered_copper_door_top,patch1=0:weathered_copper_door_bottom,transparency=TRANSPARENT
[1.20.3-]block:id=%waxed_copper_door,data=*,patch0=0:copper_door_top,patch1=0:copper_door_bottom,transparency=TRANSPARENT
[1.20.3-]block:id=%waxed_exposed_copper_door,data=*,patch0=0:exposed_copper_door_top,patch1=0:exposed_copper_door_bottom,transparency=TRANSPARENT
[1.20.3-]block:id=%waxed_oxidized_copper_door,data=*,patch0=0:oxidized_copper_door_top,patch1=0:oxidized_copper_door_bottom,transparency=TRANSPARENT
[1.20.3-]block:id=%waxed_weathered_copper_door,data=*,patch0=0:weathered_copper_door_top,patch1=0:weathered_copper_door_bottom,transparency=TRANSPARENT
[1.20.3-]block:id=%copper_trapdoor,id=%waxed_copper_trapdoor,allfaces=0:copper_trapdoor,stdrot=true,transparency=TRANSPARENT
[1.20.3-]block:id=%exposed_copper_trapdoor,id=%waxed_exposed_copper_trapdoor,allfaces=0:exposed_copper_trapdoor,stdrot=true,transparency=TRANSPARENT
[1.20.3-]block:id=%oxidized_copper_trapdoor,id=%waxed_oxidized_copper_trapdoor,allfaces=0:oxidized_copper_trapdoor,stdrot=true,transparency=TRANSPARENT
[1.20.3-]block:id=%weathered_copper_trapdoor,id=%waxed_weathered_copper_trapdoor,allfaces=0:weathered_copper_trapdoor,stdrot=true,transparency=TRANSPARENT
[1.20.3-]block:id=%copper_grate,patch0-5=0:copper_grate,transparency=TRANSPARENT,stdrot=true
[1.20.3-]block:id=%exposed_copper_grate,patch0-5=0:exposed_copper_grate,transparency=TRANSPARENT,stdrot=true
[1.20.3-]block:id=%weathered_copper_grate,patch0-5=0:weathered_copper_grate,transparency=TRANSPARENT,stdrot=true
[1.20.3-]block:id=%oxidized_copper_grate,patch0-5=0:oxidized_copper_grate,transparency=TRANSPARENT,stdrot=true
[1.20.3-]block:id=%waxed_copper_grate,patch0-5=0:copper_grate,transparency=TRANSPARENT,stdrot=true
[1.20.3-]block:id=%waxed_exposed_copper_grate,patch0-5=0:exposed_copper_grate,transparency=TRANSPARENT,stdrot=true
[1.20.3-]block:id=%waxed_weathered_copper_grate,patch0-5=0:weathered_copper_grate,transparency=TRANSPARENT,stdrot=true
[1.20.3-]block:id=%waxed_oxidized_copper_grate,patch0-5=0:oxidized_copper_grate,transparency=TRANSPARENT,stdrot=true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 252 B

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 210 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 259 B

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 301 B

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 B

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 232 B

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 B

After

Width:  |  Height:  |  Size: 242 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 B

After

Width:  |  Height:  |  Size: 212 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 B

After

Width:  |  Height:  |  Size: 215 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 276 B

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

After

Width:  |  Height:  |  Size: 222 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 260 B

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 201 B

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

After

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 B

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 B

After

Width:  |  Height:  |  Size: 201 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 251 B

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 290 B

After

Width:  |  Height:  |  Size: 255 B

Some files were not shown because too many files have changed in this diff Show More