diff --git a/.gitmodules b/.gitmodules index fc46c2b9..84c8d6ba 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "leveldb/src/main/cpp/leveldb-mcpe"] +[submodule "leveldb-mcpe"] path = leveldb/src/main/cpp/leveldb-mcpe - url = https://github.com/Mojang/leveldb-mcpe.git + url = git@github.com:Mojang/leveldb-mcpe diff --git a/README.md b/README.md index 614074d6..a5ea78ef 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,10 @@ By *Proto Lambda*\(Link removed, as he asked to\), [@MithrilMania](https://githu [@flagmaggot](https://github.com/flagmaggot) and many other community contributors, including translation. This fork is the only one supporting MCPE 1.13+ for now. -## ![translate](https://github.com/Templarian/MaterialDesign/blob/master/svg/web.svg) Help improve translation -[Click here](https://github.com/oO0oO0oO0o0o00/blocktopograph/blob/master/translation.md). +## Redirection +Update is currently paused due to several difficulties (including sections below). The current active fork is now https://github.com/NguyenDuck/blocktopograph -## Update paused -As title. - -Translations and pull requests **will still be processed**, but we encourage you to -take over this project and develope on your own. +Translations and pull requests are encouraged to be made to the active forks instead of this one. ## ![download](https://github.com/Templarian/MaterialDesign/blob/master/svg/download.svg)Download [>>> Download on Google Play <<<](https://play.google.com/store/apps/details?id=rbq2012.blocktopograph) diff --git a/TODO.md b/TODO.md index 6cf97df9..5cbb713f 100644 --- a/TODO.md +++ b/TODO.md @@ -1,19 +1,3 @@ #TODO -- Translations/Localization -- MCPE 0.16 blocks + 1.0 blocks!!! -- new entities, block entities -- new icons -- unit tests -- testing! - - -#extra: - -- multithreading of the individual chunks of each tile, with a thread-pool. -- optimizing the top down rendering with lazy chunk loading (from the right direction, stopping when opaque) - -#important - -- firebase cleanup (remove config, new key) -- google big query! +- new blocks \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 975d0999..95cc84fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,16 +1,19 @@ apply plugin: 'com.android.application' -apply plugin: 'io.fabric' +//apply plugin: 'com.guardsquare.proguard' +//apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.google.firebase.crashlytics' android { - compileSdkVersion 29 + compileSdkVersion 30 defaultConfig { applicationId 'rbq2012.blocktopograph' - minSdkVersion 16 + minSdkVersion 26 targetSdkVersion 29 - versionCode 1090005 - versionName "1.9.3" + versionCode 1090007 + versionName "1.9.5" vectorDrawables.useSupportLibrary = true } + dataBinding { enabled true } @@ -20,51 +23,69 @@ android { buildTypes { debug { - minifyEnabled false + firebaseCrashlytics { + mappingFileUploadEnabled false + } + postprocessing { + removeUnusedCode true + obfuscate false + optimizeCode true + proguardFile 'proguard-rules.pro' + } //multiDexEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' ext.alwaysUpdateBuildId = false } release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + firebaseCrashlytics { + mappingFileUploadEnabled false + } + postprocessing { + removeUnusedCode true + obfuscate false + optimizeCode true + proguardFile 'proguard-rules.pro' + } +// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { - sourceCompatibility = '1.8' - targetCompatibility = '1.8' + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } } dependencies { implementation fileTree(include: ['*.jar', '*.so', '*.aar'], dir: 'libs') - testImplementation 'junit:junit:4.12' + implementation 'com.google.firebase:firebase-crashlytics:18.2.1' + implementation 'com.google.firebase:firebase-analytics:19.0.0' + testImplementation 'junit:junit:4.13.2' implementation project(':leveldb') implementation project(':tileview') implementation 'com.github.clans:fab:1.6.4' - implementation 'com.github.bmelnychuk:atv:1.2.8' - implementation 'com.github.woxthebox:draglistview:1.6.3' + implementation 'com.github.bmelnychuk:atv:1.2.9' + implementation 'com.github.woxthebox:draglistview:1.7.2' implementation 'com.andreabaccega:android-edittext-validator:1.3.5' //core is the new recommended alias for analytics - implementation 'com.google.firebase:firebase-core:17.2.2' - implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' + implementation 'com.google.firebase:firebase-core:19.0.0' //implementation 'org.jetbrains:annotations-java5:15.0' - implementation 'com.tomergoldst.android:tooltips:1.0.10' - implementation 'androidx.annotation:annotation:1.1.0' - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.recyclerview:recyclerview:1.1.0' - implementation 'com.google.android.material:material:1.1.0' - implementation 'com.github.bumptech.glide:glide:4.9.0' - annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' + implementation 'com.tomergoldst.android:tooltips:1.1.0' + implementation 'androidx.annotation:annotation:1.2.0' + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.recyclerview:recyclerview:1.2.1' + implementation 'com.google.android.material:material:1.4.0' + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' //implementation 'com.github.MikeOrtiz:TouchImageView:2.1.1' implementation 'com.github.chrisbanes:PhotoView:2.3.0' - implementation 'com.github.florent37:expansionpanel:1.2.2' - implementation 'com.jbvincey:nestedradiobutton:1.0' - implementation 'net.lingala.zip4j:zip4j:2.3.1' - implementation 'commons-io:commons-io:2.4' - implementation 'org.apache.commons:commons-lang3:3.9' + implementation 'com.github.florent37:expansionpanel:1.2.4' + implementation 'com.github.jbvincey:nestedradiobutton:1.1' + implementation 'net.lingala.zip4j:zip4j:2.9.0' + // do NOT accidentally "up"-grade to the 2003 version + //noinspection GradleDependency + implementation 'commons-io:commons-io:2.11.0' + implementation 'org.apache.commons:commons-lang3:3.12.0' //debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.1' + implementation 'com.google.guava:guava:30.1.1-jre' } -apply plugin: 'com.google.gms.google-services' diff --git a/app/src/main/assets/blocks/anvil_base.png b/app/src/main/assets/blocks/anvil_base.png new file mode 100644 index 00000000..db5f9a9f Binary files /dev/null and b/app/src/main/assets/blocks/anvil_base.png differ diff --git a/app/src/main/assets/blocks/anvil_top_damaged_0.png b/app/src/main/assets/blocks/anvil_top_damaged_0.png new file mode 100644 index 00000000..55a73198 Binary files /dev/null and b/app/src/main/assets/blocks/anvil_top_damaged_0.png differ diff --git a/app/src/main/assets/blocks/anvil_top_damaged_1.png b/app/src/main/assets/blocks/anvil_top_damaged_1.png new file mode 100644 index 00000000..7bc6349c Binary files /dev/null and b/app/src/main/assets/blocks/anvil_top_damaged_1.png differ diff --git a/app/src/main/assets/blocks/anvil_top_damaged_2.png b/app/src/main/assets/blocks/anvil_top_damaged_2.png new file mode 100644 index 00000000..cc5ac5e5 Binary files /dev/null and b/app/src/main/assets/blocks/anvil_top_damaged_2.png differ diff --git a/app/src/main/assets/blocks/beacon.png b/app/src/main/assets/blocks/beacon.png new file mode 100644 index 00000000..a7e77a2b Binary files /dev/null and b/app/src/main/assets/blocks/beacon.png differ diff --git a/app/src/main/assets/blocks/bed_feet_end.png b/app/src/main/assets/blocks/bed_feet_end.png new file mode 100644 index 00000000..41838cf3 Binary files /dev/null and b/app/src/main/assets/blocks/bed_feet_end.png differ diff --git a/app/src/main/assets/blocks/bed_feet_side.png b/app/src/main/assets/blocks/bed_feet_side.png new file mode 100644 index 00000000..69627219 Binary files /dev/null and b/app/src/main/assets/blocks/bed_feet_side.png differ diff --git a/app/src/main/assets/blocks/bed_feet_top.png b/app/src/main/assets/blocks/bed_feet_top.png new file mode 100644 index 00000000..43ba6a36 Binary files /dev/null and b/app/src/main/assets/blocks/bed_feet_top.png differ diff --git a/app/src/main/assets/blocks/bed_head_end.png b/app/src/main/assets/blocks/bed_head_end.png new file mode 100644 index 00000000..95888bf1 Binary files /dev/null and b/app/src/main/assets/blocks/bed_head_end.png differ diff --git a/app/src/main/assets/blocks/bed_head_side.png b/app/src/main/assets/blocks/bed_head_side.png new file mode 100644 index 00000000..4a49da31 Binary files /dev/null and b/app/src/main/assets/blocks/bed_head_side.png differ diff --git a/app/src/main/assets/blocks/bed_head_top.png b/app/src/main/assets/blocks/bed_head_top.png new file mode 100644 index 00000000..024640f0 Binary files /dev/null and b/app/src/main/assets/blocks/bed_head_top.png differ diff --git a/app/src/main/assets/blocks/bedrock.png b/app/src/main/assets/blocks/bedrock.png new file mode 100644 index 00000000..4d079233 Binary files /dev/null and b/app/src/main/assets/blocks/bedrock.png differ diff --git a/app/src/main/assets/blocks/beetroots_stage_0.png b/app/src/main/assets/blocks/beetroots_stage_0.png new file mode 100644 index 00000000..fdd85ee0 Binary files /dev/null and b/app/src/main/assets/blocks/beetroots_stage_0.png differ diff --git a/app/src/main/assets/blocks/beetroots_stage_1.png b/app/src/main/assets/blocks/beetroots_stage_1.png new file mode 100644 index 00000000..ac1e6162 Binary files /dev/null and b/app/src/main/assets/blocks/beetroots_stage_1.png differ diff --git a/app/src/main/assets/blocks/beetroots_stage_2.png b/app/src/main/assets/blocks/beetroots_stage_2.png new file mode 100644 index 00000000..19dd6eb1 Binary files /dev/null and b/app/src/main/assets/blocks/beetroots_stage_2.png differ diff --git a/app/src/main/assets/blocks/beetroots_stage_3.png b/app/src/main/assets/blocks/beetroots_stage_3.png new file mode 100644 index 00000000..a13a0ec9 Binary files /dev/null and b/app/src/main/assets/blocks/beetroots_stage_3.png differ diff --git a/app/src/main/assets/blocks/bookshelf.png b/app/src/main/assets/blocks/bookshelf.png new file mode 100644 index 00000000..7ac3737a Binary files /dev/null and b/app/src/main/assets/blocks/bookshelf.png differ diff --git a/app/src/main/assets/blocks/border.png b/app/src/main/assets/blocks/border.png new file mode 100644 index 00000000..2bca675a Binary files /dev/null and b/app/src/main/assets/blocks/border.png differ diff --git a/app/src/main/assets/blocks/brewing_stand.png b/app/src/main/assets/blocks/brewing_stand.png new file mode 100644 index 00000000..b7509d75 Binary files /dev/null and b/app/src/main/assets/blocks/brewing_stand.png differ diff --git a/app/src/main/assets/blocks/brewing_stand_base.png b/app/src/main/assets/blocks/brewing_stand_base.png new file mode 100644 index 00000000..48491bb5 Binary files /dev/null and b/app/src/main/assets/blocks/brewing_stand_base.png differ diff --git a/app/src/main/assets/blocks/brick.png b/app/src/main/assets/blocks/brick.png new file mode 100644 index 00000000..3efcee4f Binary files /dev/null and b/app/src/main/assets/blocks/brick.png differ diff --git a/app/src/main/assets/blocks/build_allow.png b/app/src/main/assets/blocks/build_allow.png new file mode 100644 index 00000000..c995bd74 Binary files /dev/null and b/app/src/main/assets/blocks/build_allow.png differ diff --git a/app/src/main/assets/blocks/build_deny.png b/app/src/main/assets/blocks/build_deny.png new file mode 100644 index 00000000..db2300b2 Binary files /dev/null and b/app/src/main/assets/blocks/build_deny.png differ diff --git a/app/src/main/assets/blocks/cactus_bottom.tga b/app/src/main/assets/blocks/cactus_bottom.tga new file mode 100644 index 00000000..583aef99 Binary files /dev/null and b/app/src/main/assets/blocks/cactus_bottom.tga differ diff --git a/app/src/main/assets/blocks/cactus_side.tga b/app/src/main/assets/blocks/cactus_side.tga new file mode 100644 index 00000000..e6e50ebe Binary files /dev/null and b/app/src/main/assets/blocks/cactus_side.tga differ diff --git a/app/src/main/assets/blocks/cactus_top.tga b/app/src/main/assets/blocks/cactus_top.tga new file mode 100644 index 00000000..3a05eeea Binary files /dev/null and b/app/src/main/assets/blocks/cactus_top.tga differ diff --git a/app/src/main/assets/blocks/cake_bottom.png b/app/src/main/assets/blocks/cake_bottom.png new file mode 100644 index 00000000..6f88ecca Binary files /dev/null and b/app/src/main/assets/blocks/cake_bottom.png differ diff --git a/app/src/main/assets/blocks/cake_inner.png b/app/src/main/assets/blocks/cake_inner.png new file mode 100644 index 00000000..1aa0d1d4 Binary files /dev/null and b/app/src/main/assets/blocks/cake_inner.png differ diff --git a/app/src/main/assets/blocks/cake_side.png b/app/src/main/assets/blocks/cake_side.png new file mode 100644 index 00000000..9d51b842 Binary files /dev/null and b/app/src/main/assets/blocks/cake_side.png differ diff --git a/app/src/main/assets/blocks/cake_top.png b/app/src/main/assets/blocks/cake_top.png new file mode 100644 index 00000000..b08b5cb9 Binary files /dev/null and b/app/src/main/assets/blocks/cake_top.png differ diff --git a/app/src/main/assets/blocks/camera_back.png b/app/src/main/assets/blocks/camera_back.png new file mode 100644 index 00000000..68524f8b Binary files /dev/null and b/app/src/main/assets/blocks/camera_back.png differ diff --git a/app/src/main/assets/blocks/camera_front.png b/app/src/main/assets/blocks/camera_front.png new file mode 100644 index 00000000..3c80d8b9 Binary files /dev/null and b/app/src/main/assets/blocks/camera_front.png differ diff --git a/app/src/main/assets/blocks/camera_side.png b/app/src/main/assets/blocks/camera_side.png new file mode 100644 index 00000000..949599e8 Binary files /dev/null and b/app/src/main/assets/blocks/camera_side.png differ diff --git a/app/src/main/assets/blocks/camera_top.png b/app/src/main/assets/blocks/camera_top.png new file mode 100644 index 00000000..436e4679 Binary files /dev/null and b/app/src/main/assets/blocks/camera_top.png differ diff --git a/app/src/main/assets/blocks/carried_waterlily.png b/app/src/main/assets/blocks/carried_waterlily.png new file mode 100644 index 00000000..5f37997b Binary files /dev/null and b/app/src/main/assets/blocks/carried_waterlily.png differ diff --git a/app/src/main/assets/blocks/carrots_stage_0.png b/app/src/main/assets/blocks/carrots_stage_0.png new file mode 100644 index 00000000..fdd85ee0 Binary files /dev/null and b/app/src/main/assets/blocks/carrots_stage_0.png differ diff --git a/app/src/main/assets/blocks/carrots_stage_1.png b/app/src/main/assets/blocks/carrots_stage_1.png new file mode 100644 index 00000000..ac1e6162 Binary files /dev/null and b/app/src/main/assets/blocks/carrots_stage_1.png differ diff --git a/app/src/main/assets/blocks/carrots_stage_2.png b/app/src/main/assets/blocks/carrots_stage_2.png new file mode 100644 index 00000000..19dd6eb1 Binary files /dev/null and b/app/src/main/assets/blocks/carrots_stage_2.png differ diff --git a/app/src/main/assets/blocks/carrots_stage_3.png b/app/src/main/assets/blocks/carrots_stage_3.png new file mode 100644 index 00000000..6dc0b894 Binary files /dev/null and b/app/src/main/assets/blocks/carrots_stage_3.png differ diff --git a/app/src/main/assets/blocks/cauldron_bottom.png b/app/src/main/assets/blocks/cauldron_bottom.png new file mode 100644 index 00000000..a9ac2a11 Binary files /dev/null and b/app/src/main/assets/blocks/cauldron_bottom.png differ diff --git a/app/src/main/assets/blocks/cauldron_inner.png b/app/src/main/assets/blocks/cauldron_inner.png new file mode 100644 index 00000000..9722b348 Binary files /dev/null and b/app/src/main/assets/blocks/cauldron_inner.png differ diff --git a/app/src/main/assets/blocks/cauldron_side.png b/app/src/main/assets/blocks/cauldron_side.png new file mode 100644 index 00000000..59e83040 Binary files /dev/null and b/app/src/main/assets/blocks/cauldron_side.png differ diff --git a/app/src/main/assets/blocks/cauldron_top.png b/app/src/main/assets/blocks/cauldron_top.png new file mode 100644 index 00000000..a87df633 Binary files /dev/null and b/app/src/main/assets/blocks/cauldron_top.png differ diff --git a/app/src/main/assets/blocks/cauldron_water.png b/app/src/main/assets/blocks/cauldron_water.png new file mode 100644 index 00000000..765a9da7 Binary files /dev/null and b/app/src/main/assets/blocks/cauldron_water.png differ diff --git a/app/src/main/assets/blocks/chest_front.png b/app/src/main/assets/blocks/chest_front.png new file mode 100644 index 00000000..60ab9810 Binary files /dev/null and b/app/src/main/assets/blocks/chest_front.png differ diff --git a/app/src/main/assets/blocks/chest_side.png b/app/src/main/assets/blocks/chest_side.png new file mode 100644 index 00000000..9614a49a Binary files /dev/null and b/app/src/main/assets/blocks/chest_side.png differ diff --git a/app/src/main/assets/blocks/chest_top.png b/app/src/main/assets/blocks/chest_top.png new file mode 100644 index 00000000..f6b17469 Binary files /dev/null and b/app/src/main/assets/blocks/chest_top.png differ diff --git a/app/src/main/assets/blocks/chorus_flower.png b/app/src/main/assets/blocks/chorus_flower.png new file mode 100644 index 00000000..bc4c6220 Binary files /dev/null and b/app/src/main/assets/blocks/chorus_flower.png differ diff --git a/app/src/main/assets/blocks/chorus_flower_dead.png b/app/src/main/assets/blocks/chorus_flower_dead.png new file mode 100644 index 00000000..46d578f7 Binary files /dev/null and b/app/src/main/assets/blocks/chorus_flower_dead.png differ diff --git a/app/src/main/assets/blocks/chorus_plant.png b/app/src/main/assets/blocks/chorus_plant.png new file mode 100644 index 00000000..00ceb71c Binary files /dev/null and b/app/src/main/assets/blocks/chorus_plant.png differ diff --git a/app/src/main/assets/blocks/clay.png b/app/src/main/assets/blocks/clay.png new file mode 100644 index 00000000..9a39c939 Binary files /dev/null and b/app/src/main/assets/blocks/clay.png differ diff --git a/app/src/main/assets/blocks/coal_block.png b/app/src/main/assets/blocks/coal_block.png new file mode 100644 index 00000000..d440bb9a Binary files /dev/null and b/app/src/main/assets/blocks/coal_block.png differ diff --git a/app/src/main/assets/blocks/coal_ore.png b/app/src/main/assets/blocks/coal_ore.png new file mode 100644 index 00000000..276e6de7 Binary files /dev/null and b/app/src/main/assets/blocks/coal_ore.png differ diff --git a/app/src/main/assets/blocks/cobblestone.png b/app/src/main/assets/blocks/cobblestone.png new file mode 100644 index 00000000..44776905 Binary files /dev/null and b/app/src/main/assets/blocks/cobblestone.png differ diff --git a/app/src/main/assets/blocks/cobblestone_mossy.png b/app/src/main/assets/blocks/cobblestone_mossy.png new file mode 100644 index 00000000..dd479fff Binary files /dev/null and b/app/src/main/assets/blocks/cobblestone_mossy.png differ diff --git a/app/src/main/assets/blocks/cocoa_stage_0.png b/app/src/main/assets/blocks/cocoa_stage_0.png new file mode 100644 index 00000000..5f764ee5 Binary files /dev/null and b/app/src/main/assets/blocks/cocoa_stage_0.png differ diff --git a/app/src/main/assets/blocks/cocoa_stage_1.png b/app/src/main/assets/blocks/cocoa_stage_1.png new file mode 100644 index 00000000..eda5b57b Binary files /dev/null and b/app/src/main/assets/blocks/cocoa_stage_1.png differ diff --git a/app/src/main/assets/blocks/cocoa_stage_2.png b/app/src/main/assets/blocks/cocoa_stage_2.png new file mode 100644 index 00000000..491ec26d Binary files /dev/null and b/app/src/main/assets/blocks/cocoa_stage_2.png differ diff --git a/app/src/main/assets/blocks/command_block.png b/app/src/main/assets/blocks/command_block.png new file mode 100644 index 00000000..3efe9221 Binary files /dev/null and b/app/src/main/assets/blocks/command_block.png differ diff --git a/app/src/main/assets/blocks/comparator_off.png b/app/src/main/assets/blocks/comparator_off.png new file mode 100644 index 00000000..36b81991 Binary files /dev/null and b/app/src/main/assets/blocks/comparator_off.png differ diff --git a/app/src/main/assets/blocks/comparator_on.png b/app/src/main/assets/blocks/comparator_on.png new file mode 100644 index 00000000..bb9413c6 Binary files /dev/null and b/app/src/main/assets/blocks/comparator_on.png differ diff --git a/app/src/main/assets/blocks/crafting_table_front.png b/app/src/main/assets/blocks/crafting_table_front.png new file mode 100644 index 00000000..e6867380 Binary files /dev/null and b/app/src/main/assets/blocks/crafting_table_front.png differ diff --git a/app/src/main/assets/blocks/crafting_table_side.png b/app/src/main/assets/blocks/crafting_table_side.png new file mode 100644 index 00000000..4b718694 Binary files /dev/null and b/app/src/main/assets/blocks/crafting_table_side.png differ diff --git a/app/src/main/assets/blocks/crafting_table_top.png b/app/src/main/assets/blocks/crafting_table_top.png new file mode 100644 index 00000000..d95444df Binary files /dev/null and b/app/src/main/assets/blocks/crafting_table_top.png differ diff --git a/app/src/main/assets/blocks/daylight_detector_inverted_top.png b/app/src/main/assets/blocks/daylight_detector_inverted_top.png new file mode 100644 index 00000000..ce5bedfe Binary files /dev/null and b/app/src/main/assets/blocks/daylight_detector_inverted_top.png differ diff --git a/app/src/main/assets/blocks/daylight_detector_side.png b/app/src/main/assets/blocks/daylight_detector_side.png new file mode 100644 index 00000000..05f7e83a Binary files /dev/null and b/app/src/main/assets/blocks/daylight_detector_side.png differ diff --git a/app/src/main/assets/blocks/daylight_detector_top.png b/app/src/main/assets/blocks/daylight_detector_top.png new file mode 100644 index 00000000..9a408dc7 Binary files /dev/null and b/app/src/main/assets/blocks/daylight_detector_top.png differ diff --git a/app/src/main/assets/blocks/deadbush.png b/app/src/main/assets/blocks/deadbush.png new file mode 100644 index 00000000..ee615f35 Binary files /dev/null and b/app/src/main/assets/blocks/deadbush.png differ diff --git a/app/src/main/assets/blocks/diamond_block.png b/app/src/main/assets/blocks/diamond_block.png new file mode 100644 index 00000000..d8663d36 Binary files /dev/null and b/app/src/main/assets/blocks/diamond_block.png differ diff --git a/app/src/main/assets/blocks/diamond_ore.png b/app/src/main/assets/blocks/diamond_ore.png new file mode 100644 index 00000000..5efca817 Binary files /dev/null and b/app/src/main/assets/blocks/diamond_ore.png differ diff --git a/app/src/main/assets/blocks/dirt.png b/app/src/main/assets/blocks/dirt.png new file mode 100644 index 00000000..2f6bc298 Binary files /dev/null and b/app/src/main/assets/blocks/dirt.png differ diff --git a/app/src/main/assets/blocks/dirt_podzol_side.png b/app/src/main/assets/blocks/dirt_podzol_side.png new file mode 100644 index 00000000..89a328b2 Binary files /dev/null and b/app/src/main/assets/blocks/dirt_podzol_side.png differ diff --git a/app/src/main/assets/blocks/dirt_podzol_top.png b/app/src/main/assets/blocks/dirt_podzol_top.png new file mode 100644 index 00000000..60d1361c Binary files /dev/null and b/app/src/main/assets/blocks/dirt_podzol_top.png differ diff --git a/app/src/main/assets/blocks/dispenser_front_horizontal.png b/app/src/main/assets/blocks/dispenser_front_horizontal.png new file mode 100644 index 00000000..5465feaa Binary files /dev/null and b/app/src/main/assets/blocks/dispenser_front_horizontal.png differ diff --git a/app/src/main/assets/blocks/dispenser_front_vertical.png b/app/src/main/assets/blocks/dispenser_front_vertical.png new file mode 100644 index 00000000..99131887 Binary files /dev/null and b/app/src/main/assets/blocks/dispenser_front_vertical.png differ diff --git a/app/src/main/assets/blocks/door_acacia_lower.png b/app/src/main/assets/blocks/door_acacia_lower.png new file mode 100644 index 00000000..1f5f7de9 Binary files /dev/null and b/app/src/main/assets/blocks/door_acacia_lower.png differ diff --git a/app/src/main/assets/blocks/door_acacia_upper.png b/app/src/main/assets/blocks/door_acacia_upper.png new file mode 100644 index 00000000..bb4c2556 Binary files /dev/null and b/app/src/main/assets/blocks/door_acacia_upper.png differ diff --git a/app/src/main/assets/blocks/door_birch_lower.png b/app/src/main/assets/blocks/door_birch_lower.png new file mode 100644 index 00000000..7daded28 Binary files /dev/null and b/app/src/main/assets/blocks/door_birch_lower.png differ diff --git a/app/src/main/assets/blocks/door_birch_upper.png b/app/src/main/assets/blocks/door_birch_upper.png new file mode 100644 index 00000000..b1b821b3 Binary files /dev/null and b/app/src/main/assets/blocks/door_birch_upper.png differ diff --git a/app/src/main/assets/blocks/door_dark_oak_lower.png b/app/src/main/assets/blocks/door_dark_oak_lower.png new file mode 100644 index 00000000..a278cdec Binary files /dev/null and b/app/src/main/assets/blocks/door_dark_oak_lower.png differ diff --git a/app/src/main/assets/blocks/door_dark_oak_upper.png b/app/src/main/assets/blocks/door_dark_oak_upper.png new file mode 100644 index 00000000..054a0f2e Binary files /dev/null and b/app/src/main/assets/blocks/door_dark_oak_upper.png differ diff --git a/app/src/main/assets/blocks/door_iron_lower.png b/app/src/main/assets/blocks/door_iron_lower.png new file mode 100644 index 00000000..5d401a5b Binary files /dev/null and b/app/src/main/assets/blocks/door_iron_lower.png differ diff --git a/app/src/main/assets/blocks/door_iron_upper.png b/app/src/main/assets/blocks/door_iron_upper.png new file mode 100644 index 00000000..725cc3ab Binary files /dev/null and b/app/src/main/assets/blocks/door_iron_upper.png differ diff --git a/app/src/main/assets/blocks/door_jungle_lower.png b/app/src/main/assets/blocks/door_jungle_lower.png new file mode 100644 index 00000000..73d98de6 Binary files /dev/null and b/app/src/main/assets/blocks/door_jungle_lower.png differ diff --git a/app/src/main/assets/blocks/door_jungle_upper.png b/app/src/main/assets/blocks/door_jungle_upper.png new file mode 100644 index 00000000..80790c2d Binary files /dev/null and b/app/src/main/assets/blocks/door_jungle_upper.png differ diff --git a/app/src/main/assets/blocks/door_spruce_lower.png b/app/src/main/assets/blocks/door_spruce_lower.png new file mode 100644 index 00000000..1224ac35 Binary files /dev/null and b/app/src/main/assets/blocks/door_spruce_lower.png differ diff --git a/app/src/main/assets/blocks/door_spruce_upper.png b/app/src/main/assets/blocks/door_spruce_upper.png new file mode 100644 index 00000000..359ee028 Binary files /dev/null and b/app/src/main/assets/blocks/door_spruce_upper.png differ diff --git a/app/src/main/assets/blocks/door_wood_lower.png b/app/src/main/assets/blocks/door_wood_lower.png new file mode 100644 index 00000000..5b88a500 Binary files /dev/null and b/app/src/main/assets/blocks/door_wood_lower.png differ diff --git a/app/src/main/assets/blocks/door_wood_upper.png b/app/src/main/assets/blocks/door_wood_upper.png new file mode 100644 index 00000000..0e4d3ea5 Binary files /dev/null and b/app/src/main/assets/blocks/door_wood_upper.png differ diff --git a/app/src/main/assets/blocks/double_plant_fern_bottom.tga b/app/src/main/assets/blocks/double_plant_fern_bottom.tga new file mode 100644 index 00000000..bc678dd0 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_fern_bottom.tga differ diff --git a/app/src/main/assets/blocks/double_plant_fern_carried.png b/app/src/main/assets/blocks/double_plant_fern_carried.png new file mode 100644 index 00000000..29f14d85 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_fern_carried.png differ diff --git a/app/src/main/assets/blocks/double_plant_fern_top.tga b/app/src/main/assets/blocks/double_plant_fern_top.tga new file mode 100644 index 00000000..2f393e08 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_fern_top.tga differ diff --git a/app/src/main/assets/blocks/double_plant_grass_bottom.tga b/app/src/main/assets/blocks/double_plant_grass_bottom.tga new file mode 100644 index 00000000..755534ff Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_grass_bottom.tga differ diff --git a/app/src/main/assets/blocks/double_plant_grass_carried.png b/app/src/main/assets/blocks/double_plant_grass_carried.png new file mode 100644 index 00000000..7383f72b Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_grass_carried.png differ diff --git a/app/src/main/assets/blocks/double_plant_grass_top.tga b/app/src/main/assets/blocks/double_plant_grass_top.tga new file mode 100644 index 00000000..b2790f24 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_grass_top.tga differ diff --git a/app/src/main/assets/blocks/double_plant_paeonia_bottom.png b/app/src/main/assets/blocks/double_plant_paeonia_bottom.png new file mode 100644 index 00000000..21868ee8 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_paeonia_bottom.png differ diff --git a/app/src/main/assets/blocks/double_plant_paeonia_top.png b/app/src/main/assets/blocks/double_plant_paeonia_top.png new file mode 100644 index 00000000..6d35bea1 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_paeonia_top.png differ diff --git a/app/src/main/assets/blocks/double_plant_rose_bottom.png b/app/src/main/assets/blocks/double_plant_rose_bottom.png new file mode 100644 index 00000000..32a4e0f8 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_rose_bottom.png differ diff --git a/app/src/main/assets/blocks/double_plant_rose_top.png b/app/src/main/assets/blocks/double_plant_rose_top.png new file mode 100644 index 00000000..bfca0ea0 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_rose_top.png differ diff --git a/app/src/main/assets/blocks/double_plant_sunflower_back.png b/app/src/main/assets/blocks/double_plant_sunflower_back.png new file mode 100644 index 00000000..b0c53a71 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_sunflower_back.png differ diff --git a/app/src/main/assets/blocks/double_plant_sunflower_bottom.png b/app/src/main/assets/blocks/double_plant_sunflower_bottom.png new file mode 100644 index 00000000..5a1febe3 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_sunflower_bottom.png differ diff --git a/app/src/main/assets/blocks/double_plant_sunflower_front.png b/app/src/main/assets/blocks/double_plant_sunflower_front.png new file mode 100644 index 00000000..9c13b766 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_sunflower_front.png differ diff --git a/app/src/main/assets/blocks/double_plant_sunflower_top.png b/app/src/main/assets/blocks/double_plant_sunflower_top.png new file mode 100644 index 00000000..6ab2f15c Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_sunflower_top.png differ diff --git a/app/src/main/assets/blocks/double_plant_syringa_bottom.tga b/app/src/main/assets/blocks/double_plant_syringa_bottom.tga new file mode 100644 index 00000000..de203ca0 Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_syringa_bottom.tga differ diff --git a/app/src/main/assets/blocks/double_plant_syringa_top.tga b/app/src/main/assets/blocks/double_plant_syringa_top.tga new file mode 100644 index 00000000..0fb0cefb Binary files /dev/null and b/app/src/main/assets/blocks/double_plant_syringa_top.tga differ diff --git a/app/src/main/assets/blocks/dragon_egg.png b/app/src/main/assets/blocks/dragon_egg.png new file mode 100644 index 00000000..548f466b Binary files /dev/null and b/app/src/main/assets/blocks/dragon_egg.png differ diff --git a/app/src/main/assets/blocks/dropper_front_horizontal.png b/app/src/main/assets/blocks/dropper_front_horizontal.png new file mode 100644 index 00000000..a2848daf Binary files /dev/null and b/app/src/main/assets/blocks/dropper_front_horizontal.png differ diff --git a/app/src/main/assets/blocks/dropper_front_vertical.png b/app/src/main/assets/blocks/dropper_front_vertical.png new file mode 100644 index 00000000..b0802c47 Binary files /dev/null and b/app/src/main/assets/blocks/dropper_front_vertical.png differ diff --git a/app/src/main/assets/blocks/emerald_block.png b/app/src/main/assets/blocks/emerald_block.png new file mode 100644 index 00000000..e75ea65a Binary files /dev/null and b/app/src/main/assets/blocks/emerald_block.png differ diff --git a/app/src/main/assets/blocks/emerald_ore.png b/app/src/main/assets/blocks/emerald_ore.png new file mode 100644 index 00000000..3653cf43 Binary files /dev/null and b/app/src/main/assets/blocks/emerald_ore.png differ diff --git a/app/src/main/assets/blocks/enchanting_table_bottom.png b/app/src/main/assets/blocks/enchanting_table_bottom.png new file mode 100644 index 00000000..5f07151c Binary files /dev/null and b/app/src/main/assets/blocks/enchanting_table_bottom.png differ diff --git a/app/src/main/assets/blocks/enchanting_table_side.png b/app/src/main/assets/blocks/enchanting_table_side.png new file mode 100644 index 00000000..dc678ce1 Binary files /dev/null and b/app/src/main/assets/blocks/enchanting_table_side.png differ diff --git a/app/src/main/assets/blocks/enchanting_table_top.png b/app/src/main/assets/blocks/enchanting_table_top.png new file mode 100644 index 00000000..6bdf83a0 Binary files /dev/null and b/app/src/main/assets/blocks/enchanting_table_top.png differ diff --git a/app/src/main/assets/blocks/end_bricks.png b/app/src/main/assets/blocks/end_bricks.png new file mode 100644 index 00000000..24395c5e Binary files /dev/null and b/app/src/main/assets/blocks/end_bricks.png differ diff --git a/app/src/main/assets/blocks/end_rod.png b/app/src/main/assets/blocks/end_rod.png new file mode 100644 index 00000000..1d07c42f Binary files /dev/null and b/app/src/main/assets/blocks/end_rod.png differ diff --git a/app/src/main/assets/blocks/end_stone.png b/app/src/main/assets/blocks/end_stone.png new file mode 100644 index 00000000..b2f9b678 Binary files /dev/null and b/app/src/main/assets/blocks/end_stone.png differ diff --git a/app/src/main/assets/blocks/ender_chest_front.png b/app/src/main/assets/blocks/ender_chest_front.png new file mode 100644 index 00000000..08776b31 Binary files /dev/null and b/app/src/main/assets/blocks/ender_chest_front.png differ diff --git a/app/src/main/assets/blocks/ender_chest_side.png b/app/src/main/assets/blocks/ender_chest_side.png new file mode 100644 index 00000000..ad2476bb Binary files /dev/null and b/app/src/main/assets/blocks/ender_chest_side.png differ diff --git a/app/src/main/assets/blocks/ender_chest_top.png b/app/src/main/assets/blocks/ender_chest_top.png new file mode 100644 index 00000000..316ac7b7 Binary files /dev/null and b/app/src/main/assets/blocks/ender_chest_top.png differ diff --git a/app/src/main/assets/blocks/endframe_eye.png b/app/src/main/assets/blocks/endframe_eye.png new file mode 100644 index 00000000..e7a5318e Binary files /dev/null and b/app/src/main/assets/blocks/endframe_eye.png differ diff --git a/app/src/main/assets/blocks/endframe_side.png b/app/src/main/assets/blocks/endframe_side.png new file mode 100644 index 00000000..ad054327 Binary files /dev/null and b/app/src/main/assets/blocks/endframe_side.png differ diff --git a/app/src/main/assets/blocks/endframe_top.png b/app/src/main/assets/blocks/endframe_top.png new file mode 100644 index 00000000..e5969ce2 Binary files /dev/null and b/app/src/main/assets/blocks/endframe_top.png differ diff --git a/app/src/main/assets/blocks/farmland_dry.png b/app/src/main/assets/blocks/farmland_dry.png new file mode 100644 index 00000000..06c72218 Binary files /dev/null and b/app/src/main/assets/blocks/farmland_dry.png differ diff --git a/app/src/main/assets/blocks/farmland_wet.png b/app/src/main/assets/blocks/farmland_wet.png new file mode 100644 index 00000000..6a3c1e1b Binary files /dev/null and b/app/src/main/assets/blocks/farmland_wet.png differ diff --git a/app/src/main/assets/blocks/fern.tga b/app/src/main/assets/blocks/fern.tga new file mode 100644 index 00000000..e1f36b07 Binary files /dev/null and b/app/src/main/assets/blocks/fern.tga differ diff --git a/app/src/main/assets/blocks/fern_carried.tga b/app/src/main/assets/blocks/fern_carried.tga new file mode 100644 index 00000000..e7c839f8 Binary files /dev/null and b/app/src/main/assets/blocks/fern_carried.tga differ diff --git a/app/src/main/assets/blocks/fire_0.png b/app/src/main/assets/blocks/fire_0.png new file mode 100644 index 00000000..59ba68b7 Binary files /dev/null and b/app/src/main/assets/blocks/fire_0.png differ diff --git a/app/src/main/assets/blocks/fire_1.png b/app/src/main/assets/blocks/fire_1.png new file mode 100644 index 00000000..02ff7300 Binary files /dev/null and b/app/src/main/assets/blocks/fire_1.png differ diff --git a/app/src/main/assets/blocks/flower_allium.png b/app/src/main/assets/blocks/flower_allium.png new file mode 100644 index 00000000..2068ace6 Binary files /dev/null and b/app/src/main/assets/blocks/flower_allium.png differ diff --git a/app/src/main/assets/blocks/flower_blue_orchid.png b/app/src/main/assets/blocks/flower_blue_orchid.png new file mode 100644 index 00000000..7c00b5c3 Binary files /dev/null and b/app/src/main/assets/blocks/flower_blue_orchid.png differ diff --git a/app/src/main/assets/blocks/flower_dandelion.png b/app/src/main/assets/blocks/flower_dandelion.png new file mode 100644 index 00000000..901e7d50 Binary files /dev/null and b/app/src/main/assets/blocks/flower_dandelion.png differ diff --git a/app/src/main/assets/blocks/flower_houstonia.png b/app/src/main/assets/blocks/flower_houstonia.png new file mode 100644 index 00000000..50151c86 Binary files /dev/null and b/app/src/main/assets/blocks/flower_houstonia.png differ diff --git a/app/src/main/assets/blocks/flower_oxeye_daisy.png b/app/src/main/assets/blocks/flower_oxeye_daisy.png new file mode 100644 index 00000000..03a11e52 Binary files /dev/null and b/app/src/main/assets/blocks/flower_oxeye_daisy.png differ diff --git a/app/src/main/assets/blocks/flower_paeonia.png b/app/src/main/assets/blocks/flower_paeonia.png new file mode 100644 index 00000000..fc14bde4 Binary files /dev/null and b/app/src/main/assets/blocks/flower_paeonia.png differ diff --git a/app/src/main/assets/blocks/flower_pot.png b/app/src/main/assets/blocks/flower_pot.png new file mode 100644 index 00000000..00f49906 Binary files /dev/null and b/app/src/main/assets/blocks/flower_pot.png differ diff --git a/app/src/main/assets/blocks/flower_rose.png b/app/src/main/assets/blocks/flower_rose.png new file mode 100644 index 00000000..4a760986 Binary files /dev/null and b/app/src/main/assets/blocks/flower_rose.png differ diff --git a/app/src/main/assets/blocks/flower_rose_blue.png b/app/src/main/assets/blocks/flower_rose_blue.png new file mode 100644 index 00000000..0dd1f412 Binary files /dev/null and b/app/src/main/assets/blocks/flower_rose_blue.png differ diff --git a/app/src/main/assets/blocks/flower_tulip_orange.png b/app/src/main/assets/blocks/flower_tulip_orange.png new file mode 100644 index 00000000..b8bac798 Binary files /dev/null and b/app/src/main/assets/blocks/flower_tulip_orange.png differ diff --git a/app/src/main/assets/blocks/flower_tulip_pink.png b/app/src/main/assets/blocks/flower_tulip_pink.png new file mode 100644 index 00000000..719457fe Binary files /dev/null and b/app/src/main/assets/blocks/flower_tulip_pink.png differ diff --git a/app/src/main/assets/blocks/flower_tulip_red.png b/app/src/main/assets/blocks/flower_tulip_red.png new file mode 100644 index 00000000..1a019643 Binary files /dev/null and b/app/src/main/assets/blocks/flower_tulip_red.png differ diff --git a/app/src/main/assets/blocks/flower_tulip_white.png b/app/src/main/assets/blocks/flower_tulip_white.png new file mode 100644 index 00000000..30886cc1 Binary files /dev/null and b/app/src/main/assets/blocks/flower_tulip_white.png differ diff --git a/app/src/main/assets/blocks/furnace_front_off.png b/app/src/main/assets/blocks/furnace_front_off.png new file mode 100644 index 00000000..3197bfd3 Binary files /dev/null and b/app/src/main/assets/blocks/furnace_front_off.png differ diff --git a/app/src/main/assets/blocks/furnace_front_on.png b/app/src/main/assets/blocks/furnace_front_on.png new file mode 100644 index 00000000..90b8b8af Binary files /dev/null and b/app/src/main/assets/blocks/furnace_front_on.png differ diff --git a/app/src/main/assets/blocks/furnace_side.png b/app/src/main/assets/blocks/furnace_side.png new file mode 100644 index 00000000..4948093f Binary files /dev/null and b/app/src/main/assets/blocks/furnace_side.png differ diff --git a/app/src/main/assets/blocks/furnace_top.png b/app/src/main/assets/blocks/furnace_top.png new file mode 100644 index 00000000..620d95b9 Binary files /dev/null and b/app/src/main/assets/blocks/furnace_top.png differ diff --git a/app/src/main/assets/blocks/glass.png b/app/src/main/assets/blocks/glass.png new file mode 100644 index 00000000..0251d4f2 Binary files /dev/null and b/app/src/main/assets/blocks/glass.png differ diff --git a/app/src/main/assets/blocks/glass_pane_top.png b/app/src/main/assets/blocks/glass_pane_top.png new file mode 100644 index 00000000..450f80c4 Binary files /dev/null and b/app/src/main/assets/blocks/glass_pane_top.png differ diff --git a/app/src/main/assets/blocks/glowing_obsidian.png b/app/src/main/assets/blocks/glowing_obsidian.png new file mode 100644 index 00000000..88e1cfbc Binary files /dev/null and b/app/src/main/assets/blocks/glowing_obsidian.png differ diff --git a/app/src/main/assets/blocks/glowstone.png b/app/src/main/assets/blocks/glowstone.png new file mode 100644 index 00000000..623e8426 Binary files /dev/null and b/app/src/main/assets/blocks/glowstone.png differ diff --git a/app/src/main/assets/blocks/gold_block.png b/app/src/main/assets/blocks/gold_block.png new file mode 100644 index 00000000..4d233c76 Binary files /dev/null and b/app/src/main/assets/blocks/gold_block.png differ diff --git a/app/src/main/assets/blocks/gold_ore.png b/app/src/main/assets/blocks/gold_ore.png new file mode 100644 index 00000000..ca1dc0ee Binary files /dev/null and b/app/src/main/assets/blocks/gold_ore.png differ diff --git a/app/src/main/assets/blocks/grass_carried.png b/app/src/main/assets/blocks/grass_carried.png new file mode 100644 index 00000000..619a1d6e Binary files /dev/null and b/app/src/main/assets/blocks/grass_carried.png differ diff --git a/app/src/main/assets/blocks/grass_path_side.png b/app/src/main/assets/blocks/grass_path_side.png new file mode 100644 index 00000000..c9de1352 Binary files /dev/null and b/app/src/main/assets/blocks/grass_path_side.png differ diff --git a/app/src/main/assets/blocks/grass_path_top.png b/app/src/main/assets/blocks/grass_path_top.png new file mode 100644 index 00000000..d1f6e3a5 Binary files /dev/null and b/app/src/main/assets/blocks/grass_path_top.png differ diff --git a/app/src/main/assets/blocks/grass_side.tga b/app/src/main/assets/blocks/grass_side.tga new file mode 100644 index 00000000..384c9412 Binary files /dev/null and b/app/src/main/assets/blocks/grass_side.tga differ diff --git a/app/src/main/assets/blocks/grass_side_carried.png b/app/src/main/assets/blocks/grass_side_carried.png new file mode 100644 index 00000000..30663bf2 Binary files /dev/null and b/app/src/main/assets/blocks/grass_side_carried.png differ diff --git a/app/src/main/assets/blocks/grass_side_snowed.png b/app/src/main/assets/blocks/grass_side_snowed.png new file mode 100644 index 00000000..1d3e4c3b Binary files /dev/null and b/app/src/main/assets/blocks/grass_side_snowed.png differ diff --git a/app/src/main/assets/blocks/grass_side_snowed.tga b/app/src/main/assets/blocks/grass_side_snowed.tga new file mode 100644 index 00000000..b4540581 Binary files /dev/null and b/app/src/main/assets/blocks/grass_side_snowed.tga differ diff --git a/app/src/main/assets/blocks/grass_top.png b/app/src/main/assets/blocks/grass_top.png new file mode 100644 index 00000000..2ba30259 Binary files /dev/null and b/app/src/main/assets/blocks/grass_top.png differ diff --git a/app/src/main/assets/blocks/gravel.png b/app/src/main/assets/blocks/gravel.png new file mode 100644 index 00000000..b91768d9 Binary files /dev/null and b/app/src/main/assets/blocks/gravel.png differ diff --git a/app/src/main/assets/blocks/hardened_clay.png b/app/src/main/assets/blocks/hardened_clay.png new file mode 100644 index 00000000..b94728a2 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_black.png b/app/src/main/assets/blocks/hardened_clay_stained_black.png new file mode 100644 index 00000000..dffc0b6e Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_black.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_blue.png b/app/src/main/assets/blocks/hardened_clay_stained_blue.png new file mode 100644 index 00000000..18576085 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_blue.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_brown.png b/app/src/main/assets/blocks/hardened_clay_stained_brown.png new file mode 100644 index 00000000..1f15029c Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_brown.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_cyan.png b/app/src/main/assets/blocks/hardened_clay_stained_cyan.png new file mode 100644 index 00000000..b2d18c92 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_cyan.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_gray.png b/app/src/main/assets/blocks/hardened_clay_stained_gray.png new file mode 100644 index 00000000..eabe8de9 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_gray.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_green.png b/app/src/main/assets/blocks/hardened_clay_stained_green.png new file mode 100644 index 00000000..1c50ec48 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_green.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_light_blue.png b/app/src/main/assets/blocks/hardened_clay_stained_light_blue.png new file mode 100644 index 00000000..86598bb8 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_light_blue.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_lime.png b/app/src/main/assets/blocks/hardened_clay_stained_lime.png new file mode 100644 index 00000000..7bb8c0d5 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_lime.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_magenta.png b/app/src/main/assets/blocks/hardened_clay_stained_magenta.png new file mode 100644 index 00000000..8ae0f586 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_magenta.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_orange.png b/app/src/main/assets/blocks/hardened_clay_stained_orange.png new file mode 100644 index 00000000..fd03df9a Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_orange.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_pink.png b/app/src/main/assets/blocks/hardened_clay_stained_pink.png new file mode 100644 index 00000000..7ffea8d1 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_pink.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_purple.png b/app/src/main/assets/blocks/hardened_clay_stained_purple.png new file mode 100644 index 00000000..1e977fc1 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_purple.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_red.png b/app/src/main/assets/blocks/hardened_clay_stained_red.png new file mode 100644 index 00000000..e14d9bab Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_red.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_silver.png b/app/src/main/assets/blocks/hardened_clay_stained_silver.png new file mode 100644 index 00000000..120adf7c Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_silver.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_white.png b/app/src/main/assets/blocks/hardened_clay_stained_white.png new file mode 100644 index 00000000..e4cb5b85 Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_white.png differ diff --git a/app/src/main/assets/blocks/hardened_clay_stained_yellow.png b/app/src/main/assets/blocks/hardened_clay_stained_yellow.png new file mode 100644 index 00000000..ec96503a Binary files /dev/null and b/app/src/main/assets/blocks/hardened_clay_stained_yellow.png differ diff --git a/app/src/main/assets/blocks/hay_block_side.png b/app/src/main/assets/blocks/hay_block_side.png new file mode 100644 index 00000000..342d8fee Binary files /dev/null and b/app/src/main/assets/blocks/hay_block_side.png differ diff --git a/app/src/main/assets/blocks/hay_block_top.png b/app/src/main/assets/blocks/hay_block_top.png new file mode 100644 index 00000000..3c74f6f3 Binary files /dev/null and b/app/src/main/assets/blocks/hay_block_top.png differ diff --git a/app/src/main/assets/blocks/hopper_inside.png b/app/src/main/assets/blocks/hopper_inside.png new file mode 100644 index 00000000..9722b348 Binary files /dev/null and b/app/src/main/assets/blocks/hopper_inside.png differ diff --git a/app/src/main/assets/blocks/hopper_outside.png b/app/src/main/assets/blocks/hopper_outside.png new file mode 100644 index 00000000..45d9e94d Binary files /dev/null and b/app/src/main/assets/blocks/hopper_outside.png differ diff --git a/app/src/main/assets/blocks/hopper_top.png b/app/src/main/assets/blocks/hopper_top.png new file mode 100644 index 00000000..da651deb Binary files /dev/null and b/app/src/main/assets/blocks/hopper_top.png differ diff --git a/app/src/main/assets/blocks/ice.png b/app/src/main/assets/blocks/ice.png new file mode 100644 index 00000000..767f1d68 Binary files /dev/null and b/app/src/main/assets/blocks/ice.png differ diff --git a/app/src/main/assets/blocks/ice_packed.png b/app/src/main/assets/blocks/ice_packed.png new file mode 100644 index 00000000..3b06f3f1 Binary files /dev/null and b/app/src/main/assets/blocks/ice_packed.png differ diff --git a/app/src/main/assets/blocks/iron_bars.png b/app/src/main/assets/blocks/iron_bars.png new file mode 100644 index 00000000..cb3057dc Binary files /dev/null and b/app/src/main/assets/blocks/iron_bars.png differ diff --git a/app/src/main/assets/blocks/iron_block.png b/app/src/main/assets/blocks/iron_block.png new file mode 100644 index 00000000..58fd399b Binary files /dev/null and b/app/src/main/assets/blocks/iron_block.png differ diff --git a/app/src/main/assets/blocks/iron_ore.png b/app/src/main/assets/blocks/iron_ore.png new file mode 100644 index 00000000..05599192 Binary files /dev/null and b/app/src/main/assets/blocks/iron_ore.png differ diff --git a/app/src/main/assets/blocks/iron_trapdoor.png b/app/src/main/assets/blocks/iron_trapdoor.png new file mode 100644 index 00000000..c705ca1b Binary files /dev/null and b/app/src/main/assets/blocks/iron_trapdoor.png differ diff --git a/app/src/main/assets/blocks/itemframe_background.png b/app/src/main/assets/blocks/itemframe_background.png new file mode 100644 index 00000000..660bae6c Binary files /dev/null and b/app/src/main/assets/blocks/itemframe_background.png differ diff --git a/app/src/main/assets/blocks/jukebox_side.png b/app/src/main/assets/blocks/jukebox_side.png new file mode 100644 index 00000000..d67c3e5e Binary files /dev/null and b/app/src/main/assets/blocks/jukebox_side.png differ diff --git a/app/src/main/assets/blocks/jukebox_top.png b/app/src/main/assets/blocks/jukebox_top.png new file mode 100644 index 00000000..831cce48 Binary files /dev/null and b/app/src/main/assets/blocks/jukebox_top.png differ diff --git a/app/src/main/assets/blocks/ladder.png b/app/src/main/assets/blocks/ladder.png new file mode 100644 index 00000000..168b6b4b Binary files /dev/null and b/app/src/main/assets/blocks/ladder.png differ diff --git a/app/src/main/assets/blocks/lapis_block.png b/app/src/main/assets/blocks/lapis_block.png new file mode 100644 index 00000000..24810ac9 Binary files /dev/null and b/app/src/main/assets/blocks/lapis_block.png differ diff --git a/app/src/main/assets/blocks/lapis_ore.png b/app/src/main/assets/blocks/lapis_ore.png new file mode 100644 index 00000000..0175e9d7 Binary files /dev/null and b/app/src/main/assets/blocks/lapis_ore.png differ diff --git a/app/src/main/assets/blocks/lava_flow.png b/app/src/main/assets/blocks/lava_flow.png new file mode 100644 index 00000000..288ff153 Binary files /dev/null and b/app/src/main/assets/blocks/lava_flow.png differ diff --git a/app/src/main/assets/blocks/lava_still.png b/app/src/main/assets/blocks/lava_still.png new file mode 100644 index 00000000..657b71fb Binary files /dev/null and b/app/src/main/assets/blocks/lava_still.png differ diff --git a/app/src/main/assets/blocks/leaves_acacia.tga b/app/src/main/assets/blocks/leaves_acacia.tga new file mode 100644 index 00000000..28d89114 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_acacia.tga differ diff --git a/app/src/main/assets/blocks/leaves_acacia_carried.tga b/app/src/main/assets/blocks/leaves_acacia_carried.tga new file mode 100644 index 00000000..763687df Binary files /dev/null and b/app/src/main/assets/blocks/leaves_acacia_carried.tga differ diff --git a/app/src/main/assets/blocks/leaves_acacia_opaque.png b/app/src/main/assets/blocks/leaves_acacia_opaque.png new file mode 100644 index 00000000..45e5f0c9 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_acacia_opaque.png differ diff --git a/app/src/main/assets/blocks/leaves_big_oak.tga b/app/src/main/assets/blocks/leaves_big_oak.tga new file mode 100644 index 00000000..28d89114 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_big_oak.tga differ diff --git a/app/src/main/assets/blocks/leaves_big_oak_carried.tga b/app/src/main/assets/blocks/leaves_big_oak_carried.tga new file mode 100644 index 00000000..763687df Binary files /dev/null and b/app/src/main/assets/blocks/leaves_big_oak_carried.tga differ diff --git a/app/src/main/assets/blocks/leaves_big_oak_opaque.png b/app/src/main/assets/blocks/leaves_big_oak_opaque.png new file mode 100644 index 00000000..45e5f0c9 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_big_oak_opaque.png differ diff --git a/app/src/main/assets/blocks/leaves_birch.tga b/app/src/main/assets/blocks/leaves_birch.tga new file mode 100644 index 00000000..cf885b99 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_birch.tga differ diff --git a/app/src/main/assets/blocks/leaves_birch_carried.tga b/app/src/main/assets/blocks/leaves_birch_carried.tga new file mode 100644 index 00000000..d4048609 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_birch_carried.tga differ diff --git a/app/src/main/assets/blocks/leaves_birch_opaque.png b/app/src/main/assets/blocks/leaves_birch_opaque.png new file mode 100644 index 00000000..45e5f0c9 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_birch_opaque.png differ diff --git a/app/src/main/assets/blocks/leaves_jungle.tga b/app/src/main/assets/blocks/leaves_jungle.tga new file mode 100644 index 00000000..f4327886 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_jungle.tga differ diff --git a/app/src/main/assets/blocks/leaves_jungle_carried.tga b/app/src/main/assets/blocks/leaves_jungle_carried.tga new file mode 100644 index 00000000..c86f741c Binary files /dev/null and b/app/src/main/assets/blocks/leaves_jungle_carried.tga differ diff --git a/app/src/main/assets/blocks/leaves_jungle_opaque.png b/app/src/main/assets/blocks/leaves_jungle_opaque.png new file mode 100644 index 00000000..5ba8366a Binary files /dev/null and b/app/src/main/assets/blocks/leaves_jungle_opaque.png differ diff --git a/app/src/main/assets/blocks/leaves_oak.tga b/app/src/main/assets/blocks/leaves_oak.tga new file mode 100644 index 00000000..28d89114 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_oak.tga differ diff --git a/app/src/main/assets/blocks/leaves_oak_carried.tga b/app/src/main/assets/blocks/leaves_oak_carried.tga new file mode 100644 index 00000000..763687df Binary files /dev/null and b/app/src/main/assets/blocks/leaves_oak_carried.tga differ diff --git a/app/src/main/assets/blocks/leaves_oak_opaque.png b/app/src/main/assets/blocks/leaves_oak_opaque.png new file mode 100644 index 00000000..45e5f0c9 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_oak_opaque.png differ diff --git a/app/src/main/assets/blocks/leaves_spruce.tga b/app/src/main/assets/blocks/leaves_spruce.tga new file mode 100644 index 00000000..b976c750 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_spruce.tga differ diff --git a/app/src/main/assets/blocks/leaves_spruce_carried.tga b/app/src/main/assets/blocks/leaves_spruce_carried.tga new file mode 100644 index 00000000..4a7c3856 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_spruce_carried.tga differ diff --git a/app/src/main/assets/blocks/leaves_spruce_opaque.png b/app/src/main/assets/blocks/leaves_spruce_opaque.png new file mode 100644 index 00000000..64c97666 Binary files /dev/null and b/app/src/main/assets/blocks/leaves_spruce_opaque.png differ diff --git a/app/src/main/assets/blocks/lever.png b/app/src/main/assets/blocks/lever.png new file mode 100644 index 00000000..a969fe02 Binary files /dev/null and b/app/src/main/assets/blocks/lever.png differ diff --git a/app/src/main/assets/blocks/log_acacia.png b/app/src/main/assets/blocks/log_acacia.png new file mode 100644 index 00000000..d4ee2f44 Binary files /dev/null and b/app/src/main/assets/blocks/log_acacia.png differ diff --git a/app/src/main/assets/blocks/log_acacia_top.png b/app/src/main/assets/blocks/log_acacia_top.png new file mode 100644 index 00000000..53422569 Binary files /dev/null and b/app/src/main/assets/blocks/log_acacia_top.png differ diff --git a/app/src/main/assets/blocks/log_big_oak.png b/app/src/main/assets/blocks/log_big_oak.png new file mode 100644 index 00000000..5101bdc4 Binary files /dev/null and b/app/src/main/assets/blocks/log_big_oak.png differ diff --git a/app/src/main/assets/blocks/log_big_oak_top.png b/app/src/main/assets/blocks/log_big_oak_top.png new file mode 100644 index 00000000..2bde954b Binary files /dev/null and b/app/src/main/assets/blocks/log_big_oak_top.png differ diff --git a/app/src/main/assets/blocks/log_birch.png b/app/src/main/assets/blocks/log_birch.png new file mode 100644 index 00000000..cd562af5 Binary files /dev/null and b/app/src/main/assets/blocks/log_birch.png differ diff --git a/app/src/main/assets/blocks/log_birch_top.png b/app/src/main/assets/blocks/log_birch_top.png new file mode 100644 index 00000000..afed5cba Binary files /dev/null and b/app/src/main/assets/blocks/log_birch_top.png differ diff --git a/app/src/main/assets/blocks/log_jungle.png b/app/src/main/assets/blocks/log_jungle.png new file mode 100644 index 00000000..613af389 Binary files /dev/null and b/app/src/main/assets/blocks/log_jungle.png differ diff --git a/app/src/main/assets/blocks/log_jungle_top.png b/app/src/main/assets/blocks/log_jungle_top.png new file mode 100644 index 00000000..d2ab7d75 Binary files /dev/null and b/app/src/main/assets/blocks/log_jungle_top.png differ diff --git a/app/src/main/assets/blocks/log_oak.png b/app/src/main/assets/blocks/log_oak.png new file mode 100644 index 00000000..66bf256e Binary files /dev/null and b/app/src/main/assets/blocks/log_oak.png differ diff --git a/app/src/main/assets/blocks/log_oak_top.png b/app/src/main/assets/blocks/log_oak_top.png new file mode 100644 index 00000000..b2d460a3 Binary files /dev/null and b/app/src/main/assets/blocks/log_oak_top.png differ diff --git a/app/src/main/assets/blocks/log_spruce.png b/app/src/main/assets/blocks/log_spruce.png new file mode 100644 index 00000000..77a22a41 Binary files /dev/null and b/app/src/main/assets/blocks/log_spruce.png differ diff --git a/app/src/main/assets/blocks/log_spruce_top.png b/app/src/main/assets/blocks/log_spruce_top.png new file mode 100644 index 00000000..e68e518f Binary files /dev/null and b/app/src/main/assets/blocks/log_spruce_top.png differ diff --git a/app/src/main/assets/blocks/melon_side.png b/app/src/main/assets/blocks/melon_side.png new file mode 100644 index 00000000..b56cce1f Binary files /dev/null and b/app/src/main/assets/blocks/melon_side.png differ diff --git a/app/src/main/assets/blocks/melon_stem_connected.png b/app/src/main/assets/blocks/melon_stem_connected.png new file mode 100644 index 00000000..5722637d Binary files /dev/null and b/app/src/main/assets/blocks/melon_stem_connected.png differ diff --git a/app/src/main/assets/blocks/melon_stem_disconnected.png b/app/src/main/assets/blocks/melon_stem_disconnected.png new file mode 100644 index 00000000..1fab6fe5 Binary files /dev/null and b/app/src/main/assets/blocks/melon_stem_disconnected.png differ diff --git a/app/src/main/assets/blocks/melon_top.png b/app/src/main/assets/blocks/melon_top.png new file mode 100644 index 00000000..d4f7b460 Binary files /dev/null and b/app/src/main/assets/blocks/melon_top.png differ diff --git a/app/src/main/assets/blocks/missing_tile.png b/app/src/main/assets/blocks/missing_tile.png new file mode 100644 index 00000000..6e47a344 Binary files /dev/null and b/app/src/main/assets/blocks/missing_tile.png differ diff --git a/app/src/main/assets/blocks/mob_spawner.png b/app/src/main/assets/blocks/mob_spawner.png new file mode 100644 index 00000000..9a1b6d94 Binary files /dev/null and b/app/src/main/assets/blocks/mob_spawner.png differ diff --git a/app/src/main/assets/blocks/mushroom_block_inside.png b/app/src/main/assets/blocks/mushroom_block_inside.png new file mode 100644 index 00000000..1cd549c6 Binary files /dev/null and b/app/src/main/assets/blocks/mushroom_block_inside.png differ diff --git a/app/src/main/assets/blocks/mushroom_block_skin_brown.png b/app/src/main/assets/blocks/mushroom_block_skin_brown.png new file mode 100644 index 00000000..d199a29c Binary files /dev/null and b/app/src/main/assets/blocks/mushroom_block_skin_brown.png differ diff --git a/app/src/main/assets/blocks/mushroom_block_skin_red.png b/app/src/main/assets/blocks/mushroom_block_skin_red.png new file mode 100644 index 00000000..5edc77c5 Binary files /dev/null and b/app/src/main/assets/blocks/mushroom_block_skin_red.png differ diff --git a/app/src/main/assets/blocks/mushroom_block_skin_stem.png b/app/src/main/assets/blocks/mushroom_block_skin_stem.png new file mode 100644 index 00000000..b79de99e Binary files /dev/null and b/app/src/main/assets/blocks/mushroom_block_skin_stem.png differ diff --git a/app/src/main/assets/blocks/mushroom_brown.png b/app/src/main/assets/blocks/mushroom_brown.png new file mode 100644 index 00000000..fedb033a Binary files /dev/null and b/app/src/main/assets/blocks/mushroom_brown.png differ diff --git a/app/src/main/assets/blocks/mushroom_red.png b/app/src/main/assets/blocks/mushroom_red.png new file mode 100644 index 00000000..43000389 Binary files /dev/null and b/app/src/main/assets/blocks/mushroom_red.png differ diff --git a/app/src/main/assets/blocks/mycelium_side.png b/app/src/main/assets/blocks/mycelium_side.png new file mode 100644 index 00000000..92c20be6 Binary files /dev/null and b/app/src/main/assets/blocks/mycelium_side.png differ diff --git a/app/src/main/assets/blocks/mycelium_top.png b/app/src/main/assets/blocks/mycelium_top.png new file mode 100644 index 00000000..0b4462ac Binary files /dev/null and b/app/src/main/assets/blocks/mycelium_top.png differ diff --git a/app/src/main/assets/blocks/nether_brick.png b/app/src/main/assets/blocks/nether_brick.png new file mode 100644 index 00000000..d001eb07 Binary files /dev/null and b/app/src/main/assets/blocks/nether_brick.png differ diff --git a/app/src/main/assets/blocks/nether_wart_stage_0.png b/app/src/main/assets/blocks/nether_wart_stage_0.png new file mode 100644 index 00000000..3fdd28d1 Binary files /dev/null and b/app/src/main/assets/blocks/nether_wart_stage_0.png differ diff --git a/app/src/main/assets/blocks/nether_wart_stage_1.png b/app/src/main/assets/blocks/nether_wart_stage_1.png new file mode 100644 index 00000000..3c669a14 Binary files /dev/null and b/app/src/main/assets/blocks/nether_wart_stage_1.png differ diff --git a/app/src/main/assets/blocks/nether_wart_stage_2.png b/app/src/main/assets/blocks/nether_wart_stage_2.png new file mode 100644 index 00000000..97c3f328 Binary files /dev/null and b/app/src/main/assets/blocks/nether_wart_stage_2.png differ diff --git a/app/src/main/assets/blocks/netherrack.png b/app/src/main/assets/blocks/netherrack.png new file mode 100644 index 00000000..bad30c35 Binary files /dev/null and b/app/src/main/assets/blocks/netherrack.png differ diff --git a/app/src/main/assets/blocks/noteblock.png b/app/src/main/assets/blocks/noteblock.png new file mode 100644 index 00000000..d67c3e5e Binary files /dev/null and b/app/src/main/assets/blocks/noteblock.png differ diff --git a/app/src/main/assets/blocks/observer_back.png b/app/src/main/assets/blocks/observer_back.png new file mode 100644 index 00000000..85ea49a6 Binary files /dev/null and b/app/src/main/assets/blocks/observer_back.png differ diff --git a/app/src/main/assets/blocks/observer_front.png b/app/src/main/assets/blocks/observer_front.png new file mode 100644 index 00000000..492a1f2f Binary files /dev/null and b/app/src/main/assets/blocks/observer_front.png differ diff --git a/app/src/main/assets/blocks/observer_side.png b/app/src/main/assets/blocks/observer_side.png new file mode 100644 index 00000000..adaf4a8b Binary files /dev/null and b/app/src/main/assets/blocks/observer_side.png differ diff --git a/app/src/main/assets/blocks/observer_top.png b/app/src/main/assets/blocks/observer_top.png new file mode 100644 index 00000000..06b72577 Binary files /dev/null and b/app/src/main/assets/blocks/observer_top.png differ diff --git a/app/src/main/assets/blocks/obsidian.png b/app/src/main/assets/blocks/obsidian.png new file mode 100644 index 00000000..36f830fa Binary files /dev/null and b/app/src/main/assets/blocks/obsidian.png differ diff --git a/app/src/main/assets/blocks/piston_bottom.png b/app/src/main/assets/blocks/piston_bottom.png new file mode 100644 index 00000000..620d95b9 Binary files /dev/null and b/app/src/main/assets/blocks/piston_bottom.png differ diff --git a/app/src/main/assets/blocks/piston_inner.png b/app/src/main/assets/blocks/piston_inner.png new file mode 100644 index 00000000..d1c27611 Binary files /dev/null and b/app/src/main/assets/blocks/piston_inner.png differ diff --git a/app/src/main/assets/blocks/piston_side.png b/app/src/main/assets/blocks/piston_side.png new file mode 100644 index 00000000..2b4ed138 Binary files /dev/null and b/app/src/main/assets/blocks/piston_side.png differ diff --git a/app/src/main/assets/blocks/piston_top_normal.png b/app/src/main/assets/blocks/piston_top_normal.png new file mode 100644 index 00000000..b4a3dcd9 Binary files /dev/null and b/app/src/main/assets/blocks/piston_top_normal.png differ diff --git a/app/src/main/assets/blocks/piston_top_sticky.png b/app/src/main/assets/blocks/piston_top_sticky.png new file mode 100644 index 00000000..bf5c073c Binary files /dev/null and b/app/src/main/assets/blocks/piston_top_sticky.png differ diff --git a/app/src/main/assets/blocks/planks_acacia.png b/app/src/main/assets/blocks/planks_acacia.png new file mode 100644 index 00000000..ef597514 Binary files /dev/null and b/app/src/main/assets/blocks/planks_acacia.png differ diff --git a/app/src/main/assets/blocks/planks_big_oak.png b/app/src/main/assets/blocks/planks_big_oak.png new file mode 100644 index 00000000..9a9a3a4b Binary files /dev/null and b/app/src/main/assets/blocks/planks_big_oak.png differ diff --git a/app/src/main/assets/blocks/planks_birch.png b/app/src/main/assets/blocks/planks_birch.png new file mode 100644 index 00000000..a78711a8 Binary files /dev/null and b/app/src/main/assets/blocks/planks_birch.png differ diff --git a/app/src/main/assets/blocks/planks_jungle.png b/app/src/main/assets/blocks/planks_jungle.png new file mode 100644 index 00000000..3352e7b0 Binary files /dev/null and b/app/src/main/assets/blocks/planks_jungle.png differ diff --git a/app/src/main/assets/blocks/planks_oak.png b/app/src/main/assets/blocks/planks_oak.png new file mode 100644 index 00000000..c2495551 Binary files /dev/null and b/app/src/main/assets/blocks/planks_oak.png differ diff --git a/app/src/main/assets/blocks/planks_spruce.png b/app/src/main/assets/blocks/planks_spruce.png new file mode 100644 index 00000000..826f70f7 Binary files /dev/null and b/app/src/main/assets/blocks/planks_spruce.png differ diff --git a/app/src/main/assets/blocks/portal.png b/app/src/main/assets/blocks/portal.png new file mode 100644 index 00000000..f93399b2 Binary files /dev/null and b/app/src/main/assets/blocks/portal.png differ diff --git a/app/src/main/assets/blocks/potatoes_stage_0.png b/app/src/main/assets/blocks/potatoes_stage_0.png new file mode 100644 index 00000000..fdd85ee0 Binary files /dev/null and b/app/src/main/assets/blocks/potatoes_stage_0.png differ diff --git a/app/src/main/assets/blocks/potatoes_stage_1.png b/app/src/main/assets/blocks/potatoes_stage_1.png new file mode 100644 index 00000000..ac1e6162 Binary files /dev/null and b/app/src/main/assets/blocks/potatoes_stage_1.png differ diff --git a/app/src/main/assets/blocks/potatoes_stage_2.png b/app/src/main/assets/blocks/potatoes_stage_2.png new file mode 100644 index 00000000..19dd6eb1 Binary files /dev/null and b/app/src/main/assets/blocks/potatoes_stage_2.png differ diff --git a/app/src/main/assets/blocks/potatoes_stage_3.png b/app/src/main/assets/blocks/potatoes_stage_3.png new file mode 100644 index 00000000..56057412 Binary files /dev/null and b/app/src/main/assets/blocks/potatoes_stage_3.png differ diff --git a/app/src/main/assets/blocks/prismarine_bricks.png b/app/src/main/assets/blocks/prismarine_bricks.png new file mode 100644 index 00000000..92b2bf32 Binary files /dev/null and b/app/src/main/assets/blocks/prismarine_bricks.png differ diff --git a/app/src/main/assets/blocks/prismarine_dark.png b/app/src/main/assets/blocks/prismarine_dark.png new file mode 100644 index 00000000..ddd44dd9 Binary files /dev/null and b/app/src/main/assets/blocks/prismarine_dark.png differ diff --git a/app/src/main/assets/blocks/prismarine_rough.png b/app/src/main/assets/blocks/prismarine_rough.png new file mode 100644 index 00000000..28d0ec18 Binary files /dev/null and b/app/src/main/assets/blocks/prismarine_rough.png differ diff --git a/app/src/main/assets/blocks/pumpkin_face_off.png b/app/src/main/assets/blocks/pumpkin_face_off.png new file mode 100644 index 00000000..d184f76c Binary files /dev/null and b/app/src/main/assets/blocks/pumpkin_face_off.png differ diff --git a/app/src/main/assets/blocks/pumpkin_face_on.png b/app/src/main/assets/blocks/pumpkin_face_on.png new file mode 100644 index 00000000..2134117a Binary files /dev/null and b/app/src/main/assets/blocks/pumpkin_face_on.png differ diff --git a/app/src/main/assets/blocks/pumpkin_side.png b/app/src/main/assets/blocks/pumpkin_side.png new file mode 100644 index 00000000..76cc0094 Binary files /dev/null and b/app/src/main/assets/blocks/pumpkin_side.png differ diff --git a/app/src/main/assets/blocks/pumpkin_stem_connected.png b/app/src/main/assets/blocks/pumpkin_stem_connected.png new file mode 100644 index 00000000..5722637d Binary files /dev/null and b/app/src/main/assets/blocks/pumpkin_stem_connected.png differ diff --git a/app/src/main/assets/blocks/pumpkin_stem_disconnected.png b/app/src/main/assets/blocks/pumpkin_stem_disconnected.png new file mode 100644 index 00000000..1fab6fe5 Binary files /dev/null and b/app/src/main/assets/blocks/pumpkin_stem_disconnected.png differ diff --git a/app/src/main/assets/blocks/pumpkin_top.png b/app/src/main/assets/blocks/pumpkin_top.png new file mode 100644 index 00000000..91f23025 Binary files /dev/null and b/app/src/main/assets/blocks/pumpkin_top.png differ diff --git a/app/src/main/assets/blocks/purpur_block.png b/app/src/main/assets/blocks/purpur_block.png new file mode 100644 index 00000000..8f1e36b6 Binary files /dev/null and b/app/src/main/assets/blocks/purpur_block.png differ diff --git a/app/src/main/assets/blocks/purpur_pillar.png b/app/src/main/assets/blocks/purpur_pillar.png new file mode 100644 index 00000000..fe658cbc Binary files /dev/null and b/app/src/main/assets/blocks/purpur_pillar.png differ diff --git a/app/src/main/assets/blocks/purpur_pillar_top.png b/app/src/main/assets/blocks/purpur_pillar_top.png new file mode 100644 index 00000000..12a3005c Binary files /dev/null and b/app/src/main/assets/blocks/purpur_pillar_top.png differ diff --git a/app/src/main/assets/blocks/quartz_block_bottom.png b/app/src/main/assets/blocks/quartz_block_bottom.png new file mode 100644 index 00000000..0eaa57d7 Binary files /dev/null and b/app/src/main/assets/blocks/quartz_block_bottom.png differ diff --git a/app/src/main/assets/blocks/quartz_block_chiseled.png b/app/src/main/assets/blocks/quartz_block_chiseled.png new file mode 100644 index 00000000..7e436f99 Binary files /dev/null and b/app/src/main/assets/blocks/quartz_block_chiseled.png differ diff --git a/app/src/main/assets/blocks/quartz_block_chiseled_top.png b/app/src/main/assets/blocks/quartz_block_chiseled_top.png new file mode 100644 index 00000000..1e3c4ca2 Binary files /dev/null and b/app/src/main/assets/blocks/quartz_block_chiseled_top.png differ diff --git a/app/src/main/assets/blocks/quartz_block_lines.png b/app/src/main/assets/blocks/quartz_block_lines.png new file mode 100644 index 00000000..80ff6bd7 Binary files /dev/null and b/app/src/main/assets/blocks/quartz_block_lines.png differ diff --git a/app/src/main/assets/blocks/quartz_block_lines_top.png b/app/src/main/assets/blocks/quartz_block_lines_top.png new file mode 100644 index 00000000..37bed2b1 Binary files /dev/null and b/app/src/main/assets/blocks/quartz_block_lines_top.png differ diff --git a/app/src/main/assets/blocks/quartz_block_side.png b/app/src/main/assets/blocks/quartz_block_side.png new file mode 100644 index 00000000..d49a864d Binary files /dev/null and b/app/src/main/assets/blocks/quartz_block_side.png differ diff --git a/app/src/main/assets/blocks/quartz_block_top.png b/app/src/main/assets/blocks/quartz_block_top.png new file mode 100644 index 00000000..d49a864d Binary files /dev/null and b/app/src/main/assets/blocks/quartz_block_top.png differ diff --git a/app/src/main/assets/blocks/quartz_ore.png b/app/src/main/assets/blocks/quartz_ore.png new file mode 100644 index 00000000..769fe130 Binary files /dev/null and b/app/src/main/assets/blocks/quartz_ore.png differ diff --git a/app/src/main/assets/blocks/rail_activator.png b/app/src/main/assets/blocks/rail_activator.png new file mode 100644 index 00000000..5736a142 Binary files /dev/null and b/app/src/main/assets/blocks/rail_activator.png differ diff --git a/app/src/main/assets/blocks/rail_activator_powered.png b/app/src/main/assets/blocks/rail_activator_powered.png new file mode 100644 index 00000000..f76659bb Binary files /dev/null and b/app/src/main/assets/blocks/rail_activator_powered.png differ diff --git a/app/src/main/assets/blocks/rail_detector.png b/app/src/main/assets/blocks/rail_detector.png new file mode 100644 index 00000000..1dfc8fe7 Binary files /dev/null and b/app/src/main/assets/blocks/rail_detector.png differ diff --git a/app/src/main/assets/blocks/rail_detector_powered.png b/app/src/main/assets/blocks/rail_detector_powered.png new file mode 100644 index 00000000..fa0a71d0 Binary files /dev/null and b/app/src/main/assets/blocks/rail_detector_powered.png differ diff --git a/app/src/main/assets/blocks/rail_golden.png b/app/src/main/assets/blocks/rail_golden.png new file mode 100644 index 00000000..fedf816a Binary files /dev/null and b/app/src/main/assets/blocks/rail_golden.png differ diff --git a/app/src/main/assets/blocks/rail_golden_powered.png b/app/src/main/assets/blocks/rail_golden_powered.png new file mode 100644 index 00000000..91a5ef4f Binary files /dev/null and b/app/src/main/assets/blocks/rail_golden_powered.png differ diff --git a/app/src/main/assets/blocks/rail_normal.png b/app/src/main/assets/blocks/rail_normal.png new file mode 100644 index 00000000..68921201 Binary files /dev/null and b/app/src/main/assets/blocks/rail_normal.png differ diff --git a/app/src/main/assets/blocks/rail_normal_turned.png b/app/src/main/assets/blocks/rail_normal_turned.png new file mode 100644 index 00000000..c8527754 Binary files /dev/null and b/app/src/main/assets/blocks/rail_normal_turned.png differ diff --git a/app/src/main/assets/blocks/reactor_core_stage_0.png b/app/src/main/assets/blocks/reactor_core_stage_0.png new file mode 100644 index 00000000..50ad37e9 Binary files /dev/null and b/app/src/main/assets/blocks/reactor_core_stage_0.png differ diff --git a/app/src/main/assets/blocks/reactor_core_stage_1.png b/app/src/main/assets/blocks/reactor_core_stage_1.png new file mode 100644 index 00000000..09432590 Binary files /dev/null and b/app/src/main/assets/blocks/reactor_core_stage_1.png differ diff --git a/app/src/main/assets/blocks/reactor_core_stage_2.png b/app/src/main/assets/blocks/reactor_core_stage_2.png new file mode 100644 index 00000000..cb381b1b Binary files /dev/null and b/app/src/main/assets/blocks/reactor_core_stage_2.png differ diff --git a/app/src/main/assets/blocks/red_sand.png b/app/src/main/assets/blocks/red_sand.png new file mode 100644 index 00000000..096ed0ee Binary files /dev/null and b/app/src/main/assets/blocks/red_sand.png differ diff --git a/app/src/main/assets/blocks/red_sandstone_bottom.png b/app/src/main/assets/blocks/red_sandstone_bottom.png new file mode 100644 index 00000000..864370fd Binary files /dev/null and b/app/src/main/assets/blocks/red_sandstone_bottom.png differ diff --git a/app/src/main/assets/blocks/red_sandstone_carved.png b/app/src/main/assets/blocks/red_sandstone_carved.png new file mode 100644 index 00000000..c86e0e95 Binary files /dev/null and b/app/src/main/assets/blocks/red_sandstone_carved.png differ diff --git a/app/src/main/assets/blocks/red_sandstone_normal.png b/app/src/main/assets/blocks/red_sandstone_normal.png new file mode 100644 index 00000000..30783bd7 Binary files /dev/null and b/app/src/main/assets/blocks/red_sandstone_normal.png differ diff --git a/app/src/main/assets/blocks/red_sandstone_smooth.png b/app/src/main/assets/blocks/red_sandstone_smooth.png new file mode 100644 index 00000000..79585312 Binary files /dev/null and b/app/src/main/assets/blocks/red_sandstone_smooth.png differ diff --git a/app/src/main/assets/blocks/red_sandstone_top.png b/app/src/main/assets/blocks/red_sandstone_top.png new file mode 100644 index 00000000..bf231481 Binary files /dev/null and b/app/src/main/assets/blocks/red_sandstone_top.png differ diff --git a/app/src/main/assets/blocks/redstone_block.png b/app/src/main/assets/blocks/redstone_block.png new file mode 100644 index 00000000..57fb02b9 Binary files /dev/null and b/app/src/main/assets/blocks/redstone_block.png differ diff --git a/app/src/main/assets/blocks/redstone_dust_cross.png b/app/src/main/assets/blocks/redstone_dust_cross.png new file mode 100644 index 00000000..e26ce519 Binary files /dev/null and b/app/src/main/assets/blocks/redstone_dust_cross.png differ diff --git a/app/src/main/assets/blocks/redstone_dust_line.png b/app/src/main/assets/blocks/redstone_dust_line.png new file mode 100644 index 00000000..27bbfad8 Binary files /dev/null and b/app/src/main/assets/blocks/redstone_dust_line.png differ diff --git a/app/src/main/assets/blocks/redstone_lamp_off.png b/app/src/main/assets/blocks/redstone_lamp_off.png new file mode 100644 index 00000000..065a3324 Binary files /dev/null and b/app/src/main/assets/blocks/redstone_lamp_off.png differ diff --git a/app/src/main/assets/blocks/redstone_lamp_on.png b/app/src/main/assets/blocks/redstone_lamp_on.png new file mode 100644 index 00000000..99d0c31e Binary files /dev/null and b/app/src/main/assets/blocks/redstone_lamp_on.png differ diff --git a/app/src/main/assets/blocks/redstone_ore.png b/app/src/main/assets/blocks/redstone_ore.png new file mode 100644 index 00000000..92282176 Binary files /dev/null and b/app/src/main/assets/blocks/redstone_ore.png differ diff --git a/app/src/main/assets/blocks/redstone_torch_off.png b/app/src/main/assets/blocks/redstone_torch_off.png new file mode 100644 index 00000000..a7478e97 Binary files /dev/null and b/app/src/main/assets/blocks/redstone_torch_off.png differ diff --git a/app/src/main/assets/blocks/redstone_torch_on.png b/app/src/main/assets/blocks/redstone_torch_on.png new file mode 100644 index 00000000..ae93814b Binary files /dev/null and b/app/src/main/assets/blocks/redstone_torch_on.png differ diff --git a/app/src/main/assets/blocks/reeds.tga b/app/src/main/assets/blocks/reeds.tga new file mode 100644 index 00000000..53cf672c Binary files /dev/null and b/app/src/main/assets/blocks/reeds.tga differ diff --git a/app/src/main/assets/blocks/repeater_off.png b/app/src/main/assets/blocks/repeater_off.png new file mode 100644 index 00000000..34966cbb Binary files /dev/null and b/app/src/main/assets/blocks/repeater_off.png differ diff --git a/app/src/main/assets/blocks/repeater_on.png b/app/src/main/assets/blocks/repeater_on.png new file mode 100644 index 00000000..ad3d5735 Binary files /dev/null and b/app/src/main/assets/blocks/repeater_on.png differ diff --git a/app/src/main/assets/blocks/sand.png b/app/src/main/assets/blocks/sand.png new file mode 100644 index 00000000..e135fbdc Binary files /dev/null and b/app/src/main/assets/blocks/sand.png differ diff --git a/app/src/main/assets/blocks/sandstone_bottom.png b/app/src/main/assets/blocks/sandstone_bottom.png new file mode 100644 index 00000000..796c52b9 Binary files /dev/null and b/app/src/main/assets/blocks/sandstone_bottom.png differ diff --git a/app/src/main/assets/blocks/sandstone_carved.png b/app/src/main/assets/blocks/sandstone_carved.png new file mode 100644 index 00000000..85d8f310 Binary files /dev/null and b/app/src/main/assets/blocks/sandstone_carved.png differ diff --git a/app/src/main/assets/blocks/sandstone_normal.png b/app/src/main/assets/blocks/sandstone_normal.png new file mode 100644 index 00000000..688adaec Binary files /dev/null and b/app/src/main/assets/blocks/sandstone_normal.png differ diff --git a/app/src/main/assets/blocks/sandstone_smooth.png b/app/src/main/assets/blocks/sandstone_smooth.png new file mode 100644 index 00000000..83a97cf9 Binary files /dev/null and b/app/src/main/assets/blocks/sandstone_smooth.png differ diff --git a/app/src/main/assets/blocks/sandstone_top.png b/app/src/main/assets/blocks/sandstone_top.png new file mode 100644 index 00000000..74838777 Binary files /dev/null and b/app/src/main/assets/blocks/sandstone_top.png differ diff --git a/app/src/main/assets/blocks/sapling_acacia.png b/app/src/main/assets/blocks/sapling_acacia.png new file mode 100644 index 00000000..840196dd Binary files /dev/null and b/app/src/main/assets/blocks/sapling_acacia.png differ diff --git a/app/src/main/assets/blocks/sapling_birch.png b/app/src/main/assets/blocks/sapling_birch.png new file mode 100644 index 00000000..8731a4a5 Binary files /dev/null and b/app/src/main/assets/blocks/sapling_birch.png differ diff --git a/app/src/main/assets/blocks/sapling_jungle.png b/app/src/main/assets/blocks/sapling_jungle.png new file mode 100644 index 00000000..0c3dc87b Binary files /dev/null and b/app/src/main/assets/blocks/sapling_jungle.png differ diff --git a/app/src/main/assets/blocks/sapling_oak.png b/app/src/main/assets/blocks/sapling_oak.png new file mode 100644 index 00000000..ff4fd1f7 Binary files /dev/null and b/app/src/main/assets/blocks/sapling_oak.png differ diff --git a/app/src/main/assets/blocks/sapling_roofed_oak.png b/app/src/main/assets/blocks/sapling_roofed_oak.png new file mode 100644 index 00000000..b7f5f3d5 Binary files /dev/null and b/app/src/main/assets/blocks/sapling_roofed_oak.png differ diff --git a/app/src/main/assets/blocks/sapling_spruce.png b/app/src/main/assets/blocks/sapling_spruce.png new file mode 100644 index 00000000..a69cf1ab Binary files /dev/null and b/app/src/main/assets/blocks/sapling_spruce.png differ diff --git a/app/src/main/assets/blocks/sea_lantern.png b/app/src/main/assets/blocks/sea_lantern.png new file mode 100644 index 00000000..0f664846 Binary files /dev/null and b/app/src/main/assets/blocks/sea_lantern.png differ diff --git a/app/src/main/assets/blocks/slime.png b/app/src/main/assets/blocks/slime.png new file mode 100644 index 00000000..c577a5a9 Binary files /dev/null and b/app/src/main/assets/blocks/slime.png differ diff --git a/app/src/main/assets/blocks/snow.png b/app/src/main/assets/blocks/snow.png new file mode 100644 index 00000000..86285d41 Binary files /dev/null and b/app/src/main/assets/blocks/snow.png differ diff --git a/app/src/main/assets/blocks/soul_sand.png b/app/src/main/assets/blocks/soul_sand.png new file mode 100644 index 00000000..14432801 Binary files /dev/null and b/app/src/main/assets/blocks/soul_sand.png differ diff --git a/app/src/main/assets/blocks/sponge.png b/app/src/main/assets/blocks/sponge.png new file mode 100644 index 00000000..c609a41f Binary files /dev/null and b/app/src/main/assets/blocks/sponge.png differ diff --git a/app/src/main/assets/blocks/sponge_wet.png b/app/src/main/assets/blocks/sponge_wet.png new file mode 100644 index 00000000..8423e7d5 Binary files /dev/null and b/app/src/main/assets/blocks/sponge_wet.png differ diff --git a/app/src/main/assets/blocks/stone.png b/app/src/main/assets/blocks/stone.png new file mode 100644 index 00000000..9fbe6f87 Binary files /dev/null and b/app/src/main/assets/blocks/stone.png differ diff --git a/app/src/main/assets/blocks/stone_andesite.png b/app/src/main/assets/blocks/stone_andesite.png new file mode 100644 index 00000000..01ba4a18 Binary files /dev/null and b/app/src/main/assets/blocks/stone_andesite.png differ diff --git a/app/src/main/assets/blocks/stone_andesite_smooth.png b/app/src/main/assets/blocks/stone_andesite_smooth.png new file mode 100644 index 00000000..591bb4d8 Binary files /dev/null and b/app/src/main/assets/blocks/stone_andesite_smooth.png differ diff --git a/app/src/main/assets/blocks/stone_diorite.png b/app/src/main/assets/blocks/stone_diorite.png new file mode 100644 index 00000000..3d752ddc Binary files /dev/null and b/app/src/main/assets/blocks/stone_diorite.png differ diff --git a/app/src/main/assets/blocks/stone_diorite_smooth.png b/app/src/main/assets/blocks/stone_diorite_smooth.png new file mode 100644 index 00000000..daebca4b Binary files /dev/null and b/app/src/main/assets/blocks/stone_diorite_smooth.png differ diff --git a/app/src/main/assets/blocks/stone_granite.png b/app/src/main/assets/blocks/stone_granite.png new file mode 100644 index 00000000..269c4a1f Binary files /dev/null and b/app/src/main/assets/blocks/stone_granite.png differ diff --git a/app/src/main/assets/blocks/stone_granite_smooth.png b/app/src/main/assets/blocks/stone_granite_smooth.png new file mode 100644 index 00000000..a4bee094 Binary files /dev/null and b/app/src/main/assets/blocks/stone_granite_smooth.png differ diff --git a/app/src/main/assets/blocks/stone_slab_side.png b/app/src/main/assets/blocks/stone_slab_side.png new file mode 100644 index 00000000..76bfc80a Binary files /dev/null and b/app/src/main/assets/blocks/stone_slab_side.png differ diff --git a/app/src/main/assets/blocks/stone_slab_top.png b/app/src/main/assets/blocks/stone_slab_top.png new file mode 100644 index 00000000..2306090f Binary files /dev/null and b/app/src/main/assets/blocks/stone_slab_top.png differ diff --git a/app/src/main/assets/blocks/stonebrick.png b/app/src/main/assets/blocks/stonebrick.png new file mode 100644 index 00000000..93225aed Binary files /dev/null and b/app/src/main/assets/blocks/stonebrick.png differ diff --git a/app/src/main/assets/blocks/stonebrick_carved.png b/app/src/main/assets/blocks/stonebrick_carved.png new file mode 100644 index 00000000..506a2206 Binary files /dev/null and b/app/src/main/assets/blocks/stonebrick_carved.png differ diff --git a/app/src/main/assets/blocks/stonebrick_cracked.png b/app/src/main/assets/blocks/stonebrick_cracked.png new file mode 100644 index 00000000..9b674557 Binary files /dev/null and b/app/src/main/assets/blocks/stonebrick_cracked.png differ diff --git a/app/src/main/assets/blocks/stonebrick_mossy.png b/app/src/main/assets/blocks/stonebrick_mossy.png new file mode 100644 index 00000000..2b0790d3 Binary files /dev/null and b/app/src/main/assets/blocks/stonebrick_mossy.png differ diff --git a/app/src/main/assets/blocks/stonecutter_bottom.png b/app/src/main/assets/blocks/stonecutter_bottom.png new file mode 100644 index 00000000..8a6c852c Binary files /dev/null and b/app/src/main/assets/blocks/stonecutter_bottom.png differ diff --git a/app/src/main/assets/blocks/stonecutter_other_side.png b/app/src/main/assets/blocks/stonecutter_other_side.png new file mode 100644 index 00000000..7b526175 Binary files /dev/null and b/app/src/main/assets/blocks/stonecutter_other_side.png differ diff --git a/app/src/main/assets/blocks/stonecutter_side.png b/app/src/main/assets/blocks/stonecutter_side.png new file mode 100644 index 00000000..71cdc074 Binary files /dev/null and b/app/src/main/assets/blocks/stonecutter_side.png differ diff --git a/app/src/main/assets/blocks/stonecutter_top.png b/app/src/main/assets/blocks/stonecutter_top.png new file mode 100644 index 00000000..b9087ee8 Binary files /dev/null and b/app/src/main/assets/blocks/stonecutter_top.png differ diff --git a/app/src/main/assets/blocks/structure_air.png b/app/src/main/assets/blocks/structure_air.png new file mode 100644 index 00000000..6e09f16a Binary files /dev/null and b/app/src/main/assets/blocks/structure_air.png differ diff --git a/app/src/main/assets/blocks/structure_block.png b/app/src/main/assets/blocks/structure_block.png new file mode 100644 index 00000000..c8c4202b Binary files /dev/null and b/app/src/main/assets/blocks/structure_block.png differ diff --git a/app/src/main/assets/blocks/structure_block_corner.png b/app/src/main/assets/blocks/structure_block_corner.png new file mode 100644 index 00000000..50fa2ba9 Binary files /dev/null and b/app/src/main/assets/blocks/structure_block_corner.png differ diff --git a/app/src/main/assets/blocks/structure_block_data.png b/app/src/main/assets/blocks/structure_block_data.png new file mode 100644 index 00000000..228e20ef Binary files /dev/null and b/app/src/main/assets/blocks/structure_block_data.png differ diff --git a/app/src/main/assets/blocks/structure_block_load.png b/app/src/main/assets/blocks/structure_block_load.png new file mode 100644 index 00000000..c44009cf Binary files /dev/null and b/app/src/main/assets/blocks/structure_block_load.png differ diff --git a/app/src/main/assets/blocks/structure_block_save.png b/app/src/main/assets/blocks/structure_block_save.png new file mode 100644 index 00000000..deaac6eb Binary files /dev/null and b/app/src/main/assets/blocks/structure_block_save.png differ diff --git a/app/src/main/assets/blocks/structure_void.png b/app/src/main/assets/blocks/structure_void.png new file mode 100644 index 00000000..6b73c3ff Binary files /dev/null and b/app/src/main/assets/blocks/structure_void.png differ diff --git a/app/src/main/assets/blocks/tallgrass.png b/app/src/main/assets/blocks/tallgrass.png new file mode 100644 index 00000000..57b5a536 Binary files /dev/null and b/app/src/main/assets/blocks/tallgrass.png differ diff --git a/app/src/main/assets/blocks/tallgrass.tga b/app/src/main/assets/blocks/tallgrass.tga new file mode 100644 index 00000000..e47ee87f Binary files /dev/null and b/app/src/main/assets/blocks/tallgrass.tga differ diff --git a/app/src/main/assets/blocks/tallgrass_carried.tga b/app/src/main/assets/blocks/tallgrass_carried.tga new file mode 100644 index 00000000..a3df3d2d Binary files /dev/null and b/app/src/main/assets/blocks/tallgrass_carried.tga differ diff --git a/app/src/main/assets/blocks/tnt_bottom.png b/app/src/main/assets/blocks/tnt_bottom.png new file mode 100644 index 00000000..19382389 Binary files /dev/null and b/app/src/main/assets/blocks/tnt_bottom.png differ diff --git a/app/src/main/assets/blocks/tnt_side.png b/app/src/main/assets/blocks/tnt_side.png new file mode 100644 index 00000000..0fa1ec32 Binary files /dev/null and b/app/src/main/assets/blocks/tnt_side.png differ diff --git a/app/src/main/assets/blocks/tnt_top.png b/app/src/main/assets/blocks/tnt_top.png new file mode 100644 index 00000000..e8023a73 Binary files /dev/null and b/app/src/main/assets/blocks/tnt_top.png differ diff --git a/app/src/main/assets/blocks/torch_on.png b/app/src/main/assets/blocks/torch_on.png new file mode 100644 index 00000000..af405f65 Binary files /dev/null and b/app/src/main/assets/blocks/torch_on.png differ diff --git a/app/src/main/assets/blocks/trapdoor.png b/app/src/main/assets/blocks/trapdoor.png new file mode 100644 index 00000000..49549640 Binary files /dev/null and b/app/src/main/assets/blocks/trapdoor.png differ diff --git a/app/src/main/assets/blocks/trip_wire.png b/app/src/main/assets/blocks/trip_wire.png new file mode 100644 index 00000000..f2139e47 Binary files /dev/null and b/app/src/main/assets/blocks/trip_wire.png differ diff --git a/app/src/main/assets/blocks/trip_wire_source.png b/app/src/main/assets/blocks/trip_wire_source.png new file mode 100644 index 00000000..c2ea57e4 Binary files /dev/null and b/app/src/main/assets/blocks/trip_wire_source.png differ diff --git a/app/src/main/assets/blocks/vine.png b/app/src/main/assets/blocks/vine.png new file mode 100644 index 00000000..011897c6 Binary files /dev/null and b/app/src/main/assets/blocks/vine.png differ diff --git a/app/src/main/assets/blocks/vine_carried.png b/app/src/main/assets/blocks/vine_carried.png new file mode 100644 index 00000000..e691cd18 Binary files /dev/null and b/app/src/main/assets/blocks/vine_carried.png differ diff --git a/app/src/main/assets/blocks/water_flow.png b/app/src/main/assets/blocks/water_flow.png new file mode 100644 index 00000000..b0985e46 Binary files /dev/null and b/app/src/main/assets/blocks/water_flow.png differ diff --git a/app/src/main/assets/blocks/water_still.png b/app/src/main/assets/blocks/water_still.png new file mode 100644 index 00000000..2effdf68 Binary files /dev/null and b/app/src/main/assets/blocks/water_still.png differ diff --git a/app/src/main/assets/blocks/waterlily.png b/app/src/main/assets/blocks/waterlily.png new file mode 100644 index 00000000..ec95d64f Binary files /dev/null and b/app/src/main/assets/blocks/waterlily.png differ diff --git a/app/src/main/assets/blocks/web.png b/app/src/main/assets/blocks/web.png new file mode 100644 index 00000000..1a53765c Binary files /dev/null and b/app/src/main/assets/blocks/web.png differ diff --git a/app/src/main/assets/blocks/wheat_stage_0.png b/app/src/main/assets/blocks/wheat_stage_0.png new file mode 100644 index 00000000..4c7c5fcc Binary files /dev/null and b/app/src/main/assets/blocks/wheat_stage_0.png differ diff --git a/app/src/main/assets/blocks/wheat_stage_1.png b/app/src/main/assets/blocks/wheat_stage_1.png new file mode 100644 index 00000000..7af57d16 Binary files /dev/null and b/app/src/main/assets/blocks/wheat_stage_1.png differ diff --git a/app/src/main/assets/blocks/wheat_stage_2.png b/app/src/main/assets/blocks/wheat_stage_2.png new file mode 100644 index 00000000..7b2aac53 Binary files /dev/null and b/app/src/main/assets/blocks/wheat_stage_2.png differ diff --git a/app/src/main/assets/blocks/wheat_stage_3.png b/app/src/main/assets/blocks/wheat_stage_3.png new file mode 100644 index 00000000..b30146a7 Binary files /dev/null and b/app/src/main/assets/blocks/wheat_stage_3.png differ diff --git a/app/src/main/assets/blocks/wheat_stage_4.png b/app/src/main/assets/blocks/wheat_stage_4.png new file mode 100644 index 00000000..adf3d430 Binary files /dev/null and b/app/src/main/assets/blocks/wheat_stage_4.png differ diff --git a/app/src/main/assets/blocks/wheat_stage_5.png b/app/src/main/assets/blocks/wheat_stage_5.png new file mode 100644 index 00000000..ada20a39 Binary files /dev/null and b/app/src/main/assets/blocks/wheat_stage_5.png differ diff --git a/app/src/main/assets/blocks/wheat_stage_6.png b/app/src/main/assets/blocks/wheat_stage_6.png new file mode 100644 index 00000000..6913898f Binary files /dev/null and b/app/src/main/assets/blocks/wheat_stage_6.png differ diff --git a/app/src/main/assets/blocks/wheat_stage_7.png b/app/src/main/assets/blocks/wheat_stage_7.png new file mode 100644 index 00000000..00845d54 Binary files /dev/null and b/app/src/main/assets/blocks/wheat_stage_7.png differ diff --git a/app/src/main/assets/blocks/wool_colored_black.png b/app/src/main/assets/blocks/wool_colored_black.png new file mode 100644 index 00000000..8b44b8fe Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_black.png differ diff --git a/app/src/main/assets/blocks/wool_colored_blue.png b/app/src/main/assets/blocks/wool_colored_blue.png new file mode 100644 index 00000000..dc33fdc0 Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_blue.png differ diff --git a/app/src/main/assets/blocks/wool_colored_brown.png b/app/src/main/assets/blocks/wool_colored_brown.png new file mode 100644 index 00000000..4c4748d1 Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_brown.png differ diff --git a/app/src/main/assets/blocks/wool_colored_cyan.png b/app/src/main/assets/blocks/wool_colored_cyan.png new file mode 100644 index 00000000..e9c69a05 Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_cyan.png differ diff --git a/app/src/main/assets/blocks/wool_colored_gray.png b/app/src/main/assets/blocks/wool_colored_gray.png new file mode 100644 index 00000000..d4f3b818 Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_gray.png differ diff --git a/app/src/main/assets/blocks/wool_colored_green.png b/app/src/main/assets/blocks/wool_colored_green.png new file mode 100644 index 00000000..a25c57de Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_green.png differ diff --git a/app/src/main/assets/blocks/wool_colored_light_blue.png b/app/src/main/assets/blocks/wool_colored_light_blue.png new file mode 100644 index 00000000..05188e50 Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_light_blue.png differ diff --git a/app/src/main/assets/blocks/wool_colored_lime.png b/app/src/main/assets/blocks/wool_colored_lime.png new file mode 100644 index 00000000..b37bb16c Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_lime.png differ diff --git a/app/src/main/assets/blocks/wool_colored_magenta.png b/app/src/main/assets/blocks/wool_colored_magenta.png new file mode 100644 index 00000000..8f4263da Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_magenta.png differ diff --git a/app/src/main/assets/blocks/wool_colored_orange.png b/app/src/main/assets/blocks/wool_colored_orange.png new file mode 100644 index 00000000..f1bc8477 Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_orange.png differ diff --git a/app/src/main/assets/blocks/wool_colored_pink.png b/app/src/main/assets/blocks/wool_colored_pink.png new file mode 100644 index 00000000..9e175135 Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_pink.png differ diff --git a/app/src/main/assets/blocks/wool_colored_purple.png b/app/src/main/assets/blocks/wool_colored_purple.png new file mode 100644 index 00000000..23e1f92b Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_purple.png differ diff --git a/app/src/main/assets/blocks/wool_colored_red.png b/app/src/main/assets/blocks/wool_colored_red.png new file mode 100644 index 00000000..e445d06a Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_red.png differ diff --git a/app/src/main/assets/blocks/wool_colored_silver.png b/app/src/main/assets/blocks/wool_colored_silver.png new file mode 100644 index 00000000..f79bc6d5 Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_silver.png differ diff --git a/app/src/main/assets/blocks/wool_colored_white.png b/app/src/main/assets/blocks/wool_colored_white.png new file mode 100644 index 00000000..c495e53a Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_white.png differ diff --git a/app/src/main/assets/blocks/wool_colored_yellow.png b/app/src/main/assets/blocks/wool_colored_yellow.png new file mode 100644 index 00000000..9839e000 Binary files /dev/null and b/app/src/main/assets/blocks/wool_colored_yellow.png differ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/CreateWorldActivity.java b/app/src/main/java/com/mithrilmania/blocktopograph/CreateWorldActivity.java index 83dc0312..2a8cb728 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/CreateWorldActivity.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/CreateWorldActivity.java @@ -20,6 +20,7 @@ import androidx.fragment.app.Fragment; import com.litl.leveldb.DB; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.databinding.ActivityCreateWorldBinding; import com.mithrilmania.blocktopograph.flat.EditFlatFragment; @@ -217,10 +218,14 @@ protected Boolean doInBackground(Void... voids) { if (lsize != 4) mIsVanillaFlat = false; else { Layer ltest = layers.get(0); - mIsVanillaFlat = ltest.block == ListingBlock.B_31_TALLGRASS && ltest.amount == 1 - && (ltest = layers.get(1)).block == ListingBlock.B_2_GRASS && ltest.amount == 1 - && (ltest = layers.get(2)).block == ListingBlock.B_3_DIRT && ltest.amount == 29 - && (ltest = layers.get(3)).block == ListingBlock.B_7_BEDROCK && ltest.amount == 1; + mIsVanillaFlat = ltest.block == BlockTemplates.getOfType("minecraft:tallgrass")[0] + && ltest.amount == 1 + && (ltest = layers.get(1)).block == BlockTemplates.getOfType("minecraft:grass")[0] + && ltest.amount == 1 + && (ltest = layers.get(2)).block == BlockTemplates.getOfType("minecraft:dirt")[0] + && ltest.amount == 29 + && (ltest = layers.get(3)).block == BlockTemplates.getOfType("minecraft:bedrock")[0] + && ltest.amount == 1; } Layer[] alayers = new Layer[lsize < 3 ? 3 : lsize]; for (int i = 0; i < lsize; i++) { @@ -314,7 +319,7 @@ protected Boolean doInBackground(Void... voids) { String nam; if (maxlen <= 0) nam = ""; else { - String namo = layer.block.getName(); + String namo = layer.block.getBlock().getName(); if (namo.length() >= maxlen) nam = namo.substring(0, maxlen); else nam = namo; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/Log.java b/app/src/main/java/com/mithrilmania/blocktopograph/Log.java index 29732ff9..d32a3000 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/Log.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/Log.java @@ -5,14 +5,12 @@ import androidx.annotation.NonNull; -import com.crashlytics.android.Crashlytics; +import com.google.firebase.crashlytics.FirebaseCrashlytics; import com.google.firebase.analytics.FirebaseAnalytics; import java.io.PrintWriter; import java.io.StringWriter; -import io.fabric.sdk.android.Fabric; - public class Log { public static final String ANA_PARAM_CREATE_WORLD_TYPE = "cw_type"; @@ -25,15 +23,13 @@ public class Log { private static FirebaseAnalytics mFirebaseAnalytics; - private static PrintWriter mFileLogger; +// private static PrintWriter mFileLogger; private static boolean mIsFirebaseAnalyticsEnabled = false; private static boolean mIsCrashlyticsEnabled = false; - private static String concat(@NonNull Object caller, @NonNull String msg) { - Class clazz; - if (caller instanceof Class) clazz = (Class) caller; - else clazz = caller.getClass(); + private static String prependClassName(@NonNull Object caller, @NonNull String msg) { + Class clazz = caller instanceof Class ? (Class) caller : caller.getClass(); return clazz.getSimpleName() + ": " + msg; } @@ -42,45 +38,38 @@ public static void enableFirebaseAnalytics(@NonNull Context context) { mIsFirebaseAnalyticsEnabled = true; } - public static void enableCrashlytics(@NonNull Context context) { + public static void enableCrashlytics() { if (!BuildConfig.DEBUG) { - Fabric.with(context, new Crashlytics()); + FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true); mIsCrashlyticsEnabled = true; } } public static void d(@NonNull Object caller, @NonNull String msg) { - android.util.Log.d(LOG_TAG, concat(caller, msg)); + android.util.Log.d(LOG_TAG, prependClassName(caller, msg)); } public static void d(@NonNull Object caller, @NonNull Throwable throwable) { StringWriter sw = new StringWriter(4096); PrintWriter pw = new PrintWriter(sw); throwable.printStackTrace(pw); - android.util.Log.e(LOG_TAG, concat(caller, sw.toString())); + android.util.Log.e(LOG_TAG, prependClassName(caller, sw.toString())); + pw.close(); } public static void e(@NonNull Object caller, @NonNull String msg) { + d(caller, msg); if (mIsCrashlyticsEnabled) - Crashlytics.log(android.util.Log.DEBUG, LOG_TAG, concat(caller, msg)); + FirebaseCrashlytics.getInstance().log(prependClassName(caller, msg)); } public static void e(@NonNull Object caller, @NonNull Throwable throwable) { - StringWriter sw = new StringWriter(4096); - PrintWriter pw = new PrintWriter(sw); - throwable.printStackTrace(pw); - android.util.Log.e(LOG_TAG, concat(caller, sw.toString())); - if (mIsCrashlyticsEnabled) Crashlytics.logException(throwable); + d(caller, throwable); + if (mIsCrashlyticsEnabled) FirebaseCrashlytics.getInstance().recordException(throwable); } private synchronized static FirebaseAnalytics getFirebaseAnalytics(@NonNull Context context) { - if (mFirebaseAnalytics == null) { - mFirebaseAnalytics = FirebaseAnalytics.getInstance(context); - - //don't measure the test devices in analytics ...Meow but why? - //How would a single test device influences data from all over the world... - //mFirebaseAnalytics.setAnalyticsCollectionEnabled(true); - } + if (mFirebaseAnalytics == null) mFirebaseAnalytics = FirebaseAnalytics.getInstance(context); return mFirebaseAnalytics; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/WorldData.java b/app/src/main/java/com/mithrilmania/blocktopograph/WorldData.java index 96f8e77d..eefd25d0 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/WorldData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/WorldData.java @@ -7,7 +7,7 @@ import com.litl.leveldb.DB; import com.litl.leveldb.Iterator; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.ChunkTag; import com.mithrilmania.blocktopograph.chunk.Version; @@ -17,6 +17,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; +import java.util.stream.IntStream; /** * Wrapper around level.dat world spec en levelDB database. @@ -30,11 +31,11 @@ public class WorldData { private WeakReference world; private LruCache chunks = new ChunkCache(this, 256); - public final BlockRegistry mBlockRegistry; + public final OldBlockRegistry mOldBlockRegistry; public WorldData(World world) { this.world = new WeakReference<>(world); - this.mBlockRegistry = new BlockRegistry(2048); + this.mOldBlockRegistry = new OldBlockRegistry(2048); } static String bytesToHex(byte[] bytes, int start, int end) { @@ -146,6 +147,10 @@ public byte[] getChunkData(int x, int z, ChunkTag type, Dimension dimension, byt return db.get(chunkKey); } + public byte[] getChunkData(int x, int z, ChunkTag type, Dimension dimension) throws WorldDBException, WorldDBLoadException { + return getChunkData(x, z, type, dimension, (byte) 0, false); + } + public void writeChunkData(int x, int z, ChunkTag type, Dimension dimension, byte subChunk, boolean asSubChunk, byte[] chunkData) throws WorldDBException { //ensure that the db is opened this.openDB(); @@ -160,6 +165,20 @@ public void removeChunkData(int x, int z, ChunkTag type, Dimension dimension, by db.delete(getChunkDataKey(x, z, type, dimension, subChunk, asSubChunk)); } + public void removeFullChunk(int x, int z, Dimension dimension) { + var iterator = db.iterator(); + int count = 0; + var compareKey = getChunkDataKey(x, z, ChunkTag.DATA_2D, dimension, (byte) 0, false); + int baseKeyLength = dimension == Dimension.OVERWORLD ? 8 : 12; + for (iterator.seekToFirst(); iterator.isValid() && count < 800; iterator.next(), count++) { + byte[] key = iterator.getKey(); + if (key.length > baseKeyLength && key.length <= baseKeyLength + 3 && + IntStream.range(0, baseKeyLength).allMatch(i -> key[i] == compareKey[i])) + db.delete(key); + } + iterator.close(); + } + public Chunk getChunk(int cX, int cZ, Dimension dimension, boolean createIfMissing, Version createOfVersion) { Key key = new Key(cX, cZ, dimension); key.createIfMissng = createIfMissing; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/Block.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/Block.java index ee70fb0f..6c4bb856 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/block/Block.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/Block.java @@ -3,91 +3,106 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; +import com.mithrilmania.blocktopograph.block.blockproperty.BlockProperty; import com.mithrilmania.blocktopograph.nbt.tags.Tag; import java.io.Serializable; -import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; public class Block implements Serializable { - @NonNull - private BlockType blockType; + private final String name; - @NonNull - private KnownBlockRepr legacyBlock; + private final BlockType type; - private ListingBlock listingBlock; + private final Object[] knownProperties; - @NonNull - private CompoundTag states; + private final Map customProperties; - private int version; - - Block(@NonNull BlockType blockType, @NonNull CompoundTag states, int version) { - this.blockType = blockType; - this.states = states; - this.version = version; - KnownBlockRepr legacyBlock = BlockWithStatesToLegacyBlockMapper.getBestRepr(this); - if (legacyBlock == null) { - for (ListingBlock lb : ListingBlock.values()) { - if (lb.getIdentifier().equals(blockType.getName())) { - listingBlock = lb; - break; - } - } - legacyBlock = KnownBlockRepr.guessBlockNew(blockType.getName()); - } - this.legacyBlock = legacyBlock; + Block(String name, Map customProperties) { + this.name = name; + this.type = null; + this.knownProperties = null; + this.customProperties = customProperties; } - Block(@NonNull BlockType blockType, @NonNull KnownBlockRepr legacyBlock, int version) { - this.blockType = blockType; - this.states = new CompoundTag("states", new ArrayList<>()); - this.version = version; - this.legacyBlock = legacyBlock; + Block(BlockType type, Object[] knownProperties, Map customProperties) { + this.name = type.getName(); + this.type = type; + this.knownProperties = knownProperties; + this.customProperties = customProperties; } - @NonNull - public String getBlockType() { - return blockType.getName(); + public String getName() { + return name; } - public int getVersion() { - return version; + public BlockType getType() { + return type; } - public boolean isOfSameType(Block block) { - return blockType == block.blockType; + public Object getProperty(String name) { + int index = getKnownPropertyIndex(name, type); + if (index >= 0) return knownProperties[index]; + else return customProperties.get(name); } - public Tag getState(String key) { - return states.getChildTagByKey(key); + public Object[] getKnownProperties() { + return knownProperties; } - @NonNull - public KnownBlockRepr getLegacyBlock() { - return legacyBlock; + public Map getCustomProperties() { + return customProperties; } - public int getColor() { - if (listingBlock != null) - return listingBlock.getColor(); - return legacyBlock.color; + private static int getKnownPropertyIndex(@NonNull String name, @Nullable BlockType type) { + if (type != null) { + BlockProperty[] properties = type.getKnownProperties(); + for (int i = 0, propertiesLength = properties.length; i < propertiesLength; i++) { + BlockProperty prop = properties[i]; + if (name.equals(prop.getName())) return i; + } + } + return -1; } - @NonNull - public CompoundTag getStates() { - return states; - } + public static class Builder { - @Override - public boolean equals(@Nullable Object obj) { - if (!(obj instanceof Block)) return false; - Block another = (Block) obj; - // Ref compare. - if (blockType != another.blockType) return false; - return states.equals(another.states); - } + private final String name; + + private final BlockType type; + + private final Object[] knownProperties; + + private final Map customProperties = new HashMap<>(); + public Builder(@NonNull String name) { + this.name = name; + this.type = null; + this.knownProperties = null; + } + + public Builder(@NonNull BlockType type) { + this.name = null; + this.type = type; + this.knownProperties = new Object[type.getKnownProperties().length]; + } + + public Builder setProperty(@NonNull String name, Object val) { + int index = getKnownPropertyIndex(name, type); + if (index >= 0) knownProperties[index] = val; + else customProperties.put(name, val); + return this; + } + + public Builder setProperty(@NonNull Tag tag) { + return setProperty(tag.getName(), tag.getValue()); + } + + public Block build() { + if (type == null) return new Block(name, customProperties); + return new Block(type, knownProperties, customProperties); + } + } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockRegistry.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockRegistry.java deleted file mode 100644 index df9008eb..00000000 --- a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockRegistry.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.mithrilmania.blocktopograph.block; - -import androidx.annotation.NonNull; - -import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; - -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.Map; - -public class BlockRegistry { - - private int limitedTypes; - private Map blockTypes; - - public BlockRegistry() { - blockTypes = new Hashtable<>(1024); - } - - public BlockRegistry(int limitedTypes) { - this(); - this.limitedTypes = limitedTypes; - } - - @NonNull - private BlockType getBlockType(String name) { - BlockType ret = blockTypes.get(name); - if (ret == null) { - ret = new BlockType(name); - if (limitedTypes > 0 && blockTypes.size() >= limitedTypes) - throw new RuntimeException("Block types exceeds your set limit."); - blockTypes.put(name, ret); - } - return ret; - } - - @NonNull - public Block createBlock(@NonNull String name, @NonNull CompoundTag states, int version) { - return new Block(getBlockType(name), states, version); - } - - @NonNull - public Block createBlock(@NonNull String name) { - return new Block(getBlockType(name), new CompoundTag("states", new ArrayList<>()), 3841); - } - - @NonNull - public Block createBlock(@NonNull KnownBlockRepr legacyBlock) { - return new Block(getBlockType(legacyBlock.identifier), legacyBlock, 1); - } - -} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplate.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplate.java new file mode 100644 index 00000000..d7e882db --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplate.java @@ -0,0 +1,48 @@ +package com.mithrilmania.blocktopograph.block; + +import com.mithrilmania.blocktopograph.block.icon.BlockIcon; +import com.mithrilmania.blocktopograph.block.icon.NoBlockIcon; +import com.mithrilmania.blocktopograph.block.icon.TexPathBlockIcon; + +import java.io.Serializable; + +public class BlockTemplate implements Serializable { + + private final String subName; + + private final Block block; + + private final BlockIcon icon; + + private final int color; + + private final boolean hasBiomeShading; + + public BlockTemplate(String subName, Block block, BlockIcon icon, int color, boolean hasBiomeShading) { + this.subName = subName; + this.block = block; + this.icon = icon; + this.color = color; + this.hasBiomeShading = hasBiomeShading; + } + + public String getSubName() { + return subName; + } + + public Block getBlock() { + return block; + } + + public BlockIcon getIcon() { + return icon; + } + + public int getColor() { + return color; + } + + public boolean isHasBiomeShading() { + return hasBiomeShading; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplates.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplates.java new file mode 100644 index 00000000..79e1b6ba --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockTemplates.java @@ -0,0 +1,1704 @@ +package com.mithrilmania.blocktopograph.block; + +import androidx.annotation.NonNull; + +import com.google.common.collect.Streams; +import com.mithrilmania.blocktopograph.block.icon.NoBlockIcon; +import com.mithrilmania.blocktopograph.block.icon.TexPathBlockIcon; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Stream; + +public class BlockTemplates { + + private static final Map allTemplates = new HashMap<>(); + + private static final BlockTemplate unknownBlockTemplate = new BlockTemplate( + null, new Block.Builder(BlockType.UNKNOWN).build(), + new NoBlockIcon(), 0xff0000, false); + + static { + init(); + } + + private static void init() { + allTemplates.put("minecraft:air", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.AIR).build(), new TexPathBlockIcon(null), 0x00000000, false) + }); + allTemplates.put("minecraft:stone", new BlockTemplate[]{ + new BlockTemplate("stone", new Block.Builder(BlockType.STONE).setProperty("stone_type", "stone").build(), new TexPathBlockIcon("blocks/stone.png"), 0xff464646, false), + new BlockTemplate("granite", new Block.Builder(BlockType.STONE).setProperty("stone_type", "granite").build(), new TexPathBlockIcon("blocks/stone_granite.png"), 0xff8c7167, false), + new BlockTemplate("granite_smooth", new Block.Builder(BlockType.STONE).setProperty("stone_type", "granite_smooth").build(), new TexPathBlockIcon("blocks/stone_granite_smooth.png"), 0xff946251, false), + new BlockTemplate("diorite", new Block.Builder(BlockType.STONE).setProperty("stone_type", "diorite").build(), new TexPathBlockIcon("blocks/stone_diorite.png"), 0xffc6c6c6, false), + new BlockTemplate("diorite_smooth", new Block.Builder(BlockType.STONE).setProperty("stone_type", "diorite_smooth").build(), new TexPathBlockIcon("blocks/stone_diorite_smooth.png"), 0xffbebec1, false), + new BlockTemplate("andesite", new Block.Builder(BlockType.STONE).setProperty("stone_type", "andesite").build(), new TexPathBlockIcon("blocks/stone_andesite.png"), 0xff797777, false), + new BlockTemplate("andesite_smooth", new Block.Builder(BlockType.STONE).setProperty("stone_type", "andesite_smooth").build(), new TexPathBlockIcon("blocks/stone_andesite_smooth.png"), 0xff828382, false) + }); + allTemplates.put("minecraft:grass", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GRASS).build(), new TexPathBlockIcon("blocks/grass_side_carried.png"), 0xff939393, true) + }); + allTemplates.put("minecraft:dirt", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DIRT).setProperty("dirt_type", "normal").build(), new TexPathBlockIcon("blocks/dirt.png"), 0xff866043, true) + }); + allTemplates.put("minecraft:cobblestone", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.COBBLESTONE).build(), new TexPathBlockIcon("blocks/cobblestone.png"), 0xff7a7a7a, false) + }); + allTemplates.put("minecraft:planks", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "oak").build(), new TexPathBlockIcon("blocks/planks_oak.png"), 0xff9c7f4e, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "spruce").build(), new TexPathBlockIcon("blocks/planks_spruce.png"), 0xff5a3d0d, false), + new BlockTemplate("birch", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "birch").build(), new TexPathBlockIcon("blocks/planks_birch.png"), 0xffdabd8d, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "jungle").build(), new TexPathBlockIcon("blocks/planks_jungle.png"), 0xffBa7d5d, false), + new BlockTemplate("acacia", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "acacia").build(), new TexPathBlockIcon("blocks/planks_acacia.png"), 0xff934f39, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.PLANKS).setProperty("wood_type", "dark_oak").build(), new TexPathBlockIcon("blocks/planks_big_oak.png"), 0xff3b260f, false) + }); + allTemplates.put("minecraft:sapling", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "oak").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_oak.png"), 0x6b476625, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "spruce").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_spruce.png"), 0x53333a21, false), + new BlockTemplate("birch", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "birch").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_birch.png"), 0x6b769654, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "jungle").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_jungle.png"), 0x55305612, false), + new BlockTemplate("acacia", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "acacia").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_acacia.png"), 0xff718919, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.SAPLING).setProperty("sapling_type", "dark_oak").setProperty("age_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sapling_roofed_oak.png"), 0xff6f522d, false) + }); + allTemplates.put("minecraft:bedrock", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BEDROCK).setProperty("infiniburn_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/bedrock.png"), 0xff535353, false) + }); + allTemplates.put("minecraft:flowing_water", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FLOWING_WATER).setProperty("liquid_depth", 0).build(), new TexPathBlockIcon("blocks/water_flow.png"), 0x802e43f4, false) + }); + allTemplates.put("minecraft:water", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WATER).setProperty("liquid_depth", 0).build(), new TexPathBlockIcon("blocks/water_still.png"), 0x802e43f4, false) + }); + allTemplates.put("minecraft:flowing_lava", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FLOWING_LAVA).setProperty("liquid_depth", 0).build(), new TexPathBlockIcon("blocks/lava_flow.png"), 0xf0d45a12, false) + }); + allTemplates.put("minecraft:lava", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LAVA).setProperty("liquid_depth", 0).build(), new TexPathBlockIcon("blocks/lava_still.png"), 0xf0d45a12, false) + }); + allTemplates.put("minecraft:sand", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.SAND).setProperty("sand_type", "normal").build(), new TexPathBlockIcon("blocks/sand.png"), 0xffdbd3a0, false), + new BlockTemplate("red", new Block.Builder(BlockType.SAND).setProperty("sand_type", "red").build(), new TexPathBlockIcon("blocks/red_sand.png"), 0xffa7531f, false) + }); + allTemplates.put("minecraft:gravel", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GRAVEL).build(), new TexPathBlockIcon("blocks/gravel.png"), 0xff7e7c7a, false) + }); + allTemplates.put("minecraft:gold_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GOLD_ORE).build(), new TexPathBlockIcon("blocks/gold_ore.png"), 0xff8f8b7c, false) + }); + allTemplates.put("minecraft:iron_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_ORE).build(), new TexPathBlockIcon("blocks/iron_ore.png"), 0xff87827e, false) + }); + allTemplates.put("minecraft:coal_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.COAL_ORE).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff737373, false) + }); + allTemplates.put("minecraft:log", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.LOG).setProperty("old_log_type", "oak").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log_oak.png"), 0xff9a7d4d, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.LOG).setProperty("old_log_type", "spruce").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log_spruce.png"), 0xff5a3d0d, false), + new BlockTemplate("birch", new Block.Builder(BlockType.LOG).setProperty("old_log_type", "birch").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log_birch.png"), 0xffdabd8d, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.LOG).setProperty("old_log_type", "jungle").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log_jungle.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:leaves", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.LEAVES).setProperty("old_leaf_type", "oak").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves_oak.png"), 0xff878787, true), + new BlockTemplate("spruce", new Block.Builder(BlockType.LEAVES).setProperty("old_leaf_type", "spruce").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves_spruce.png"), 0xff132613, true), + new BlockTemplate("birch", new Block.Builder(BlockType.LEAVES).setProperty("old_leaf_type", "birch").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves_birch.png"), 0xff283816, true), + new BlockTemplate("jungle", new Block.Builder(BlockType.LEAVES).setProperty("old_leaf_type", "jungle").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves_jungle.png"), 0xff918e86, true) + }); + allTemplates.put("minecraft:sponge", new BlockTemplate[]{ + new BlockTemplate("dry", new Block.Builder(BlockType.SPONGE).setProperty("sponge_type", "dry").build(), new TexPathBlockIcon("blocks/sponge_dry.png"), 0xffb6b639, false), + new BlockTemplate("wet", new Block.Builder(BlockType.SPONGE).setProperty("sponge_type", "wet").build(), new TexPathBlockIcon("blocks/sponge_wet.png"), 0xff9b9a33, false) + }); + allTemplates.put("minecraft:glass", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GLASS).build(), new TexPathBlockIcon("blocks/glass.png"), 0x46daf0f4, false) + }); + allTemplates.put("minecraft:lapis_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LAPIS_ORE).build(), new TexPathBlockIcon("blocks/lapis_ore.png"), 0xff667086, false) + }); + allTemplates.put("minecraft:lapis_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LAPIS_BLOCK).build(), new TexPathBlockIcon("blocks/lapis_block.png"), 0xff1d47a5, false) + }); + allTemplates.put("minecraft:dispenser", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DISPENSER).setProperty("facing_direction", 0).setProperty("triggered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dispenser.png"), 0xff606060, false) + }); + allTemplates.put("minecraft:sandstone", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.SANDSTONE).setProperty("sand_stone_type", "default").build(), new TexPathBlockIcon("blocks/sandstone_default.png"), 0xffdad29e, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.SANDSTONE).setProperty("sand_stone_type", "heiroglyphs").build(), new TexPathBlockIcon("blocks/sandstone_chiseled.png"), 0xffdad1a2, false), + new BlockTemplate("smooth", new Block.Builder(BlockType.SANDSTONE).setProperty("sand_stone_type", "cut").build(), new TexPathBlockIcon("blocks/sandstone_smooth.png"), 0xffdad1a2, false) + }); + allTemplates.put("minecraft:noteblock", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NOTEBLOCK).build(), new TexPathBlockIcon("blocks/noteblock.png"), 0xff644332, false) + }); + allTemplates.put("minecraft:bed", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BED).setProperty("direction", 0).setProperty("head_piece_bit", (byte) 0).setProperty("occupied_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/bed.png"), 0xff8e1616, false) + }); + allTemplates.put("minecraft:golden_rail", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GOLDEN_RAIL).setProperty("rail_direction", 0).setProperty("rail_data_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/golden_rail.png"), 0xab9a6846, false) + }); + allTemplates.put("minecraft:detector_rail", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DETECTOR_RAIL).setProperty("rail_direction", 0).setProperty("rail_data_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/detector_rail.png"), 0x9b786559, false) + }); + allTemplates.put("minecraft:sticky_piston", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STICKY_PISTON).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/sticky_piston.png"), 0xff8d9263, false) + }); + allTemplates.put("minecraft:web", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WEB).build(), new TexPathBlockIcon("blocks/web.png"), 0x68dcdcdc, false) + }); + allTemplates.put("minecraft:tallgrass", new BlockTemplate[]{ + new BlockTemplate("fern", new Block.Builder(BlockType.TALLGRASS).setProperty("tall_grass_type", "tall").build(), new TexPathBlockIcon("blocks/tallgrass_fern.png"), 0xff747474, true), + new BlockTemplate("grass", new Block.Builder(BlockType.TALLGRASS).setProperty("tall_grass_type", "fern").build(), new TexPathBlockIcon("blocks/tallgrass_grass.png"), 0x4e787878, true) + }); + allTemplates.put("minecraft:deadbush", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DEADBUSH).build(), new TexPathBlockIcon("blocks/deadbush.png"), 0x517b4f19, false) + }); + allTemplates.put("minecraft:piston", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PISTON).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/piston.png"), 0xff998159, false) + }); + allTemplates.put("minecraft:pistonArmCollision", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PISTONARMCOLLISION).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/pistonArmCollision.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:wool", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.WOOL).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/wool_colored_white.png"), 0xffdddddd, false), + new BlockTemplate("orange", new Block.Builder(BlockType.WOOL).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/wool_colored_orange.png"), 0xffdb7d3e, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.WOOL).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/wool_colored_magenta.png"), 0xffb350bc, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.WOOL).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/wool_colored_light_blue.png"), 0xff6a8ac9, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.WOOL).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/wool_colored_yellow.png"), 0xffb1a627, false), + new BlockTemplate("lime", new Block.Builder(BlockType.WOOL).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/wool_colored_lime.png"), 0xff41ae38, false), + new BlockTemplate("pink", new Block.Builder(BlockType.WOOL).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/wool_colored_pink.png"), 0xffd08499, false), + new BlockTemplate("gray", new Block.Builder(BlockType.WOOL).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/wool_colored_gray.png"), 0xff404040, false), + new BlockTemplate("silver", new Block.Builder(BlockType.WOOL).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/wool_colored_silver.png"), 0xff9aa1a1, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.WOOL).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/wool_colored_cyan.png"), 0xff2e6e89, false), + new BlockTemplate("purple", new Block.Builder(BlockType.WOOL).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/wool_colored_purple.png"), 0xff7e3db5, false), + new BlockTemplate("blue", new Block.Builder(BlockType.WOOL).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/wool_colored_blue.png"), 0xff2e388d, false), + new BlockTemplate("brown", new Block.Builder(BlockType.WOOL).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/wool_colored_brown.png"), 0xff4f321f, false), + new BlockTemplate("green", new Block.Builder(BlockType.WOOL).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/wool_colored_green.png"), 0xff35461b, false), + new BlockTemplate("red", new Block.Builder(BlockType.WOOL).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/wool_colored_red.png"), 0xff963430, false), + new BlockTemplate("black", new Block.Builder(BlockType.WOOL).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/wool_colored_black.png"), 0xff191616, false) + }); + allTemplates.put("minecraft:element_0", new BlockTemplate[]{ + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false), + new BlockTemplate("unknown", new Block.Builder(BlockType.ELEMENT_0).build(), new TexPathBlockIcon("blocks/coal_ore.png"), 0xff191616, false) + }); + allTemplates.put("minecraft:yellow_flower", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.YELLOW_FLOWER).build(), new TexPathBlockIcon("blocks/yellow_flower.png"), 0x1e6ca200, false) + }); + allTemplates.put("minecraft:red_flower", new BlockTemplate[]{ + new BlockTemplate("poppy", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "poppy").build(), new TexPathBlockIcon("blocks/flower_poppy.png"), 0x1d8a2b0d, false), + new BlockTemplate("blue_orchid", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "orchid").build(), new TexPathBlockIcon("blocks/flower_blue_orchid.png"), 0x1d188fd3, false), + new BlockTemplate("allium", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "allium").build(), new TexPathBlockIcon("blocks/flower_allium.png"), 0x1ddbb7f8, false), + new BlockTemplate("houstonia", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "houstonia").build(), new TexPathBlockIcon("blocks/flower_houstonia.png"), 0x1defef99, false), + new BlockTemplate("tulip_red", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "tulip_red").build(), new TexPathBlockIcon("blocks/flower_tulip_red.png"), 0x1dbd2604, false), + new BlockTemplate("tulip_orange", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "tulip_orange").build(), new TexPathBlockIcon("blocks/flower_tulip_orange.png"), 0x1dd06713, false), + new BlockTemplate("tulip_white", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "tulip_white").build(), new TexPathBlockIcon("blocks/flower_tulip_white.png"), 0x1df9f9f9, false), + new BlockTemplate("tulip_pink", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "tulip_pink").build(), new TexPathBlockIcon("blocks/flower_tulip_pink.png"), 0x1dbeb3be, false), + new BlockTemplate("oxeye_daisy", new Block.Builder(BlockType.RED_FLOWER).setProperty("flower_type", "oxeye").build(), new TexPathBlockIcon("blocks/flower_oxeye_daisy.png"), 0x1ddadada, false) + }); + allTemplates.put("minecraft:brown_mushroom", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BROWN_MUSHROOM).build(), new TexPathBlockIcon("blocks/brown_mushroom.png"), 0x198a6953, false) + }); + allTemplates.put("minecraft:red_mushroom", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RED_MUSHROOM).build(), new TexPathBlockIcon("blocks/red_mushroom.png"), 0x21c33538, false) + }); + allTemplates.put("minecraft:gold_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GOLD_BLOCK).build(), new TexPathBlockIcon("blocks/gold_block.png"), 0xfff9ec4e, false) + }); + allTemplates.put("minecraft:iron_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_BLOCK).build(), new TexPathBlockIcon("blocks/iron_block.png"), 0xffdbdbdb, false) + }); + allTemplates.put("minecraft:double_stone_slab", new BlockTemplate[]{ + new BlockTemplate("stone", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "smooth_stone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_stone.png"), 0xff9f9f9f, false), + new BlockTemplate("sand", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "sandstone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_sand.png"), 0xffdad29e, false), + new BlockTemplate("wood", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "wood").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_wood.png"), 0xff9c7f4e, false), + new BlockTemplate("cobble", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "cobblestone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_cobble.png"), 0xff7a7a7a, false), + new BlockTemplate("brick", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_brick.png"), 0xff926356, false), + new BlockTemplate("smooth_stone_brick", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "stone_brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_smooth_stone_brick.png"), 0xff7d7d7d, false), + new BlockTemplate("quartz", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "quartz").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_quartz.png"), 0xff2c161a, false), + new BlockTemplate("nether_brick", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "nether_brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab_nether_brick.png"), 0xffece9e2, false), + new BlockTemplate("red_sandstone", new Block.Builder(BlockType.DOUBLE_STONE_SLAB).setProperty("stone_slab_type", "smooth_stone").setProperty("top_slot_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/double_stone_slab_red_sandstone.png"), 0xff9f9f9f, false) + }); + allTemplates.put("minecraft:stone_slab", new BlockTemplate[]{ + new BlockTemplate("stone", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "smooth_stone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff9f9f9f, false), + new BlockTemplate("sand", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "sandstone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xffdad29e, false), + new BlockTemplate("wood", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "wood").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff9c7f4e, false), + new BlockTemplate("cobble", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "cobblestone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff7a7a7a, false), + new BlockTemplate("brick", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff926356, false), + new BlockTemplate("smooth_stone_brick", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "stone_brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff7d7d7d, false), + new BlockTemplate("quartz", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "quartz").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xff2c161a, false), + new BlockTemplate("nether_brick", new Block.Builder(BlockType.STONE_SLAB).setProperty("stone_slab_type", "nether_brick").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab_side.png"), 0xffece9e2, false) + }); + allTemplates.put("minecraft:brick_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BRICK_BLOCK).build(), new TexPathBlockIcon("blocks/brick_block.png"), 0xff926356, false) + }); + allTemplates.put("minecraft:tnt", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TNT).setProperty("allow_underwater_bit", (byte) 0).setProperty("explode_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/tnt.png"), 0xff82412f, false) + }); + allTemplates.put("minecraft:bookshelf", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BOOKSHELF).build(), new TexPathBlockIcon("blocks/bookshelf.png"), 0xff6b5839, false) + }); + allTemplates.put("minecraft:mossy_cobblestone", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MOSSY_COBBLESTONE).build(), new TexPathBlockIcon("blocks/mossy_cobblestone.png"), 0xff677967, false) + }); + allTemplates.put("minecraft:obsidian", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.OBSIDIAN).build(), new TexPathBlockIcon("blocks/obsidian.png"), 0xff14121d, false) + }); + allTemplates.put("minecraft:torch", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/torch.png"), 0x13826a3a, false) + }); + allTemplates.put("minecraft:fire", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FIRE).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/fire.png"), 0x8bd38c35, false) + }); + allTemplates.put("minecraft:mob_spawner", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MOB_SPAWNER).build(), new TexPathBlockIcon("blocks/mob_spawner.png"), 0x9b1a2731, false) + }); + allTemplates.put("minecraft:oak_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.OAK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/oak_stairs.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:chest", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHEST).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/chest_front.png"), 0xc86f5739, false) + }); + allTemplates.put("minecraft:redstone_wire", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_WIRE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/redstone_wire.png"), 0x80fa1010, false) + }); + allTemplates.put("minecraft:diamond_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DIAMOND_ORE).build(), new TexPathBlockIcon("blocks/diamond_ore.png"), 0xff818c8f, false) + }); + allTemplates.put("minecraft:diamond_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DIAMOND_BLOCK).build(), new TexPathBlockIcon("blocks/diamond_block.png"), 0xff61dbd5, false) + }); + allTemplates.put("minecraft:crafting_table", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CRAFTING_TABLE).build(), new TexPathBlockIcon("blocks/crafting_table.png"), 0xff6b472a, false) + }); + allTemplates.put("minecraft:wheat", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WHEAT).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/wheat.png"), 0x0500b312, false) + }); + allTemplates.put("minecraft:farmland", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FARMLAND).setProperty("moisturized_amount", 0).build(), new TexPathBlockIcon("blocks/farmland.png"), 0xff734b2d, false) + }); + allTemplates.put("minecraft:furnace", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FURNACE).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/furnace.png"), 0xff606060, false) + }); + allTemplates.put("minecraft:lit_furnace", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LIT_FURNACE).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/lit_furnace.png"), 0xff606060, false) + }); + allTemplates.put("minecraft:standing_sign", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STANDING_SIGN).setProperty("ground_sign_direction", 0).build(), new TexPathBlockIcon("blocks/standing_sign.png"), 0x566f5739, false) + }); + allTemplates.put("minecraft:wooden_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WOODEN_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_door.png"), 0xcf866733, false) + }); + allTemplates.put("minecraft:ladder", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LADDER).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/ladder.png"), 0x8f795f34, false) + }); + allTemplates.put("minecraft:rail", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RAIL).setProperty("rail_direction", 0).build(), new TexPathBlockIcon("blocks/rail.png"), 0x8f796c58, false) + }); + allTemplates.put("minecraft:stone_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_stairs.png"), 0xff7a7a7a, false) + }); + allTemplates.put("minecraft:wall_sign", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WALL_SIGN).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/wall_sign.png"), 0x206f5739, false) + }); + allTemplates.put("minecraft:lever", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LEVER).setProperty("lever_direction", "down_east_west").setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/lever.png"), 0x136a5940, false) + }); + allTemplates.put("minecraft:stone_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONE_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/stone_pressure_plate.png"), 0xff7d7d7d, false) + }); + allTemplates.put("minecraft:iron_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/iron_door.png"), 0xcfbababa, false) + }); + allTemplates.put("minecraft:wooden_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WOODEN_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/wooden_pressure_plate.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:redstone_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_ORE).build(), new TexPathBlockIcon("blocks/redstone_ore.png"), 0xff846b6b, false) + }); + allTemplates.put("minecraft:lit_redstone_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LIT_REDSTONE_ORE).build(), new TexPathBlockIcon("blocks/lit_redstone_ore.png"), 0xff846b6b, false) + }); + allTemplates.put("minecraft:unlit_redstone_torch", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:redstone_torch", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/redstone_torch.png"), 0x46a74b29, false) + }); + allTemplates.put("minecraft:stone_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_button.png"), 0x28565656, false) + }); + allTemplates.put("minecraft:snow_layer", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SNOW_LAYER).setProperty("covered_bit", (byte) 0).setProperty("height", 0).build(), new TexPathBlockIcon("blocks/snow_layer.png"), 0xffeffbfb, false) + }); + allTemplates.put("minecraft:ice", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ICE).build(), new TexPathBlockIcon("blocks/ice.png"), 0x9f7dadff, false) + }); + allTemplates.put("minecraft:snow", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SNOW).build(), new TexPathBlockIcon("blocks/snow.png"), 0xffeffbfb, false) + }); + allTemplates.put("minecraft:cactus", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CACTUS).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/cactus.png"), 0xc30d6318, false) + }); + allTemplates.put("minecraft:clay", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CLAY).build(), new TexPathBlockIcon("blocks/clay.png"), 0xff9ea4b0, false) + }); + allTemplates.put("minecraft:reeds", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REEDS).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/reeds.png"), 0x8c94c065, false) + }); + allTemplates.put("minecraft:jukebox", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUKEBOX).build(), new TexPathBlockIcon("blocks/fence_birch_fence.png"), 0x8f463822, false) + }); + allTemplates.put("minecraft:fence", new BlockTemplate[]{ + new BlockTemplate("fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "oak").build(), new TexPathBlockIcon("blocks/fence_fence.png"), 0x8f463822, false), + new BlockTemplate("spruce_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "spruce").build(), new TexPathBlockIcon("blocks/fence_spruce_fence.png"), 0x8f5a3d0d, false), + new BlockTemplate("birch_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "birch").build(), new TexPathBlockIcon("blocks/fence_birch_fence.png"), 0x8fdabd8d, false), + new BlockTemplate("jungle_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "jungle").build(), new TexPathBlockIcon("blocks/fence_jungle_fence.png"), 0x8fBa7d5d, false), + new BlockTemplate("acacia_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "acacia").build(), new TexPathBlockIcon("blocks/fence_acacia_fence.png"), 0x8f934f39, false), + new BlockTemplate("dark_oak_fence", new Block.Builder(BlockType.FENCE).setProperty("wood_type", "dark_oak").build(), new TexPathBlockIcon("blocks/fence_dark_oak_fence.png"), 0x8f2d2213, false) + }); + allTemplates.put("minecraft:pumpkin", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PUMPKIN).setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/pumpkin.png"), 0xffc07615, false) + }); + allTemplates.put("minecraft:netherrack", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHERRACK).build(), new TexPathBlockIcon("blocks/netherrack.png"), 0xff6f3634, false) + }); + allTemplates.put("minecraft:soul_sand", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SOUL_SAND).build(), new TexPathBlockIcon("blocks/soul_sand.png"), 0xff544033, false) + }); + allTemplates.put("minecraft:glowstone", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GLOWSTONE).build(), new TexPathBlockIcon("blocks/glowstone.png"), 0xff8f7645, false) + }); + allTemplates.put("minecraft:portal", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PORTAL).setProperty("portal_axis", "unknown").build(), new TexPathBlockIcon("blocks/portal.png"), 0xc8410491, false) + }); + allTemplates.put("minecraft:lit_pumpkin", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LIT_PUMPKIN).setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/lit_pumpkin.png"), 0xffc07615, false) + }); + allTemplates.put("minecraft:cake", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CAKE).setProperty("bite_counter", 0).build(), new TexPathBlockIcon("blocks/cake.png"), 0xc3e4cdce, false) + }); + allTemplates.put("minecraft:unpowered_repeater", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.UNPOWERED_REPEATER).setProperty("direction", 0).setProperty("repeater_delay", 0).build(), new TexPathBlockIcon("blocks/unpowered_repeater.png"), 0xff979393, false) + }); + allTemplates.put("minecraft:powered_repeater", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:invisibleBedrock", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.INVISIBLEBEDROCK).build(), new TexPathBlockIcon("blocks/invisibleBedrock.png"), 0x3c282828, false) + }); + allTemplates.put("minecraft:trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/trapdoor.png"), 0xdb7e5d2d, false) + }); + allTemplates.put("minecraft:monster_egg", new BlockTemplate[]{ + new BlockTemplate("stone", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "stone").build(), new TexPathBlockIcon("blocks/monster_egg_stone.png"), 0xff7d7d7d, false), + new BlockTemplate("cobble", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "cobblestone").build(), new TexPathBlockIcon("blocks/monster_egg_cobble.png"), 0xff7a7a7a, false), + new BlockTemplate("brick", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "stone_brick").build(), new TexPathBlockIcon("blocks/monster_egg_brick.png"), 0xff7a7a7a, false), + new BlockTemplate("mossybrick", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "mossy_stone_brick").build(), new TexPathBlockIcon("blocks/monster_egg_mossybrick.png"), 0xff7b6651, false), + new BlockTemplate("crackedbrick", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "cracked_stone_brick").build(), new TexPathBlockIcon("blocks/monster_egg_crackedbrick.png"), 0xff7b6651, false), + new BlockTemplate("chiseledbrick", new Block.Builder(BlockType.MONSTER_EGG).setProperty("monster_egg_stone_type", "chiseled_stone_brick").build(), new TexPathBlockIcon("blocks/monster_egg_chiseledbrick.png"), 0xff7b6651, false) + }); + allTemplates.put("minecraft:stonebrick", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "default").build(), new TexPathBlockIcon("blocks/stonebrick_default.png"), 0xff7a7a7a, false), + new BlockTemplate("mossy", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "mossy").build(), new TexPathBlockIcon("blocks/stonebrick_mossy.png"), 0xff72776a, false), + new BlockTemplate("cracked", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "cracked").build(), new TexPathBlockIcon("blocks/stonebrick_cracked.png"), 0xff767676, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "chiseled").build(), new TexPathBlockIcon("blocks/stonebrick_chiseled.png"), 0xff767676, false), + new BlockTemplate("smooth", new Block.Builder(BlockType.STONEBRICK).setProperty("stone_brick_type", "smooth").build(), new TexPathBlockIcon("blocks/stonebrick_smooth.png"), 0xff767676, false) + }); + allTemplates.put("minecraft:brown_mushroom_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BROWN_MUSHROOM_BLOCK).setProperty("huge_mushroom_bits", 0).build(), new TexPathBlockIcon("blocks/brown_mushroom_block.png"), 0xff8d6a53, false) + }); + allTemplates.put("minecraft:red_mushroom_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RED_MUSHROOM_BLOCK).setProperty("huge_mushroom_bits", 0).build(), new TexPathBlockIcon("blocks/red_mushroom_block.png"), 0xffb62524, false) + }); + allTemplates.put("minecraft:iron_bars", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_BARS).build(), new TexPathBlockIcon("blocks/iron_bars.png"), 0x736d6c6a, false) + }); + allTemplates.put("minecraft:glass_pane", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GLASS_PANE).build(), new TexPathBlockIcon("blocks/glass_pane.png"), 0x1fd3eff4, false) + }); + allTemplates.put("minecraft:melon_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MELON_BLOCK).build(), new TexPathBlockIcon("blocks/melon_block.png"), 0xff979924, false) + }); + allTemplates.put("minecraft:pumpkin_stem", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PUMPKIN_STEM).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/pumpkin_stem.png"), 0x1e87b759, false) + }); + allTemplates.put("minecraft:melon_stem", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MELON_STEM).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/melon_stem.png"), 0x1e87b759, false) + }); + allTemplates.put("minecraft:vine", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.VINE).setProperty("vine_direction_bits", 0).build(), new TexPathBlockIcon("blocks/vine.png"), 0x8a6f6f6f, false) + }); + allTemplates.put("minecraft:fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/fence_gate.png"), 0x7b463822, false) + }); + allTemplates.put("minecraft:brick_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BRICK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/brick_stairs.png"), 0xff926356, false) + }); + allTemplates.put("minecraft:stone_brick_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONE_BRICK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_brick_stairs.png"), 0xff7a7a7a, false) + }); + allTemplates.put("minecraft:mycelium", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MYCELIUM).build(), new TexPathBlockIcon("blocks/mycelium.png"), 0xff6f6369, false) + }); + allTemplates.put("minecraft:waterlily", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WATERLILY).build(), new TexPathBlockIcon("blocks/waterlily.png"), 0x93335a21, false) + }); + allTemplates.put("minecraft:nether_brick", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHER_BRICK).build(), new TexPathBlockIcon("blocks/nether_brick.png"), 0xff2c161a, false) + }); + allTemplates.put("minecraft:nether_brick_fence", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHER_BRICK_FENCE).build(), new TexPathBlockIcon("blocks/nether_brick_fence.png"), 0xff2c161a, false) + }); + allTemplates.put("minecraft:nether_brick_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHER_BRICK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/nether_brick_stairs.png"), 0xff2c161a, false) + }); + allTemplates.put("minecraft:nether_wart", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.NETHER_WART).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/nether_wart.png"), 0x2a6a0e1e, false) + }); + allTemplates.put("minecraft:enchanting_table", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ENCHANTING_TABLE).build(), new TexPathBlockIcon("blocks/enchanting_table.png"), 0xff67403b, false) + }); + allTemplates.put("minecraft:brewing_stand", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BREWING_STAND).setProperty("brewing_stand_slot_a_bit", (byte) 0).setProperty("brewing_stand_slot_b_bit", (byte) 0).setProperty("brewing_stand_slot_c_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/brewing_stand.png"), 0x767c6751, false) + }); + allTemplates.put("minecraft:cauldron", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CAULDRON).setProperty("cauldron_liquid", "water").setProperty("fill_level", 0).build(), new TexPathBlockIcon("blocks/cauldron.png"), 0xff373737, false) + }); + allTemplates.put("minecraft:end_portal", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_PORTAL).build(), new TexPathBlockIcon("blocks/endframe_top.png"), 0xff101010, false) + }); + allTemplates.put("minecraft:end_portal_frame", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_PORTAL_FRAME).setProperty("direction", 0).setProperty("end_portal_eye_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/endframe_side.png"), 0xff597560, false) + }); + allTemplates.put("minecraft:end_stone", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_STONE).build(), new TexPathBlockIcon("blocks/end_stone.png"), 0xffdddfa5, false) + }); + allTemplates.put("minecraft:dragon_egg", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DRAGON_EGG).build(), new TexPathBlockIcon("blocks/dragon_egg.png"), 0xff0c090f, false) + }); + allTemplates.put("minecraft:redstone_lamp", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_LAMP).build(), new TexPathBlockIcon("blocks/redstone_lamp.png"), 0xff462b1a, false) + }); + allTemplates.put("minecraft:lit_redstone_lamp", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:dropper", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DROPPER).setProperty("facing_direction", 0).setProperty("triggered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dropper.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:activator_rail", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACTIVATOR_RAIL).setProperty("rail_direction", 0).setProperty("rail_data_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/activator_rail.png"), 0xff9c7f4e, false) + }); + allTemplates.put("minecraft:cocoa", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:sandstone_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SANDSTONE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/sandstone_stairs.png"), 0xffdad29e, false) + }); + allTemplates.put("minecraft:emerald_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.EMERALD_ORE).build(), new TexPathBlockIcon("blocks/emerald_ore.png"), 0xff6d8074, false) + }); + allTemplates.put("minecraft:ender_chest", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ENDER_CHEST).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/ender_chest_front.png"), 0xc82c3e40, false) + }); + allTemplates.put("minecraft:tripwire_hook", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TRIPWIRE_HOOK).setProperty("direction", 0).setProperty("attached_bit", (byte) 0).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/tripwire_hook.png"), 0x2d8a8171, false) + }); + allTemplates.put("minecraft:tripWire", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TRIPWIRE).setProperty("attached_bit", (byte) 0).setProperty("disarmed_bit", (byte) 0).setProperty("powered_bit", (byte) 0).setProperty("suspended_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/tripWire.png"), 0x2d818181, false) + }); + allTemplates.put("minecraft:emerald_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.EMERALD_BLOCK).build(), new TexPathBlockIcon("blocks/emerald_block.png"), 0xff51d975, false) + }); + allTemplates.put("minecraft:spruce_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/spruce_stairs.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:birch_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/birch_stairs.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:jungle_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/jungle_stairs.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:beacon", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BEACON).build(), new TexPathBlockIcon("blocks/beacon.png"), 0xff74ddd7, false) + }); + allTemplates.put("minecraft:cobblestone_wall", new BlockTemplate[]{ + new BlockTemplate("normal", new Block.Builder(BlockType.COBBLESTONE_WALL).setProperty("wall_block_type", "cobblestone").build(), new TexPathBlockIcon("blocks/cobblestone_wall_normal.png"), 0xff7a7a7a, false), + new BlockTemplate("mossy", new Block.Builder(BlockType.COBBLESTONE_WALL).setProperty("wall_block_type", "mossy_cobblestone").build(), new TexPathBlockIcon("blocks/cobblestone_wall_mossy.png"), 0xff506a50, false) + }); + allTemplates.put("minecraft:flower_pot", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FLOWER_POT).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/flower_pot.png"), 0x31764133, false) + }); + allTemplates.put("minecraft:carrots", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CARROTS).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/carrots.png"), 0x0901ab10, false) + }); + allTemplates.put("minecraft:potatoes", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.POTATOES).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/potatoes.png"), 0x0901ab10, false) + }); + allTemplates.put("minecraft:wooden_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.WOODEN_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_button.png"), 0x2878613e, false) + }); + allTemplates.put("minecraft:skull", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SKULL).setProperty("facing_direction", 0).setProperty("no_drop_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/skull.png"), 0x8c8c8c8c, false) + }); + allTemplates.put("minecraft:anvil", new BlockTemplate[]{ + new BlockTemplate("intact", new Block.Builder(BlockType.ANVIL).setProperty("direction", 0).setProperty("damage", "undamaged").build(), new TexPathBlockIcon("blocks/anvil_intact.png"), 0x9f403c3c, false), + new BlockTemplate("slightly_damaged", new Block.Builder(BlockType.ANVIL).setProperty("direction", 0).setProperty("damage", "slightly_damaged").build(), new TexPathBlockIcon("blocks/anvil_slightly_damaged.png"), 0x9f403c3c, false), + new BlockTemplate("very_damaged", new Block.Builder(BlockType.ANVIL).setProperty("direction", 0).setProperty("damage", "very_damaged").build(), new TexPathBlockIcon("blocks/anvil_very_damaged.png"), 0x9f403c3c, false) + }); + allTemplates.put("minecraft:trapped_chest", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.TRAPPED_CHEST).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/chest_front.png"), 0xfe6f5739, false) + }); + allTemplates.put("minecraft:light_weighted_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.LIGHT_WEIGHTED_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/light_weighted_pressure_plate.png"), 0xc8f9ec4e, false) + }); + allTemplates.put("minecraft:heavy_weighted_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HEAVY_WEIGHTED_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/heavy_weighted_pressure_plate.png"), 0xc8dbdbdb, false) + }); + allTemplates.put("minecraft:unpowered_comparator", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.UNPOWERED_COMPARATOR).setProperty("direction", 0).setProperty("output_lit_bit", (byte) 0).setProperty("output_subtract_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/unpowered_comparator.png"), 0xff9c9695, false) + }); + allTemplates.put("minecraft:powered_comparator", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.POWERED_COMPARATOR).setProperty("direction", 0).setProperty("output_lit_bit", (byte) 0).setProperty("output_subtract_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/powered_comparator.png"), 0xffa59594, false) + }); + allTemplates.put("minecraft:daylight_detector", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DAYLIGHT_DETECTOR).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/daylight_detector.png"), 0xff82745e, false) + }); + allTemplates.put("minecraft:redstone_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REDSTONE_BLOCK).build(), new TexPathBlockIcon("blocks/redstone_block.png"), 0xffab1b09, false) + }); + allTemplates.put("minecraft:quartz_ore", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.QUARTZ_ORE).build(), new TexPathBlockIcon("blocks/quartz_ore.png"), 0xffd9d1c8, false) + }); + allTemplates.put("minecraft:hopper", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HOPPER).setProperty("facing_direction", 0).setProperty("toggle_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/hopper.png"), 0xff3e3e3e, false) + }); + allTemplates.put("minecraft:quartz_block", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.QUARTZ_BLOCK).setProperty("chisel_type", "default").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffece9e2, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.QUARTZ_BLOCK).setProperty("chisel_type", "chiseled").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_chiseled.png"), 0xffe7e4db, false), + new BlockTemplate("lines", new Block.Builder(BlockType.QUARTZ_BLOCK).setProperty("chisel_type", "lines").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_lines.png"), 0xffe8e5dd, false), + new BlockTemplate("default", new Block.Builder(BlockType.QUARTZ_BLOCK).setProperty("chisel_type", "smooth").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffe7e3db, false) + }); + allTemplates.put("minecraft:quartz_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.QUARTZ_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/quartz_stairs.png"), 0xffece9e2, false) + }); + allTemplates.put("minecraft:double_wooden_slab", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "oak").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_oak.png"), 0xb4907449, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "spruce").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_spruce.png"), 0xff5a3d0d, false), + new BlockTemplate("birch", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "birch").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_birch.png"), 0xb4dabd8d, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "jungle").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_jungle.png"), 0xb4Ba7d5d, false), + new BlockTemplate("acacia", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "acacia").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_acacia.png"), 0xb4934f39, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.DOUBLE_WOODEN_SLAB).setProperty("wood_type", "dark_oak").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/planks_big_oak.png"), 0xb4907449, false) + }); + allTemplates.put("minecraft:wooden_slab", new BlockTemplate[]{ + new BlockTemplate("oak", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "oak").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_oak.png"), 0xff907449, false), + new BlockTemplate("spruce", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "spruce").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_spruce.png"), 0xff5a3d0d, false), + new BlockTemplate("birch", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "birch").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_birch.png"), 0xffdabd8d, false), + new BlockTemplate("jungle", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "jungle").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_jungle.png"), 0xffBa7d5d, false), + new BlockTemplate("acacia", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "acacia").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_acacia.png"), 0xff934f39, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.WOODEN_SLAB).setProperty("wood_type", "dark_oak").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/wooden_slab_big_oak.png"), 0xff907449, false) + }); + allTemplates.put("minecraft:stained_hardened_clay", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_white.png"), 0xff836f64, false), + new BlockTemplate("orange", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_orange.png"), 0xff9d5021, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_magenta.png"), 0xff915369, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_light_blue.png"), 0xff706b87, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_yellow.png"), 0xffb5801f, false), + new BlockTemplate("lime", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_lime.png"), 0xff617030, false), + new BlockTemplate("pink", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_pink.png"), 0xff9c4848, false), + new BlockTemplate("gray", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_gray.png"), 0xff392721, false), + new BlockTemplate("silver", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_silver.png"), 0xff81655b, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_cyan.png"), 0xff565959, false), + new BlockTemplate("purple", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_purple.png"), 0xff744555, false), + new BlockTemplate("blue", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_blue.png"), 0xff463857, false), + new BlockTemplate("brown", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_brown.png"), 0xff492e1f, false), + new BlockTemplate("green", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_green.png"), 0xff484f26, false), + new BlockTemplate("red", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_red.png"), 0xffff382b, false), + new BlockTemplate("black", new Block.Builder(BlockType.STAINED_HARDENED_CLAY).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/hardened_clay_stained_black.png"), 0xff21120d, false) + }); + allTemplates.put("minecraft:stained_glass_pane", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/glass.png"), 0x32141414, false), + new BlockTemplate("orange", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/glass.png"), 0x209d5021, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20915369, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20706b87, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20b5801f, false), + new BlockTemplate("lime", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20617030, false), + new BlockTemplate("pink", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/glass.png"), 0x209c4848, false), + new BlockTemplate("gray", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20392721, false), + new BlockTemplate("silver", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/glass.png"), 0x2081655b, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20565959, false), + new BlockTemplate("purple", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20744555, false), + new BlockTemplate("blue", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20463857, false), + new BlockTemplate("brown", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20492e1f, false), + new BlockTemplate("green", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20484f26, false), + new BlockTemplate("red", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/glass.png"), 0x20ff382b, false), + new BlockTemplate("black", new Block.Builder(BlockType.STAINED_GLASS_PANE).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/glass.png"), 0x2021120d, false) + }); + allTemplates.put("minecraft:leaves2", new BlockTemplate[]{ + new BlockTemplate("acacia", new Block.Builder(BlockType.LEAVES2).setProperty("new_leaf_type", "acacia").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves2_acacia.png"), 0xff2e780c, true), + new BlockTemplate("big_oak", new Block.Builder(BlockType.LEAVES2).setProperty("new_leaf_type", "dark_oak").setProperty("persistent_bit", (byte) 0).setProperty("update_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/leaves2_big_oak.png"), 0xff878787, true) + }); + allTemplates.put("minecraft:log2", new BlockTemplate[]{ + new BlockTemplate("acacia", new Block.Builder(BlockType.LOG2).setProperty("new_log_type", "acacia").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log2_acacia.png"), 0xff934f39, false), + new BlockTemplate("big_oak", new Block.Builder(BlockType.LOG2).setProperty("new_log_type", "dark_oak").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/log2_big_oak.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:acacia_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/acacia_stairs.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:dark_oak_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dark_oak_stairs.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:slime", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SLIME).build(), new TexPathBlockIcon("blocks/slime.png"), 0xc880b672, false) + }); + allTemplates.put("minecraft:iron_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.IRON_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/iron_trapdoor.png"), 0xb4cccccc, false) + }); + allTemplates.put("minecraft:prismarine", new BlockTemplate[]{ + new BlockTemplate("rough", new Block.Builder(BlockType.PRISMARINE).setProperty("prismarine_block_type", "default").build(), new TexPathBlockIcon("blocks/prismarine_rough.png"), 0xff79Ad7e, false), + new BlockTemplate("dark", new Block.Builder(BlockType.PRISMARINE).setProperty("prismarine_block_type", "dark").build(), new TexPathBlockIcon("blocks/prismarine_dark.png"), 0xFF34634e, false), + new BlockTemplate("bricks", new Block.Builder(BlockType.PRISMARINE).setProperty("prismarine_block_type", "bricks").build(), new TexPathBlockIcon("blocks/prismarine_bricks.png"), 0xff59Ad7e, false) + }); + allTemplates.put("minecraft:seaLantern", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SEALANTERN).build(), new TexPathBlockIcon("blocks/seaLantern.png"), 0xffe0eae4, false) + }); + allTemplates.put("minecraft:hay_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HAY_BLOCK).setProperty("deprecated", 0).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/hay_block.png"), 0xffa3870e, false) + }); + allTemplates.put("minecraft:carpet", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.CARPET).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/carpet_white.png"), 0xffdddddd, false), + new BlockTemplate("orange", new Block.Builder(BlockType.CARPET).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/carpet_orange.png"), 0xffdb7d3e, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.CARPET).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/carpet_magenta.png"), 0xffb350bc, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.CARPET).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/carpet_light_blue.png"), 0xff6a8ac9, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.CARPET).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/carpet_yellow.png"), 0xffb1a627, false), + new BlockTemplate("lime", new Block.Builder(BlockType.CARPET).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/carpet_lime.png"), 0xff41ae38, false), + new BlockTemplate("pink", new Block.Builder(BlockType.CARPET).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/carpet_pink.png"), 0xffd08499, false), + new BlockTemplate("gray", new Block.Builder(BlockType.CARPET).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/carpet_gray.png"), 0xff404040, false), + new BlockTemplate("silver", new Block.Builder(BlockType.CARPET).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/carpet_silver.png"), 0xff9aa1a1, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CARPET).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/carpet_cyan.png"), 0xff2e6e89, false), + new BlockTemplate("purple", new Block.Builder(BlockType.CARPET).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/carpet_purple.png"), 0xff7e3db5, false), + new BlockTemplate("blue", new Block.Builder(BlockType.CARPET).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/carpet_blue.png"), 0xff2e388d, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CARPET).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/carpet_brown.png"), 0xff4f321f, false), + new BlockTemplate("green", new Block.Builder(BlockType.CARPET).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/carpet_green.png"), 0xff35461b, false), + new BlockTemplate("red", new Block.Builder(BlockType.CARPET).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/carpet_red.png"), 0xff963430, false), + new BlockTemplate("black", new Block.Builder(BlockType.CARPET).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/carpet_black.png"), 0xff191616, false) + }); + allTemplates.put("minecraft:hardened_clay", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HARDENED_CLAY).build(), new TexPathBlockIcon("blocks/hardened_clay.png"), 0xff5d3828, false) + }); + allTemplates.put("minecraft:coal_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.COAL_BLOCK).build(), new TexPathBlockIcon("blocks/coal_block.png"), 0xff111111, false) + }); + allTemplates.put("minecraft:packed_ice", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PACKED_ICE).build(), new TexPathBlockIcon("blocks/packed_ice.png"), 0xff97b3e4, false) + }); + allTemplates.put("minecraft:double_plant", new BlockTemplate[]{ + new BlockTemplate("sunflower", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "sunflower").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_sunflower.png"), 0xb4d28219, false), + new BlockTemplate("syringa", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "syringa").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_syringa.png"), 0xb4dec0e2, false), + new BlockTemplate("grass", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "grass").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_grass.png"), 0xb4334e2c, false), + new BlockTemplate("fern", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "fern").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_fern.png"), 0xb43d5d34, false), + new BlockTemplate("rose", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "rose").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_rose.png"), 0xb4d10609, false), + new BlockTemplate("paeonia", new Block.Builder(BlockType.DOUBLE_PLANT).setProperty("double_plant_type", "paeonia").setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_plant_paeonia.png"), 0xb4d6c1df, false) + }); + allTemplates.put("minecraft:banner", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:daylight_detector_inverted", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DAYLIGHT_DETECTOR_INVERTED).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/daylight_detector_inverted.png"), 0xffd8c9b5, false) + }); + allTemplates.put("minecraft:red_sandstone", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.RED_SANDSTONE).setProperty("sand_stone_type", "default").build(), new TexPathBlockIcon("blocks/red_sandstone_default.png"), 0xffaa561e, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.RED_SANDSTONE).setProperty("sand_stone_type", "heiroglyphs").build(), new TexPathBlockIcon("blocks/red_sandstone_chiseled.png"), 0xffa8551e, false), + new BlockTemplate("smooth", new Block.Builder(BlockType.RED_SANDSTONE).setProperty("sand_stone_type", "cut").build(), new TexPathBlockIcon("blocks/red_sandstone_smooth.png"), 0xffcc5e16, false) + }); + allTemplates.put("minecraft:red_sandstone_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RED_SANDSTONE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/red_sandstone_stairs.png"), 0xffaa561e, false) + }); + allTemplates.put("minecraft:double_stone_slab2", new BlockTemplate[]{ + new BlockTemplate("red_sandstone", new Block.Builder(BlockType.DOUBLE_STONE_SLAB2).setProperty("stone_slab_type_2", "red_sandstone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab2_red_sandstone.png"), 0xffaa561e, false), + new BlockTemplate("purpur", new Block.Builder(BlockType.DOUBLE_STONE_SLAB2).setProperty("stone_slab_type_2", "purpur").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/double_stone_slab2_purpur.png"), 0xffa072a0, false) + }); + allTemplates.put("minecraft:stone_slab2", new BlockTemplate[]{ + new BlockTemplate("red_sandstone", new Block.Builder(BlockType.STONE_SLAB2).setProperty("stone_slab_type_2", "red_sandstone").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab2_red_sandstone.png"), 0xffaa561e, false), + new BlockTemplate("purpur", new Block.Builder(BlockType.STONE_SLAB2).setProperty("stone_slab_type_2", "purpur").setProperty("top_slot_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/stone_slab2_purpur.png"), 0xffa072a0, false) + }); + allTemplates.put("minecraft:spruce_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/spruce_fence_gate.png"), 0x8f5a3d0d, false) + }); + allTemplates.put("minecraft:birch_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/birch_fence_gate.png"), 0x8fdabd8d, false) + }); + allTemplates.put("minecraft:jungle_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/jungle_fence_gate.png"), 0x8fBa7d5d, false) + }); + allTemplates.put("minecraft:dark_oak_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dark_oak_fence_gate.png"), 0x8f2d2213, false) + }); + allTemplates.put("minecraft:acacia_fence_gate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_FENCE_GATE).setProperty("direction", 0).setProperty("in_wall_bit", (byte) 0).setProperty("open_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/acacia_fence_gate.png"), 0x8f934f39, false) + }); + allTemplates.put("minecraft:repeating_command_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 1).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 2).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 3).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 4).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 5).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 1).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 2).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 3).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 4).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 5).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.REPEATING_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:chain_command_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 1).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 2).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 3).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 4).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 5).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 1).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 2).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 3).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 4).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 5).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.CHAIN_COMMAND_BLOCK).setProperty("facing_direction", 0).setProperty("conditional_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/command_block.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:hard_glass_pane", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HARD_GLASS_PANE).build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:hard_stained_glass_pane", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false), + new BlockTemplate(null, new Block.Builder(BlockType.HARD_STAINED_GLASS_PANE).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/glass_pane_top.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:chemical_heat", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHEMICAL_HEAT).build(), new TexPathBlockIcon("blocks/fire_0.png"), 0x00000000, false) + }); + allTemplates.put("minecraft:spruce_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/spruce_door.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:birch_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/birch_door.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:jungle_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/jungle_door.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:acacia_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/acacia_door.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:dark_oak_door", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_DOOR).setProperty("direction", 0).setProperty("door_hinge_bit", (byte) 0).setProperty("open_bit", (byte) 0).setProperty("upper_block_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/dark_oak_door.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:grass_path", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GRASS_PATH).build(), new TexPathBlockIcon("blocks/grass_path.png"), 0x46a0a0a0, false) + }); + allTemplates.put("minecraft:frame", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.FRAME).setProperty("facing_direction", 5).setProperty("item_frame_map_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/frame.png"), 0xa04f3e4f, false) + }); + allTemplates.put("minecraft:chorus_flower", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHORUS_FLOWER).setProperty("age", 0).build(), new TexPathBlockIcon("blocks/chorus_flower.png"), 0xa0c3b6c8, false) + }); + allTemplates.put("minecraft:purpur_block", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.PURPUR_BLOCK).setProperty("chisel_type", "default").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/purpur_block_default.png"), 0xc095c0ff, false), + new BlockTemplate("chiseled", new Block.Builder(BlockType.PURPUR_BLOCK).setProperty("chisel_type", "chiseled").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/purpur_block_chiseled.png"), 0xc095c0ff, false), + new BlockTemplate("lines", new Block.Builder(BlockType.PURPUR_BLOCK).setProperty("chisel_type", "lines").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/purpur_block_lines.png"), 0xc095c0ff, false), + new BlockTemplate("default", new Block.Builder(BlockType.PURPUR_BLOCK).setProperty("chisel_type", "smooth").setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/purpur_block_default.png"), 0xc095c0ff, false) + }); + allTemplates.put("minecraft:purpur_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PURPUR_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/purpur_stairs.png"), 0xc095c0ff, false) + }); + allTemplates.put("minecraft:shulker_box", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("white", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false), + new BlockTemplate("silver", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa6a6a6, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d5656, false), + new BlockTemplate("purple", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff560d56, false), + new BlockTemplate("blue", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d0e56, false), + new BlockTemplate("brown", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff804530, false), + new BlockTemplate("green", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d560e, false), + new BlockTemplate("red", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff2020, false), + new BlockTemplate("black", new Block.Builder(BlockType.SHULKER_BOX).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff000000, false) + }); + allTemplates.put("minecraft:end_bricks", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_BRICKS).build(), new TexPathBlockIcon("blocks/end_bricks.png"), 0xffe7f2af, false) + }); + allTemplates.put("minecraft:end_rod", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_ROD).setProperty("facing_direction", 0).build(), new TexPathBlockIcon("blocks/end_rod.png"), 0xff6e6e6e, true) + }); + allTemplates.put("minecraft:end_gateway", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.END_GATEWAY).build(), new TexPathBlockIcon("blocks/end_gateway.png"), 0xff171c27, false) + }); + allTemplates.put("minecraft:210", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:211", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:212", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:magma", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.MAGMA).build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffc45a12, false) + }); + allTemplates.put("minecraft:nether_wart_block", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.NETHER_WART_BLOCK).build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffbf2030, false) + }); + allTemplates.put("minecraft:red_nether_brick", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.RED_NETHER_BRICK).build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xff7f1020, false) + }); + allTemplates.put("minecraft:bone_block", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.BONE_BLOCK).setProperty("deprecated", 0).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/quartz_block_default.png"), 0xffefe5d2, false) + }); + allTemplates.put("minecraft:purple_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("purple", new Block.Builder(BlockType.PURPLE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff762d76, false), + new BlockTemplate("purple", new Block.Builder(BlockType.PURPLE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff762d76, false), + new BlockTemplate("purple", new Block.Builder(BlockType.PURPLE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff762d76, false), + new BlockTemplate("purple", new Block.Builder(BlockType.PURPLE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff762d76, false) + }); + allTemplates.put("minecraft:white_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.WHITE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("white", new Block.Builder(BlockType.WHITE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("white", new Block.Builder(BlockType.WHITE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("white", new Block.Builder(BlockType.WHITE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false) + }); + allTemplates.put("minecraft:orange_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("orange", new Block.Builder(BlockType.ORANGE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8030, false), + new BlockTemplate("orange", new Block.Builder(BlockType.ORANGE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8030, false), + new BlockTemplate("orange", new Block.Builder(BlockType.ORANGE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8030, false), + new BlockTemplate("orange", new Block.Builder(BlockType.ORANGE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8030, false) + }); + allTemplates.put("minecraft:magenta_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("magenta", new Block.Builder(BlockType.MAGENTA_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff108f, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.MAGENTA_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff108f, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.MAGENTA_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff108f, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.MAGENTA_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff108f, false) + }); + allTemplates.put("minecraft:light_blue_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("light_blue", new Block.Builder(BlockType.LIGHT_BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff75a8ff, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.LIGHT_BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff75a8ff, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.LIGHT_BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff75a8ff, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.LIGHT_BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff75a8ff, false) + }); + allTemplates.put("minecraft:yellow_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("yellow", new Block.Builder(BlockType.YELLOW_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff60, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.YELLOW_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff60, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.YELLOW_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff60, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.YELLOW_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff60, false) + }); + allTemplates.put("minecraft:lime_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("lime", new Block.Builder(BlockType.LIME_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2dd62e, false), + new BlockTemplate("lime", new Block.Builder(BlockType.LIME_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2dd62e, false), + new BlockTemplate("lime", new Block.Builder(BlockType.LIME_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2dd62e, false), + new BlockTemplate("lime", new Block.Builder(BlockType.LIME_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2dd62e, false) + }); + allTemplates.put("minecraft:pink_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("pink", new Block.Builder(BlockType.PINK_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8096, false), + new BlockTemplate("pink", new Block.Builder(BlockType.PINK_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8096, false), + new BlockTemplate("pink", new Block.Builder(BlockType.PINK_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8096, false), + new BlockTemplate("pink", new Block.Builder(BlockType.PINK_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff8096, false) + }); + allTemplates.put("minecraft:gray_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("gray", new Block.Builder(BlockType.GRAY_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff767676, false), + new BlockTemplate("gray", new Block.Builder(BlockType.GRAY_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff767676, false), + new BlockTemplate("gray", new Block.Builder(BlockType.GRAY_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff767676, false), + new BlockTemplate("gray", new Block.Builder(BlockType.GRAY_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff767676, false) + }); + allTemplates.put("minecraft:silver_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("silver", new Block.Builder(BlockType.SILVER_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc6c6c6, false), + new BlockTemplate("silver", new Block.Builder(BlockType.SILVER_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc6c6c6, false), + new BlockTemplate("silver", new Block.Builder(BlockType.SILVER_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc6c6c6, false), + new BlockTemplate("silver", new Block.Builder(BlockType.SILVER_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc6c6c6, false) + }); + allTemplates.put("minecraft:cyan_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("cyan", new Block.Builder(BlockType.CYAN_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d7676, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CYAN_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d7676, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CYAN_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d7676, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CYAN_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d7676, false) + }); + allTemplates.put("minecraft:230", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:blue_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("blue", new Block.Builder(BlockType.BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2e76, false), + new BlockTemplate("blue", new Block.Builder(BlockType.BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2e76, false), + new BlockTemplate("blue", new Block.Builder(BlockType.BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2e76, false), + new BlockTemplate("blue", new Block.Builder(BlockType.BLUE_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2e76, false) + }); + allTemplates.put("minecraft:brown_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("brown", new Block.Builder(BlockType.BROWN_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa06550, false), + new BlockTemplate("brown", new Block.Builder(BlockType.BROWN_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa06550, false), + new BlockTemplate("brown", new Block.Builder(BlockType.BROWN_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa06550, false), + new BlockTemplate("brown", new Block.Builder(BlockType.BROWN_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa06550, false) + }); + allTemplates.put("minecraft:green_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("green", new Block.Builder(BlockType.GREEN_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d762e, false), + new BlockTemplate("green", new Block.Builder(BlockType.GREEN_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d762e, false), + new BlockTemplate("green", new Block.Builder(BlockType.GREEN_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d762e, false), + new BlockTemplate("green", new Block.Builder(BlockType.GREEN_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d762e, false) + }); + allTemplates.put("minecraft:red_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("red", new Block.Builder(BlockType.RED_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff3030, false), + new BlockTemplate("red", new Block.Builder(BlockType.RED_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff3030, false), + new BlockTemplate("red", new Block.Builder(BlockType.RED_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff3030, false), + new BlockTemplate("red", new Block.Builder(BlockType.RED_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff3030, false) + }); + allTemplates.put("minecraft:black_glazed_terracotta", new BlockTemplate[]{ + new BlockTemplate("black", new Block.Builder(BlockType.BLACK_GLAZED_TERRACOTTA).setProperty("facing_direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff050505, false), + new BlockTemplate("black", new Block.Builder(BlockType.BLACK_GLAZED_TERRACOTTA).setProperty("facing_direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff050505, false), + new BlockTemplate("black", new Block.Builder(BlockType.BLACK_GLAZED_TERRACOTTA).setProperty("facing_direction", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff050505, false), + new BlockTemplate("black", new Block.Builder(BlockType.BLACK_GLAZED_TERRACOTTA).setProperty("facing_direction", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff050505, false) + }); + allTemplates.put("minecraft:concrete", new BlockTemplate[]{ + new BlockTemplate("orange", new Block.Builder(BlockType.CONCRETE).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.CONCRETE).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.CONCRETE).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.CONCRETE).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.CONCRETE).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.CONCRETE).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.CONCRETE).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.CONCRETE).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false), + new BlockTemplate("silver", new Block.Builder(BlockType.CONCRETE).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa6a6a6, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CONCRETE).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d5656, false), + new BlockTemplate("purple", new Block.Builder(BlockType.CONCRETE).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff560d56, false), + new BlockTemplate("blue", new Block.Builder(BlockType.CONCRETE).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d0e56, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CONCRETE).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff804530, false), + new BlockTemplate("green", new Block.Builder(BlockType.CONCRETE).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d560e, false), + new BlockTemplate("red", new Block.Builder(BlockType.CONCRETE).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff2020, false), + new BlockTemplate("black", new Block.Builder(BlockType.CONCRETE).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff000000, false) + }); + allTemplates.put("minecraft:concretePowder", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false), + new BlockTemplate("silver", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa6a6a6, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d5656, false), + new BlockTemplate("purple", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff560d56, false), + new BlockTemplate("blue", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d0e56, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff804530, false), + new BlockTemplate("green", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d560e, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff2020, false), + new BlockTemplate("black", new Block.Builder(BlockType.CONCRETEPOWDER).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff000000, false) + }); + allTemplates.put("minecraft:chemistry_table", new BlockTemplate[]{ + new BlockTemplate("orange", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "compound_creator").setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "compound_creator").setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "compound_creator").setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "compound_creator").setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "material_reducer").setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "material_reducer").setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "material_reducer").setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "material_reducer").setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false), + new BlockTemplate("silver", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "element_constructor").setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffa6a6a6, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "element_constructor").setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d5656, false), + new BlockTemplate("purple", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "element_constructor").setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff560d56, false), + new BlockTemplate("blue", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "element_constructor").setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d0e56, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "lab_table").setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff804530, false), + new BlockTemplate("green", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "lab_table").setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0d560e, false), + new BlockTemplate("brown", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "lab_table").setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff2020, false), + new BlockTemplate("black", new Block.Builder(BlockType.CHEMISTRY_TABLE).setProperty("chemistry_table_type", "lab_table").setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff000000, false) + }); + allTemplates.put("minecraft:underwater_torch", new BlockTemplate[]{ + new BlockTemplate("orange", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffffff, false), + new BlockTemplate("orange", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "west").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffd030, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "east").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffef007f, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "north").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5588ff, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "south").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffffff40, false), + new BlockTemplate("lime", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "top").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff0db60e, false), + new BlockTemplate("pink", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffff6076, false), + new BlockTemplate("gray", new Block.Builder(BlockType.UNDERWATER_TORCH).setProperty("torch_facing_direction", "unknown").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff565656, false) + }); + allTemplates.put("minecraft:chorus_plant", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CHORUS_PLANT).build(), new TexPathBlockIcon("blocks/chorus_plant.png"), 0xaa3d6e86, false) + }); + allTemplates.put("minecraft:stained_glass", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/stained_glass_white.png"), 0x50836f64, false), + new BlockTemplate("orange", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/stained_glass_orange.png"), 0x509d5021, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/stained_glass_magenta.png"), 0x50915369, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/stained_glass_light_blue.png"), 0x50706b87, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/stained_glass_yellow.png"), 0x50b5801f, false), + new BlockTemplate("lime", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/stained_glass_lime.png"), 0x50617030, false), + new BlockTemplate("pink", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/stained_glass_pink.png"), 0x509c4848, false), + new BlockTemplate("gray", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/stained_glass_gray.png"), 0x50392721, false), + new BlockTemplate("silver", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/stained_glass_silver.png"), 0x5081655b, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/stained_glass_cyan.png"), 0x50565959, false), + new BlockTemplate("purple", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/stained_glass_purple.png"), 0x50744555, false), + new BlockTemplate("blue", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/stained_glass_blue.png"), 0x50463857, false), + new BlockTemplate("brown", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/stained_glass_brown.png"), 0x50492e1f, false), + new BlockTemplate("green", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/stained_glass_green.png"), 0x50484f26, false), + new BlockTemplate("red", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/stained_glass_red.png"), 0x50ff382b, false), + new BlockTemplate("black", new Block.Builder(BlockType.STAINED_GLASS).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/stained_glass_black.png"), 0x5021120d, false) + }); + allTemplates.put("minecraft:242", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:podzol", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PODZOL).build(), new TexPathBlockIcon("blocks/podzol.png"), 0xff533a1b, true) + }); + allTemplates.put("minecraft:beetroot", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BEETROOT).setProperty("growth", 0).build(), new TexPathBlockIcon("blocks/beetroot.png"), 0x0901ab10, false) + }); + allTemplates.put("minecraft:stonecutter", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STONECUTTER).build(), new TexPathBlockIcon("blocks/stonecutter.png"), 0xff515151, false) + }); + allTemplates.put("minecraft:glowingobsidian", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.GLOWINGOBSIDIAN).build(), new TexPathBlockIcon("blocks/glowingobsidian.png"), 0xff17060a, false) + }); + allTemplates.put("minecraft:netherreactor", new BlockTemplate[]{ + new BlockTemplate("default", new Block.Builder(BlockType.NETHERREACTOR).build(), new TexPathBlockIcon("blocks/netherreactor_default.png"), 0xffd2d200, false), + new BlockTemplate("active", new Block.Builder(BlockType.NETHERREACTOR).build(), new TexPathBlockIcon("blocks/netherreactor_active.png"), 0xff3d6e86, false), + new BlockTemplate("cooled", new Block.Builder(BlockType.NETHERREACTOR).build(), new TexPathBlockIcon("blocks/netherreactor_cooled.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:info_update", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.INFO_UPDATE).build(), new TexPathBlockIcon("blocks/info_update.png"), 0xff2f3218, false) + }); + allTemplates.put("minecraft:info_update2", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.INFO_UPDATE2).build(), new TexPathBlockIcon("blocks/info_update2.png"), 0xff2f3218, false) + }); + allTemplates.put("minecraft:movingBlock", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.MOVINGBLOCK).build(), new TexPathBlockIcon("blocks/movingBlock.png"), 0, false) + }); + allTemplates.put("minecraft:observer", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 1).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 2).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 3).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 4).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 5).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 1).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 2).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 3).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 4).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 5).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.OBSERVER).setProperty("facing_direction", 0).setProperty("powered_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:structure_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "data").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "save").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "load").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "corner").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "invalid").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "export").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "data").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRUCTURE_BLOCK).setProperty("structure_block_type", "data").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:hard_glass", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.HARD_GLASS).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:hard_stained_glass", new BlockTemplate[]{ + new BlockTemplate("white", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "white").build(), new TexPathBlockIcon("blocks/stained_glass_white.png"), 0x50836f64, false), + new BlockTemplate("orange", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "orange").build(), new TexPathBlockIcon("blocks/stained_glass_orange.png"), 0x509d5021, false), + new BlockTemplate("magenta", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "magenta").build(), new TexPathBlockIcon("blocks/stained_glass_magenta.png"), 0x50915369, false), + new BlockTemplate("light_blue", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "light_blue").build(), new TexPathBlockIcon("blocks/stained_glass_light_blue.png"), 0x50706b87, false), + new BlockTemplate("yellow", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "yellow").build(), new TexPathBlockIcon("blocks/stained_glass_yellow.png"), 0x50b5801f, false), + new BlockTemplate("lime", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "lime").build(), new TexPathBlockIcon("blocks/stained_glass_lime.png"), 0x50617030, false), + new BlockTemplate("pink", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "pink").build(), new TexPathBlockIcon("blocks/stained_glass_pink.png"), 0x509c4848, false), + new BlockTemplate("gray", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "gray").build(), new TexPathBlockIcon("blocks/stained_glass_gray.png"), 0x50392721, false), + new BlockTemplate("silver", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "silver").build(), new TexPathBlockIcon("blocks/stained_glass_silver.png"), 0x5081655b, false), + new BlockTemplate("cyan", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "cyan").build(), new TexPathBlockIcon("blocks/stained_glass_cyan.png"), 0x50565959, false), + new BlockTemplate("purple", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "purple").build(), new TexPathBlockIcon("blocks/stained_glass_purple.png"), 0x50744555, false), + new BlockTemplate("blue", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "blue").build(), new TexPathBlockIcon("blocks/stained_glass_blue.png"), 0x50463857, false), + new BlockTemplate("brown", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "brown").build(), new TexPathBlockIcon("blocks/stained_glass_brown.png"), 0x50492e1f, false), + new BlockTemplate("green", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "green").build(), new TexPathBlockIcon("blocks/stained_glass_green.png"), 0x50484f26, false), + new BlockTemplate("red", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "red").build(), new TexPathBlockIcon("blocks/stained_glass_red.png"), 0x50ff382b, false), + new BlockTemplate("black", new Block.Builder(BlockType.HARD_STAINED_GLASS).setProperty("color", "black").build(), new TexPathBlockIcon("blocks/stained_glass_black.png"), 0x5021120d, false) + }); + allTemplates.put("minecraft:reserved6", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.RESERVED6).build(), new TexPathBlockIcon("blocks/reserved6.png"), 0xff19171a, false) + }); + allTemplates.put("minecraft:256", new BlockTemplate[]{ + + }); + allTemplates.put("minecraft:prismarine_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xA9498d6e, false) + }); + allTemplates.put("minecraft:dark_prismarine_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_PRISMARINE_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04635e, false) + }); + allTemplates.put("minecraft:prismarine_bricks_stairs", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 2).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false), + new BlockTemplate(null, new Block.Builder(BlockType.PRISMARINE_BRICKS_STAIRS).setProperty("weirdo_direction", 3).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff097d6e, false) + }); + allTemplates.put("minecraft:stripped_spruce_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_SPRUCE_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_SPRUCE_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_SPRUCE_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_SPRUCE_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:stripped_birch_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_BIRCH_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_BIRCH_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_BIRCH_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_BIRCH_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:stripped_jungle_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_JUNGLE_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_JUNGLE_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_JUNGLE_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_JUNGLE_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:stripped_acacia_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_ACACIA_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_ACACIA_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_ACACIA_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_ACACIA_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:stripped_dark_oak_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_DARK_OAK_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_DARK_OAK_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_DARK_OAK_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_DARK_OAK_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:stripped_oak_log", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_OAK_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff9a7d4d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_OAK_LOG).setProperty("pillar_axis", "x").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff9a7d4d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_OAK_LOG).setProperty("pillar_axis", "z").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff9a7d4d, false), + new BlockTemplate(null, new Block.Builder(BlockType.STRIPPED_OAK_LOG).setProperty("pillar_axis", "y").build(), new TexPathBlockIcon("blocks/observer.png"), 0xff9a7d4d, false) + }); + allTemplates.put("minecraft:blue_ice", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BLUE_ICE).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff7dbeF6, false) + }); + allTemplates.put("minecraft:seagrass", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SEAGRASS).setProperty("sea_grass_type", "default").build(), new TexPathBlockIcon("blocks/observer.png"), 0x4e787878, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEAGRASS).setProperty("sea_grass_type", "double_top").build(), new TexPathBlockIcon("blocks/observer.png"), 0x4e787878, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEAGRASS).setProperty("sea_grass_type", "double_bot").build(), new TexPathBlockIcon("blocks/observer.png"), 0x4e787878, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEAGRASS).setProperty("sea_grass_type", "default").build(), new TexPathBlockIcon("blocks/observer.png"), 0x4e787878, false) + }); + allTemplates.put("minecraft:coral", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "pink").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "purple").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "red").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "yellow").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "pink").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "purple").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "red").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "yellow").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "pink").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "purple").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "red").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "yellow").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "pink").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "purple").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "red").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "yellow").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_BLOCK).setProperty("coral_color", "blue").setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_fan", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "pink").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "yellow").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "pink").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "purple").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "red").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "yellow").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_fan_dead", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "pink").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "purple").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "red").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "yellow").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "pink").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "purple").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "red").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "yellow").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_DEAD).setProperty("coral_color", "blue").setProperty("coral_fan_direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xFFC8C8C8, false) + }); + allTemplates.put("minecraft:coral_fan_hang", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_fan_hang2", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG2).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:coral_fan_hang3", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 0).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false), + new BlockTemplate(null, new Block.Builder(BlockType.CORAL_FAN_HANG3).setProperty("coral_hang_type_bit", (byte) 1).setProperty("coral_direction", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff3d6e86, false) + }); + allTemplates.put("minecraft:kelp", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false), + new BlockTemplate(null, new Block.Builder(BlockType.KELP).setProperty("kelp_age", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff04833e, false) + }); + allTemplates.put("minecraft:dried_kelp_block", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DRIED_KELP_BLOCK).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff044b4b, false) + }); + allTemplates.put("minecraft:acacia_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0x5f934f39, false) + }); + allTemplates.put("minecraft:birch_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:dark_oak_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:jungle_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:spruce_button", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 1).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 2).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 3).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 4).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 5).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_BUTTON).setProperty("facing_direction", 0).setProperty("button_pressed_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:acacia_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:birch_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:dark_oak_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:jungle_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:spruce_trapdoor", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 0).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 0).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 1).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 2).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_TRAPDOOR).setProperty("direction", 3).setProperty("open_bit", (byte) 1).setProperty("upside_down_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:acacia_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false), + new BlockTemplate(null, new Block.Builder(BlockType.ACACIA_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff934f39, false) + }); + allTemplates.put("minecraft:birch_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false), + new BlockTemplate(null, new Block.Builder(BlockType.BIRCH_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffdabd8d, false) + }); + allTemplates.put("minecraft:dark_oak_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false), + new BlockTemplate(null, new Block.Builder(BlockType.DARK_OAK_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff2d2213, false) + }); + allTemplates.put("minecraft:jungle_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false), + new BlockTemplate(null, new Block.Builder(BlockType.JUNGLE_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffBa7d5d, false) + }); + allTemplates.put("minecraft:spruce_pressure_plate", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 4).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 5).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 6).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 7).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 8).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 9).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 10).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 11).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 12).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 13).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 14).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false), + new BlockTemplate(null, new Block.Builder(BlockType.SPRUCE_PRESSURE_PLATE).setProperty("redstone_signal", 15).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff5a3d0d, false) + }); + allTemplates.put("minecraft:carved_pumpkin", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.CARVED_PUMPKIN).setProperty("direction", 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc07615, false), + new BlockTemplate(null, new Block.Builder(BlockType.CARVED_PUMPKIN).setProperty("direction", 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc07615, false), + new BlockTemplate(null, new Block.Builder(BlockType.CARVED_PUMPKIN).setProperty("direction", 2).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc07615, false), + new BlockTemplate(null, new Block.Builder(BlockType.CARVED_PUMPKIN).setProperty("direction", 3).build(), new TexPathBlockIcon("blocks/observer.png"), 0xffc07615, false) + }); + allTemplates.put("minecraft:sea_pickle", new BlockTemplate[]{ + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 0).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 1).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 2).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 3).setProperty("dead_bit", (byte) 0).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 0).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 1).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 2).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false), + new BlockTemplate(null, new Block.Builder(BlockType.SEA_PICKLE).setProperty("cluster_count", 3).setProperty("dead_bit", (byte) 1).build(), new TexPathBlockIcon("blocks/observer.png"), 0xff10C38e, false) + }); + } + + public static BlockTemplate[] getOfType(@NonNull String name) { + if (!name.contains(":")) name = "minecraft:" + name; + return allTemplates.get(name); + } + + @NonNull + public static BlockTemplate getBest(@NonNull Block block) { + var type = block.getType(); + if (type == null) return getUnknownBlockTemplate(); + List candidates = Arrays.asList(Objects.requireNonNull(getOfType(type.getName()))); + for (int i = 0, limit = block.getType().getKnownProperties().length; i < limit; i++) { + List newCandidates = new ArrayList<>(); + for (var template : candidates) { + if (Objects.equals(template.getBlock().getKnownProperties()[i], block.getKnownProperties()[i])) + newCandidates.add(template); + } + switch (newCandidates.size()) { + case 0: // give up filtering based on this property + continue; + case 1: // no longer an option + return newCandidates.get(0); + default: // less candidates + candidates = newCandidates; + } + } + return candidates.size() > 0 ? candidates.get(0) : getUnknownBlockTemplate(); + } + + public static Stream getAll() { + var stream = Arrays.stream(new BlockTemplate[0]); + for (var templates : allTemplates.values()) + stream = Streams.concat(stream, Arrays.stream(templates)); + return stream; + } + + @NonNull + public static BlockTemplate getAirTemplate() { + return getOfType("minecraft:air")[0]; + } + + @NonNull + public static BlockTemplate getUnknownBlockTemplate() { + return unknownBlockTemplate; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockType.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockType.java index 404e587f..0ef4e750 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockType.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockType.java @@ -1,16 +1,327 @@ package com.mithrilmania.blocktopograph.block; +import androidx.annotation.Nullable; + +import com.mithrilmania.blocktopograph.block.blockproperty.BlockProperty; + import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +public enum BlockType implements Serializable { + AIR("minecraft:air", new BlockProperty[]{}), + STONE("minecraft:stone", new BlockProperty[]{BlockProperty.STONE_TYPE}), + GRASS("minecraft:grass", new BlockProperty[]{}), + DIRT("minecraft:dirt", new BlockProperty[]{BlockProperty.DIRT_TYPE}), + COBBLESTONE("minecraft:cobblestone", new BlockProperty[]{}), + PLANKS("minecraft:planks", new BlockProperty[]{BlockProperty.WOOD_TYPE}), + SAPLING("minecraft:sapling", new BlockProperty[]{BlockProperty.SAPLING_TYPE, BlockProperty.AGE_BIT}), + BEDROCK("minecraft:bedrock", new BlockProperty[]{BlockProperty.INFINIBURN_BIT}), + FLOWING_WATER("minecraft:flowing_water", new BlockProperty[]{BlockProperty.LIQUID_DEPTH}), + WATER("minecraft:water", new BlockProperty[]{BlockProperty.LIQUID_DEPTH}), + FLOWING_LAVA("minecraft:flowing_lava", new BlockProperty[]{BlockProperty.LIQUID_DEPTH}), + LAVA("minecraft:lava", new BlockProperty[]{BlockProperty.LIQUID_DEPTH}), + SAND("minecraft:sand", new BlockProperty[]{BlockProperty.SAND_TYPE}), + GRAVEL("minecraft:gravel", new BlockProperty[]{}), + GOLD_ORE("minecraft:gold_ore", new BlockProperty[]{}), + IRON_ORE("minecraft:iron_ore", new BlockProperty[]{}), + COAL_ORE("minecraft:coal_ore", new BlockProperty[]{}), + LOG("minecraft:log", new BlockProperty[]{BlockProperty.OLD_LOG_TYPE, BlockProperty.PILLAR_AXIS}), + LEAVES("minecraft:leaves", new BlockProperty[]{BlockProperty.OLD_LEAF_TYPE, BlockProperty.PERSISTENT_BIT, BlockProperty.UPDATE_BIT}), + SPONGE("minecraft:sponge", new BlockProperty[]{BlockProperty.SPONGE_TYPE}), + GLASS("minecraft:glass", new BlockProperty[]{}), + LAPIS_ORE("minecraft:lapis_ore", new BlockProperty[]{}), + LAPIS_BLOCK("minecraft:lapis_block", new BlockProperty[]{}), + DISPENSER("minecraft:dispenser", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.TRIGGERED_BIT}), + SANDSTONE("minecraft:sandstone", new BlockProperty[]{BlockProperty.SAND_STONE_TYPE}), + NOTEBLOCK("minecraft:noteblock", new BlockProperty[]{}), + BED("minecraft:bed", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.HEAD_PIECE_BIT, BlockProperty.OCCUPIED_BIT}), + GOLDEN_RAIL("minecraft:golden_rail", new BlockProperty[]{BlockProperty.RAIL_DIRECTION, BlockProperty.RAIL_DATA_BIT}), + DETECTOR_RAIL("minecraft:detector_rail", new BlockProperty[]{BlockProperty.RAIL_DIRECTION, BlockProperty.RAIL_DATA_BIT}), + STICKY_PISTON("minecraft:sticky_piston", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + WEB("minecraft:web", new BlockProperty[]{}), + TALLGRASS("minecraft:tallgrass", new BlockProperty[]{BlockProperty.TALL_GRASS_TYPE}), + DEADBUSH("minecraft:deadbush", new BlockProperty[]{}), + PISTON("minecraft:piston", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + PISTONARMCOLLISION("minecraft:pistonArmCollision", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + WOOL("minecraft:wool", new BlockProperty[]{BlockProperty.COLOR}), + ELEMENT_0("minecraft:element_0", new BlockProperty[]{}), + YELLOW_FLOWER("minecraft:yellow_flower", new BlockProperty[]{}), + RED_FLOWER("minecraft:red_flower", new BlockProperty[]{BlockProperty.FLOWER_TYPE}), + BROWN_MUSHROOM("minecraft:brown_mushroom", new BlockProperty[]{}), + RED_MUSHROOM("minecraft:red_mushroom", new BlockProperty[]{}), + GOLD_BLOCK("minecraft:gold_block", new BlockProperty[]{}), + IRON_BLOCK("minecraft:iron_block", new BlockProperty[]{}), + DOUBLE_STONE_SLAB("minecraft:double_stone_slab", new BlockProperty[]{BlockProperty.STONE_SLAB_TYPE, BlockProperty.TOP_SLOT_BIT}), + STONE_SLAB("minecraft:stone_slab", new BlockProperty[]{BlockProperty.STONE_SLAB_TYPE, BlockProperty.TOP_SLOT_BIT}), + BRICK_BLOCK("minecraft:brick_block", new BlockProperty[]{}), + TNT("minecraft:tnt", new BlockProperty[]{BlockProperty.ALLOW_UNDERWATER_BIT, BlockProperty.EXPLODE_BIT}), + BOOKSHELF("minecraft:bookshelf", new BlockProperty[]{}), + MOSSY_COBBLESTONE("minecraft:mossy_cobblestone", new BlockProperty[]{}), + OBSIDIAN("minecraft:obsidian", new BlockProperty[]{}), + TORCH("minecraft:torch", new BlockProperty[]{BlockProperty.TORCH_FACING_DIRECTION}), + FIRE("minecraft:fire", new BlockProperty[]{BlockProperty.AGE}), + MOB_SPAWNER("minecraft:mob_spawner", new BlockProperty[]{}), + OAK_STAIRS("minecraft:oak_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + CHEST("minecraft:chest", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + REDSTONE_WIRE("minecraft:redstone_wire", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + DIAMOND_ORE("minecraft:diamond_ore", new BlockProperty[]{}), + DIAMOND_BLOCK("minecraft:diamond_block", new BlockProperty[]{}), + CRAFTING_TABLE("minecraft:crafting_table", new BlockProperty[]{}), + WHEAT("minecraft:wheat", new BlockProperty[]{BlockProperty.GROWTH}), + FARMLAND("minecraft:farmland", new BlockProperty[]{BlockProperty.MOISTURIZED_AMOUNT}), + FURNACE("minecraft:furnace", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LIT_FURNACE("minecraft:lit_furnace", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + STANDING_SIGN("minecraft:standing_sign", new BlockProperty[]{BlockProperty.GROUND_SIGN_DIRECTION}), + WOODEN_DOOR("minecraft:wooden_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + LADDER("minecraft:ladder", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + RAIL("minecraft:rail", new BlockProperty[]{BlockProperty.RAIL_DIRECTION}), + STONE_STAIRS("minecraft:stone_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + WALL_SIGN("minecraft:wall_sign", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LEVER("minecraft:lever", new BlockProperty[]{BlockProperty.LEVER_DIRECTION, BlockProperty.OPEN_BIT}), + STONE_PRESSURE_PLATE("minecraft:stone_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + IRON_DOOR("minecraft:iron_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + WOODEN_PRESSURE_PLATE("minecraft:wooden_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + REDSTONE_ORE("minecraft:redstone_ore", new BlockProperty[]{}), + LIT_REDSTONE_ORE("minecraft:lit_redstone_ore", new BlockProperty[]{}), + UNLIT_REDSTONE_TORCH("minecraft:unlit_redstone_torch", new BlockProperty[]{}), + REDSTONE_TORCH("minecraft:redstone_torch", new BlockProperty[]{BlockProperty.TORCH_FACING_DIRECTION}), + STONE_BUTTON("minecraft:stone_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + SNOW_LAYER("minecraft:snow_layer", new BlockProperty[]{BlockProperty.COVERED_BIT, BlockProperty.HEIGHT}), + ICE("minecraft:ice", new BlockProperty[]{}), + SNOW("minecraft:snow", new BlockProperty[]{}), + CACTUS("minecraft:cactus", new BlockProperty[]{BlockProperty.AGE}), + CLAY("minecraft:clay", new BlockProperty[]{}), + REEDS("minecraft:reeds", new BlockProperty[]{BlockProperty.AGE}), + JUKEBOX("minecraft:jukebox", new BlockProperty[]{}), + FENCE("minecraft:fence", new BlockProperty[]{BlockProperty.WOOD_TYPE}), + PUMPKIN("minecraft:pumpkin", new BlockProperty[]{BlockProperty.DIRECTION}), + NETHERRACK("minecraft:netherrack", new BlockProperty[]{}), + SOUL_SAND("minecraft:soul_sand", new BlockProperty[]{}), + GLOWSTONE("minecraft:glowstone", new BlockProperty[]{}), + PORTAL("minecraft:portal", new BlockProperty[]{BlockProperty.PORTAL_AXIS}), + LIT_PUMPKIN("minecraft:lit_pumpkin", new BlockProperty[]{BlockProperty.DIRECTION}), + CAKE("minecraft:cake", new BlockProperty[]{BlockProperty.BITE_COUNTER}), + UNPOWERED_REPEATER("minecraft:unpowered_repeater", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.REPEATER_DELAY}), + POWERED_REPEATER("minecraft:powered_repeater", new BlockProperty[]{}), + INVISIBLEBEDROCK("minecraft:invisibleBedrock", new BlockProperty[]{}), + TRAPDOOR("minecraft:trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + MONSTER_EGG("minecraft:monster_egg", new BlockProperty[]{BlockProperty.MONSTER_EGG_STONE_TYPE}), + STONEBRICK("minecraft:stonebrick", new BlockProperty[]{BlockProperty.STONE_BRICK_TYPE}), + BROWN_MUSHROOM_BLOCK("minecraft:brown_mushroom_block", new BlockProperty[]{BlockProperty.HUGE_MUSHROOM_BITS}), + RED_MUSHROOM_BLOCK("minecraft:red_mushroom_block", new BlockProperty[]{BlockProperty.HUGE_MUSHROOM_BITS}), + IRON_BARS("minecraft:iron_bars", new BlockProperty[]{}), + GLASS_PANE("minecraft:glass_pane", new BlockProperty[]{}), + MELON_BLOCK("minecraft:melon_block", new BlockProperty[]{}), + PUMPKIN_STEM("minecraft:pumpkin_stem", new BlockProperty[]{BlockProperty.GROWTH}), + MELON_STEM("minecraft:melon_stem", new BlockProperty[]{BlockProperty.GROWTH}), + VINE("minecraft:vine", new BlockProperty[]{BlockProperty.VINE_DIRECTION_BITS}), + FENCE_GATE("minecraft:fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + BRICK_STAIRS("minecraft:brick_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + STONE_BRICK_STAIRS("minecraft:stone_brick_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + MYCELIUM("minecraft:mycelium", new BlockProperty[]{}), + WATERLILY("minecraft:waterlily", new BlockProperty[]{}), + NETHER_BRICK("minecraft:nether_brick", new BlockProperty[]{}), + NETHER_BRICK_FENCE("minecraft:nether_brick_fence", new BlockProperty[]{}), + NETHER_BRICK_STAIRS("minecraft:nether_brick_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + NETHER_WART("minecraft:nether_wart", new BlockProperty[]{BlockProperty.AGE}), + ENCHANTING_TABLE("minecraft:enchanting_table", new BlockProperty[]{}), + BREWING_STAND("minecraft:brewing_stand", new BlockProperty[]{BlockProperty.BREWING_STAND_SLOT_A_BIT, BlockProperty.BREWING_STAND_SLOT_B_BIT, BlockProperty.BREWING_STAND_SLOT_C_BIT}), + CAULDRON("minecraft:cauldron", new BlockProperty[]{BlockProperty.CAULDRON_LIQUID, BlockProperty.FILL_LEVEL}), + END_PORTAL("minecraft:end_portal", new BlockProperty[]{}), + END_PORTAL_FRAME("minecraft:end_portal_frame", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.END_PORTAL_EYE_BIT}), + END_STONE("minecraft:end_stone", new BlockProperty[]{}), + DRAGON_EGG("minecraft:dragon_egg", new BlockProperty[]{}), + REDSTONE_LAMP("minecraft:redstone_lamp", new BlockProperty[]{}), + LIT_REDSTONE_LAMP("minecraft:lit_redstone_lamp", new BlockProperty[]{}), + DROPPER("minecraft:dropper", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.TRIGGERED_BIT}), + ACTIVATOR_RAIL("minecraft:activator_rail", new BlockProperty[]{BlockProperty.RAIL_DIRECTION, BlockProperty.RAIL_DATA_BIT}), + COCOA("minecraft:cocoa", new BlockProperty[]{}), + SANDSTONE_STAIRS("minecraft:sandstone_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + EMERALD_ORE("minecraft:emerald_ore", new BlockProperty[]{}), + ENDER_CHEST("minecraft:ender_chest", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + TRIPWIRE_HOOK("minecraft:tripwire_hook", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.ATTACHED_BIT, BlockProperty.POWERED_BIT}), + TRIPWIRE("minecraft:tripWire", new BlockProperty[]{BlockProperty.ATTACHED_BIT, BlockProperty.DISARMED_BIT, BlockProperty.POWERED_BIT, BlockProperty.SUSPENDED_BIT}), + EMERALD_BLOCK("minecraft:emerald_block", new BlockProperty[]{}), + SPRUCE_STAIRS("minecraft:spruce_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + BIRCH_STAIRS("minecraft:birch_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + JUNGLE_STAIRS("minecraft:jungle_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + BEACON("minecraft:beacon", new BlockProperty[]{}), + COBBLESTONE_WALL("minecraft:cobblestone_wall", new BlockProperty[]{BlockProperty.WALL_BLOCK_TYPE}), + FLOWER_POT("minecraft:flower_pot", new BlockProperty[]{BlockProperty.UPDATE_BIT}), + CARROTS("minecraft:carrots", new BlockProperty[]{BlockProperty.GROWTH}), + POTATOES("minecraft:potatoes", new BlockProperty[]{BlockProperty.GROWTH}), + WOODEN_BUTTON("minecraft:wooden_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + SKULL("minecraft:skull", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.NO_DROP_BIT}), + ANVIL("minecraft:anvil", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DAMAGE}), + TRAPPED_CHEST("minecraft:trapped_chest", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LIGHT_WEIGHTED_PRESSURE_PLATE("minecraft:light_weighted_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + HEAVY_WEIGHTED_PRESSURE_PLATE("minecraft:heavy_weighted_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + UNPOWERED_COMPARATOR("minecraft:unpowered_comparator", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OUTPUT_LIT_BIT, BlockProperty.OUTPUT_SUBTRACT_BIT}), + POWERED_COMPARATOR("minecraft:powered_comparator", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OUTPUT_LIT_BIT, BlockProperty.OUTPUT_SUBTRACT_BIT}), + DAYLIGHT_DETECTOR("minecraft:daylight_detector", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + REDSTONE_BLOCK("minecraft:redstone_block", new BlockProperty[]{}), + QUARTZ_ORE("minecraft:quartz_ore", new BlockProperty[]{}), + HOPPER("minecraft:hopper", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.TOGGLE_BIT}), + QUARTZ_BLOCK("minecraft:quartz_block", new BlockProperty[]{BlockProperty.CHISEL_TYPE, BlockProperty.PILLAR_AXIS}), + QUARTZ_STAIRS("minecraft:quartz_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + DOUBLE_WOODEN_SLAB("minecraft:double_wooden_slab", new BlockProperty[]{BlockProperty.WOOD_TYPE, BlockProperty.TOP_SLOT_BIT}), + WOODEN_SLAB("minecraft:wooden_slab", new BlockProperty[]{BlockProperty.WOOD_TYPE, BlockProperty.TOP_SLOT_BIT}), + STAINED_HARDENED_CLAY("minecraft:stained_hardened_clay", new BlockProperty[]{BlockProperty.COLOR}), + STAINED_GLASS_PANE("minecraft:stained_glass_pane", new BlockProperty[]{BlockProperty.COLOR}), + LEAVES2("minecraft:leaves2", new BlockProperty[]{BlockProperty.NEW_LEAF_TYPE, BlockProperty.PERSISTENT_BIT, BlockProperty.UPDATE_BIT}), + LOG2("minecraft:log2", new BlockProperty[]{BlockProperty.NEW_LOG_TYPE, BlockProperty.PILLAR_AXIS}), + ACACIA_STAIRS("minecraft:acacia_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + DARK_OAK_STAIRS("minecraft:dark_oak_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + SLIME("minecraft:slime", new BlockProperty[]{}), + IRON_TRAPDOOR("minecraft:iron_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + PRISMARINE("minecraft:prismarine", new BlockProperty[]{BlockProperty.PRISMARINE_BLOCK_TYPE}), + SEALANTERN("minecraft:seaLantern", new BlockProperty[]{}), + HAY_BLOCK("minecraft:hay_block", new BlockProperty[]{BlockProperty.DEPRECATED, BlockProperty.PILLAR_AXIS}), + CARPET("minecraft:carpet", new BlockProperty[]{BlockProperty.COLOR}), + HARDENED_CLAY("minecraft:hardened_clay", new BlockProperty[]{}), + COAL_BLOCK("minecraft:coal_block", new BlockProperty[]{}), + PACKED_ICE("minecraft:packed_ice", new BlockProperty[]{}), + DOUBLE_PLANT("minecraft:double_plant", new BlockProperty[]{BlockProperty.DOUBLE_PLANT_TYPE, BlockProperty.UPPER_BLOCK_BIT}), + BANNER("minecraft:banner", new BlockProperty[]{}), + DAYLIGHT_DETECTOR_INVERTED("minecraft:daylight_detector_inverted", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + RED_SANDSTONE("minecraft:red_sandstone", new BlockProperty[]{BlockProperty.SAND_STONE_TYPE}), + RED_SANDSTONE_STAIRS("minecraft:red_sandstone_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + DOUBLE_STONE_SLAB2("minecraft:double_stone_slab2", new BlockProperty[]{BlockProperty.STONE_SLAB_TYPE_2, BlockProperty.TOP_SLOT_BIT}), + STONE_SLAB2("minecraft:stone_slab2", new BlockProperty[]{BlockProperty.STONE_SLAB_TYPE_2, BlockProperty.TOP_SLOT_BIT}), + SPRUCE_FENCE_GATE("minecraft:spruce_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + BIRCH_FENCE_GATE("minecraft:birch_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + JUNGLE_FENCE_GATE("minecraft:jungle_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + DARK_OAK_FENCE_GATE("minecraft:dark_oak_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + ACACIA_FENCE_GATE("minecraft:acacia_fence_gate", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.IN_WALL_BIT, BlockProperty.OPEN_BIT}), + REPEATING_COMMAND_BLOCK("minecraft:repeating_command_block", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.CONDITIONAL_BIT}), + CHAIN_COMMAND_BLOCK("minecraft:chain_command_block", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.CONDITIONAL_BIT}), + HARD_GLASS_PANE("minecraft:hard_glass_pane", new BlockProperty[]{}), + HARD_STAINED_GLASS_PANE("minecraft:hard_stained_glass_pane", new BlockProperty[]{BlockProperty.COLOR}), + CHEMICAL_HEAT("minecraft:chemical_heat", new BlockProperty[]{}), + SPRUCE_DOOR("minecraft:spruce_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + BIRCH_DOOR("minecraft:birch_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + JUNGLE_DOOR("minecraft:jungle_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + ACACIA_DOOR("minecraft:acacia_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + DARK_OAK_DOOR("minecraft:dark_oak_door", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.DOOR_HINGE_BIT, BlockProperty.OPEN_BIT, BlockProperty.UPPER_BLOCK_BIT}), + GRASS_PATH("minecraft:grass_path", new BlockProperty[]{}), + FRAME("minecraft:frame", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.ITEM_FRAME_MAP_BIT}), + CHORUS_FLOWER("minecraft:chorus_flower", new BlockProperty[]{BlockProperty.AGE}), + PURPUR_BLOCK("minecraft:purpur_block", new BlockProperty[]{BlockProperty.CHISEL_TYPE, BlockProperty.PILLAR_AXIS}), + PURPUR_STAIRS("minecraft:purpur_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + SHULKER_BOX("minecraft:shulker_box", new BlockProperty[]{BlockProperty.COLOR}), + END_BRICKS("minecraft:end_bricks", new BlockProperty[]{}), + END_ROD("minecraft:end_rod", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + END_GATEWAY("minecraft:end_gateway", new BlockProperty[]{}), + B_210("minecraft:210", new BlockProperty[]{}), + B_211("minecraft:211", new BlockProperty[]{}), + B_212("minecraft:212", new BlockProperty[]{}), + MAGMA("minecraft:magma", new BlockProperty[]{}), + NETHER_WART_BLOCK("minecraft:nether_wart_block", new BlockProperty[]{}), + RED_NETHER_BRICK("minecraft:red_nether_brick", new BlockProperty[]{}), + BONE_BLOCK("minecraft:bone_block", new BlockProperty[]{BlockProperty.DEPRECATED, BlockProperty.PILLAR_AXIS}), + PURPLE_GLAZED_TERRACOTTA("minecraft:purple_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + WHITE_GLAZED_TERRACOTTA("minecraft:white_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + ORANGE_GLAZED_TERRACOTTA("minecraft:orange_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + MAGENTA_GLAZED_TERRACOTTA("minecraft:magenta_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LIGHT_BLUE_GLAZED_TERRACOTTA("minecraft:light_blue_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + YELLOW_GLAZED_TERRACOTTA("minecraft:yellow_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + LIME_GLAZED_TERRACOTTA("minecraft:lime_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + PINK_GLAZED_TERRACOTTA("minecraft:pink_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + GRAY_GLAZED_TERRACOTTA("minecraft:gray_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + SILVER_GLAZED_TERRACOTTA("minecraft:silver_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + CYAN_GLAZED_TERRACOTTA("minecraft:cyan_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + B_230("minecraft:230", new BlockProperty[]{}), + BLUE_GLAZED_TERRACOTTA("minecraft:blue_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + BROWN_GLAZED_TERRACOTTA("minecraft:brown_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + GREEN_GLAZED_TERRACOTTA("minecraft:green_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + RED_GLAZED_TERRACOTTA("minecraft:red_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + BLACK_GLAZED_TERRACOTTA("minecraft:black_glazed_terracotta", new BlockProperty[]{BlockProperty.FACING_DIRECTION}), + CONCRETE("minecraft:concrete", new BlockProperty[]{BlockProperty.COLOR}), + CONCRETEPOWDER("minecraft:concretePowder", new BlockProperty[]{BlockProperty.COLOR}), + CHEMISTRY_TABLE("minecraft:chemistry_table", new BlockProperty[]{BlockProperty.CHEMISTRY_TABLE_TYPE, BlockProperty.DIRECTION}), + UNDERWATER_TORCH("minecraft:underwater_torch", new BlockProperty[]{BlockProperty.TORCH_FACING_DIRECTION}), + CHORUS_PLANT("minecraft:chorus_plant", new BlockProperty[]{}), + STAINED_GLASS("minecraft:stained_glass", new BlockProperty[]{BlockProperty.COLOR}), + B_242("minecraft:242", new BlockProperty[]{}), + PODZOL("minecraft:podzol", new BlockProperty[]{}), + BEETROOT("minecraft:beetroot", new BlockProperty[]{BlockProperty.GROWTH}), + STONECUTTER("minecraft:stonecutter", new BlockProperty[]{}), + GLOWINGOBSIDIAN("minecraft:glowingobsidian", new BlockProperty[]{}), + NETHERREACTOR("minecraft:netherreactor", new BlockProperty[]{}), + INFO_UPDATE("minecraft:info_update", new BlockProperty[]{}), + INFO_UPDATE2("minecraft:info_update2", new BlockProperty[]{}), + MOVINGBLOCK("minecraft:movingBlock", new BlockProperty[]{}), + OBSERVER("minecraft:observer", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.POWERED_BIT}), + STRUCTURE_BLOCK("minecraft:structure_block", new BlockProperty[]{BlockProperty.STRUCTURE_BLOCK_TYPE}), + HARD_GLASS("minecraft:hard_glass", new BlockProperty[]{}), + HARD_STAINED_GLASS("minecraft:hard_stained_glass", new BlockProperty[]{BlockProperty.COLOR}), + RESERVED6("minecraft:reserved6", new BlockProperty[]{}), + B_256("minecraft:256", new BlockProperty[]{}), + PRISMARINE_STAIRS("minecraft:prismarine_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + DARK_PRISMARINE_STAIRS("minecraft:dark_prismarine_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + PRISMARINE_BRICKS_STAIRS("minecraft:prismarine_bricks_stairs", new BlockProperty[]{BlockProperty.WEIRDO_DIRECTION, BlockProperty.UPSIDE_DOWN_BIT}), + STRIPPED_SPRUCE_LOG("minecraft:stripped_spruce_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_BIRCH_LOG("minecraft:stripped_birch_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_JUNGLE_LOG("minecraft:stripped_jungle_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_ACACIA_LOG("minecraft:stripped_acacia_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_DARK_OAK_LOG("minecraft:stripped_dark_oak_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + STRIPPED_OAK_LOG("minecraft:stripped_oak_log", new BlockProperty[]{BlockProperty.PILLAR_AXIS}), + BLUE_ICE("minecraft:blue_ice", new BlockProperty[]{}), + SEAGRASS("minecraft:seagrass", new BlockProperty[]{BlockProperty.SEA_GRASS_TYPE}), + CORAL("minecraft:coral", new BlockProperty[]{BlockProperty.CORAL_COLOR, BlockProperty.DEAD_BIT}), + CORAL_BLOCK("minecraft:coral_block", new BlockProperty[]{BlockProperty.CORAL_COLOR, BlockProperty.DEAD_BIT}), + CORAL_FAN("minecraft:coral_fan", new BlockProperty[]{BlockProperty.CORAL_COLOR, BlockProperty.CORAL_FAN_DIRECTION}), + CORAL_FAN_DEAD("minecraft:coral_fan_dead", new BlockProperty[]{BlockProperty.CORAL_COLOR, BlockProperty.CORAL_FAN_DIRECTION}), + CORAL_FAN_HANG("minecraft:coral_fan_hang", new BlockProperty[]{BlockProperty.CORAL_HANG_TYPE_BIT, BlockProperty.CORAL_DIRECTION, BlockProperty.DEAD_BIT}), + CORAL_FAN_HANG2("minecraft:coral_fan_hang2", new BlockProperty[]{BlockProperty.CORAL_HANG_TYPE_BIT, BlockProperty.CORAL_DIRECTION, BlockProperty.DEAD_BIT}), + CORAL_FAN_HANG3("minecraft:coral_fan_hang3", new BlockProperty[]{BlockProperty.CORAL_HANG_TYPE_BIT, BlockProperty.CORAL_DIRECTION, BlockProperty.DEAD_BIT}), + KELP("minecraft:kelp", new BlockProperty[]{BlockProperty.KELP_AGE}), + DRIED_KELP_BLOCK("minecraft:dried_kelp_block", new BlockProperty[]{}), + ACACIA_BUTTON("minecraft:acacia_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + BIRCH_BUTTON("minecraft:birch_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + DARK_OAK_BUTTON("minecraft:dark_oak_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + JUNGLE_BUTTON("minecraft:jungle_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + SPRUCE_BUTTON("minecraft:spruce_button", new BlockProperty[]{BlockProperty.FACING_DIRECTION, BlockProperty.BUTTON_PRESSED_BIT}), + ACACIA_TRAPDOOR("minecraft:acacia_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + BIRCH_TRAPDOOR("minecraft:birch_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + DARK_OAK_TRAPDOOR("minecraft:dark_oak_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + JUNGLE_TRAPDOOR("minecraft:jungle_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + SPRUCE_TRAPDOOR("minecraft:spruce_trapdoor", new BlockProperty[]{BlockProperty.DIRECTION, BlockProperty.OPEN_BIT, BlockProperty.UPSIDE_DOWN_BIT}), + ACACIA_PRESSURE_PLATE("minecraft:acacia_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + BIRCH_PRESSURE_PLATE("minecraft:birch_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + DARK_OAK_PRESSURE_PLATE("minecraft:dark_oak_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + JUNGLE_PRESSURE_PLATE("minecraft:jungle_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + SPRUCE_PRESSURE_PLATE("minecraft:spruce_pressure_plate", new BlockProperty[]{BlockProperty.REDSTONE_SIGNAL}), + CARVED_PUMPKIN("minecraft:carved_pumpkin", new BlockProperty[]{BlockProperty.DIRECTION}), + SEA_PICKLE("minecraft:sea_pickle", new BlockProperty[]{BlockProperty.CLUSTER_COUNT, BlockProperty.DEAD_BIT}), + UNKNOWN("blocktopograph:unknown", new BlockProperty[0]); + + private static final Map blockTypes = new HashMap<>(); + + private final String name; -public class BlockType implements Serializable { + private final BlockProperty[] knownProperties; - private String name; + static { + for (var block : BlockType.values()) blockTypes.put(block.name, block); + } - public BlockType(String name) { + BlockType(String name, BlockProperty[] knownProperties) { this.name = name; + this.knownProperties = knownProperties; + } + + @Nullable + public static BlockType get(String name) { + return blockTypes.get(name); } public String getName() { return name; } + + public BlockProperty[] getKnownProperties() { + return knownProperties; + } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockWithStatesToLegacyBlockMapper.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockWithStatesToLegacyBlockMapper.java index c4e89f61..0e60ab48 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockWithStatesToLegacyBlockMapper.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/BlockWithStatesToLegacyBlockMapper.java @@ -4786,13 +4786,13 @@ public class BlockWithStatesToLegacyBlockMapper { } @Nullable - public static KnownBlockRepr getBestRepr(@NonNull Block block) { - Pair[] list = mMapTypeToBlocks.get(block.getBlockType()); + public static KnownBlockRepr getBestRepr(@NonNull OldBlock oldBlock) { + Pair[] list = mMapTypeToBlocks.get(oldBlock.getBlockType()); if (list == null || list.length <= 0) // Already the best we can d for now. return null; String[] checks = new String[]{"color", "type", "direction"}; - ArrayList tags = block.getStates().getValue(); + ArrayList tags = oldBlock.getStates().getValue(); List> range = new ArrayList<>(list.length); range.addAll(Arrays.asList(list)); for (String check : checks) { diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlock.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlock.java new file mode 100644 index 00000000..a95e0c57 --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlock.java @@ -0,0 +1,93 @@ +package com.mithrilmania.blocktopograph.block; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; +import com.mithrilmania.blocktopograph.nbt.tags.Tag; + +import java.io.Serializable; +import java.util.ArrayList; + +public class OldBlock implements Serializable { + + @NonNull + private OldBlockType oldBlockType; + + @NonNull + private KnownBlockRepr legacyBlock; + + private ListingBlock listingBlock; + + @NonNull + private CompoundTag states; + + private int version; + + OldBlock(@NonNull OldBlockType oldBlockType, @NonNull CompoundTag states, int version) { + this.oldBlockType = oldBlockType; + this.states = states; + this.version = version; + KnownBlockRepr legacyBlock = BlockWithStatesToLegacyBlockMapper.getBestRepr(this); + if (legacyBlock == null) { + for (ListingBlock lb : ListingBlock.values()) { + if (lb.getIdentifier().equals(oldBlockType.getName())) { + listingBlock = lb; + break; + } + } + legacyBlock = KnownBlockRepr.guessBlockNew(oldBlockType.getName()); + } + this.legacyBlock = legacyBlock; + } + + OldBlock(@NonNull OldBlockType oldBlockType, @NonNull KnownBlockRepr legacyBlock, int version) { + this.oldBlockType = oldBlockType; + this.states = new CompoundTag("states", new ArrayList<>()); + this.version = version; + this.legacyBlock = legacyBlock; + } + + @NonNull + public String getBlockType() { + return oldBlockType.getName(); + } + + public int getVersion() { + return version; + } + + public boolean isOfSameType(OldBlock oldBlock) { + return oldBlockType == oldBlock.oldBlockType; + } + + public Tag getState(String key) { + return states.getChildTagByKey(key); + } + + @NonNull + public KnownBlockRepr getLegacyBlock() { + return legacyBlock; + } + + public int getColor() { + if (listingBlock != null) + return listingBlock.getColor(); + return legacyBlock.color; + } + + @NonNull + public CompoundTag getStates() { + return states; + } + + @Override + public boolean equals(@Nullable Object obj) { + if (!(obj instanceof OldBlock)) return false; + OldBlock another = (OldBlock) obj; + // Ref compare. + if (oldBlockType != another.oldBlockType) return false; + return states.equals(another.states); + } + +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockRegistry.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockRegistry.java new file mode 100644 index 00000000..38e79a3c --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockRegistry.java @@ -0,0 +1,52 @@ +package com.mithrilmania.blocktopograph.block; + +import androidx.annotation.NonNull; + +import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; + +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.Map; + +public class OldBlockRegistry { + + private int limitedTypes; + private Map blockTypes; + + public OldBlockRegistry() { + blockTypes = new Hashtable<>(1024); + } + + public OldBlockRegistry(int limitedTypes) { + this(); + this.limitedTypes = limitedTypes; + } + + @NonNull + private OldBlockType getBlockType(String name) { + OldBlockType ret = blockTypes.get(name); + if (ret == null) { + ret = new OldBlockType(name); + if (limitedTypes > 0 && blockTypes.size() >= limitedTypes) + throw new RuntimeException("Block types exceeds your set limit."); + blockTypes.put(name, ret); + } + return ret; + } + + @NonNull + public OldBlock createBlock(@NonNull String name, @NonNull CompoundTag states, int version) { + return new OldBlock(getBlockType(name), states, version); + } + + @NonNull + public OldBlock createBlock(@NonNull String name) { + return new OldBlock(getBlockType(name), new CompoundTag("states", new ArrayList<>()), 3841); + } + + @NonNull + public OldBlock createBlock(@NonNull KnownBlockRepr legacyBlock) { + return new OldBlock(getBlockType(legacyBlock.identifier), legacyBlock, 1); + } + +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockType.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockType.java new file mode 100644 index 00000000..6ab2d1b0 --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/OldBlockType.java @@ -0,0 +1,16 @@ +package com.mithrilmania.blocktopograph.block; + +import java.io.Serializable; + +public class OldBlockType implements Serializable { + + private final String name; + + public OldBlockType(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BitValuesRange.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BitValuesRange.java new file mode 100644 index 00000000..6da14fa7 --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BitValuesRange.java @@ -0,0 +1,4 @@ +package com.mithrilmania.blocktopograph.block.blockproperty; + +public class BitValuesRange extends ValuesRange { +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BlockProperty.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BlockProperty.java new file mode 100644 index 00000000..be27b3ae --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/BlockProperty.java @@ -0,0 +1,134 @@ +package com.mithrilmania.blocktopograph.block.blockproperty; + +import androidx.annotation.Nullable; + +import com.mithrilmania.blocktopograph.nbt.convert.NBTConstants; + +import java.util.HashMap; +import java.util.Map; + +public enum BlockProperty { + AGE_BIT("age_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + ALLOW_UNDERWATER_BIT("allow_underwater_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + ATTACHED_BIT("attached_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + BREWING_STAND_SLOT_A_BIT("brewing_stand_slot_a_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + BREWING_STAND_SLOT_B_BIT("brewing_stand_slot_b_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + BREWING_STAND_SLOT_C_BIT("brewing_stand_slot_c_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + BUTTON_PRESSED_BIT("button_pressed_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + CONDITIONAL_BIT("conditional_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + CORAL_HANG_TYPE_BIT("coral_hang_type_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + COVERED_BIT("covered_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + DEAD_BIT("dead_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + DISARMED_BIT("disarmed_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + DOOR_HINGE_BIT("door_hinge_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + END_PORTAL_EYE_BIT("end_portal_eye_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + EXPLODE_BIT("explode_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + HEAD_PIECE_BIT("head_piece_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + IN_WALL_BIT("in_wall_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + INFINIBURN_BIT("infiniburn_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + ITEM_FRAME_MAP_BIT("item_frame_map_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + NO_DROP_BIT("no_drop_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + OCCUPIED_BIT("occupied_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + OPEN_BIT("open_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + OUTPUT_LIT_BIT("output_lit_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + OUTPUT_SUBTRACT_BIT("output_subtract_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + PERSISTENT_BIT("persistent_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + POWERED_BIT("powered_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + RAIL_DATA_BIT("rail_data_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + SUSPENDED_BIT("suspended_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + TOGGLE_BIT("toggle_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + TOP_SLOT_BIT("top_slot_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + TRIGGERED_BIT("triggered_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + UPDATE_BIT("update_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + UPPER_BLOCK_BIT("upper_block_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + UPSIDE_DOWN_BIT("upside_down_bit", NBTConstants.NBTType.BYTE, new BitValuesRange()), + AGE("age", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + BITE_COUNTER("bite_counter", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + CLUSTER_COUNT("cluster_count", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3})), + CORAL_DIRECTION("coral_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3})), + CORAL_FAN_DIRECTION("coral_fan_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1})), + DEPRECATED("deprecated", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + DIRECTION("direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3})), + FACING_DIRECTION("facing_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3, 4, 5})), + FILL_LEVEL("fill_level", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + GROUND_SIGN_DIRECTION("ground_sign_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + GROWTH("growth", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + HEIGHT("height", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + HUGE_MUSHROOM_BITS("huge_mushroom_bits", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + KELP_AGE("kelp_age", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9})), + LIQUID_DEPTH("liquid_depth", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + MOISTURIZED_AMOUNT("moisturized_amount", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + RAIL_DIRECTION("rail_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + REDSTONE_SIGNAL("redstone_signal", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9})), + REPEATER_DELAY("repeater_delay", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + VINE_DIRECTION_BITS("vine_direction_bits", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0})), + WEIRDO_DIRECTION("weirdo_direction", NBTConstants.NBTType.INT, new EnumValuesRange(new Integer[]{0, 1, 2, 3})), + CAULDRON_LIQUID("cauldron_liquid", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"water"})), + CHEMISTRY_TABLE_TYPE("chemistry_table_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"compound_creator", "element_constructor", "lab_table", "material_reducer"})), + CHISEL_TYPE("chisel_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"chiseled", "default", "lines", "smooth"})), + COLOR("color", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"black", "blue", "brown", "cyan", "gray", "green", "light_blue", "lime", "magenta", "orange", "pink", "purple", "red", "silver", "white", "yellow"})), + CORAL_COLOR("coral_color", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"blue", "pink", "purple", "red", "yellow"})), + DAMAGE("damage", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"slightly_damaged", "undamaged", "very_damaged"})), + DIRT_TYPE("dirt_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"normal"})), + DOUBLE_PLANT_TYPE("double_plant_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"fern", "grass", "paeonia", "rose", "sunflower", "syringa"})), + FLOWER_TYPE("flower_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"allium", "houstonia", "orchid", "oxeye", "poppy", "tulip_orange", "tulip_pink", "tulip_red", "tulip_white"})), + LEVER_DIRECTION("lever_direction", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"down_east_west"})), + MONSTER_EGG_STONE_TYPE("monster_egg_stone_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"chiseled_stone_brick", "cobblestone", "cracked_stone_brick", "mossy_stone_brick", "stone", "stone_brick"})), + NEW_LEAF_TYPE("new_leaf_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"acacia", "dark_oak"})), + NEW_LOG_TYPE("new_log_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"acacia", "dark_oak"})), + OLD_LEAF_TYPE("old_leaf_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"birch", "jungle", "oak", "spruce"})), + OLD_LOG_TYPE("old_log_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"birch", "jungle", "oak", "spruce"})), + PILLAR_AXIS("pillar_axis", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"x", "y", "z"})), + PORTAL_AXIS("portal_axis", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"unknown"})), + PRISMARINE_BLOCK_TYPE("prismarine_block_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"bricks", "dark", "default"})), + SAND_STONE_TYPE("sand_stone_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"cut", "default", "heiroglyphs"})), + SAND_TYPE("sand_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"normal", "red"})), + SAPLING_TYPE("sapling_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"acacia", "birch", "dark_oak", "jungle", "oak", "spruce"})), + SEA_GRASS_TYPE("sea_grass_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"default", "double_bot", "double_top"})), + SPONGE_TYPE("sponge_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"dry", "wet"})), + STONE_BRICK_TYPE("stone_brick_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"chiseled", "cracked", "default", "mossy", "smooth"})), + STONE_SLAB_TYPE("stone_slab_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"brick", "cobblestone", "nether_brick", "quartz", "sandstone", "smooth_stone", "stone_brick", "wood"})), + STONE_SLAB_TYPE_2("stone_slab_type_2", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"purpur", "red_sandstone"})), + STONE_TYPE("stone_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"andesite", "andesite_smooth", "diorite", "diorite_smooth", "granite", "granite_smooth", "stone"})), + STRUCTURE_BLOCK_TYPE("structure_block_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"corner", "data", "export", "invalid", "load", "save"})), + TALL_GRASS_TYPE("tall_grass_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"fern", "tall"})), + TORCH_FACING_DIRECTION("torch_facing_direction", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"east", "north", "south", "top", "unknown", "west"})), + WALL_BLOCK_TYPE("wall_block_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"cobblestone", "mossy_cobblestone"})), + WOOD_TYPE("wood_type", NBTConstants.NBTType.STRING, new EnumValuesRange(new String[]{"acacia", "birch", "dark_oak", "jungle", "oak", "spruce"})); + + + private static final Map blockProperties = new HashMap<>(); + + private final String name; + + private final NBTConstants.NBTType type; + + private final ValuesRange valuesRange; + + static { + for (var property : BlockProperty.values()) blockProperties.put(property.name, property); + } + + BlockProperty(String name, NBTConstants.NBTType type, ValuesRange valuesRange) { + this.name = name; + this.type = type; + this.valuesRange = valuesRange; + } + + @Nullable + public static BlockProperty get(String name){ + return blockProperties.get(name); + } + + public String getName() { + return name; + } + + public NBTConstants.NBTType getType() { + return type; + } + + public ValuesRange getValuesRange() { + return valuesRange; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/EnumValuesRange.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/EnumValuesRange.java new file mode 100644 index 00000000..a12171ae --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/EnumValuesRange.java @@ -0,0 +1,16 @@ +package com.mithrilmania.blocktopograph.block.blockproperty; + +import com.mithrilmania.blocktopograph.nbt.tags.Tag; + +public class EnumValuesRange extends ValuesRange { + + private final Object[] values; + + public EnumValuesRange(Object[] values) { + this.values = values; + } + + public Object[] getValues() { + return values; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/ValuesRange.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/ValuesRange.java new file mode 100644 index 00000000..dd67e8ca --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/blockproperty/ValuesRange.java @@ -0,0 +1,4 @@ +package com.mithrilmania.blocktopograph.block.blockproperty; + +public abstract class ValuesRange { +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/BlockIcon.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/BlockIcon.java new file mode 100644 index 00000000..3500921b --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/BlockIcon.java @@ -0,0 +1,11 @@ +package com.mithrilmania.blocktopograph.block.icon; + +import android.content.Context; +import android.graphics.Bitmap; + +import java.io.Serializable; + +public abstract class BlockIcon implements Serializable{ + + abstract public Bitmap getIcon(Context context); +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/NoBlockIcon.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/NoBlockIcon.java new file mode 100644 index 00000000..8fff5dac --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/NoBlockIcon.java @@ -0,0 +1,11 @@ +package com.mithrilmania.blocktopograph.block.icon; + +import android.content.Context; +import android.graphics.Bitmap; + +public class NoBlockIcon extends BlockIcon{ + + public Bitmap getIcon(Context context){ + return null; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/TexPathBlockIcon.java b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/TexPathBlockIcon.java new file mode 100644 index 00000000..55145b86 --- /dev/null +++ b/app/src/main/java/com/mithrilmania/blocktopograph/block/icon/TexPathBlockIcon.java @@ -0,0 +1,45 @@ +package com.mithrilmania.blocktopograph.block.icon; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; + +import com.mithrilmania.blocktopograph.Log; +import com.mithrilmania.blocktopograph.block.KnownBlockRepr; + +import java.io.FileNotFoundException; +import java.lang.ref.WeakReference; + +public class TexPathBlockIcon extends BlockIcon { + + private final String texPath; + + private transient WeakReference texture; + + public TexPathBlockIcon(String texPath) { + this.texPath = texPath; + texture = null; + } + + public Bitmap getIcon(Context context) { + var result = texture == null ? null : texture.get(); + if (result == null) { + result = loadIcon(context); + if (result != null) texture = new WeakReference<>(result); + } + return result; + } + + private Bitmap loadIcon(Context context) { + try { + return Bitmap.createScaledBitmap( + BitmapFactory.decodeStream( + context.getAssets().open(texPath)), 120, 120, false); + } catch (FileNotFoundException e) { + //TODO file-paths were generated from block names; some do not actually exist... + } catch (Exception e) { + Log.d(KnownBlockRepr.class, e); + } + return null; + } +} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/BedrockChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/BedrockChunk.java index abf77bb6..c98dd4a4 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/BedrockChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/BedrockChunk.java @@ -3,11 +3,15 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.mithrilmania.blocktopograph.BuildConfig; +import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.terrain.TerrainSubChunk; -import com.mithrilmania.blocktopograph.chunk.terrain.V1d2d13TerrainSubChunk; import com.mithrilmania.blocktopograph.map.Biome; import com.mithrilmania.blocktopograph.map.Dimension; import com.mithrilmania.blocktopograph.util.ColorUtil; @@ -49,7 +53,7 @@ private void load2dData(boolean createIfMissing) { mChunkX, mChunkZ, ChunkTag.DATA_2D, mDimension, (byte) 0, false); if (rawData == null) { if (createIfMissing) { - this.data2D = ByteBuffer.allocate(0x300); + this.data2D = ByteBuffer.allocate(DATA2D_LENGTH); } else { mIsError = true; mIsVoid = true; @@ -58,16 +62,15 @@ private void load2dData(boolean createIfMissing) { } this.data2D = ByteBuffer.wrap(rawData); } catch (Exception e) { + if (BuildConfig.DEBUG) { + Log.d(this, e); + } mIsError = true; mIsVoid = true; } } } - public V1d2d13TerrainSubChunk tempGetSubChunk() { - return (V1d2d13TerrainSubChunk) getSubChunk(0, false); - } - @Nullable private TerrainSubChunk getSubChunk(int which, boolean createIfMissing) { if (mIsError || mVoidList[which]) return null; @@ -83,14 +86,16 @@ private TerrainSubChunk getSubChunk(int which, boolean createIfMissing) { return null; } } catch (Exception e) { - e.printStackTrace(); + if (BuildConfig.DEBUG) { + Log.d(this, e); + } mErrorList[which] = true; mVoidList[which] = true; return null; } ret = raw == null ? - TerrainSubChunk.createEmpty(8, worldData.mBlockRegistry) : - TerrainSubChunk.create(raw, worldData.mBlockRegistry); + TerrainSubChunk.createEmpty(8) : + TerrainSubChunk.create(raw); if (ret == null || ret.isError()) { mVoidList[which] = true; mErrorList[which] = true; @@ -174,18 +179,23 @@ public int getGrassColor(int x, int z) { @NonNull @Override - public Block getBlock(int x, int y, int z) { - return getBlock(x, y, z, 0); + public BlockTemplate getBlockTemplate(int x, int y, int z, int layer) { + if (x >= 16 || y >= 256 || z >= 16 || x < 0 || y < 0 || z < 0 || mIsVoid) + return BlockTemplates.getAirTemplate(); + TerrainSubChunk subChunk = getSubChunk(y >> 4, false); + if (subChunk == null) + return BlockTemplates.getAirTemplate(); + return subChunk.getBlockTemplate(x, y & 0xf, z, layer); } @NonNull @Override public Block getBlock(int x, int y, int z, int layer) { if (x >= 16 || y >= 256 || z >= 16 || x < 0 || y < 0 || z < 0 || mIsVoid) - return getAir(); + throw new IllegalArgumentException(); TerrainSubChunk subChunk = getSubChunk(y >> 4, false); if (subChunk == null) - return getAir(); + return BlockTemplates.getAirTemplate().getBlock(); return subChunk.getBlock(x, y & 0xf, z, layer); } @@ -198,20 +208,17 @@ public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { if (subChunk == null) return; subChunk.setBlock(x, y & 0xf, z, layer, block); mDirtyList[which] = true; - KnownBlockRepr repr = block.getLegacyBlock(); - + BlockTemplate template = BlockTemplates.getBest(block); // Height increased. - if (repr != KnownBlockRepr.B_0_0_AIR && getHeightMapValue(x, z) < y) { + if (template != BlockTemplates.getAirTemplate() && getHeightMapValue(x, z) < y) { mIs2dDirty = true; setHeightMapValue(x, z, (short) (y + 1)); // Roof removed. - } else if (repr == KnownBlockRepr.B_0_0_AIR && getHeightMapValue(x, z) == y) { + } else if (template == BlockTemplates.getAirTemplate() && getHeightMapValue(x, z) == y) { mIs2dDirty = true; int height = 0; for (int h = y - 1; h >= 0; h--) { - Block blockAtHeight = getBlock(x, h, z); - KnownBlockRepr reprAtHeight = blockAtHeight.getLegacyBlock(); - if (reprAtHeight != KnownBlockRepr.B_0_0_AIR) { + if (getBlockTemplate(x, h, z) != BlockTemplates.getAirTemplate()) { height = h + 1; break; } @@ -247,9 +254,7 @@ public int getHighestBlockYUnderAt(int x, int z, int y) { subChunk = getSubChunk(which, false); if (subChunk == null) continue; for (int innerY = (which == (y >> 4)) ? y & 0xf : 15; innerY >= 0; innerY--) { - Block block = subChunk.getBlock(x, innerY, z, 0); - KnownBlockRepr repr = block.getLegacyBlock(); - if (repr != KnownBlockRepr.B_0_0_AIR) + if (subChunk.getBlockTemplate(x, innerY, z, 0) != BlockTemplates.getAirTemplate()) return (which << 4) | innerY; } } @@ -265,8 +270,7 @@ public int getCaveYUnderAt(int x, int z, int y) { subChunk = getSubChunk(which, false); if (subChunk == null) continue; for (int innerY = (which == (y >> 4)) ? y & 0xf : 15; innerY >= 0; innerY--) { - Block block = subChunk.getBlock(x, innerY, z, 0); - if (block.getLegacyBlock() == KnownBlockRepr.B_0_0_AIR) + if (subChunk.getBlockTemplate(x, innerY, z, 0) == BlockTemplates.getAirTemplate()) return (which << 4) | innerY; } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Chunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Chunk.java index 9d158eda..fc888daa 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Chunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Chunk.java @@ -5,11 +5,13 @@ import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.KnownBlockRepr; +import com.mithrilmania.blocktopograph.block.BlockTemplate; import com.mithrilmania.blocktopograph.map.Dimension; import java.io.IOException; import java.lang.ref.WeakReference; +import java.util.Arrays; +import java.util.stream.IntStream; public abstract class Chunk { @@ -44,9 +46,10 @@ public static Chunk createEmpty(@NonNull WorldData worldData, int chunkX, int ch Chunk chunk; switch (createOfVersion) { case V1_2_PLUS: + case V1_16_PLUS: try { worldData.writeChunkData(chunkX, chunkZ, ChunkTag.GENERATOR_STAGE, dimension, (byte) 0, false, new byte[]{2, 0, 0, 0}); - worldData.writeChunkData(chunkX, chunkZ, ChunkTag.VERSION, dimension, (byte) 0, false, new byte[]{0xf}); + worldData.writeChunkData(chunkX, chunkZ, ChunkTag.VERSION_PRE16, dimension, (byte) 0, false, new byte[]{0xf}); chunk = new BedrockChunk(worldData, createOfVersion, chunkX, chunkZ, dimension, true); } catch (Exception e) { Log.d(Chunk.class, e); @@ -63,7 +66,9 @@ public static Chunk create(@NonNull WorldData worldData, int chunkX, int chunkZ, boolean createIfMissing, Version createOfVersion) { Version version; try { - byte[] data = worldData.getChunkData(chunkX, chunkZ, ChunkTag.VERSION, dimension, (byte) 0, false); + byte[] data = worldData.getChunkData(chunkX, chunkZ, ChunkTag.VERSION_PRE16, dimension); + if (data == null) + data = worldData.getChunkData(chunkX, chunkZ, ChunkTag.VERSION, dimension); if (data == null && createIfMissing) return createEmpty(worldData, chunkX, chunkZ, dimension, createOfVersion); version = Version.getVersion(data); @@ -73,17 +78,18 @@ public static Chunk create(@NonNull WorldData worldData, int chunkX, int chunkZ, } Chunk chunk; switch (version) { - case ERROR: - case OLD_LIMITED: - chunk = new VoidChunk(worldData, version, chunkX, chunkZ, dimension); - chunk.mIsError = true; - break; - case v0_9: - chunk = new PocketChunk(worldData, version, chunkX, chunkZ, dimension); - break; - case V1_0: - case V1_1: +// case ERROR: +// case OLD_LIMITED: +// chunk = new VoidChunk(worldData, version, chunkX, chunkZ, dimension); +// chunk.mIsError = true; +// break; +// case v0_9: +// chunk = new PocketChunk(worldData, version, chunkX, chunkZ, dimension); +// break; +// case V1_0: +// case V1_1: case V1_2_PLUS: + case V1_16_PLUS: chunk = new BedrockChunk(worldData, version, chunkX, chunkZ, dimension, false); break; case NULL: @@ -97,12 +103,10 @@ public final WorldData getWorldData() { return mWorldData.get(); } - public final boolean isVoid() { return mIsVoid; } - public final boolean isError() { return mIsError; } @@ -122,7 +126,17 @@ public final boolean isError() { abstract public int getGrassColor(int x, int z); @NonNull - abstract public Block getBlock(int x, int y, int z); + public BlockTemplate getBlockTemplate(int x, int y, int z) { + return getBlockTemplate(x, y, z, 0); + } + + @NonNull + abstract public BlockTemplate getBlockTemplate(int x, int y, int z, int layer); + + @NonNull + public Block getBlock(int x, int y, int z) { + return getBlock(x, y, z, 0); + } @NonNull abstract public Block getBlock(int x, int y, int z, int layer); @@ -139,37 +153,19 @@ public final boolean isError() { abstract public void save() throws WorldData.WorldDBException, IOException; - @NonNull - protected Block getAir() { - return mWorldData.get().mBlockRegistry.createBlock(KnownBlockRepr.B_0_0_AIR); - } - public void deleteThis() throws Exception { + // TODO: delete all with given prefix WorldData worldData = mWorldData.get(); if (worldData == null) throw new RuntimeException("World data is null."); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.VERSION, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.DATA_2D, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.DATA_2D_LEGACY, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.PENDING_TICKS, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.GENERATOR_STAGE, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.BIOME_STATE, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.ENTITY, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.BLOCK_ENTITY, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.BLOCK_EXTRA_DATA, mDimension, (byte) 0, false); - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.V0_9_LEGACY_TERRAIN, mDimension, (byte) 0, false); - for (byte i = 0; i < 16; i++) { - worldData.removeChunkData(mChunkX, mChunkZ, ChunkTag.TERRAIN, mDimension, i, true); - } + worldData.removeFullChunk(mChunkX, mChunkZ, mDimension); // Prevent saving. mIsError = true; } - public final NBTChunkData getEntity() { return mEntity; } - public final NBTChunkData getBlockEntity() { return mTileEntity; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/ChunkTag.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/ChunkTag.java index 5ea022fc..be7ab281 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/ChunkTag.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/ChunkTag.java @@ -16,7 +16,8 @@ public enum ChunkTag { BLOCK_EXTRA_DATA((byte) 0x34),//TODO untested, 32768 bytes, used for top-snow. BIOME_STATE((byte) 0x35),//TODO untested GENERATOR_STAGE((byte) 0x36), - VERSION((byte) 0x76); + VERSION_PRE16((byte) 0x76), + VERSION((byte) 0x2c);; public final byte dataID; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/PocketChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/PocketChunk.java index 7fff07a0..f4a9ec15 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/PocketChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/PocketChunk.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk; import android.graphics.Color; @@ -5,7 +6,7 @@ import androidx.annotation.NonNull; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.map.Dimension; @@ -153,14 +154,14 @@ public int getGrassColor(int x, int z) { @NonNull @Override - public Block getBlock(int x, int y, int z) { + public OldBlock getBlock(int x, int y, int z) { return getBlock(x, y, z, 0); } @NonNull @Override - public Block getBlock(int x, int y, int z, int layer) { - return mWorldData.get().mBlockRegistry.createBlock(getKnownBlock(x, y, z, layer)); + public OldBlock getBlock(int x, int y, int z, int layer) { + return mWorldData.get().mOldBlockRegistry.createBlock(getKnownBlock(x, y, z, layer)); } @NonNull @@ -175,7 +176,7 @@ private KnownBlockRepr getKnownBlock(int x, int y, int z, int layer) { } @Override - public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { + public void setBlock(int x, int y, int z, int layer, @NonNull OldBlock oldBlock) { //TODO implement setBlock for pocket chunk } @@ -219,3 +220,4 @@ public void save() { if (mIsError || mIsVoid) return; } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/TempChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/TempChunk.java deleted file mode 100644 index e759041e..00000000 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/TempChunk.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.mithrilmania.blocktopograph.chunk; - -import com.mithrilmania.blocktopograph.Log; -import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.chunk.terrain.TerrainChunkData; -import com.mithrilmania.blocktopograph.map.Dimension; - -import java.lang.ref.WeakReference; -import java.util.concurrent.atomic.AtomicReferenceArray; - - -public class TempChunk { - -// public final WeakReference worldData; -// -// public final int x, z; -// public final Dimension dimension; -// -// private Version version; -// -// private AtomicReferenceArray terrain; -// -// private volatile NBTChunkData entity, blockEntity; -// -// public TempChunk(WorldData worldData, int x, int z, Dimension dimension) { -// this.worldData = new WeakReference<>(worldData); -// this.x = x; -// this.z = z; -// this.dimension = dimension; -// try { -// byte[] data = worldData.getChunkData(x, z, ChunkTag.VERSION, dimension, (byte) 0, false); -// this.version = Version.getVersion(data); -// } catch (WorldData.WorldDBLoadException | WorldData.WorldDBException e) { -// e.printStackTrace(); -// this.version = Version.ERROR; -// } -// terrain = new AtomicReferenceArray<>(16); -// Log.e("new Chunk " + x + "," + z); -// } -// -// public boolean load2dData() throws Version.VersionException { -// TerrainChunkData terr = getTerrain((byte) 0); -// if (null == terr) return false; -// else return terr.load2DData(); -// } -// -// public int getHeightMapValue(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getHeightMapValue(x, z); -// } -// -// public int getBiome(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getBiome(x, z); -// } -// -// public int getGrassR(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getGrassR(x, z); -// } -// -// public int getGrassG(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getGrassG(x, z); -// } -// -// public int getGrassB(int x, int z) throws Version.VersionException { -// return getTerrain((byte) 0).getGrassB(x, z); -// } -// -// public int getBlockLightValue(int x, int y, int z) throws Version.VersionException { -// return getTerrain((byte) (y / version.subChunkHeight)).getBlockLightValue(x, y % version.subChunkHeight, z); -// } -// -// public int getBlockTypeId(int x, int y, int z) throws Version.VersionException { -// return getTerrain((byte) (y / version.subChunkHeight)).getBlockTypeId(x, y % version.subChunkHeight, z); -// } -// -// public int getBlockData(int x, int y, int z) throws Version.VersionException { -// return getTerrain((byte) (y / version.subChunkHeight)).getBlockData(x, y % version.subChunkHeight, z); -// } -// -// public boolean supportsBlockLightValues() throws Version.VersionException { -// return getTerrain((byte) 0).supportsBlockLightValues(); -// } -// -// public int getHeightLimit() { -// switch (version) { -// //This one in lower case good trip leaving for next author. -// case v0_9: -// case OLD_LIMITED: -// return 128; -// case V1_0: -// case V1_1: -// case V1_2_PLUS: -// return 256; -// default: -// return 0; -// } -// } -// -// private TerrainChunkData getTerrain(byte subChunk) throws Version.VersionException { -// TerrainChunkData data = terrain.get(subChunk & 0xff); -// if (data == null) { -// data = this.getVersion().createTerrainChunkData(this, subChunk); -// terrain.set(subChunk & 0xff, data); -// } -// return data; -// } -// -// public NBTChunkData getEntity() throws Version.VersionException { -// if (entity == null) entity = this.getVersion().createEntityChunkData(this); -// return entity; -// } -// -// -// public NBTChunkData getBlockEntity() throws Version.VersionException { -// if (blockEntity == null) blockEntity = this.getVersion().createBlockEntityChunkData(this); -// return blockEntity; -// } -// -// public Version getVersion() { -// return version; -// } -// -// -// //TODO: should we use the heightmap??? -// public int getHighestBlockYAt(int x, int z) throws Version.VersionException { -// TerrainChunkData data; -// for (int subChunk = version.subChunks - 1; subChunk >= 0; subChunk--) { -// data = this.getTerrain((byte) subChunk); -// if (data == null || !data.loadTerrain()) continue; -// -// for (int y = version.subChunkHeight; y >= 0; y--) { -// if (data.getBlockTypeId(x & 15, y, z & 15) != 0) -// return (subChunk * version.subChunkHeight) + y; -// } -// } -// return -1; -// } -// -// public int getHighestBlockYUnderAt(int x, int z, int y) throws Version.VersionException { -// ///Meow -// ///if (worldData.isMeow()) return meowTeChData.getHighestBlockYUnderAt(x, y, z); -// -// Version cVersion = getVersion(); -// int offset = y % cVersion.subChunkHeight; -// int subChunk = y / cVersion.subChunkHeight; -// TerrainChunkData data; -// -// for (; subChunk >= 0; subChunk--) { -// data = this.getTerrain((byte) subChunk); -// if (data == null || !data.loadTerrain()) continue; -// -// for (y = offset; y >= 0; y--) { -// if (data.getBlockTypeId(x & 15, y, z & 15) != 0) -// return (subChunk * cVersion.subChunkHeight) + y; -// } -// -// //start at the top of the next chunk! (current offset might differ) -// offset = cVersion.subChunkHeight - 1; -// } -// return -1; -// } -// -// public int getCaveYUnderAt(int x, int z, int y) throws Version.VersionException { -// ///Meow -// ///if (worldData.isMeow()) return meowTeChData.getHighestBlockYUnderAt(x, y, z); -// -// Version cVersion = getVersion(); -// int offset = y % cVersion.subChunkHeight; -// int subChunk = y / cVersion.subChunkHeight; -// TerrainChunkData data; -// -// for (; subChunk >= 0; subChunk--) { -// data = this.getTerrain((byte) subChunk); -// if (data == null || !data.loadTerrain()) continue; -// for (y = offset; y >= 0; y--) { -// if (data.getBlockTypeId(x & 15, y, z & 15) == 0) -// return (subChunk * cVersion.subChunkHeight) + y; -// } -// -// //start at the top of the next chunk! (current offset might differ) -// offset = cVersion.subChunkHeight - 1; -// } -// return -1; -// } - - -} diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Version.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Version.java index 8b2b622b..5d0386d3 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Version.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/Version.java @@ -15,9 +15,10 @@ public enum Version { v0_9("v0.9.0", "infinite xz, zlib leveldb; introduced in v0.9.0", 2, 128, 1), V1_0("v1.0.0", "Stacked sub-chunks, 256 world-height, 16 high sub-chunks; introduced in alpha v1.0.0 (v0.17)", 3, 16, 16), V1_1("v1.1.0", "KnownBlockRepr-light is not stored anymore", 4, 16, 16), - V1_2_PLUS("v1.2.0.13", "Global numeric id replaced with string id and per-chunk numeric id", 7, 16, 16); + V1_2_PLUS("v1.2.0.13", "Global numeric id replaced with string id and per-chunk numeric id", 7, 16, 16), + V1_16_PLUS("v1.16(17)", "val is replaced by block states",0x16,16,16); - public static final int LATEST_SUPPORTED_VERSION = V1_2_PLUS.id; + public static final int LATEST_SUPPORTED_VERSION = V1_16_PLUS.id; public final String displayName, description; public final int id, subChunkHeight, subChunks; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/VoidChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/VoidChunk.java index 27d66c8e..6c521804 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/VoidChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/VoidChunk.java @@ -4,6 +4,9 @@ import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.map.Dimension; @@ -50,18 +53,19 @@ public int getGrassColor(int x, int z) { @NonNull @Override - public Block getBlock(int x, int y, int z) { - return getBlock(x, y, z, 0); + public BlockTemplate getBlockTemplate(int x, int y, int z, int layer) { + return BlockTemplates.getAirTemplate(); } @NonNull @Override public Block getBlock(int x, int y, int z, int layer) { - return getAir(); + throw new RuntimeException(); } @Override public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { + throw new RuntimeException(); } @Override diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/PreV1d2d13TerrainSubChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/PreV1d2d13TerrainSubChunk.java index 893f1cd5..3cb23bb6 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/PreV1d2d13TerrainSubChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/PreV1d2d13TerrainSubChunk.java @@ -1,10 +1,11 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import androidx.annotation.NonNull; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.OldBlock; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.map.Dimension; @@ -20,9 +21,9 @@ public final class PreV1d2d13TerrainSubChunk extends TerrainSubChunk { private ByteBuffer mData; - PreV1d2d13TerrainSubChunk(@NonNull ByteBuffer raw, @NonNull BlockRegistry blockRegistry) { + PreV1d2d13TerrainSubChunk(@NonNull ByteBuffer raw, @NonNull OldBlockRegistry oldBlockRegistry) { - super(blockRegistry); + super(oldBlockRegistry); int size = raw.capacity(); if (size < POS_SKY_LIGHT || size > TERRAIN_MAX_LENGTH) { @@ -38,7 +39,7 @@ public final class PreV1d2d13TerrainSubChunk extends TerrainSubChunk { @NonNull @Override - public Block getBlock(int x, int y, int z, int layer) { + public OldBlock getBlock(int x, int y, int z, int layer) { if (mIsError) return getAir(); int offset = getOffset(x, y, z); int id = mData.get(POS_BLOCK_IDS + offset) & 0xff; @@ -48,7 +49,7 @@ public Block getBlock(int x, int y, int z, int layer) { } @Override - public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { + public void setBlock(int x, int y, int z, int layer, @NonNull OldBlock oldBlock) { // TODO implement setBlock for pre v1.2.13 subChunk. } @@ -73,3 +74,4 @@ public void save(WorldData worldData, int chunkX, int chunkZ, Dimension dimensio // TODO implement save for pre v1.2.13 subChunk. } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/TerrainSubChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/TerrainSubChunk.java index 4e4bb6f5..9940a14d 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/TerrainSubChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/TerrainSubChunk.java @@ -5,43 +5,42 @@ import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; -import com.mithrilmania.blocktopograph.block.KnownBlockRepr; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.map.Dimension; import java.io.IOException; -import java.lang.ref.WeakReference; import java.nio.ByteBuffer; public abstract class TerrainSubChunk { - private final WeakReference mBlockRegistry; +// private final WeakReference mBlockRegistry; boolean mHasSkyLight; boolean mHasBlockLight; boolean mIsError; - protected TerrainSubChunk(@NonNull BlockRegistry blockRegistry) { - mBlockRegistry = new WeakReference<>(blockRegistry); + protected TerrainSubChunk() { +// mBlockRegistry = new WeakReference<>(oldBlockRegistry); } @Nullable - public static TerrainSubChunk create(@NonNull byte[] rawData, @NonNull BlockRegistry blockRegistry) { + public static TerrainSubChunk create(@NonNull byte[] rawData) { TerrainSubChunk subChunk; ByteBuffer byteBuffer = ByteBuffer.wrap(rawData); switch (rawData[0]) { - case 0: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - subChunk = new PreV1d2d13TerrainSubChunk(byteBuffer, blockRegistry); - break; +// case 0: +// case 2: +// case 3: +// case 4: +// case 5: +// case 6: +// case 7: +// subChunk = new PreV1d2d13TerrainSubChunk(byteBuffer, oldBlockRegistry); +// break; case 1: case 8: - subChunk = new V1d2d13TerrainSubChunk(byteBuffer, blockRegistry); + subChunk = new V1d2d13TerrainSubChunk(byteBuffer); break; default: subChunk = null; @@ -50,7 +49,7 @@ public static TerrainSubChunk create(@NonNull byte[] rawData, @NonNull BlockRegi } @Nullable - public static TerrainSubChunk createEmpty(int preferredVersion, @NonNull BlockRegistry blockRegistry) { + public static TerrainSubChunk createEmpty(int preferredVersion) { TerrainSubChunk subChunk; switch (preferredVersion) { case 0: @@ -64,7 +63,7 @@ public static TerrainSubChunk createEmpty(int preferredVersion, @NonNull BlockRe break; case 1: case 8: - subChunk = new V1d2d13TerrainSubChunk(blockRegistry); + subChunk = new V1d2d13TerrainSubChunk(); break; default: subChunk = null; @@ -72,16 +71,14 @@ public static TerrainSubChunk createEmpty(int preferredVersion, @NonNull BlockRe return subChunk; } - @NonNull - protected Block getAir() { - return wrapKnownBlock(KnownBlockRepr.B_0_0_AIR); - } +// @NonNull +// protected OldBlock wrapKnownBlock(KnownBlockRepr knownBlock) { +// // TODO: This would be not efficiency for old saves, add corresponding oldBlock to known blocks. +// return mBlockRegistry.get().createBlock(knownBlock); +// } @NonNull - protected Block wrapKnownBlock(KnownBlockRepr knownBlock) { - // TODO: This would be not efficiency for old saves, add corresponding block to known blocks. - return mBlockRegistry.get().createBlock(knownBlock); - } + abstract public BlockTemplate getBlockTemplate(int x, int y, int z, int layer); @NonNull abstract public Block getBlock(int x, int y, int z, int layer); @@ -106,14 +103,14 @@ public final boolean isError() { return mIsError; } - @Nullable - protected BlockRegistry getBlockRegistry() { - BlockRegistry blockRegistry = mBlockRegistry.get(); - if (blockRegistry == null) { - mIsError = true; - } - return blockRegistry; - } +// @Nullable +// protected OldBlockRegistry getBlockRegistry() { +// OldBlockRegistry oldBlockRegistry = mBlockRegistry.get(); +// if (oldBlockRegistry == null) { +// mIsError = true; +// } +// return oldBlockRegistry; +// } abstract public void save(WorldData worldData, int chunkX, int chunkZ, Dimension dimension, int which) throws WorldData.WorldDBException, IOException; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V0_9_TerrainChunkData.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V0_9_TerrainChunkData.java index a16916e5..7838fec8 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V0_9_TerrainChunkData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V0_9_TerrainChunkData.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import com.mithrilmania.blocktopograph.WorldData; @@ -163,9 +164,11 @@ public boolean supportsBlockLightValues() { return true; } - /** + */ +/** * Sets a block type, and also set the corresponding dirty table entry and set the saving flag. - */ + *//* + @Override public void setBlockTypeId(int x, int y, int z, int type) { if (x >= chunkW || y >= chunkH || z >= chunkL || x < 0 || y < 0 || z < 0) { @@ -223,3 +226,4 @@ public int getHeightMapValue(int x, int z) { } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_0_TerrainChunkData.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_0_TerrainChunkData.java index 4823e156..8d1eda7a 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_0_TerrainChunkData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_0_TerrainChunkData.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import com.mithrilmania.blocktopograph.WorldData; @@ -183,9 +184,11 @@ public boolean supportsBlockLightValues() { return true; } - /** + */ +/** * Sets a block type, and also set the corresponding dirty table entry and set the saving flag. - */ + *//* + @Override public void setBlockTypeId(int x, int y, int z, int type) { if (x >= chunkW || y >= chunkH || z >= chunkL || x < 0 || y < 0 || z < 0) { @@ -218,10 +221,12 @@ public byte getBiome(int x, int z) { return data2D.get(POS_BIOME_DATA + get2Di(x, z)); } - /* + */ +/* MCPE 1.0 stopped embedding foliage color data in the chunk data, so now we fake the colors by combining biome colors with Perlin noise - */ + *//* + @Override public byte getGrassR(int x, int z) { @@ -254,3 +259,4 @@ public int getHeightMapValue(int x, int z) { return ((h & 0xff) << 8) | ((h >> 8) & 0xff);//little endian to big endian } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_1_TerrainChunkData.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_1_TerrainChunkData.java index 703a8754..e838c7cf 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_1_TerrainChunkData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_1_TerrainChunkData.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import com.mithrilmania.blocktopograph.WorldData; @@ -181,9 +182,11 @@ public boolean supportsBlockLightValues() { return false; } - /** + */ +/** * Sets a block type, and also set the corresponding dirty table entry and set the saving flag. - */ + *//* + @Override public void setBlockTypeId(int x, int y, int z, int type) { if (x >= chunkW || y >= chunkH || z >= chunkL || x < 0 || y < 0 || z < 0) { @@ -216,10 +219,12 @@ public byte getBiome(int x, int z) { return data2D.get(POS_BIOME_DATA + get2Di(x, z)); } - /* + */ +/* MCPE 1.0 stopped embedding foliage color data in the chunk data, so now we fake the colors by combining biome colors with Perlin noise - */ + *//* + @Override public byte getGrassR(int x, int z) { @@ -252,3 +257,4 @@ public int getHeightMapValue(int x, int z) { return ((h & 0xff) << 8) | ((h >> 8) & 0xff);//little endian to big endian } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_2_Plus_TerrainChunkData.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_2_Plus_TerrainChunkData.java index a90486c6..655b493b 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_2_Plus_TerrainChunkData.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1_2_Plus_TerrainChunkData.java @@ -1,3 +1,4 @@ +/* package com.mithrilmania.blocktopograph.chunk.terrain; import com.mithrilmania.blocktopograph.WorldData; @@ -36,7 +37,7 @@ public class V1_2_Plus_TerrainChunkData extends TerrainChunkData { public static final int POS_BIOME_DATA = POS_HEIGHTMAP + area + area; public static final int DATA2D_LENGTH = POS_BIOME_DATA + area; - //Masks used to extract BlockState bits of a certain block out of a int32, and vice-versa. + //Masks used to extract BlockState bits of a certain oldBlock out of a int32, and vice-versa. private static final int[] msk = {0b1, 0b11, 0b111, 0b1111, 0b11111, 0b111111, 0b1111111, 0b11111111, 0b111111111, 0b1111111111, 0b11111111111, @@ -232,7 +233,7 @@ public byte getSkyLightValue(int x, int y, int z) { @Override public byte getBlockLightValue(int x, int y, int z) { - //block light is not stored anymore + //oldBlock light is not stored anymore return 0; } @@ -241,9 +242,11 @@ public boolean supportsBlockLightValues() { return false; } - /** - * Sets a block type, and also set the corresponding dirty table entry and set the saving flag. - */ + */ +/** + * Sets a oldBlock type, and also set the corresponding dirty table entry and set the saving flag. + *//* + @Override public void setBlockTypeId(int x, int y, int z, int type) { if (x >= chunkW || y >= chunkH || z >= chunkL || x < 0 || y < 0 || z < 0) { @@ -298,3 +301,4 @@ public int getHeightMapValue(int x, int z) { return ((h & 0xff) << 8) | ((h >> 8) & 0xff);//little endian to big endian } } +*/ diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1d2d13TerrainSubChunk.java b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1d2d13TerrainSubChunk.java index 410cff9c..b5c69f3f 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1d2d13TerrainSubChunk.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/chunk/terrain/V1d2d13TerrainSubChunk.java @@ -1,20 +1,28 @@ package com.mithrilmania.blocktopograph.chunk.terrain; +import android.util.Pair; + import androidx.annotation.NonNull; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Streams; +import com.mithrilmania.blocktopograph.BuildConfig; +import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.WorldData; import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; -import com.mithrilmania.blocktopograph.block.KnownBlockRepr; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.BlockType; +import com.mithrilmania.blocktopograph.block.blockproperty.BlockProperty; import com.mithrilmania.blocktopograph.chunk.ChunkTag; import com.mithrilmania.blocktopograph.map.Dimension; import com.mithrilmania.blocktopograph.nbt.convert.NBTInputStream; import com.mithrilmania.blocktopograph.nbt.convert.NBTOutputStream; +import com.mithrilmania.blocktopograph.nbt.tags.ByteTag; import com.mithrilmania.blocktopograph.nbt.tags.CompoundTag; import com.mithrilmania.blocktopograph.nbt.tags.IntTag; -import com.mithrilmania.blocktopograph.nbt.tags.ShortTag; import com.mithrilmania.blocktopograph.nbt.tags.StringTag; -import com.mithrilmania.blocktopograph.nbt.tags.Tag; import com.mithrilmania.blocktopograph.util.LittleEndianOutputStream; import java.io.ByteArrayInputStream; @@ -24,33 +32,32 @@ import java.nio.ByteOrder; import java.nio.IntBuffer; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; +import java.util.stream.Collectors; public final class V1d2d13TerrainSubChunk extends TerrainSubChunk { - private static final String PALETTE_KEY_NAME = "name"; - private static final String PALETTE_KEY_VAL = "val"; - private static final String PREFIX_MINECRAFT = "minecraft:"; private boolean mIsDualStorageSupported; - // Masks used to extract BlockState bits of a certain block out of a int32, and vice-versa. + // Masks used to extract BlockState bits of a certain oldBlock out of a int32, and vice-versa. private static final int[] msk = {0b1, 0b11, 0b111, 0b1111, 0b11111, 0b111111, 0b1111111, 0b11111111, 0b111111111, 0b1111111111, 0b11111111111, 0b111111111111, 0b1111111111111, 0b11111111111111, 0b11111111111111}; // There could be multiple BlockStorage let's read the first two. - private volatile BlockStorage[] mStorages; + private final BlockStorage[] mStorages; - V1d2d13TerrainSubChunk(@NonNull BlockRegistry blockRegistry) { - super(blockRegistry); + V1d2d13TerrainSubChunk() { mStorages = new BlockStorage[2]; - mIsDualStorageSupported = false; + mIsDualStorageSupported = true; createEmptyBlockStorage(0); } - V1d2d13TerrainSubChunk(@NonNull ByteBuffer raw, @NonNull BlockRegistry blockRegistry) { - super(blockRegistry); + V1d2d13TerrainSubChunk(@NonNull ByteBuffer raw) { raw.order(ByteOrder.LITTLE_ENDIAN); mStorages = new BlockStorage[2]; @@ -62,9 +69,11 @@ public final class V1d2d13TerrainSubChunk extends TerrainSubChunk { mIsDualStorageSupported = false; raw.position(1); try { - loadBlockStorage(raw, 0); + mStorages[0] = BlockStorage.loadAndMoveForward(raw); } catch (IOException e) { - e.printStackTrace(); + if (BuildConfig.DEBUG) { + Log.d(this, e); + } mIsError = true; } break; @@ -78,10 +87,12 @@ public final class V1d2d13TerrainSubChunk extends TerrainSubChunk { return; } try { - loadBlockStorage(raw, 0); - if (count > 1) loadBlockStorage(raw, 1); + mStorages[0] = BlockStorage.loadAndMoveForward(raw); + if (count > 1) mStorages[1] = BlockStorage.loadAndMoveForward(raw); } catch (IOException e) { - e.printStackTrace(); + if (BuildConfig.DEBUG) { + Log.d(this, e); + } mIsError = true; } break; @@ -94,252 +105,41 @@ public final class V1d2d13TerrainSubChunk extends TerrainSubChunk { } @NonNull - private static BlockStorage.BlockRecord createNewBlockRecord(@NonNull Block block) { - BlockStorage.BlockRecord blockRecord = new BlockStorage.BlockRecord(); - blockRecord.blockResolved = block; - StringTag nameTag = new StringTag(PALETTE_KEY_NAME, block.getBlockType()); - ArrayList pitem = new ArrayList<>(2); - pitem.add(nameTag); - pitem.add(block.getStates()); - pitem.add(new IntTag("version", block.getVersion())); - blockRecord.tag = new CompoundTag("", pitem); - return blockRecord; - } - - private boolean setBlockIfSpace( - int x, int y, int z, @NonNull BlockStorage storage, @NonNull Block block) { - int code = -1; - - // If in palette. - List palette = storage.palette; - for (int localId = 0, paletteSize = palette.size(); localId < paletteSize; localId++) { - Block blockInPalette = palette.get(localId).blockResolved; - if (block.equals(blockInPalette)) { - code = localId; - break; - } - } - - // Or not. - if (code < 0) { - // Reached size limit. - int max = 1 << storage.blockCodeLenth; - int size = palette.size(); - if (size >= max) return false; - - BlockRegistry blockRegistry = getBlockRegistry(); - if (blockRegistry == null) return true; - - palette.add(createNewBlockRecord(block)); - code = size; - } - - // The codeOffset'th BlockState is wanted. - int codeOffset = getOffset(x, y, z); - - // How much BlockStates can one int32 hold? - int intCapa = 32 / storage.blockCodeLenth; - - // The int32 that holds the wanted BlockState. - int whichInt = codeOffset / intCapa; - int stick = storage.records.get(whichInt); - int shift = codeOffset % intCapa * storage.blockCodeLenth; - stick &= ~(msk[storage.blockCodeLenth - 1] << shift); - stick |= code << shift; - storage.records.put(whichInt, stick); - - return true; - } - - private void writeStorage(@NonNull BlockStorage storage, @NonNull LittleEndianOutputStream stream) throws IOException { - - // Code length. - stream.write(storage.blockCodeLenth << 1); - - // Int32s. - stream.write(storage.raw); - - // Palette size. - List palette = storage.palette; - int size = palette.size(); - stream.writeInt(size); - - // Palettes. - NBTOutputStream nos = new NBTOutputStream(stream, false, true); - - BlockRegistry blockRegistry = getBlockRegistry(); - if (blockRegistry == null) return; - for (int j = 0; j < size; j++) - nos.writeTag(palette.get(j).tag); - } - -// public CompoundTag[] tempGetPalettes(int baseX, int y, int z) { -// return new CompoundTag[]{ -// tempGetPaletteItemOfPosition(baseX, y, z), -// tempGetPaletteItemOfPosition(baseX + 8, y, z) -// }; -// } -// -// private CompoundTag tempGetPaletteItemOfPosition(int x, int y, int z) { -// BlockStorage storage = mStorages[0]; -// -// //The codeOffset'th BlockState is wanted. -// int codeOffset = getOffset(x, y, z); -// -// //How much BlockStates can one int32 hold? -// int intCapa = 32 / storage.blockCodeLenth; -// -// //The int32 that holds the wanted BlockState. -// int stick = storage.records.get(codeOffset / intCapa); -// -// //Get the BlockState. It's also the index in palette array. -// int ind = (stick >> (codeOffset % intCapa * storage.blockCodeLenth)) & msk[storage.blockCodeLenth - 1]; -// -// //Transform the local BlockState into global id<<8|data structure. -// return storage.palette.get(ind).tag; -// } - - private void loadBlockStorage(@NonNull ByteBuffer raw, int which) throws IOException { - - BlockStorage storage = new BlockStorage(); - mStorages[which] = storage; - - //Read BlockState length. - //this byte = (length << 2) | serializedType. - storage.blockCodeLenth = (raw.get() & 0xff) >> 1; - - if (storage.blockCodeLenth > 16) throw new IOException("mBlockLength > 16"); - - //We use this much of bytes to store BlockStates. - int bufsize = (4095 / (32 / storage.blockCodeLenth) + 1) << 2; - byte[] arr = new byte[bufsize]; - ByteBuffer byteBuffer = ByteBuffer.wrap(arr); - byteBuffer.order(ByteOrder.LITTLE_ENDIAN); - storage.records = byteBuffer.asIntBuffer(); - storage.raw = arr; - - //No convenient way copy these stuff. - byteBuffer.put(raw.array(), raw.position(), bufsize); - raw.position(raw.position() + bufsize); - - //Palette items count. - int psize = raw.getInt(); - -// if(psize>(1< most possible bound"); -// } - - //Construct the palette. Each item is a piece of nbt data. - storage.palette = new ArrayList<>(16); - - //NBT reader requires a stream. - ByteArrayInputStream bais = new ByteArrayInputStream(raw.array()); - - // Skip for byte array would not fail. - //noinspection ResultOfMethodCallIgnored - bais.skip(raw.position()); - - //Wrap it. - NBTInputStream nis = new NBTInputStream(bais, false); - BlockRegistry blockRegistry = getBlockRegistry(); - if (blockRegistry == null) return; - for (int i = 0; i < psize; i++) { - - //Read a piece of nbt data, represented by a root CompoundTag. - CompoundTag tag = (CompoundTag) nis.readTag(); - BlockStorage.BlockRecord record = new BlockStorage.BlockRecord(); - record.tag = tag; - - //Read `name` and `val` then resolve the `name` into numeric id. - String name = ((StringTag) tag.getChildTagByKey(PALETTE_KEY_NAME)).getValue(); - Tag statesTag = tag.getChildTagByKey("states"); - if (statesTag != null) { - Tag verTag = tag.getChildTagByKey("version"); - record.blockResolved = blockRegistry.createBlock(name, (CompoundTag) statesTag, - verTag == null ? 2 : ((IntTag) verTag).getValue()); - } else { - Tag valTag = tag.getChildTagByKey(PALETTE_KEY_VAL); - KnownBlockRepr repr = KnownBlockRepr.getBlockNew(name, - valTag instanceof ShortTag ? ((ShortTag) valTag).getValue() : 0); - if (repr == null) repr = KnownBlockRepr.guessBlockNew(name); - record.blockResolved = blockRegistry.createBlock(repr); - } - storage.palette.add(record); - } - - //If one day we need to read more BlockStorage's, this line helps. - raw.position(raw.position() + nis.getReadCount()); + @Override + public BlockTemplate getBlockTemplate(int x, int y, int z, int layer) { + if (mIsError) return BlockTemplates.getAirTemplate(); + BlockStorage storage = mStorages[layer]; + if (storage == null) return BlockTemplates.getAirTemplate(); + return storage.getBlock(x, y, z).second; } @NonNull @Override public Block getBlock(int x, int y, int z, int layer) { - - if (mIsError) return getAir(); - + if (mIsError) throw new RuntimeException(); BlockStorage storage = mStorages[layer]; - if (storage == null) return getAir(); - - //The codeOffset'th BlockState is wanted. - int codeOffset = getOffset(x, y, z); - - //How much BlockStates can one int32 hold? - int intCapa = 32 / storage.blockCodeLenth; - - //The int32 that holds the wanted BlockState. - int stick = storage.records.get(codeOffset / intCapa); - - //Get the BlockState. It's also the index in palette array. - int ind = (stick >> (codeOffset % intCapa * storage.blockCodeLenth)) & msk[storage.blockCodeLenth - 1]; - - //Transform the local BlockState into global id<<8|data structure. - return storage.palette.get(ind).blockResolved; + if (storage == null) return BlockTemplates.getAirTemplate().getBlock(); + return storage.getBlock(x, y, z).first; } @Override public void setBlock(int x, int y, int z, int layer, @NonNull Block block) { // Has error or not supported. - if (mIsError || (layer > 0 && !mIsDualStorageSupported)) return; + if (mIsError || (layer > 0 && !mIsDualStorageSupported)) throw new RuntimeException(); BlockStorage storage = mStorages[layer]; // Main storage won't be null unless error. - if (storage == null) storage = createEmptyBlockStorage(1); + if (storage == null) storage = createEmptyBlockStorage(layer); // If space is enough. - if (setBlockIfSpace(x, y, z, storage, block)) return; + if (storage.setBlockIfSpace(x, y, z, block)) return; // Or we have to extend the whole storage. - BlockStorage newStorage = new BlockStorage(); - newStorage.blockCodeLenth = storage.blockCodeLenth + 1; - newStorage.palette = new ArrayList<>(storage.palette); - int capa_new = 32 / newStorage.blockCodeLenth; - int capa_old = 32 / storage.blockCodeLenth; - int stick = 4095 / capa_new + 1; - byte[] newRecs = new byte[stick << 2]; - ByteBuffer newBb = ByteBuffer.wrap(newRecs); - newBb.order(ByteOrder.LITTLE_ENDIAN); - newStorage.records = newBb.asIntBuffer(); - newStorage.raw = newRecs; - - for (int i = 0, hold = 0, hnew = 0, mold = 0, mnew = 0; i < 4096; i++) { - int idold = - (storage.records.get(hold) >> (mold * storage.blockCodeLenth)) & msk[storage.blockCodeLenth - 1]; - idold <<= mnew * newStorage.blockCodeLenth; - newStorage.records.put(hnew, newStorage.records.get(hnew) | idold); - mold++; - mnew++; - if (mold == capa_old) { - mold = 0; - hold++; - } - if (mnew == capa_new) { - mnew = 0; - hnew++; - } - } - mStorages[layer] = newStorage; - setBlockIfSpace(x, y, z, newStorage, block); + storage = BlockStorage.extend(storage); + + mStorages[layer] = storage; + storage.setBlockIfSpace(x, y, z, block); } @Override @@ -353,21 +153,8 @@ public int getSkyLightValue(int x, int y, int z) { } private BlockStorage createEmptyBlockStorage(int which) { - - BlockStorage storage = new BlockStorage(); + BlockStorage storage = BlockStorage.createNew(); mStorages[which] = storage; - - byte[] arr = new byte[512]; - ByteBuffer bbuff = ByteBuffer.wrap(arr); - bbuff.order(ByteOrder.LITTLE_ENDIAN); - storage.records = bbuff.asIntBuffer(); - storage.raw = arr; - - storage.palette = new ArrayList<>(4); - storage.palette.add(createNewBlockRecord(getAir())); - - storage.blockCodeLenth = 1; - return storage; } @@ -384,11 +171,11 @@ public void save(WorldData worldData, int chunkX, int chunkZ, Dimension dimensio if (mIsDualStorageSupported) { leos.write(8); leos.write(storageCount); - writeStorage(mStorages[0], leos); - if (storageCount == 2) writeStorage(mStorages[1], leos); + mStorages[0].write(leos); + if (storageCount == 2) mStorages[1].write(leos); } else { leos.write(1); - writeStorage(mStorages[0], leos); + mStorages[0].write(leos); } leos.flush(); @@ -399,19 +186,241 @@ public void save(WorldData worldData, int chunkX, int chunkZ, Dimension dimensio private static class BlockStorage { - byte[] raw; + public static final String PALETTE_KEY_ROOT = ""; + public static final String PALETTE_KEY_NAME = "name"; + public static final String PALETTE_KEY_STATES = "states"; + public static final String PALETTE_KEY_VERSION = "version"; + + private final byte[] raw; + + // records is a view into raw + private final IntBuffer records; + + private final List palette; - IntBuffer records; + private final List renderPalette; - List palette; + private final int blockCodeLenth; - int blockCodeLenth; + private BlockStorage() { + raw = new byte[512]; + ByteBuffer bbuff = ByteBuffer.wrap(raw); + bbuff.order(ByteOrder.LITTLE_ENDIAN); + records = bbuff.asIntBuffer(); - static class BlockRecord { + palette = new ArrayList<>(4); + renderPalette = new ArrayList<>(4); + var airTemplate = BlockTemplates.getAirTemplate(); + renderPalette.add(airTemplate); + palette.add(airTemplate.getBlock()); - CompoundTag tag; - Block blockResolved; + blockCodeLenth = 1; + } + + // stateful! wrapping with static creation method + private BlockStorage(@NonNull ByteBuffer buffer) throws IOException { + + //Read BlockState length. + //this byte = (length << 2) | serializedType. + blockCodeLenth = (buffer.get() & 0xff) >> 1; + + if (blockCodeLenth > 16) throw new IOException("mBlockLength > 16"); + + //We use this much of bytes to store BlockStates. + int bufsize = (4095 / (32 / blockCodeLenth) + 1) << 2; + byte[] arr = new byte[bufsize]; + ByteBuffer byteBuffer = ByteBuffer.wrap(arr); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + records = byteBuffer.asIntBuffer(); + raw = arr; + + //No convenient way copy these stuff. + byteBuffer.put(buffer.array(), buffer.position(), bufsize); + buffer.position(buffer.position() + bufsize); + + //Palette items count. + int psize = buffer.getInt(); + +// if(psize>(1< most possible bound"); +// } + + //Construct the palette. Each item is a piece of nbt data. + palette = new ArrayList<>(16); + renderPalette = new ArrayList<>(16); + + //NBT reader requires a stream. + var bais = new ByteArrayInputStream(buffer.array()); + + // Skip for byte array would not fail. + //noinspection ResultOfMethodCallIgnored + bais.skip(buffer.position()); + + //Wrap it. + var nis = new NBTInputStream(bais, false); + for (int i = 0; i < psize; i++) + //Read a piece of nbt data, represented by a root CompoundTag. + addToPalette(deserializeBlock((CompoundTag) nis.readTag())); + + //If one day we need to read more BlockStorage's, this line helps. + buffer.position(buffer.position() + nis.getReadCount()); + } + + private BlockStorage(@NonNull BlockStorage old) { + blockCodeLenth = old.blockCodeLenth + 1; + palette = new ArrayList<>(old.palette); + renderPalette = new ArrayList<>(old.renderPalette); + int capa_new = 32 / blockCodeLenth; + int capa_old = 32 / old.blockCodeLenth; + int stick = 4095 / capa_new + 1; + byte[] newRecs = new byte[stick << 2]; + ByteBuffer newBb = ByteBuffer.wrap(newRecs); + newBb.order(ByteOrder.LITTLE_ENDIAN); + records = newBb.asIntBuffer(); + raw = newRecs; + for (int i = 0, hold = 0, hnew = 0, mold = 0, mnew = 0; i < 4096; i++) { + int idold = + (old.records.get(hold) >> (mold * old.blockCodeLenth)) & msk[old.blockCodeLenth - 1]; + idold <<= mnew * blockCodeLenth; + records.put(hnew, records.get(hnew) | idold); + mold++; + mnew++; + if (mold == capa_old) { + mold = 0; + hold++; + } + if (mnew == capa_new) { + mnew = 0; + hnew++; + } + } + } + + public static BlockStorage createNew() { + return new BlockStorage(); + } + + public static BlockStorage loadAndMoveForward(@NonNull ByteBuffer buffer) throws IOException { + return new BlockStorage(buffer); + } + + public static BlockStorage extend(@NonNull BlockStorage storage) { + return new BlockStorage(storage); + } + + private void addToPalette(Block block) { + palette.add(block); + renderPalette.add(BlockTemplates.getBest(block)); + } + + public boolean setBlockIfSpace( + int x, int y, int z, @NonNull Block block) { + int code = -1; + + // If in palette. + for (int localId = 0, paletteSize = palette.size(); localId < paletteSize; localId++) { + Block blockInPalette = palette.get(localId); + if (block.equals(blockInPalette)) { + code = localId; + break; + } + } + + // Or not. + if (code < 0) { + // Reached size limit. + int max = 1 << blockCodeLenth; + int size = palette.size(); + if (size >= max) return false; + + addToPalette(block); + code = size; + } + + // The codeOffset'th BlockState is wanted. + int codeOffset = getOffset(x, y, z); + + // How much BlockStates can one int32 hold? + int intCapa = 32 / blockCodeLenth; + + // The int32 that holds the wanted BlockState. + int whichInt = codeOffset / intCapa; + int stick = records.get(whichInt); + int shift = codeOffset % intCapa * blockCodeLenth; + stick &= ~(msk[blockCodeLenth - 1] << shift); + stick |= code << shift; + records.put(whichInt, stick); + + return true; + } + + public Pair getBlock(int x, int y, int z) { + + //The codeOffset'th BlockState is wanted. + int codeOffset = getOffset(x, y, z); + + //How much BlockStates can one int32 hold? + int intCapa = 32 / blockCodeLenth; + + //The int32 that holds the wanted BlockState. + int stick = records.get(codeOffset / intCapa); + + //Get the BlockState. It's also the index in palette array. + int ind = (stick >> (codeOffset % intCapa * blockCodeLenth)) & msk[blockCodeLenth - 1]; + + //Transform the local BlockState into global id<<8|data structure. + return new Pair<>(palette.get(ind), renderPalette.get(ind)); + } + + private void write(@NonNull LittleEndianOutputStream stream) throws IOException { + + // Code length. + stream.write(blockCodeLenth << 1); + + // Int32s. + stream.write(raw); + + // Palette size. + int size = palette.size(); + stream.writeInt(size); + + // Palettes. + NBTOutputStream nos = new NBTOutputStream(stream, false, true); + + for (int j = 0; j < size; j++) + nos.writeTag(serializeBlock(palette.get(j))); + } + + private static CompoundTag serializeBlock(@NonNull Block block) { + return new CompoundTag(PALETTE_KEY_ROOT, Lists.newArrayList( + new StringTag(PALETTE_KEY_NAME, block.getName()), + new CompoundTag(PALETTE_KEY_STATES, new ArrayList<>(Streams.concat(Streams.zip( + Arrays.stream(block.getType().getKnownProperties()).map(BlockProperty::getName), + Arrays.stream(block.getKnownProperties()), Maps::immutableEntry).filter(Objects::nonNull), + block.getCustomProperties().entrySet().stream()).map( + (entry) -> { + var name = entry.getKey(); + var val = entry.getValue(); + if (val instanceof Byte) return new ByteTag(name, (Byte) val); + else if (val instanceof Integer) + return new IntTag(name, (Integer) val); + else if (val instanceof String) + return new StringTag(name, (String) val); + else + throw new RuntimeException("block state with unsupported type"); + }).collect(Collectors.toList()))), + new IntTag(PALETTE_KEY_VERSION, 2012) + )); + } + private static Block deserializeBlock(@NonNull CompoundTag tag) { + var name = ((StringTag) tag.getChildTagByKey(PALETTE_KEY_NAME)).getValue(); + var blockType = BlockType.get(name); + var builder = (blockType == null ? new Block.Builder(name) : new Block.Builder(blockType)); + for (var state : ((CompoundTag) tag.getChildTagByKey(PALETTE_KEY_STATES)).getValue()) + builder.setProperty(state); + Log.d(BlockStorage.class, "fuckfuckversion" + tag.getChildTagByKey(PALETTE_KEY_VERSION).getValue()); + return builder.build(); } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditFlatFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditFlatFragment.java index 0985aeea..96d1e068 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditFlatFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditFlatFragment.java @@ -19,6 +19,7 @@ import com.google.android.material.snackbar.Snackbar; import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.R; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.databinding.FragLayersBinding; import com.mithrilmania.blocktopograph.databinding.ItemWorldLayerBinding; @@ -153,13 +154,13 @@ public long getUniqueItemId(int i) { } void loadDefault() { - Layer layer = new Layer(ListingBlock.B_7_BEDROCK, 1); + Layer layer = new Layer(BlockTemplates.getOfType("minecraft:bedrock")[0], 1); addItem(0, layer); - layer = new Layer(ListingBlock.B_3_DIRT, 29); + layer = new Layer(BlockTemplates.getOfType("minecraft:dirt")[0], 29); addItem(0, layer); - layer = new Layer(ListingBlock.B_2_GRASS, 1); + layer = new Layer(BlockTemplates.getOfType("minecraft:grass")[0], 1); addItem(0, layer); - layer = new Layer(ListingBlock.B_31_TALLGRASS, 1); + layer = new Layer(BlockTemplates.getOfType("minecraft:tallgrass")[0],1); addItem(0, layer); } @@ -205,7 +206,7 @@ public void onBindViewHolder(@NonNull MeowHolder holder, int position) { super.onBindViewHolder(holder, position); Layer layer = mItemList.get(position); holder.binding.setLayer(layer); - holder.binding.icon.setImageBitmap(layer.block.getIcon(assMan)); + holder.binding.icon.setImageBitmap(layer.block.getIcon().getIcon(getContext())); } @Override @@ -216,7 +217,7 @@ public void onItemSwipeStarted(ListSwipeItem item) { private MeowHolder getHolderFromTag(@NonNull ListSwipeItem view) { Object tag = view.getTag(); if (!(tag instanceof WeakReference)) return null; - WeakReference ref = (WeakReference) tag; + WeakReference ref = (WeakReference) tag; Object mho = ref.get(); return (MeowHolder) mho; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditLayerDialog.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditLayerDialog.java index 0315433e..25f75a87 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditLayerDialog.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/EditLayerDialog.java @@ -15,6 +15,7 @@ import com.andreabaccega.widget.FormEditText; import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.R; +import com.mithrilmania.blocktopograph.block.BlockTemplate; import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.databinding.DialogEditLayerBinding; import com.mithrilmania.blocktopograph.util.UiUtil; @@ -79,7 +80,7 @@ public void afterTextChanged(Editable editable) { }); amountBar.addValidator(new AmountValidator(getString(R.string.edit_layer_amount_constrait))); - mBinding.icon.setImageBitmap(layer.block.getIcon(getAssets())); + mBinding.icon.setImageBitmap(layer.block.getIcon().getIcon(this)); UiUtil.blendBlockColor(mBinding.frame, layer.block); } @@ -112,11 +113,11 @@ protected void onActivityResult(int requestCode, int resultCode, @Nullable Inten case REQUEST_CODE_PICK_BLOCK: { if (resultCode != RESULT_OK) return; assert data != null; - ListingBlock block = (ListingBlock) data.getSerializableExtra(PickBlockActivity.EXTRA_KEY_BLOCK); + BlockTemplate block = (BlockTemplate) data.getSerializableExtra(PickBlockActivity.EXTRA_KEY_BLOCK); Layer layer = mBinding.getLayer(); layer.block = block; mBinding.setLayer(layer); - mBinding.icon.setImageBitmap(layer.block.getIcon(getAssets())); + mBinding.icon.setImageBitmap(layer.block.getIcon().getIcon(this)); UiUtil.blendBlockColor(mBinding.frame, block); //mBinding.notifyChange(); return; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/FlatLayers.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/FlatLayers.java index 4b00ee26..e5522c7e 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/FlatLayers.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/FlatLayers.java @@ -96,7 +96,7 @@ public String write() { JSONArray jlayers = new JSONArray(); for (Layer layer : mLayers) { JSONObject jlayer = new JSONObject(); - jlayer.put(KEY_BLOCK_NAME, layer.block.getIdentifier()); + jlayer.put(KEY_BLOCK_NAME, layer.block.getBlock().getName()); //jlayer.put(KEY_BLOCK_DATA, layer.block.subId); jlayer.put(KEY_COUNT, layer.amount); jlayers.put(jlayer); diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/Layer.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/Layer.java index 390c29c3..ab188d18 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/Layer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/Layer.java @@ -2,6 +2,8 @@ import androidx.annotation.Nullable; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.block.ListingBlock; import java.io.Serializable; @@ -9,7 +11,7 @@ public final class Layer implements Serializable { private static long counter = 0; - public ListingBlock block; + public BlockTemplate block; public int amount; public long uid; @@ -23,12 +25,12 @@ private synchronized void genUid() { } public Layer() { - block = ListingBlock.B_0_AIR; + block = BlockTemplates.getOfType("minecraft:air")[0]; amount = 1; genUid(); } - Layer(ListingBlock block, int amount) { + Layer(BlockTemplate block, int amount) { this.block = block; this.amount = amount; genUid(); diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/flat/PickBlockActivity.java b/app/src/main/java/com/mithrilmania/blocktopograph/flat/PickBlockActivity.java index 3ed3d643..c6ee2419 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/flat/PickBlockActivity.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/flat/PickBlockActivity.java @@ -1,7 +1,6 @@ package com.mithrilmania.blocktopograph.flat; import android.content.Intent; -import android.content.res.AssetManager; import android.os.AsyncTask; import android.os.Bundle; import android.text.Editable; @@ -16,14 +15,17 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.google.common.collect.Streams; import com.mithrilmania.blocktopograph.R; -import com.mithrilmania.blocktopograph.block.ListingBlock; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.databinding.DialogPickBlockBinding; import com.mithrilmania.blocktopograph.databinding.ItemPickBlockBinding; import com.mithrilmania.blocktopograph.util.UiUtil; import java.lang.ref.WeakReference; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public final class PickBlockActivity extends AppCompatActivity { @@ -41,7 +43,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { RecyclerView list = mBinding.list; mListManager = new LinearLayoutManager(this); list.setLayoutManager(mListManager); - mAdapter = new MeowAdapter(getAssets()); + mAdapter = new MeowAdapter(); list.setAdapter(mAdapter); setResult(RESULT_CANCELED); @@ -89,12 +91,12 @@ protected void onPreExecute() { protected Void doInBackground(Void... voids) { PickBlockActivity activity = thiz.get(); if (activity == null) return null; - List list = activity.mAdapter.getListControl(); + List list = activity.mAdapter.getListControl(); //Backup all candidates. - ListingBlock[] olds = null; + BlockTemplate[] olds = null; if (index1 >= 0) { - olds = new ListingBlock[index2 - index1 + 1]; + olds = new BlockTemplate[index2 - index1 + 1]; for (int i = index1, limit = list.size(); i < olds.length && i < limit; i++) { olds[i] = list.get(i); } @@ -110,13 +112,14 @@ protected Void doInBackground(Void... voids) { } catch (NumberFormatException e) { num = -1; } - for (ListingBlock b : ListingBlock.values()) - if (b.getLegacy_id() == num || - (b.getIdentifier().contains(text)) || - (b.getName().contains(text))) + for (Iterator it = BlockTemplates.getAll().iterator(); it.hasNext(); ) { + BlockTemplate b = it.next(); + if ( + (b.getBlock().getName().contains(text))) list.add(b); + } int position = -1; - if (olds != null) for (ListingBlock b : olds) { + if (olds != null) for (BlockTemplate b : olds) { int i = list.indexOf(b); if (i != -1) { position = i; @@ -138,14 +141,10 @@ protected void onPostExecute(Void aVoid) { private class MeowAdapter extends RecyclerView.Adapter { - private final List mBlocks; - - @NonNull - private AssetManager assMan; + private final List mBlocks; - private MeowAdapter(@NonNull AssetManager assMan) { + private MeowAdapter() { mBlocks = new ArrayList<>(512); - this.assMan = assMan; } @NonNull @@ -159,7 +158,7 @@ public MeowHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { root.setOnClickListener(v -> { //UiUtil.toast(PickBlockActivity.this,""+i); setResult(RESULT_OK, new Intent() - .putExtra(EXTRA_KEY_BLOCK, holder.binding.getBlock()));//;(KnownBlockRepr) v.getTag())); + .putExtra(EXTRA_KEY_BLOCK, holder.binding.getOldBlock()));//;(KnownBlockRepr) v.getTag())); finish(); }); return holder; @@ -167,12 +166,12 @@ public MeowHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { @Override public void onBindViewHolder(@NonNull MeowHolder meowHolder, int i) { - ListingBlock block = mBlocks.get(i); + BlockTemplate oldBlock = mBlocks.get(i); ItemPickBlockBinding binding = meowHolder.binding; - binding.setBlock(block); - //binding.getRoot().setTag(block); - binding.icon.setImageBitmap(block.getIcon(assMan)); - UiUtil.blendBlockColor(binding.getRoot(), block); + binding.setOldBlock(oldBlock); + //binding.getRoot().setTag(oldBlock); + binding.icon.setImageBitmap(oldBlock.getIcon().getIcon(PickBlockActivity.this)); + UiUtil.blendBlockColor(binding.getRoot(), oldBlock); } @Override @@ -180,7 +179,7 @@ public int getItemCount() { return mBlocks.size(); } - List getListControl() { + List getListControl() { return mBlocks; } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java index 943817a9..41624d90 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/Biome.java @@ -5,150 +5,158 @@ import com.mithrilmania.blocktopograph.util.ColorWrapper; - /* Biome enum for MCPE -- by @mithrilmania +Reference link: https://minecraft.fandom.com/wiki/Biome/ID --- Please attribute @mithrilmania for generating+updating this enum */ public enum Biome { - OCEAN(0, "Ocean", ColorWrapper.fromRGB(2, 0, 112)), - PLAINS(1, "Plains", ColorWrapper.fromRGB(140, 176, 96)), - DESERT(2, "Desert", ColorWrapper.fromRGB(251, 148, 27)), - EXTREME_HILLS(3, "Extreme Hills", ColorWrapper.fromRGB(93, 99, 93)), - FOREST(4, "Forest", ColorWrapper.fromRGB(2, 99, 32)), - TAIGA(5, "Taiga", ColorWrapper.fromRGB(9, 102, 91)), - SWAMPLAND(6, "Swampland", ColorWrapper.fromRGB(4, 200, 139)), - RIVER(7, "River", ColorWrapper.fromRGB(1, 1, 255)), - HELL(8, "Hell", ColorWrapper.fromRGB(255, 0, 1)), - SKY(9, "Sky", ColorWrapper.fromRGB(130, 129, 254)), - FROZEN_OCEAN(10, "Frozen Ocean", ColorWrapper.fromRGB(142, 141, 161)), - FROZEN_RIVER(11, "Frozen River", ColorWrapper.fromRGB(159, 163, 255)), - ICE_PLAINS(12, "Ice Plains", ColorWrapper.fromRGB(255, 254, 255)), - ICE_MOUNTAINS(13, "Ice Mountains", ColorWrapper.fromRGB(162, 157, 157)), - MUSHROOM_ISLAND(14, "Mushroom Island", ColorWrapper.fromRGB(254, 1, 255)), - MUSHROOM_ISLAND_SHORE(15, "Mushroom Island Shore", ColorWrapper.fromRGB(158, 3, 253)), - BEACH(16, "Beach", ColorWrapper.fromRGB(250, 223, 85)), - DESERT_HILLS(17, "Desert Hills", ColorWrapper.fromRGB(212, 94, 15)), - FOREST_HILLS(18, "Forest Hills", ColorWrapper.fromRGB(37, 86, 30)), - TAIGA_HILLS(19, "Taiga Hills", ColorWrapper.fromRGB(25, 54, 49)), - EXTREME_HILLS_EDGE(20, "Extreme Hills Edge", ColorWrapper.fromRGB(115, 118, 157)), - JUNGLE(21, "Jungle", ColorWrapper.fromRGB(82, 122, 7)), - JUNGLE_HILLS(22, "Jungle Hills", ColorWrapper.fromRGB(46, 64, 3)), - JUNGLE_EDGE(23, "Jungle Edge", ColorWrapper.fromRGB(99, 142, 24)), - DEEP_OCEAN(24, "Deep Ocean", ColorWrapper.fromRGB(2, 0, 47)), - STONE_BEACH(25, "Stone Beach", ColorWrapper.fromRGB(162, 164, 132)), - COLD_BEACH(26, "Cold Beach", ColorWrapper.fromRGB(250, 238, 193)), - BIRCH_FOREST(27, "Birch Forest", ColorWrapper.fromRGB(48, 117, 70)), - BIRCH_FOREST_HILLS(28, "Birch Forest Hills", ColorWrapper.fromRGB(29, 94, 51)), - ROOFED_FOREST(29, "Roofed Forest", ColorWrapper.fromRGB(66, 82, 24)), - COLD_TAIGA(30, "Cold Taiga", ColorWrapper.fromRGB(49, 85, 75)), - COLD_TAIGA_HILLS(31, "Cold Taiga Hills", ColorWrapper.fromRGB(34, 61, 52)), - MEGA_TAIGA(32, "Mega Taiga", ColorWrapper.fromRGB(92, 105, 84)), - MEGA_TAIGA_HILLS(33, "Mega Taiga Hills", ColorWrapper.fromRGB(70, 76, 59)), - EXTREME_HILLS_PLUS(34, "Extreme Hills+", ColorWrapper.fromRGB(79, 111, 81)), - SAVANNA(35, "Savanna", ColorWrapper.fromRGB(192, 180, 94)), - SAVANNA_PLATEAU(36, "Savanna Plateau", ColorWrapper.fromRGB(168, 157, 98)), - MESA(37, "Mesa", ColorWrapper.fromRGB(220, 66, 19)), - MESA_PLATEAU_F(38, "Mesa Plateau F", ColorWrapper.fromRGB(174, 152, 100)), - MESA_PLATEAU(39, "Mesa Plateau", ColorWrapper.fromRGB(202, 139, 98)), - - //fix the colors for these - SMALL_END_ISLANDS(40, "Small End Islands", ColorWrapper.fromRGB(202, 139, 98)), - END_MIDLANDS(41, "End Midlands", ColorWrapper.fromRGB(202, 139, 98)), - END_HIGHLANDS(42, "End Highlands", ColorWrapper.fromRGB(202, 139, 98)), - END_BARRENS(43, "End Barrens", ColorWrapper.fromRGB(202, 139, 98)), - WARM_OCEAN(44, "Warm Ocean", ColorWrapper.fromRGB(202, 139, 98)), - LUKEWARM_OCEAN(45, "Lukewarm Ocean", ColorWrapper.fromRGB(202, 139, 98)), - COLD_OCEAN(46, "Cold Ocean", ColorWrapper.fromRGB(202, 139, 98)), - DEEP_WARM_OCEAN(47, "Deep Warm Ocean", ColorWrapper.fromRGB(202, 139, 98)), - DEEP_LUKEWARM_OCEAN(48, "Deep Lukewarm Ocean", ColorWrapper.fromRGB(202, 139, 98)), - DEEP_COLD_OCEAN(49, "Deep Cold Ocean", ColorWrapper.fromRGB(202, 139, 98)), - DEEP_FROZEN_OCEAN(50, "Deep Frozen Ocean", ColorWrapper.fromRGB(202, 139, 98)), - - //fix the colors for the void - THE_VOID(127, "The Void", ColorWrapper.fromRGB(81, 79, 195)), - - OCEAN_M(128, "Ocean M", ColorWrapper.fromRGB(81, 79, 195)), - SUNFLOWER_PLAINS(129, "Sunflower Plains", ColorWrapper.fromRGB(220, 255, 177)), - DESERT_M(130, "Desert M", ColorWrapper.fromRGB(255, 230, 101)), - EXTREME_HILLS_M(131, "Extreme Hills M", ColorWrapper.fromRGB(177, 176, 174)), - FLOWER_FOREST(132, "Flower Forest", ColorWrapper.fromRGB(82, 180, 110)), - TAIGA_M(133, "Taiga M", ColorWrapper.fromRGB(90, 182, 171)), - SWAMPLAND_M(134, "Swampland M", ColorWrapper.fromRGB(87, 255, 255)), - RIVER_M(135, "River M", ColorWrapper.fromRGB(82, 79, 255)), - HELL_M(136, "Hell M", ColorWrapper.fromRGB(255, 80, 83)), - SKY_M(137, "Sky M", ColorWrapper.fromRGB(210, 211, 255)), - FROZEN_OCEAN_M(138, "Frozen Ocean M", ColorWrapper.fromRGB(226, 224, 241)), - FROZEN_RIVER_M(139, "Frozen River M", ColorWrapper.fromRGB(239, 242, 255)), - ICE_PLAINS_SPIKES(140, "Ice Plains Spikes", ColorWrapper.fromRGB(223, 255, 255)), - ICE_MOUNTAINS_M(141, "Ice Mountains M", ColorWrapper.fromRGB(237, 237, 238)), - MUSHROOM_ISLAND_M(142, "Mushroom Island M", ColorWrapper.fromRGB(255, 82, 255)), - MUSHROOM_ISLAND_SHORE_M(143, "Mushroom Island Shore M", ColorWrapper.fromRGB(243, 82, 255)), - BEACH_M(144, "Beach M", ColorWrapper.fromRGB(255, 255, 162)), - DESERT_HILLS_M(145, "Desert Hills M", ColorWrapper.fromRGB(255, 177, 100)), - FOREST_HILLS_M(146, "Forest Hills M", ColorWrapper.fromRGB(113, 167, 109)), - TAIGA_HILLS_M(147, "Taiga Hills M", ColorWrapper.fromRGB(103, 135, 134)), - EXTREME_HILLS_EDGE_M(148, "Extreme Hills Edge M", ColorWrapper.fromRGB(196, 203, 234)), - JUNGLE_M(149, "Jungle M", ColorWrapper.fromRGB(160, 203, 92)), - JUNGLE_HILLS_M(150, "Jungle Hills M", ColorWrapper.fromRGB(127, 146, 86)), - JUNGLE_EDGE_M(151, "Jungle Edge M", ColorWrapper.fromRGB(179, 217, 105)), - DEEP_OCEAN_M(152, "Deep Ocean M", ColorWrapper.fromRGB(82, 79, 130)), - STONE_BEACH_M(153, "Stone Beach M", ColorWrapper.fromRGB(242, 243, 209)), - COLD_BEACH_M(154, "Cold Beach M", ColorWrapper.fromRGB(255, 255, 255)), - BIRCH_FOREST_M(155, "Birch Forest M", ColorWrapper.fromRGB(131, 194, 148)), - BIRCH_FOREST_HILLS_M(156, "Birch Forest Hills M", ColorWrapper.fromRGB(111, 175, 133)), - ROOFED_FOREST_M(157, "Roofed Forest M", ColorWrapper.fromRGB(143, 158, 109)), - COLD_TAIGA_M(158, "Cold Taiga M", ColorWrapper.fromRGB(132, 163, 156)), - COLD_TAIGA_HILLS_M(159, "Cold Taiga Hills M", ColorWrapper.fromRGB(113, 143, 136)), - MEGA_SPRUCE_TAIGA(160, "Mega Spruce Taiga", ColorWrapper.fromRGB(168, 180, 164)), - REDWOOD_TAIGA_HILLS_M(161, "Redwood Taiga Hills M", ColorWrapper.fromRGB(150, 158, 140)), - EXTREME_HILLS_PLUS_M(162, "Extreme Hills+ M", ColorWrapper.fromRGB(161, 194, 158)), - SAVANNA_M(163, "Savanna M", ColorWrapper.fromRGB(255, 255, 173)), - SAVANNA_PLATEAU_M(164, "Savanna Plateau M", ColorWrapper.fromRGB(247, 238, 180)), - MESA_BRYCE(165, "Mesa (Bryce)", ColorWrapper.fromRGB(255, 151, 101)), - MESA_PLATEAU_F_M(166, "Mesa Plateau F M", ColorWrapper.fromRGB(255, 234, 179)), - MESA_PLATEAU_M(167, "Mesa Plateau M", ColorWrapper.fromRGB(255, 220, 184)), - BAMBOO_JUNGLE(168, "Bamboo Jungle", ColorWrapper.fromRGB(255, 220, 184)), - BAMBOO_JUNGLE_HILLS(169, "Bamboo Jungle Hills", ColorWrapper.fromRGB(255, 220, 184)); - - //Nether biome in 1.16.0 nether update. - NETHER_WASTES(8, "Nether Wastes", ColorWrapper.fromRGB(132, 65, 65)); - - SOUL_SAND_VALLEY(170, "Soul Sand Valley", ColorWrapper.fromRGB(66, 113, 114)); - - CRIMSON_FOREST(171, "Crimson Forest", ColorWrapper.fromRGB(141, 30, 40)); - - WARPED_FOREST(172, "Warped Forest", ColorWrapper.fromRGB(22, 126, 134)); - - BASALT_DELTAS(173, "Basalt Deltas", ColorWrapper.fromRGB(75, 69, 71)); - - private static final SparseArray biomeMap; - - static { - biomeMap = new SparseArray<>(); - for (Biome b : Biome.values()) { - biomeMap.put(b.id, b); - } - } - - public final int id; - public final String name; - public final ColorWrapper color; - - Biome(int id, String name, ColorWrapper color) { - this.id = id; - this.name = name; - this.color = color; - } - - public static Biome getBiome(int id) { - return biomeMap.get(id); - } - - - public String getName() { - return name; - } + OCEAN(0, "Ocean", ColorWrapper.fromRGB(2, 0, 112)), + PLAINS(1, "Plains", ColorWrapper.fromRGB(140, 176, 96)), + DESERT(2, "Desert", ColorWrapper.fromRGB(251, 148, 27)), + EXTREME_HILLS(3, "Mountains", ColorWrapper.fromRGB(93, 99, 93)), + FOREST(4, "Forest", ColorWrapper.fromRGB(2, 99, 32)), + TAIGA(5, "Taiga", ColorWrapper.fromRGB(9, 102, 91)), + SWAMPLAND(6, "Swampland", ColorWrapper.fromRGB(4, 200, 139)), + RIVER(7, "River", ColorWrapper.fromRGB(1, 1, 255)), + HELL(8, "Nether Wastes", ColorWrapper.fromRGB(132, 65, 65)), + THE_END(9, "The End", ColorWrapper.fromRGB(130, 129, 254)), + FROZEN_OCEAN(10, "Frozen Ocean", ColorWrapper.fromRGB(142, 141, 161)), + FROZEN_RIVER(11, "Frozen River", ColorWrapper.fromRGB(159, 163, 255)), + ICE_PLAINS(12, "Ice Plains", ColorWrapper.fromRGB(255, 254, 255)), + ICE_MOUNTAINS(13, "Ice Mountains", ColorWrapper.fromRGB(162, 157, 157)), + MUSHROOM_ISLAND(14, "Mushroom Fields", ColorWrapper.fromRGB(254, 1, 255)), + MUSHROOM_ISLAND_SHORE(15, "Mushroom Fields Shore", ColorWrapper.fromRGB(158, 3, 253)), + BEACH(16, "Beach", ColorWrapper.fromRGB(250, 223, 85)), + DESERT_HILLS(17, "Desert Hills", ColorWrapper.fromRGB(212, 94, 15)), + FOREST_HILLS(18, "Wooded Hills", ColorWrapper.fromRGB(37, 86, 30)), + TAIGA_HILLS(19, "Taiga Hills", ColorWrapper.fromRGB(25, 54, 49)), + EXTREME_HILLS_EDGE(20, "Mountain Edge", ColorWrapper.fromRGB(115, 118, 157)), + JUNGLE(21, "Jungle", ColorWrapper.fromRGB(82, 122, 7)), + JUNGLE_HILLS(22, "Jungle Hills", ColorWrapper.fromRGB(46, 64, 3)), + JUNGLE_EDGE(23, "Jungle Edge", ColorWrapper.fromRGB(99, 142, 24)), + DEEP_OCEAN(24, "Deep Ocean", ColorWrapper.fromRGB(2, 0, 47)), + STONE_BEACH(25, "Stone Shore", ColorWrapper.fromRGB(162, 164, 132)), + COLD_BEACH(26, "Snowy Beach", ColorWrapper.fromRGB(250, 238, 193)), + BIRCH_FOREST(27, "Birch Forest", ColorWrapper.fromRGB(48, 117, 70)), + BIRCH_FOREST_HILLS(28, "Birch Forest Hills", ColorWrapper.fromRGB(29, 94, 51)), + ROOFED_FOREST(29, "Dark Forest", ColorWrapper.fromRGB(66, 82, 24)), + COLD_TAIGA(30, "Snowy Taiga", ColorWrapper.fromRGB(49, 85, 75)), + COLD_TAIGA_HILLS(31, "Snowy Taiga Hills", ColorWrapper.fromRGB(34, 61, 52)), + MEGA_TAIGA(32, "Giant Tree Taiga", ColorWrapper.fromRGB(92, 105, 84)), + MEGA_TAIGA_HILLS(33, "Giant Tree Taiga Hills", ColorWrapper.fromRGB(70, 76, 59)), + EXTREME_HILLS_PLUS_TREE(34, "Wooded Mountains", ColorWrapper.fromRGB(79, 111, 81)), + SAVANNA(35, "Savanna", ColorWrapper.fromRGB(192, 180, 94)), + SAVANNA_PLATEAU(36, "Savanna Plateau", ColorWrapper.fromRGB(168, 157, 98)), + MESA(37, "Badlands", ColorWrapper.fromRGB(220, 66, 19)), + MESA_PLATEAU(38, "Badlands Plateau", ColorWrapper.fromRGB(174, 152, 100)), + MESA_PLATEAU_STONE(39, "Wooded Badlands Plateau", ColorWrapper.fromRGB(202, 139, 98)), + + //fix the colors for these + WARM_OCEAN(40, "Warm Ocean", ColorWrapper.fromRGB(202, 139, 98)), + LUKEWARM_OCEAN(41, "Lukewarm Ocean", ColorWrapper.fromRGB(202, 139, 98)), + COLD_OCEAN(42, "Cold Ocean", ColorWrapper.fromRGB(202, 139, 98)), + DEEP_WARM_OCEAN(43, "Deep Warm Ocean", ColorWrapper.fromRGB(202, 139, 98)), + DEEP_LUKEWARM_OCEAN(44, "Deep Lukewarm Ocean", ColorWrapper.fromRGB(202, 139, 98)), + DEEP_COLD_OCEAN(45, "Deep Cold Ocean", ColorWrapper.fromRGB(202, 139, 98)), + DEEP_FROZEN_OCEAN(46, "Deep Frozen Ocean", ColorWrapper.fromRGB(202, 139, 98)), + LEGACY_FROZEN_OCEAN(47, "Legacy Frozen Ocean", ColorWrapper.fromRGB(202, 139, 98)), + + // Not sure are available ( need tester ) +// OCEAN_M(128, "Ocean M", ColorWrapper.fromRGB(81, 79, 195)), + + SUNFLOWER_PLAINS(129, "Sunflower Plains", ColorWrapper.fromRGB(220, 255, 177)), + DESERT_MUTATED(130, "Desert Lakes", ColorWrapper.fromRGB(255, 230, 101)), + EXTREME_HILLS_MUTATED(131, "Gravelly Mountains", ColorWrapper.fromRGB(177, 176, 174)), + FLOWER_FOREST(132, "Flower Forest", ColorWrapper.fromRGB(82, 180, 110)), + TAIGA_MUTATED(133, "Taiga Mountains", ColorWrapper.fromRGB(90, 182, 171)), + SWAMPLAND_MUTATED(134, "Swamp Hills", ColorWrapper.fromRGB(87, 255, 255)), + + // Not sure available ( need tester ) +// RIVER_M(135, "River M", ColorWrapper.fromRGB(82, 79, 255)), +// HELL_M(136, "Hell M", ColorWrapper.fromRGB(255, 80, 83)), +// SKY_M(137, "Sky M", ColorWrapper.fromRGB(210, 211, 255)), +// FROZEN_OCEAN_M(138, "Frozen Ocean M", ColorWrapper.fromRGB(226, 224, 241)), +// FROZEN_RIVER_M(139, "Frozen River M", ColorWrapper.fromRGB(239, 242, 255)), + + ICE_PLAINS_SPIKES(140, "Ice Spikes", ColorWrapper.fromRGB(223, 255, 255)), + + // Not sure available ( need tester ) +// ICE_MOUNTAINS_M(141, "Ice Mountains M", ColorWrapper.fromRGB(237, 237, 238)), +// MUSHROOM_ISLAND_M(142, "Mushroom Island M", ColorWrapper.fromRGB(255, 82, 255)), +// MUSHROOM_ISLAND_SHORE_M(143, "Mushroom Island Shore M", ColorWrapper.fromRGB(243, 82, 255)), +// BEACH_M(144, "Beach M", ColorWrapper.fromRGB(255, 255, 162)), +// DESERT_HILLS_M(145, "Desert Hills M", ColorWrapper.fromRGB(255, 177, 100)), +// FOREST_HILLS_M(146, "Forest Hills M", ColorWrapper.fromRGB(113, 167, 109)), +// TAIGA_HILLS_M(147, "Taiga Hills M", ColorWrapper.fromRGB(103, 135, 134)), +// EXTREME_HILLS_EDGE_M(148, "Extreme Hills Edge M", ColorWrapper.fromRGB(196, 203, 234)), + + JUNGLE_MUTATED(149, "Modified Jungle", ColorWrapper.fromRGB(160, 203, 92)), +// JUNGLE_HILLS_M(150, "Jungle Hills M", ColorWrapper.fromRGB(127, 146, 86)), + JUNGLE_EDGE_MUTATED(151, "Modified Jungle Edge", ColorWrapper.fromRGB(179, 217, 105)), +// DEEP_OCEAN_M(152, "Deep Ocean M", ColorWrapper.fromRGB(82, 79, 130)), +// STONE_BEACH_M(153, "Stone Beach M", ColorWrapper.fromRGB(242, 243, 209)), +// COLD_BEACH_M(154, "Cold Beach M", ColorWrapper.fromRGB(255, 255, 255)), + BIRCH_FOREST_MUTATED(155, "Tall Birch Forest", ColorWrapper.fromRGB(131, 194, 148)), + BIRCH_FOREST_HILLS_MUTATED(156, "Tall Birch Hills", ColorWrapper.fromRGB(111, 175, 133)), + ROOFED_FOREST_MUTATED(157, "Dark Forest Hills", ColorWrapper.fromRGB(143, 158, 109)), + COLD_TAIGA_MUTATED(158, "Snowy Taiga Mountains", ColorWrapper.fromRGB(132, 163, 156)), +// COLD_TAIGA_HILLS_M(159, "Cold Taiga Hills M", ColorWrapper.fromRGB(113, 143, 136)), + REDWOOD_TAIGA_MUTATED(160, "Giant Spruce Taiga", ColorWrapper.fromRGB(168, 180, 164)), + REDWOOD_TAIGA_HILLS_MUTATED(161, "Giant Spruce Taiga Hills", ColorWrapper.fromRGB(150, 158, 140)), + EXTREME_HILLS_PLUS_TREE_MUTATED(162, "Gravelly Mountains", ColorWrapper.fromRGB(161, 194, 158)), + SAVANNA_MUTATED(163, "Shattered Savanna", ColorWrapper.fromRGB(255, 255, 173)), + SAVANNA_PLATEAU_MUTATED(164, "Shattered Savanna Plateau", ColorWrapper.fromRGB(247, 238, 180)), + MESA_BRYCE(165, "Eroded Badlands", ColorWrapper.fromRGB(255, 151, 101)), + MESA_PLATEAU_MUTATED(166, "Modified Badlands Plateau", ColorWrapper.fromRGB(255, 234, 179)), + MESA_PLATEAU_STONE_MUTATED(167, "Modified Wooded Badlands Plateau", ColorWrapper.fromRGB(255, 220, 184)), + BAMBOO_JUNGLE(168, "Bamboo Jungle", ColorWrapper.fromRGB(255, 220, 184)), + BAMBOO_JUNGLE_HILLS(169, "Bamboo Jungle Hills", ColorWrapper.fromRGB(255, 220, 184)), + + // 1.16 BIOME + SOUL_SAND_VALLEY(178, "Soul Sand Valley", ColorWrapper.fromRGB(66, 113, 114)), + CRIMSON_FOREST(179, "Crimson Forest", ColorWrapper.fromRGB(141, 30, 40)), + WARPED_FOREST(180, "Warped Forest", ColorWrapper.fromRGB(22, 126, 134)), + BASALT_DELTAS(181, "Basalt Deltas", ColorWrapper.fromRGB(75, 69, 71)), + + // 1.17 BIOME ? + JAGGED_PEAKS(182, "Jagged Peaks", ColorWrapper.fromRGB(0, 0, 0)), + FROZEN_PEAKS(183, "Frozen Peaks", ColorWrapper.fromRGB(0, 0, 0)), + SNOWY_SLOPES(184, "Snowy Slopes", ColorWrapper.fromRGB(0, 0, 0)), + GROVE(185, "Grove", ColorWrapper.fromRGB(0, 0, 0)), + MEADOW(186, "Meadow", ColorWrapper.fromRGB(0, 0, 0)), + LUSH_CAVES(187, "Lush Caves", ColorWrapper.fromRGB(0, 0, 0)), + DRIPSTONE_CAVES(188, "Dripstone Caves", ColorWrapper.fromRGB(0, 0, 0)), + STONY_PEAKS(189, "Stony Peaks", ColorWrapper.fromRGB(0, 0, 0)) + ; + + private static final SparseArray biomeMap; + + static { + biomeMap = new SparseArray<>(); + for (Biome b : Biome.values()) { + biomeMap.put(b.id, b); + } + } + + public final int id; + public final String name; + public final ColorWrapper color; + + Biome(int id, String name, ColorWrapper color) { + this.id = id; + this.name = name; + this.color = color; + } + + public static Biome getBiome(int id) { + return biomeMap.get(id); + } + + + public String getName() { + return name; + } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/MapFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/MapFragment.java index 7b75ee10..2c369ef2 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/MapFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/MapFragment.java @@ -297,7 +297,7 @@ private void closeFloatPane() { if (mBinding.selectionBoard.hasSelection()) { SelectionMenuFragment fragment = SelectionMenuFragment .newInstance(mBinding.selectionBoard.getSelection(), - world.getWorldData().mBlockRegistry, this::doSelectionBasedEdit); + world.getWorldData().mOldBlockRegistry, this::doSelectionBasedEdit); trans.add(R.id.float_window_container, fragment); mFloatingFragment = fragment; setUpSelectionMenu(); @@ -316,7 +316,7 @@ public void onConfigurationChanged(@NonNull Configuration newConfig) { fragment = AdvancedLocatorFragment.create(world, this::frameTo); } else if (mFloatingFragment instanceof SelectionMenuFragment) { fragment = SelectionMenuFragment - .newInstance(mBinding.selectionBoard.getSelection(), world.getWorldData().mBlockRegistry, + .newInstance(mBinding.selectionBoard.getSelection(), world.getWorldData().mOldBlockRegistry, this::doSelectionBasedEdit); } else return; closeFloatPane(); @@ -756,7 +756,7 @@ private void doSelectionBasedEdit(@NonNull EditFunction func, @Nullable Bundle a case LAMPSHADE: case CHBIOME: case DCHUNK: - new SelectionBasedContextFreeEditTask(func, args, this, world.getWorldData().mBlockRegistry).execute( + new SelectionBasedContextFreeEditTask(func, args, this, world.getWorldData().mOldBlockRegistry).execute( new RectEditTarget( world.getWorldData(), mBinding.selectionBoard.getSelection(), @@ -791,7 +791,7 @@ public Object[] calculateViewPort(int marginX, int marginZ) { MapTileView tileView = mBinding.tileView; float scale = tileView.getScale(); - //scale the amount of pixels, less pixels per block if zoomed out + //scale the amount of pixels, less pixels per oldBlock if zoomed out double pixelsPerBlockW = pixelsPerBlockW_unscaled * scale; double pixelsPerBlockL = pixelsPerBlockL_unscaled * scale; @@ -1004,7 +1004,7 @@ private void beginOrEndSelection(int worldX, int worldZ) { } else { mBinding.selectionBoard.beginSelection(worldX, worldZ); SelectionMenuFragment fragment = SelectionMenuFragment - .newInstance(mBinding.selectionBoard.getSelection(), world.getWorldData().mBlockRegistry, this::doSelectionBasedEdit); + .newInstance(mBinding.selectionBoard.getSelection(), world.getWorldData().mOldBlockRegistry, this::doSelectionBasedEdit); openFloatPane(fragment); setUpSelectionMenu(); Activity activity = getActivity(); @@ -1219,7 +1219,7 @@ private void onChooseTeleportPlayer(float worldX, float worldZ, Dimension dim, V * Opens the chunk data nbt editor. * * @param chunk the chunk to edit - * @param entity if it is entity data (True) or block-entity data (False) + * @param entity if it is entity data (True) or oldBlock-entity data (False) * @return false when the chunk data could not be loaded. */ private boolean chunkDataNBT(Chunk chunk, boolean entity) { diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/ChBiomeFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/ChBiomeFragment.java index fdf62b1e..556eb60f 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/ChBiomeFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/ChBiomeFragment.java @@ -113,7 +113,7 @@ private void onClickOk(DialogInterface dia, int i) { mBinding.changeFor.getCheckedRadioButtonId() == R.id.biome_for_all ? null : mBinding.biomeView.getBiome()); Biome biomeTo = mBinding.biomeReplace.getBiome(); - bundle.putSerializable(KEY_TO, biomeTo == null ? Biome.THE_VOID : biomeTo); + bundle.putSerializable(KEY_TO, biomeTo == null ? Biome.PLAINS : biomeTo); mEntry.invokeEditFunction(EditFunction.CHBIOME, bundle); } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SearchAndReplaceFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SearchAndReplaceFragment.java index 4dbc62bc..e86ee3c3 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SearchAndReplaceFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SearchAndReplaceFragment.java @@ -17,10 +17,9 @@ import com.jbvincey.nestedradiobutton.NestedRadioGroupManager; import com.mithrilmania.blocktopograph.R; -import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; -import com.mithrilmania.blocktopograph.block.KnownBlockRepr; -import com.mithrilmania.blocktopograph.block.ListingBlock; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.databinding.FragSerachAndReplaceBinding; import com.mithrilmania.blocktopograph.databinding.IncludeBlockBinding; import com.mithrilmania.blocktopograph.flat.PickBlockActivity; @@ -45,9 +44,9 @@ public class SearchAndReplaceFragment extends DialogFragment { private FragSerachAndReplaceBinding mBinding; private SelectionMenuFragment.EditFunctionEntry mEntry; private ToolTipsManager mToolTipsManager; - private BlockRegistry registry; + private OldBlockRegistry registry; - public static SearchAndReplaceFragment newInstance(BlockRegistry registry, SelectionMenuFragment.EditFunctionEntry entry) { + public static SearchAndReplaceFragment newInstance(OldBlockRegistry registry, SelectionMenuFragment.EditFunctionEntry entry) { SearchAndReplaceFragment fragment = new SearchAndReplaceFragment(); fragment.mEntry = entry; fragment.registry = registry; @@ -78,20 +77,20 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c switch (cfg.placeMode) { case 1: case 2: - recoverBlock(mBinding.replaceBlockAny, cfg.placeBlockMain); + recoverBlock(mBinding.replaceBlockAny, cfg.placeOldBlockMain); break; case 3: - recoverBlock(mBinding.replaceBlockBg, cfg.placeBlockSub); - recoverBlock(mBinding.replaceBlockFg, cfg.placeBlockMain); + recoverBlock(mBinding.replaceBlockBg, cfg.placeOldBlockSub); + recoverBlock(mBinding.replaceBlockFg, cfg.placeOldBlockMain); } //mBinding.cbIgsub.setChecked(cfg.ignoreSubId); } else { - setBlockToItem(mBinding.searchBlockAny, ListingBlock.B_2_GRASS); - setBlockToItem(mBinding.searchBlockBg, ListingBlock.B_0_AIR); - setBlockToItem(mBinding.searchBlockFg, ListingBlock.B_2_GRASS); - setBlockToItem(mBinding.replaceBlockAny, ListingBlock.B_20_GLASS); - setBlockToItem(mBinding.replaceBlockFg, ListingBlock.B_20_GLASS); - setBlockToItem(mBinding.replaceBlockBg, ListingBlock.B_9_WATER); + setBlockToItem(mBinding.searchBlockAny, BlockTemplates.getOfType("minecraft:grass")[0]); + setBlockToItem(mBinding.searchBlockBg, BlockTemplates.getOfType("minecraft:air")[0]); + setBlockToItem(mBinding.searchBlockFg, BlockTemplates.getOfType("minecraft:grass")[0]); + setBlockToItem(mBinding.replaceBlockAny, BlockTemplates.getOfType("minecraft:glass")[0]); + setBlockToItem(mBinding.replaceBlockFg, BlockTemplates.getOfType("minecraft:glass")[0]); + setBlockToItem(mBinding.replaceBlockBg, BlockTemplates.getOfType("minecraft:water")[0]); } mBinding.searchIn.setOnCheckedChangeListener(this::onCheckedChanged); @@ -169,7 +168,7 @@ private void recoverPlaceIn(int code) { } private void recoverBlock(@NonNull IncludeBlockBinding item, @Nullable Serializable data) { - setBlockToItem(item, data instanceof ListingBlock ? (ListingBlock) data : ListingBlock.B_0_AIR); + setBlockToItem(item, data instanceof BlockTemplate ? (BlockTemplate) data : BlockTemplates.getAirTemplate()); } @Override @@ -178,12 +177,6 @@ public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); } - @NonNull - private Block convertListingBlockToBlock(ListingBlock listingBlock) { - if (listingBlock == null) return registry.createBlock(KnownBlockRepr.B_0_0_AIR); - return registry.createBlock(listingBlock.getIdentifier()); - } - private void writeToBundle(@NonNull Bundle bundle) { SnrConfig cfg = new SnrConfig(); cfg.searchMode = getSearchInCode(); @@ -192,21 +185,24 @@ private void writeToBundle(@NonNull Bundle bundle) { case 1: case 2: case 3: - cfg.searchBlockMain = new SnrConfig.SearchConditionBlock(mBinding.searchBlockAny.getBlock()); + cfg.searchBlockMain = new SnrConfig.SearchConditionBlock( + mBinding.searchBlockAny.getBlockTemplate().getBlock(), false, true); break; case 4: - cfg.searchBlockMain = new SnrConfig.SearchConditionBlock(mBinding.searchBlockFg.getBlock()); - cfg.searchBlockSub = new SnrConfig.SearchConditionBlock(mBinding.searchBlockBg.getBlock()); + cfg.searchBlockMain = new SnrConfig.SearchConditionBlock( + mBinding.searchBlockFg.getBlockTemplate().getBlock(), false, true); + cfg.searchBlockSub = new SnrConfig.SearchConditionBlock( + mBinding.searchBlockBg.getBlockTemplate().getBlock(), false, true); break; } switch (cfg.placeMode) { case 1: case 2: - cfg.placeBlockMain = convertListingBlockToBlock(mBinding.replaceBlockAny.getBlock()); + cfg.placeOldBlockMain = mBinding.replaceBlockAny.getBlockTemplate().getBlock(); break; case 3: - cfg.placeBlockMain = convertListingBlockToBlock(mBinding.replaceBlockFg.getBlock()); - cfg.placeBlockSub = convertListingBlockToBlock(mBinding.replaceBlockBg.getBlock()); + cfg.placeOldBlockMain = mBinding.replaceBlockFg.getBlockTemplate().getBlock(); + cfg.placeOldBlockSub = mBinding.replaceBlockBg.getBlockTemplate().getBlock(); break; } cfg.ignoreSubId = true;// mBinding.cbIgsub.isChecked(); @@ -230,25 +226,25 @@ private void onBlockItemClick(@NonNull View view) { @Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (resultCode == RESULT_OK && data != null) { - ListingBlock block = (ListingBlock) data.getSerializableExtra(PickBlockActivity.EXTRA_KEY_BLOCK); + var blockTemplate = (BlockTemplate) data.getSerializableExtra(PickBlockActivity.EXTRA_KEY_BLOCK); switch (requestCode - REQUEST_CODE) { case 0: - setBlockToItem(mBinding.searchBlockAny, block); + setBlockToItem(mBinding.searchBlockAny, blockTemplate); break; case 1: - setBlockToItem(mBinding.searchBlockBg, block); + setBlockToItem(mBinding.searchBlockBg, blockTemplate); break; case 2: - setBlockToItem(mBinding.searchBlockFg, block); + setBlockToItem(mBinding.searchBlockFg, blockTemplate); break; case 3: - setBlockToItem(mBinding.replaceBlockAny, block); + setBlockToItem(mBinding.replaceBlockAny, blockTemplate); break; case 4: - setBlockToItem(mBinding.replaceBlockBg, block); + setBlockToItem(mBinding.replaceBlockBg, blockTemplate); break; case 5: - setBlockToItem(mBinding.replaceBlockFg, block); + setBlockToItem(mBinding.replaceBlockFg, blockTemplate); break; } return; @@ -256,10 +252,10 @@ public void onActivityResult(int requestCode, int resultCode, @Nullable Intent d super.onActivityResult(requestCode, resultCode, data); } - private void setBlockToItem(@NonNull IncludeBlockBinding item, @NonNull ListingBlock block) { - item.icon.setImageBitmap(block.getIcon(getResources().getAssets())); - UiUtil.blendBlockColor(item.getRoot(), block); - item.setBlock(block); + private void setBlockToItem(@NonNull IncludeBlockBinding item, @NonNull BlockTemplate template) { + item.icon.setImageBitmap(template.getIcon().getIcon(getContext())); + UiUtil.blendBlockColor(item.getRoot(), template); + item.setBlockTemplate(template); } private void onClickOk(View view) { diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SelectionBasedContextFreeEditTask.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SelectionBasedContextFreeEditTask.java index a3e6ef40..69b92384 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SelectionBasedContextFreeEditTask.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SelectionBasedContextFreeEditTask.java @@ -11,9 +11,9 @@ import androidx.appcompat.app.AlertDialog; import com.mithrilmania.blocktopograph.R; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; -import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.map.Biome; import com.mithrilmania.blocktopograph.map.MapFragment; import com.mithrilmania.blocktopograph.util.UiUtil; @@ -34,13 +34,13 @@ public class SelectionBasedContextFreeEditTask extends private final WeakReference mOwner; @NonNull - private final BlockRegistry registry; + private final OldBlockRegistry registry; private AlertDialog mWaitDialog; public SelectionBasedContextFreeEditTask( @NonNull EditFunction func, @Nullable Bundle args, @NonNull MapFragment owner, - @NonNull BlockRegistry registry) { + @NonNull OldBlockRegistry registry) { mFunction = func; mArgs = args; this.registry = registry; @@ -67,8 +67,8 @@ protected EditResultCode doInBackground(EditTarget... editTargets) { SnrConfig cfg = new SnrConfig(); cfg.searchMode = 2; cfg.placeMode = 1; - cfg.searchBlockMain = new SnrConfig.SearchConditionBlock(ListingBlock.B_50_TORCH); - cfg.placeBlockMain = registry.createBlock(KnownBlockRepr.B_20_0_GLASS); + cfg.searchBlockMain = new SnrConfig.SearchConditionBlock(BlockTemplates.getOfType("minecraft:torch")[0].getBlock(), true, true); + cfg.placeOldBlockMain = BlockTemplates.getOfType("minecraft:glass")[0].getBlock(); cfg.ignoreSubId = true; return doSnr(cfg, editTargets); } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrConfig.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrConfig.java index c06f6eb0..b4b98850 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrConfig.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrConfig.java @@ -1,9 +1,15 @@ package com.mithrilmania.blocktopograph.map.edit; +import android.util.Pair; + +import androidx.annotation.NonNull; + +import com.google.common.collect.Streams; import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.ListingBlock; import java.io.Serializable; +import java.util.Arrays; +import java.util.Objects; public class SnrConfig implements Serializable { @@ -21,8 +27,8 @@ public class SnrConfig implements Serializable { public int placeMode; public SearchConditionBlock searchBlockMain; public SearchConditionBlock searchBlockSub; - public Block placeBlockMain; - public Block placeBlockSub; + public Block placeOldBlockMain; + public Block placeOldBlockSub; //savedInstanceState.getInt(KEY_SEARCH_IN, 0) //savedInstanceState.getInt(KEY_PLACE_IN, 0) @@ -44,10 +50,32 @@ public class SnrConfig implements Serializable { // bundle.putSerializable(KEY_PLACE_FG, mBinding.replaceBlockFg.getBlock()); public static class SearchConditionBlock implements Serializable { - public String identifier; + private final Block examplar; + private final boolean matchNameOnly; + private final boolean allowExtraStates; + + public SearchConditionBlock(@NonNull Block block, boolean matchNameOnly, boolean allowExtraStates) { + this.examplar = block; + this.matchNameOnly = matchNameOnly; + this.allowExtraStates = allowExtraStates; + } - public SearchConditionBlock(ListingBlock block) { - identifier = block.getIdentifier(); + public boolean matches(Block block) { + if (!examplar.getName().equals(block.getName())) return false; + var examplarKnownProperties = examplar.getKnownProperties(); + if (examplarKnownProperties != null && Streams.zip(Arrays.stream(examplarKnownProperties), + Arrays.stream(block.getKnownProperties()), Pair::new) + .anyMatch(pair -> pair.first != null && !Objects.equals(pair.first, pair.second))) { + return false; + } + var examplarCustomProperties = examplar.getCustomProperties(); + var blockCustomProperties = block.getCustomProperties(); + if (!allowExtraStates && blockCustomProperties.size() > examplarCustomProperties.size()) + return false; + for (var pair : examplarCustomProperties.entrySet()) + if (!Objects.equals(pair.getValue(), blockCustomProperties.get(pair.getKey()))) + return false; + return true; } } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrEdit.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrEdit.java index 1dc27869..4d58f347 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrEdit.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/edit/SnrEdit.java @@ -3,12 +3,13 @@ import androidx.annotation.NonNull; import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.chunk.Chunk; public class SnrEdit implements EditTarget.RandomAccessEdit { - private SnrConfig config; + private final SnrConfig config; private SnrConfig.SearchConditionBlock b1; private SnrConfig.SearchConditionBlock b2; private Block b3; @@ -30,30 +31,26 @@ public class SnrEdit implements EditTarget.RandomAccessEdit { switch (cfg.placeMode) { case 1: case 2: - b3 = cfg.placeBlockMain; + b3 = cfg.placeOldBlockMain; break; case 3: - b3 = cfg.placeBlockMain; - b4 = cfg.placeBlockSub; + b3 = cfg.placeOldBlockMain; + b4 = cfg.placeOldBlockSub; break; } } - private boolean matches(Block got, SnrConfig.SearchConditionBlock expected) { - return got.getBlockType().equals(expected.identifier); - } - @Override public int edit(Chunk chunk, int x, int y, int z) { if ( - (config.searchMode == 1 && matches(chunk.getBlock(x, y, z, 1), b1) - ) || (config.searchMode == 2 && matches(chunk.getBlock(x, y, z), b1) + (config.searchMode == 1 && b1.matches(chunk.getBlock(x, y, z, 1)) + ) || (config.searchMode == 2 && b1.matches(chunk.getBlock(x, y, z)) ) || (config.searchMode == 3 && ( - matches(chunk.getBlock(x, y, z), b1) - || matches(chunk.getBlock(x, y, z, 1), b1)) + b1.matches(chunk.getBlock(x, y, z)) + || b1.matches(chunk.getBlock(x, y, z, 1))) ) || (config.searchMode == 4 && ( - matches(chunk.getBlock(x, y, z), b1) - && matches(chunk.getBlock(x, y, z, 1), b2)) + b1.matches(chunk.getBlock(x, y, z)) + && b2.matches(chunk.getBlock(x, y, z, 1))) ) ) { switch (config.placeMode) { diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/CaveRenderer.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/CaveRenderer.java index ca7c16bd..ffd7d1c1 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/CaveRenderer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/CaveRenderer.java @@ -7,7 +7,8 @@ import android.graphics.Rect; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.Version; import com.mithrilmania.blocktopograph.map.Dimension; @@ -43,67 +44,54 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int int r = 0, g = 0, b = 0; - subChunkLoop: for (int y = chunk.getHeightMapValue(x, z); y >= 0; y--) { - Block block = chunk.getBlock(x, y, z, 0); - - switch (block.getLegacyBlock()) { - case B_0_0_AIR: - //count the number of times it goes from solid to air - if (solid) layers++; - - //count the air blocks underground, - // but avoid trees by skipping the first layer - if (intoSurface) cavyness++; - break; - case B_66_0_RAIL://rail + var blockTemplate = chunk.getBlockTemplate(x, y, z, 0); + + //wooden plank + //stone bricks + //moss cobblestone + if (BlockTemplates.getAirTemplate().equals(blockTemplate)) { + //count the number of times it goes from solid to air + if (solid) layers++; + //count the air blocks underground, + // but avoid trees by skipping the first layer + if (intoSurface) cavyness++; + } else { + var blockName = blockTemplate.getBlock().getName(); + if ("minecraft:rail".equals(blockName)) {//rail if (b < 150) { b = 150; r = g = 50; } - break; - case B_5_0_PLANKS_OAK://wooden plank - case B_5_1_PLANKS_SPRUCE: - case B_5_2_PLANKS_BIRCH: - case B_5_3_PLANKS_JUNGLE: - case B_5_4_PLANKS_ACACIA: - case B_5_5_PLANKS_BIG_OAK: + } else if ("minecraft:planks".equals(blockName)) { if (b < 100) { b = 100; r = g = 100; } - break; - case B_52_0_MOB_SPAWNER://monster spawner + } else if ("minecraft:mob_spawner".equals(blockName)) {//monster spawner r = g = b = 255; - break subChunkLoop; - case B_54_0_CHEST://chest + break; + } else if ("minecraft:chest".equals(blockName)) {//chest if (b < 170) { b = 170; r = 240; g = 40; } - break; - case B_98_0_STONEBRICK_DEFAULT://stone bricks - case B_98_1_STONEBRICK_MOSSY: - case B_98_2_STONEBRICK_CRACKED: - case B_98_3_STONEBRICK_CHISELED: - case B_98_4_STONEBRICK_SMOOTH: + } else if ("minecraft:stonebrick".equals(blockName)) { if (b < 145) { b = 145; r = g = 120; } - break; - case B_48_0_MOSSY_COBBLESTONE://moss cobblestone - case B_4_0_COBBLESTONE://cobblestone + } else if ("minecraft:mossy_cobblestone".equals(blockName) || "minecraft:cobblestone".equals(blockName)) {//cobblestone if (b < 140) { b = 140; r = g = 100; } - break; + } } r += chunk.getBlockLightValue(x, y, z); - solid = Color.alpha(block.getColor()) == 0xff; + solid = Color.alpha(blockTemplate.getColor()) == 0xff; intoSurface |= solid && (y < 60 || layers > 0); } @@ -114,8 +102,8 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int } else r *= r; - r = r < 0 ? 0 : r > 255 ? 255 : r; - g = g < 0 ? 0 : g > 255 ? 255 : g; + r = r < 0 ? 0 : Math.min(r, 255); + g = g < 0 ? 0 : Math.min(g, 255); //b = b < 0 ? 0 : b > 255 ? 255 : b; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/MapType.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/MapType.java index bd9040da..a2037594 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/MapType.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/MapType.java @@ -44,7 +44,7 @@ public enum MapType implements DetailLevelManager.LevelType { NETHER_BLOCK_LIGHT(new BlockLightRenderer()), //add in 1.16.0 - NETHER_BIOME(new BiomeRenderer()); + NETHER_BIOME(new BiomeRenderer()), END_SATELLITE(new SatelliteRenderer()), diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/NetherRenderer.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/NetherRenderer.java index 3d63eb88..599345eb 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/NetherRenderer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/NetherRenderer.java @@ -7,7 +7,9 @@ import android.graphics.Rect; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.Version; @@ -76,16 +78,16 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int for (y = caveceil; y >= cavefloor; y--) { - Block block = chunk.getBlock(x, y, z, 0); + var blockTemplate = chunk.getBlockTemplate(x, y, z, 0); - if (block.getLegacyBlock() == KnownBlockRepr.B_0_0_AIR) + if (BlockTemplates.getAirTemplate().equals(blockTemplate)) continue;//skip air blocks //try the default meta value: 0 - //if (block == null) block = KnownBlockRepr.getBlock(id, 0); + //if (oldBlock == null) oldBlock = KnownBlockRepr.getBlock(id, 0); - int color = block.getColor(); - // no need to process block if it is fully transparent + int color = blockTemplate.getColor(); + // no need to process oldBlock if it is fully transparent if (Color.alpha(color) == 0) continue; float rf = Color.red(color) / 255f; @@ -103,7 +105,7 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int sumBf += blendB; a *= 1f - af; - // break when an opaque block is encountered + // break when an opaque oldBlock is encountered if (Color.alpha(color) == 0xff) break; } @@ -123,40 +125,37 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int int b = (int) (avgShading * sumBf / layers * 255f); - r = r < 0 ? 0 : r > 255 ? 255 : r; - g = g < 0 ? 0 : g > 255 ? 255 : g; - b = b < 0 ? 0 : b > 255 ? 255 : b; + r = r < 0 ? 0 : Math.min(r, 255); + g = g < 0 ? 0 : Math.min(g, 255); + b = b < 0 ? 0 : Math.min(b, 255); for (y = 0; y < chunk.getHeightLimit(); y++) { //some x-ray for important stuff like portals - switch (chunk.getBlock(x, y, z, 0).getLegacyBlock()) { - case B_52_0_MOB_SPAWNER://monster spawner - r = g = b = 255; - break; - case B_54_0_CHEST://chest - if (worth < 90) { - worth = 90; - b = 170; - r = 240; - g = 40; - } - break; - case B_115_0_NETHER_WART://nether wart - if (worth < 80) { - worth = 80; - r = b = 120; - g = 170; - } - break; - case B_90_0_PORTAL://nether portal - if (worth < 95) { - worth = 95; - r = 60; - g = 0; - b = 170; - } - break; + BlockTemplate blockTemplate = chunk.getBlockTemplate(x, y, z, 0); + var blockName = blockTemplate.getBlock().getName(); + if ("minecraft:mob_spawner".equals(blockName)) {//monster spawner + r = g = b = 255; + } else if ("minecraft:chest".equals(blockName)) {//chest + if (worth < 90) { + worth = 90; + b = 170; + r = 240; + g = 40; + } + } else if ("minecraft:nether_wart".equals(blockName)) {//nether wart + if (worth < 80) { + worth = 80; + r = b = 120; + g = 170; + } + } else if ("minecraft:portal".equals(blockName)) {//nether portal + if (worth < 95) { + worth = 95; + r = 60; + g = 0; + b = 170; + } } } diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/SatelliteRenderer.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/SatelliteRenderer.java index 682d6114..ef4cc528 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/SatelliteRenderer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/SatelliteRenderer.java @@ -8,7 +8,8 @@ import androidx.annotation.NonNull; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; +import com.mithrilmania.blocktopograph.block.BlockTemplates; +import com.mithrilmania.blocktopograph.block.OldBlock; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.Version; @@ -33,13 +34,11 @@ static int getColumnColour(@NonNull Chunk chunk, int x, int y, int z, int height y--; for (; y >= 0 && alphaRemain >= .1f; y--) { - Block block = chunk.getBlock(x, y, z, 0); + var blockTemplate = chunk.getBlockTemplate(x, y, z, 0); - KnownBlockRepr legacyBlock = block.getLegacyBlock(); + if (BlockTemplates.getAirTemplate().equals(blockTemplate)) continue;//skip air blocks - if (legacyBlock == KnownBlockRepr.B_0_0_AIR) continue;//skip air blocks - - int color = block.getColor(); + int color = blockTemplate.getColor(); // no need to process block if it is fully transparent if (Color.alpha(color) == 0) continue; @@ -52,7 +51,7 @@ static int getColumnColour(@NonNull Chunk chunk, int x, int y, int z, int height float blendB = alphaRemain * blendA * (Color.blue(color) / 255f); //blend biome-colored blocks - if (legacyBlock.hasBiomeShading) { + if (blockTemplate.isHasBiomeShading()) { blendR *= biomeR; blendG *= biomeG; blendB *= biomeB; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/XRayRenderer.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/XRayRenderer.java index 247e2875..b5d13fc9 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/XRayRenderer.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/renderer/XRayRenderer.java @@ -6,6 +6,8 @@ import android.graphics.Rect; import com.mithrilmania.blocktopograph.WorldData; +import com.mithrilmania.blocktopograph.block.BlockTemplate; +import com.mithrilmania.blocktopograph.block.BlockTemplates; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.Version; @@ -24,39 +26,38 @@ public void renderToBitmap(Chunk chunk, Canvas canvas, Dimension dimension, int int rW = 16; int size2D = rW * (16); int index2D; - KnownBlockRepr[] bestBlock = new KnownBlockRepr[size2D]; + var bestBlock = new BlockTemplate[size2D]; int[] minValue = new int[size2D]; int bValue; - KnownBlockRepr block; int average; + BlockTemplate blockTemplate; for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) { for (int y = 0; y < chunk.getHeightLimit(); y++) { - block = chunk.getBlock(x, y, z, 0).getLegacyBlock(); - + blockTemplate = chunk.getBlockTemplate(x, y, z, 0); + var blockName = blockTemplate.getBlock().getName(); index2D = (z * rW) + x; - if (block.id <= 1) - continue; - else if (block == KnownBlockRepr.B_56_0_DIAMOND_ORE) { - bestBlock[index2D] = block; + if (BlockTemplates.getAirTemplate().equals(blockTemplate)) continue; + else if ("minecraft:diamond_ore".equals(blockName)) { + bestBlock[index2D] = blockTemplate; break; - } else if (block == KnownBlockRepr.B_129_0_EMERALD_ORE) bValue = 8; - else if (block == KnownBlockRepr.B_153_0_QUARTZ_ORE) bValue = 7; - else if (block == KnownBlockRepr.B_14_0_GOLD_ORE) bValue = 6; - else if (block == KnownBlockRepr.B_15_0_IRON_ORE) bValue = 5; - else if (block == KnownBlockRepr.B_73_0_REDSTONE_ORE) bValue = 4; - else if (block == KnownBlockRepr.B_21_0_LAPIS_ORE) bValue = 3; - //else if(block == KnownBlockRepr.COAL_ORE) bValue = 2; + } else if ("minecraft:emerald_ore".equals(blockName)) bValue = 8; + else if ("minecraft:quartz_ore".equals(blockName)) bValue = 7; + else if ("minecraft:gold_ore".equals(blockName)) bValue = 6; + else if ("minecraft:iron_ore".equals(blockName)) bValue = 5; + else if ("minecraft:redstone_ore".equals(blockName)) bValue = 4; + else if ("minecraft:lapis_ore".equals(blockName)) bValue = 3; + //else if(oldBlock == KnownBlockRepr.COAL_ORE) bValue = 2; //else if(b == KnownBlockRepr.LAVA || b == KnownBlockRepr.STATIONARY_LAVA) bValue = 1; else bValue = 0; if (bValue > minValue[index2D]) { minValue[index2D] = bValue; - bestBlock[index2D] = block; + bestBlock[index2D] = blockTemplate; } } } @@ -70,13 +71,13 @@ else if (block == KnownBlockRepr.B_56_0_DIAMOND_ORE) { for (int z = 0, tY = pY; z < 16; z++, tY += pL) { for (int x = 0, tX = pX; x < 16; x++, tX += pW) { - block = bestBlock[(z * rW) + x]; + blockTemplate = bestBlock[(z * rW) + x]; int color; - if (block == null) { + if (blockTemplate == null) { color = 0xff000000; } else { - color = block.color; + color = blockTemplate.getColor(); int r = Color.red(color); int g = Color.green(color); diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionMenuFragment.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionMenuFragment.java index 8d1a17dc..1ad4d5e0 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionMenuFragment.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionMenuFragment.java @@ -21,7 +21,7 @@ import com.mithrilmania.blocktopograph.Log; import com.mithrilmania.blocktopograph.R; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.databinding.FragSelMenuBinding; import com.mithrilmania.blocktopograph.map.FloatPaneFragment; import com.mithrilmania.blocktopograph.map.edit.ChBiomeFragment; @@ -44,10 +44,10 @@ public class SelectionMenuFragment extends FloatPaneFragment { private EditFunctionEntry mEditFunctionEntry; - private BlockRegistry registry; + private OldBlockRegistry registry; public static SelectionMenuFragment newInstance( - @NonNull Rect initial, @NonNull BlockRegistry registry, @NonNull EditFunctionEntry editFunctionEntry) { + @NonNull Rect initial, @NonNull OldBlockRegistry registry, @NonNull EditFunctionEntry editFunctionEntry) { SelectionMenuFragment fragment = new SelectionMenuFragment(); fragment.mSelection.set(initial); fragment.registry = registry; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionView.java b/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionView.java index dc05c926..41f22b7e 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionView.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/map/selection/SelectionView.java @@ -55,7 +55,7 @@ public class SelectionView extends FrameLayout { * *

* If the drag distance of a given moment cannot move the selection - * at least 1 block's wide, we accumulate the distance to have a larger + * at least 1 oldBlock's wide, we accumulate the distance to have a larger * chance to move on the next round. *

*/ @@ -328,7 +328,7 @@ private void onMove() { //Log.d(this, "" + distOnScreen + "," + mDragCurrentPos + "," + mDragBeginPosCorr); - // If a previous round failed to move at least 1 block's wide, + // If a previous round failed to move at least 1 oldBlock's wide, // it would accumulate the distance till in a future round we could move. float movement = distOnScreen * amp + mDragAccumulation; @@ -337,7 +337,7 @@ private void onMove() { float pxPerBlx = scale * MCTileProvider.TILESIZE / 16; int distanceInBlocks = Math.round(movement / pxPerBlx); - // If it's less than a block we couldn't move, let the accumulation grow. + // If it's less than a oldBlock we couldn't move, let the accumulation grow. if (distanceInBlocks == 0) {//&& Math.abs(movement) >= 0.00001f) { mDragAccumulation = movement; break flow; @@ -545,7 +545,7 @@ protected void onLayout(boolean b, int i, int i1, int i2, int i3) { float scale = tileView.getScale(); - // Pixels per block. + // Pixels per oldBlock. float pxPerBlx = scale * MCTileProvider.TILESIZE / 16; // This would translate coordinate related to view, e.g. getScrollX() result, diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/test/MainTestActivity.java b/app/src/main/java/com/mithrilmania/blocktopograph/test/MainTestActivity.java index 127daa9b..51f0acc2 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/test/MainTestActivity.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/test/MainTestActivity.java @@ -22,8 +22,8 @@ import com.mithrilmania.blocktopograph.R; import com.mithrilmania.blocktopograph.World; import com.mithrilmania.blocktopograph.WorldData; -import com.mithrilmania.blocktopograph.block.Block; -import com.mithrilmania.blocktopograph.block.BlockRegistry; +import com.mithrilmania.blocktopograph.block.OldBlock; +import com.mithrilmania.blocktopograph.block.OldBlockRegistry; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.chunk.Chunk; import com.mithrilmania.blocktopograph.chunk.ChunkTag; @@ -296,13 +296,13 @@ private void onClickFixLdb(View view) { }); } - @SuppressWarnings("unchecked") + /*@SuppressWarnings("unchecked") private void onClickGenAllBlocks(View view) { new ForegroundTask(this).execute(() -> { WorldData worldData = mWorld.getWorldData(); - BlockRegistry registry = worldData.mBlockRegistry; + OldBlockRegistry registry = worldData.mOldBlockRegistry; int pos = 0; - for (KnownBlockRepr block : KnownBlockRepr.values()) { + for (KnownBlockRepr oldBlock : KnownBlockRepr.values()) { if (pos % 16 == 0) worldData.removeChunkData(pos / 16, 0, ChunkTag.TERRAIN, Dimension.OVERWORLD, (byte) 0, true); String pot = "------------X------------" + @@ -313,7 +313,7 @@ private void onClickGenAllBlocks(View view) { for (int y = 0; y < 3; y++) for (int x = 0; x < 5; x++) for (int z = 0; z < 5; z++) { - Block blk; + OldBlock blk; switch (pot.charAt(i)) { case 'X': blk = registry.createBlock(KnownBlockRepr.B_42_0_IRON_BLOCK); @@ -322,7 +322,7 @@ private void onClickGenAllBlocks(View view) { blk = registry.createBlock(KnownBlockRepr.B_3_0_DIRT); break; case '?': - blk = registry.createBlock(block); + blk = registry.createBlock(oldBlock); break; default: blk = null; @@ -343,7 +343,7 @@ private void onClickGenAllBlocks(View view) { worldData.closeDB(); return "meow"; }); - } + }*/ @SuppressWarnings("unchecked") private void onClickAnaAllBlocks(View view) { @@ -352,7 +352,7 @@ private void onClickAnaAllBlocks(View view) { // int pos = 0, valids = 0, invalids = 0, offs = 0; // StringBuilder sb = new StringBuilder(); // CompoundTag[] tags = null; -// for (KnownBlockRepr block : KnownBlockRepr.values()) { +// for (KnownBlockRepr oldBlock : KnownBlockRepr.values()) { // Chunk chunk = worldData.getChunk(pos / 16, 0, Dimension.OVERWORLD, true, Version.V1_2_PLUS); // int ind; // if (pos % 16 == 0) { @@ -360,7 +360,7 @@ private void onClickAnaAllBlocks(View view) { // ind = 0; // } else ind = 1; // String name = ((StringTag) tags[ind].getChildTagByKey("name")).getValue().substring(10); -// sb.append(block.identifier).append(":").append(block.subId).append("->").append(name).append(":"); +// sb.append(oldBlock.identifier).append(":").append(oldBlock.subId).append("->").append(name).append(":"); // CompoundTag states = ((CompoundTag) tags[ind].getChildTagByKey("states")); // sb.append("["); // ArrayList value = states.getValue(); @@ -401,7 +401,7 @@ private void onClickGenCodeAllBlocksState(View view) { // int pos = 0, valids = 0, invalids = 0; // StringBuilder sb = new StringBuilder(); // CompoundTag[] tags = null; -// for (KnownBlockRepr block : KnownBlockRepr.values()) { +// for (KnownBlockRepr oldBlock : KnownBlockRepr.values()) { // Chunk chunk = worldData.getChunk(pos / 16, 0, Dimension.OVERWORLD, true, Version.V1_2_PLUS); // int ind; // if (pos % 16 == 0) { @@ -409,7 +409,7 @@ private void onClickGenCodeAllBlocksState(View view) { // ind = 0; // } else ind = 1; // String name = ((StringTag) tags[ind].getChildTagByKey("name")).getValue().substring(10); -// if (name.equals(block.identifier)) { +// if (name.equals(oldBlock.identifier)) { // CompoundTag states = ((CompoundTag) tags[ind].getChildTagByKey("states")); // sb.append("new BlockStateBuilder()"); // Object[] value = states.getValue().toArray(); diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/util/UiUtil.java b/app/src/main/java/com/mithrilmania/blocktopograph/util/UiUtil.java index ce110deb..b070b5d2 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/util/UiUtil.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/util/UiUtil.java @@ -20,6 +20,7 @@ import com.google.android.material.snackbar.Snackbar; import com.mithrilmania.blocktopograph.R; +import com.mithrilmania.blocktopograph.block.BlockTemplate; import com.mithrilmania.blocktopograph.block.KnownBlockRepr; import com.mithrilmania.blocktopograph.block.ListingBlock; import com.mithrilmania.blocktopograph.databinding.GeneralWaitBinding; @@ -78,6 +79,16 @@ public static void blendBlockColor(@NonNull View view, ListingBlock block) { gradientDrawable.setColor(color); } + public static void blendBlockColor(@NonNull View view, BlockTemplate block) { + Drawable drawable = view.getBackground(); + if (!(drawable instanceof GradientDrawable)) return; + GradientDrawable gradientDrawable = (GradientDrawable) drawable; + int color = block.getColor(); + if (color != Color.TRANSPARENT) + color = ColorUtils.blendARGB(color, 0x7f7f7f7f, 0.5f); + gradientDrawable.setColor(color); + } + public static void blendBlockColor(@NonNull View view, Biome biome) { Drawable drawable = view.getBackground(); if (!(drawable instanceof GradientDrawable)) return; diff --git a/app/src/main/java/com/mithrilmania/blocktopograph/worldlist/WorldItemListActivity.java b/app/src/main/java/com/mithrilmania/blocktopograph/worldlist/WorldItemListActivity.java index 803857a7..a5d3e0ec 100644 --- a/app/src/main/java/com/mithrilmania/blocktopograph/worldlist/WorldItemListActivity.java +++ b/app/src/main/java/com/mithrilmania/blocktopograph/worldlist/WorldItemListActivity.java @@ -93,7 +93,7 @@ public static boolean verifyStoragePermissions(Activity activity) { private void showFeedbackRequestDialogIfNeeded() { SharedPreferences prefs = getPreferences(MODE_PRIVATE); if (prefs.getInt(PREF_KEY_ACCEPT_DATA_USAGE, 0) == 1) { - Log.enableCrashlytics(this); + Log.enableCrashlytics(); Log.enableFirebaseAnalytics(this); return; } @@ -113,8 +113,8 @@ private void showFeedbackRequestDialogIfNeeded() { } private void onAcceptedRequestDialog(DialogInterface dialogInterface, int i) { - Log.enableCrashlytics(this); Log.enableFirebaseAnalytics(this); + Log.enableCrashlytics(); getPreferences(MODE_PRIVATE).edit().putInt(PREF_KEY_ACCEPT_DATA_USAGE, 1).apply(); } diff --git a/app/src/main/res/layout/dialog_edit_layer.xml b/app/src/main/res/layout/dialog_edit_layer.xml index dbbfb4ed..e1eb0d35 100644 --- a/app/src/main/res/layout/dialog_edit_layer.xml +++ b/app/src/main/res/layout/dialog_edit_layer.xml @@ -44,13 +44,13 @@ + android:text="@{layer.block.block.name}" /> diff --git a/app/src/main/res/layout/include_block.xml b/app/src/main/res/layout/include_block.xml index 2695cb0a..46d4a470 100644 --- a/app/src/main/res/layout/include_block.xml +++ b/app/src/main/res/layout/include_block.xml @@ -5,8 +5,8 @@ + name="blockTemplate" + type="com.mithrilmania.blocktopograph.block.BlockTemplate" /> @@ -38,13 +38,13 @@ + android:text="@{blockTemplate.block.name}" /> diff --git a/app/src/main/res/layout/item_pick_block.xml b/app/src/main/res/layout/item_pick_block.xml index 69593b53..2c30a15f 100644 --- a/app/src/main/res/layout/item_pick_block.xml +++ b/app/src/main/res/layout/item_pick_block.xml @@ -5,8 +5,8 @@ + name="oldBlock" + type="com.mithrilmania.blocktopograph.block.BlockTemplate" /> @@ -38,13 +38,13 @@ + android:text="@{oldBlock.block.name}" /> diff --git a/app/src/main/res/layout/item_world_layer.xml b/app/src/main/res/layout/item_world_layer.xml index 72b19cb9..5c062dce 100644 --- a/app/src/main/res/layout/item_world_layer.xml +++ b/app/src/main/res/layout/item_world_layer.xml @@ -63,13 +63,13 @@ + android:text="@{layer.block.block.name+` x`+layer.amount}" /> diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 00000000..640dc22b --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,516 @@ + + + NBT данные ~local_player + Моя отметка + Ещё + Найти в + Показать все + Выберите приложение + ВЫКЛ + ВКЛ + Alt + + Ctrl + + Удалить + Ввод + Fn + + Meta + + Shift + + Пробел + Sym + + Меню + + Введите запрос + Удалить запрос + Поисковый запрос + Поиск + Отправить запрос + Голосовой поиск + Поделиться с помощью + Поделиться с помощью %s + Свернуть + Дополнительная информация + История изменений + Помощь + Настройки + Телепортировать! + Дополнительные параметры + Это приложение создано Protol Lambda (Ссылка удалена, так как он и просил), Участники проекта: @MithrilMania, @flagmaggot, @MeowCat, @MiemieMethod, Manuel", ScrapperBox25, Tcbdxh и многие другие. + +Приложение больше не доступно в Google Play. "Источник для загрузки APK. Текущий активный github репозиторий: github.com/oO0oO0oO0o0o00/blocktopograph Не стесняйтесь ставить звезду или форкать исходный код, помогать с проектом или просто добавлять свою собственную языковую поддержку. Ваш вклад на github приветствуется! Больше информации (включая дорожную карту проекта, список изменений и справочную информацию) можно найти по адресу: blocktopograph.protolambda.com (web archive)". + +Пожалуйста, сделайте резервную копию всех ваших любимых Minecraft миров на случай повреждения данных! +ПРИМЕЧАНИЕ: Minecraft может не загрузить целый мир из-за одного поврежденного фрагмента NBT! + +Это приложение создано и протестировано для Minecraft 1.16.x, 1.15.x, 1.14.x, 1.13.x, 1.12.x, 1.11.x, 1.10.x, 1.9.x(бета-версия), 1.8.x, 1.7.x, 1.6.x, 1.5.x, 1.4.x, 1.2.x, 1.1.x, 1.0.x, 0.16.x, 0.15.x и 0.14.x +Более старые версии MCPE не поддерживаются. + +Blocktopograph не может читать чанки миров созданных в Minecraft версии 1.16.100 и выше. Это означает, что если вы откройте такой мир в Blocktopograph, то его карта будет пустой. + +Начиная с Minecraft 1.18 Mojang изменил путь хранения миров с (/storage/emulated/0/games/com.mojang/minecraftWorlds) на (/storage/emulated/0/Android/data/com.mojang.minecraftpe/files/games/com.mojang/minecraftWorlds), Blocktopograph не может получить доступ к папкам в ...Android/data... из-за ограничений Android 11. Даже если вы укажите путь к файлу level.dat лежащему в этих папках Blocktopograph всë равно не сможет открыть мир. Вы можете: + • Использовать аналогичную программу на ПК или телефоне. + • Отправить миры из недоступной папки в (/storage/emulated/0/games/com.mojang/minecraftWorlds) для этого можно использовать ПК либо проводники способные обойти ограничения Android 11 такие как: ES проводник, Zarchiver, Total Commander и.т.д. Если Android в более новых версиях заблокирует доступ даже этим проводниками, то вы можете найти другой обходной путь либо другой проводник способный обходить это ограничение, либо произвести рутирование своего телефона и тогда у вас будет доступ ко всей ФС. + • Отредактировать APK Minecraft, чтобы заставить его сохранять миры в (/storage/emulated/0/games/com.mojang/minecraftWorlds) или туда куда вы хотите и там где доступ для Blocktopograph не заблокирован. + + + +"предупреждение" +"Это приложение не связано с Mojang AB или Microsoft." +Это не официальное, а фанатское приложение. +Minecraft является торговой маркой Mojang AB. +Пожалуйста, обратите внимание: +• Blocktopograph НЕ ЯВЛЯЕТСЯ ОФИЦИАЛЬНЫМ ПРОДУКТОМ MINECRAFT. НЕ ОДОБРЕН MOJANG И НЕ СВЯЗАН С НИМ. +• ПРИЛОЖЕНИЕ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. + + + "Библиотеки используемыев Blocktopograph:" + • "FloatingActionButton" + • "Tileview, fork by mithrilmania" + • "leveldb-mcpe" + с " android-leveldb, форк от mithrilmania" + +"Исходный код на GitHub:" +"https://github.com/oO0oO0oO0o0o00/blocktopograph" + Перевод на Русский язык выполнил "@Max_RM_" " + Версия: %1$s &lt;br/>&lt;br/> Полный список изменений можно найти по адресу (устарел): &lt;a href=https://web.archive.org/web/20200801044719/http://blocktopograph.protolambda.com/changelog> blocktopograph.protolambda.com/changelog (web archive) &lt;/a> + Документацию к приложению можно найти по адресу (страница была удалена, а часть информации устарела, вы можете перейти по ссылке, но попадëте на страницу сохранëнную в web archive): blocktopograph.protolambda.com/help (web archive)". " + Blocktopograph + com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior + Вы хотите закрыть этот мир? + Выполняется автоматическое резервное копирование... + [Авто] + Автоматически удалять резервные копии старше 3 дней (не удаляет, если существует не более 3 резервных копий) + Автоматически создавать резервные копии при каждом открытии мира в Blocktopograph + NBT автономных сущностей + Создание резервных копий и восстановление + Удаление резервной копии + Вы действительно хотите удалить резервную копию? + Это папка резервных копий для этого мира, созданная и управляемая NBT редактором миров Minecraft для Android и средством просмотра карт - Blocktopograph. Пожалуйста, не изменяйте файлы здесь, иначе вы не сможете восстановить эти резервные копии с помощью Blocktopograph. + Выберите биом + NBT данные биомов + Показать биомы + com.google.android.material.bottomsheet.BottomSheetBehavior + Приложение, созданное сообществом Minecraft + Невозможно отредактировать корневой NBT. + Не удается найти запись с таким именем! + Существующие резервные копии + Показать пещеры + Введенные символы %1$d of %2$d + Превышен лимит символов %1$d of %2$d + %1$d / %2$d + Текст чипа + Выбрать саб чанк(0…): + Открытый текст + Буфер обмена пуст! + Ошибка: элемент из буфера обмена уже существует в данном compound теге! + Закрыть + 243c826a-0ebd-4702-b35e-37032f3a8ba5 + Включить + Для работы приложения \"%1$s\" требуется включить сервисы Google Play. + Включите сервисы Google Play + Установить + Для работы приложения \"%1$s\" требуется установить сервисы Google Play. + Установите сервисы Google Play + Доступность сервисов Google Play + Ошибка сервисов Google Play + Приложению \"%1$s\" не удается подключиться к сервисам Google Play. Повторите попытку. + Для работы с приложением \"%1$s\" требуются сервисы Google Play. Они не поддерживаются на вашем устройстве. + Обновить + Чтобы запустить приложение \"%1$s\", обновите сервисы Google Play. + Обновите сервисы Google Play + Сервисы Google Play, необходимые для работы приложения \"%1$s\", в настоящий момент обновляются. + Версия сервисов Google Play устарела. Они автоматически обновятся в ближайшее время. + Открыть на телефоне + Войти + Войти через аккаунт Google + Вы действительно хотите закрыть этот NBT редактор? + Вы хотите закрыть этот мир? + Вы действительно хотите удалить все NBT? + Вы действительно хотите сохранить внесëнные изменения? + Не удалось найти миры! + Создать + Создать отметку на карте + "Ярлыки отметок: + • default_marker, blue_marker, green_marker, red_marker + • Вы можете использовать имена сущностей для ярлыков + • Вы можете использовать имена блоков для ярлыков +" + Создать NBT + После создания мира в Blocktopograph он появится в Minecraft (если Minecraft в этот момент был включен, то его нужно перезапустить). + Создать новую резервную копию + Числовой id биома, по умолчанию 21 + Биом: + " +§cДобро~ пожаловать~ Мяу~ +§rЭтот мир создан программой +§3Blocktopograph + +§1Скачайте в Google Play +§5и редактируйте ваши +§5собственные миры! + +§rДата создания мира: +§d%1$s" + "§r%1$dx §b%2$s +" + "Слои мира: +" + " §r..И больше" + Мяу~ + Мой мир + от_Blocktopograph.txt + "Добро~ пожаловать~ Мяу~ +Этот мир создан программой Blocktopograph, +NBT редактором миров Minecraft для Android. +Скачайте в Google Play или GitHub +и редактируйте ваши собственные миры!" + Слои: + Имя: + Создать плоский мир + Версия: + 1.2.13 + Созданы и сохранены новые NBT данные чанка! + Создание и сохранение новых NBT данных чанка… + Этот тип данных пока не существует для этого блока. Сначала он должен появиться, вы хотите его создать? + Моя отметка + 245780358673-r3au662jj4b7f4ou7j0vses5iqh7vu6i.apps.googleusercontent.com + УДАЛИТЬ! + NBT данные dimension0 + NBT данные dimension1 + NBT данные dimension2 + Добавить вложенный тег + Закрыть это окно + Копировать + Удалить + Добавить слой... + Здесь должен быть хотя бы один слой. + Редактировать + "1. Вы можете менять слои местами перетаскивая их за ярлык. +2. Кликните по любому элементу для начала редактирования. +3. Нажмите кнопку \"+\", чтобы добавить слой. +4. Проведите пальцем влево, чтобы удалить слой." + Количество: + Сумма всех слоев должна быть не менее 0 и не более 127. + Вставить (заменив текущий(е) тег(и)) + Вставить (как вложенный тег) + Переименовать + Добавить NBT + Вставить как вложенный тег + Удалить все NBT + Каждый раз, когда вы открываете мир, Blocktopograph будет создавать новую резервную копию. Это может занять некоторое время и привести к дополнительному использованию памяти. + Включить автоматическое резервное копирование + Данные сущностей в чанке + Миры не найдены. + "Обратите внимание, что более новый Minecraft по умолчанию помещает ваши миры в свои личные данные (доступ без root прав невозможен). По этой причине никакие инструменты не способны получить доступ к мирам. Вам нужно будет настроить Minecraft на использование \"внешнего\" хранилища, перейдя в Minecraft-> Настройки-> Профиль-> Расположение хранилища файлов и измените параметр с \"Приложение\" на \"Внешнее\". После этого вновь созданные миры будут доступны для Blocktopograph, в то время как существующие миры в корневой папке Minecraft не могут быть открыты. Возможно, вы захотите поискать в Google информацию о том, как переместить миры из внешнего хранилища во внутреннее. Для этого можно использовать WorldExporter: https://tikolu.net/world-exporter/ +Инструкция: https://youtu.be/7CsP52xNfTA + +Либо вы можете рутировать телефон и скопировать миры из папки (/data/user/0/com.mojang.minecraftpe/games/com.mojang/minecraftWorlds/) в (/storage/emulated/0/games/com.mojang/minecraftWorlds) с помощью проводников таких как: ES проводник, Zarchiver, Total Commander и.т.д" + Не удалось открыть этот мир Minecraft. Попробуйте перезапустить Blocktopograph и выйти из мира в Minecraft, если он был там открыт. + Ошибка: не удается перезаписать NBT в пустом родительском теге. + Ошибка: не удается перезаписать тег: неподходящий тип родительского NBT. + Ошибка: не удается вставить в качестве вложенного тега: неподходящий тип родительского NBT. + Ошибка: не удается удалить NBT из пустого списка. + Ошибка: не удалось открыть мир. + Ошибка: не удалось открыть сведения мира; потерян трекер мира. + Номер кредитной карты введён некорректно + Неправильный формат ввода + Доменное имя некорректно + Email введён некорректно + Поле не может быть пустым + Неизвестная ошибка. + Ошибка + IP-адрес введён некорректо + Ошибка: этот ключ уже существует в теге compound! + Некорректный ввод имени. + Некорректный ввод имени или фамилии. + Допускаются только цифры. + Допускаются только цифры из разрешённого диапазона + Допускается только стандартный текст + Произошла ошибка при попытке открыть мир + Ошибка: родительский NBT уже содержит этот ключ! + Номер телефона введён некорректно + Это поле не может содержать специальные символы + Интернет-адрес введён некорректно + Показать выпадающее меню + com.google.android.material.transformation.FabTransformationScrimBehavior + com.google.android.material.transformation.FabTransformationSheetBehavior + Не удалось найти игрока. + Не удалось найти спавн. + Не удалось открыть запись игрока из БД. ключ: %1$s + Не удалось телепортировать игрока. + Ошибка: не удалось создать отметку. + Ошибка: не удалось создать/сохранить новые NBT данные чанка. + Ошибка: не удалось выполнить изменение NBT. + Не удалось найти/отредактировать данные ~local_player. + Не удалось загрузить %1$s. + Не удалось прочитать \"%1$s\" из базы данных мира + Не удалось получить данные игрока. + Фильтр отметок + https://rbq2012-blocktopograph-r.firebaseio.com + Показать цвета листвы + dd/MM/yyyy hh:mm a + Выделить область + Убрать выделитель области + Приключения + Креатив + Выживание + 245780358673 + Отменено. + Удалить + Готово. + Не удалось. + Понятно + Игнорировать + Пожалуйста подождите... + Поделиться + Перейти! + Перейти к отметке: + Перейти к координатам + Перейти к ~local_player + Перейти к другому игроку + Перейти к позиции игрока + Перейти к спавну + AIzaSyAz5C2QrR8v3fljLC7UooajEH6b6I2uxGQ + 1:245780358673:android:09760b39a1d3e21f + AIzaSyAz5C2QrR8v3fljLC7UooajEH6b6I2uxGQ + rbq2012-blocktopograph-r.appspot.com + Продвинутый поисковик... + "Создать полную картину +мира" + Показать карту высот + com.google.android.material.behavior.HideBottomViewOnScrollBehavior + Дать имя резервной копии (это не обязательно) + Введите имя для тега... + Ярлык диалогового окна + Неверное имя ярлыка! + Неверное имя ключа. + Недопустимая координата X для отметки! + Недопустимая координата Y для отметки! + Недопустимая координата Z для отметки! + Введите levelDB ключ... + Показать карту света + Загрузка мира... + Координаты + Отметки + Игроки + Карта измерения + Дважды коснитесь экрана, чтобы открыть меню. + Всë выделенное + Что изменить + Конкретные биомы + Заменить на + Это приведëт к удалению всех фрагментов в пределах выбранной вами области. Позже Minecraft может снова сгенерировать эту область, но ваш прогресс внутри неë будет потерян. Если вы не знаете, что такое чанк в Minecraft, и не понимаете последствий, вам не следует продолжать. Не верьте рандомным онлайн-статьям, только Minecraft WIKI + Продолжить с автоматической настройкой + Выбранная вами область не была выровнена по границам чанков/чанка. Не волнуйтесь, Blocktopograph может подстроиться под вас. Фактическая удаленная область будет немного больше выделенной. Чтобы быть точным, это будет на 0 ~ 15 блоков больше с каждой стороны. Это потому, что область может быть сгенерирована повторно только в том случае, если она была удалена вместе с содержащимися в ней чанками. Если вам не нравится автоматическая настройка, вы можете нажать \"ОТМЕНА\" и изменить выделение самостоятельно. + Изменить биом + Удалить чанки + Факелы с абажурами + Создать картину + Найти и заменить + Это добавит стеклянные абажуры к факелам в выбранной области. Поддерживаются миры Minecraft Bedrock 1.4.x или выше. Мы советуем вам создать резервную копию вашего мира перед любыми изменениями в Blocktopograph. + Массив и под-массив + Под-массив + Под-массив: + Оба + Массив + Массив: + Выбрать + Искать в + "Простой поиск и замену можно выполнить, игнорируя под-массив. + +Начиная с версии Minecraft 1.4.x, под-массивы используются для хранения воды, сосуществующей с другими блоками в одной и той же позиции, однако их можно использовать для размещения любого блока вместо воды. Вы можете использовать эту функцию для размещения 2 разных блоков в одной и той же позиции." + Игнорировать подтипы + Любой + Заменить на + Неизвестная позиция + Вы можете удержать палец на экране для открытия меню и выбрать \"Выделить область\" чтобы начать редактировать область. + Параметры карты + Вы можете масштабировать изображение и сделать его больше. Минимальный масштаб - 1 пиксель на 1 блок. + Выбранная область слишком велика + Выбранная вами область слишком большая. Ширина и высота должны быть в пределах %1$d блоков, и площадь должна быть в пределах %2$d блоков². + "Мир слишком огромный. Вы можете: +(1) Использовать аналогичный инструмент на ПК; +(2) Начать выбор части мира, а не всего целиком и нажать \"Создать картину\" в меню выбора." + Мир слишком огромный + Ширина и высота должны быть не менее 1. + От [ + , + ] + Применить + Функции + Выделенная область + Функции для выделенной области + Диапазон + x + До [ %1$d, %2$d ] (включая от и до) + ВСЕГДА СОЗДАВАЙТЕ РЕЗЕРВНУЮ КОПИЮ, ПРЕЖДЕ ЧЕМ ПРОДОЛЖИТЬ! + Слишком много отметок! + На вашем экране слишком много отметок, например, мобов. Вы можете отключить их отображение, нажав Отображение отметок в маню или настроив фильтр отметок. + Открыть меню + Blocktopograph + %1$s (%2$d, %3$d, %4$d) + Недопустимое имя отметки! + Эта отметка не может быть удалена! + Новое уведомление + Убрать %1$s + %1$d%2$s + Переход к следующему месяцу + Переход к предыдущему месяцу + Текущее выделение: %1$s + brut.androlib.res.data.value.ResReferenceValue@f37859 + brut.androlib.res.data.value.ResReferenceValue@42b8c1e + %1$s + Выбрать дату + Выбранная дата + Колонка дней: %1$s + Неверный формат + Пример: %1$s + Использовать: %1$s + Недопустимый диапазон. + Перейдите к году %1$s + Вне диапазона: %1$s + Первая дата – %1$s + %1$s – последняя дата + %1$s – %2$s + Выберите диапазон дат + Первая дата - последняя дата + Сохранить + Дата + Последняя дата + Первая дата + д + м + г + Переключиться в режим ввода для календаря + Нажмите, чтобы переключиться на выбор дня + Переключиться в режим ввода текста + Нажмите, чтобы переключиться на выбор года + NBT данные игроков + Закрыть меню + Открыть меню + NBT данные чанка + NBT редактор + Функции NBT + Незер + "Пользовательские отметки не были созданы в этом мире! + +Вы можете создать их, долго нажимая на точку на карте, где вы хотите установить отметку, затем нажмите \"Создать отметку на карте\". Затем выберите ярлык отметки и высоту по координате Y. + +После создания отметки на карте она появится в этом списке!" + Нет отметок! + Никакие данные не были отредактированы, нечего сохранять. + Файл/папка не найдены по этому пути! + Файл level.dat не найден! + данные об уровне отсутствуют + Карта недоступна. + Не найдены NBT данные игроков. + Нет доступа на чтение/запись к мирам. + Не удается открыть миры, нет доступа на чтение/запись в хранилище! Попробуйте перезапустить приложение и разрешите доступ на чтение/запись в появившемся окне. + Открыть + Показать NBT данные сущностей в чанке + Показать NBT данные блоков в чанке + Открыть NBT данные игрока + Открыть NBT по имени + Поиск NBT данных в БД + "Приложение опасно, +сделайте резервную копию перед редактированием!" + Открыть мир с пользовательским путем + Основное измерение + NBT основного измерения + Показать пароль + M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5zM12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5zM12,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3 3,-1.34 3,-3 -1.34,-3 -3,-3z + M2,4.27 L19.73,22 L22.27,19.46 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z + M2,4.27 L2,4.27 L4.54,1.73 L4.54,1.73 L4.54,1 L23,1 L23,23 L1,23 L1,4.27 Z + M3.27,4.27 L19.74,20.74 + "В мире есть данные из старой версии Minecraft. Возможно, вы захотите выйти из программы и открыть мир в более новом Minecraft, чтобы данные автоматически обновились. Вы также можете игнорировать эти данные. " + Есть поврежденные или неподдерживаемые данные, пропустить или выйти? + Сгенерировать + Отмена и возврат + Это создало бы картину мира и может привести к сбою. + Ваш мир не может быть распознан через Blocktopograph, возможно, ваша версия игры слишком старая или слишком новая. + Местность не найдена. + Этот Minecraft мир имеет слишком старую версию, поэтому не может быть прочитан. + Предварительный просмотр: + Создание предварительного просмотра... + Анализ + Сохранить + Картина будет сохранена в вашей папке загрузки. + Картина сохранена. + Примерно %1$dx%2$d. + Выберите масштаб: + Поделиться с + Сгенерировать картину мира + Каждый блок будет размером в один пиксель. Если вы выберете меньшую область, то сможете увеличить масштаб изображения. + Выберите блок + Игрок + Координаты: (%1$d, %2$d, %3$d) Измерение: %4$s + "NBT данные незер порталов " + Координаты:(%1$.1f, %2$.1f) чанк:(%3$d, %4$d) + Принять и продолжить + Выход + "Здравствуй друг, + +Для улучшения работы Blocktopograph от вас может потребоваться предоставить нам определенную информацию, включая, но не ограничиваясь, общую информацию об открытых вами мирах Minecraft, включая версии, сиды и статистику, связанную с устройством/ОС, автоматически собираемую Firebase, которая может быть (косвенно) идентифицируемой лично, технически. + +Ссылки на политику конфиденциальности сторонних поставщиков услуг, используемых приложением: +"Сервисы Google Play" +"Firebase Analytics" +"Crashlytics (web archive)" + +Все собранные данные будут обрабатываться только на защищенных сервисах, предоставляемых этими общедоступными поставщиками онлайн услуг. + +Полная политика конфиденциальности доступна по адресу "Политика конфиденциальности Blocktopograph + Политика конфиденциальности + rbq2012-blocktopograph-r + Список миров обновлëн. + Удалить отметку + Переименовать + Переименовать NBT + "Ваш путь: %1$s + + Уже произведен поиск мировых папок в: %2$s" + Восстановить + Восстановление предыдущей резервной копии + Это возвратит вспять все изменения в мире, которые были внесены до создания резервной копии! Вы уверены? Будьте осторожны, это может стереть вашу работу! + Функции для корневого NBT + Карта измерения + Поиск + Поиск отметок… + Выбрать игрока + Выйти из мира + Показать карту + NBT данные ~local_player + Показать слайм чанки + Что-то пошло не так... + %1$s (%2$.1f, %3$.1f, %4$.1f) + %1$s в, (%2$d, %3$d, %4$d) + Спавн + >999 + Укажите путь до файла level.dat + Саб чанк + Ошибка: вставлять тег можно только в теги типа \"compound\" и теги типа \"list\". + Телепортировать игрока в точку которую вы нажали + Игрок телепортирован в (%1$.1f, %2$.1f, %3$.1f) + Игрок телепортирован в: + Эндер мир + Данные блоков в чанке + Мир + Тестовая страница + Мир + Выберите мир + Включить/выключить сетку + Отображение отметок + Извините, что-то пошло не так, и вы не сможете использовать это приложение. Короче говоря, волшебная часть приложения отсутствует. \\nВы приложение (apk-файл) от кого-то другого, кто ранее установил приложение? Затем приложение было оптимизировано только для устройства этого человека, даже если у вас та же модель устройства, оно не будет работать. Попробуйте удалить и переустановить из Google Play Store, возможно, это решит проблему. Вы также можете скачать полную версию приложения с GitHub или из других источников. В этом случае вам также может потребоваться удалить эту версию приложения. Извините за неудобства.\\nЕсли это не та ситуация, то мы понятия не имеем в чëм проблема. + NBT данные деревень + [NetEase] + Повреждëнный мир + NBT данные level.dat + Сид мира: + Путь к файлу: + Режим игры: + Последняя игра: + Имя мира: + Сид мира: + Размер мира: + Этот путь (необязательно с суффиксом /level.dat) не является директорией! + \"%1$s\" некорректный! + X-Ray (показать руды) + diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml new file mode 100644 index 00000000..6f171388 --- /dev/null +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -0,0 +1,421 @@ + + + 由Proto Lambda製作 + 請選擇一個地圖 + 地圖 + 地圖 + 打開導航欄 + 關閉導航欄 + 設定 + 關於 + 幫助 + 更新內容 + "無法打開地圖,沒有存儲的讀寫許可權! + 請嘗試重啟應用並接受對讀/寫許可權的請求,或者在應用設置/手機管家中開啟本應用的存儲許可權。" + 沒有自定義標記! + 還沒有自定義標記! + 你可以在地圖上你想要的地方長按來創建一個標記, + 然後點擊「創建自定義標記」。 + 然後選擇一個標記圖標和一個Y坐標。 + 最後在地圖上檢查一下你有沒有成功創建它! + 查看本應用的文檔(長期未更新): + + blocktopograph.protolambda.com/help + . + 地圖種子碼: + + 本應用由Proto Lambda(應其要求,已移除鏈接)原創, + @MithrilMania、 + @flagmaggot、 + @MeowCat、 + @MiemieMethod、 + Manuel和其他人參與更新和維護。 + 感謝百度貼吧minecraftpe吧的朋友們提供反饋。 + 可以在Google Play、Github的項目release頁面(PC版網頁)下載或百度貼吧搜索。 + 有賬號的可以點一下Star~ + 歡迎在Github查看源代碼,並參與更新維護(包括增強翻譯): + github.com/oO0oO0oO0o0o00/blocktopograph + 使用前請備份你的重要存檔,以免發生意外。一點小問題都可能導致Minecraft無法載入整個存檔→_→ + 本應用支持MCPE 0.14至1.9(當前)的存檔格式,更舊或者更新的版本【可能】不完全兼容,但不妨一試。 + 原作者網站:blocktopograph.protolambda.com + 免責聲明 + 此應用程序與Minecraft、Mojang AB或Microsoft無關。 + 這不是一個官方的而是一個飯制的APP。 + Minecraft是Mojang的一個商標。 + 請注意: + • 【這不是一個官方的MINECRAFT產品。並未經MOJANG批准並且與其無關。】 + • 【該APP「按原樣」提供,不提供任何形式的保證。】 + 使用的庫 + • FloatingActionButton + • + Tileview,mithrilmania的版本庫分支 + • leveldb-mcpe + with + android-leveldb,mithrilmania的版本庫分支 + + + + 版本: %1$s +
+ 2018之前的更新記錄可以到: + + blocktopograph.protolambda.com/changelog + 查看。]]> +
+ + 標記圖標: + • default_marker(默認標記)、blue_marker(藍標記)、green_marker(綠標記)、red_marker(紅標記) + • 實體的數據名(大小寫敏感) + • 方塊的數據名(大小寫敏感) + + 已刷新地圖列表 + 找不到任何地圖! + 無法讀/寫地圖 + 輸入文件路徑…… + 從自定義路徑打開地圖 + 打開 + + 您使用的路徑:%1$s + + 已在%2$s + 路徑中搜索包含Minecraft地圖的文件夾。 + + 在您輸入的路徑中沒有找到文件或者文件夾! + + 文件路徑(可以以「/level.dat」結尾)不是文件夾! + + 沒找到level.dat文件 + 打開地圖時發生錯誤 + 您想關閉該地圖嗎? + 輸入levelDB中的鍵…… + 從資料庫中打開NBT + 無效的鍵名 + 無法在資料庫中找到具有該名字的記錄! + + 不能從該地圖的資料庫中讀取%1$s"。 + + 未找到聯機玩家的數據 + 選擇玩家 + 打開NBT + 無法從資料庫中打開玩家的記錄。鍵: + %1$s + + 當前的Minecraft地圖無法打開。 + 如果你已在Minecraft打開該地圖,可以嘗試從Minecraft退出,然後重啟本應用。 + + 您真要關閉該地圖嗎? + 您真要關閉該NBT編輯器嗎? + 傳送單機玩家 + 創建自定義標記 + 移除標記 + 打開該區塊中實體的NBT + 打開該區塊中方塊實體的NBT + 該區塊的實體數據 + 該區塊的方塊實體數據 + 該區塊的NBT + + %1$s + (%2$d, + %3$d, + %4$d) + + + 已傳送玩家到(%1$.1f, + %2$.1f, + %3$.1f) + + 傳送玩家失敗 + 找不到或者無法編輯本地玩家數據 + 我的自定義標記 + 無效的標記名! + 無效的圖標名! + 無效的X坐標! + 無效的Y坐標! + 無效的Z坐標! + 錯誤:創建標記失敗 + + 載入%1$s失敗 + + NBT編輯器 + + 該區塊尚未具有該類型的數據。 + 它首先需要存在,您要創建它嗎? + 正在創建和保存該區塊的新NBT數據…… + 已創建和保存該區塊的新NBT數據! + 錯誤:創建或保存該區塊的新NBT數據失敗 + 錯誤:無法打開地圖詳情;地圖信息丟失 + 錯誤:無法打開地圖 + 沒有有效的存檔數據 + 地圖名字: + 地圖大小: + 遊戲模式: + 上次遊玩: + 地圖種子碼: + 文件路徑: + 載入地圖中…… + + 「%1$s」無效 + + 取消 + 複製 + 粘貼(覆蓋該標籤) + 粘貼(作為該標籤的子標籤) + 刪除 + 重命名 + 添加子標籤 + 添加新NBT標籤 + 作為子標籤粘貼 + 移除所有NBT標籤 + 不能修改根NBT標籤。 + 根NBT標籤選項 + 輸入標籤名字…… + 創建NBT標籤 + 創建 + 剪貼板為空…… + 真的要刪除所有的NBT標籤嗎? + " 刪!除!" + 錯誤:修改NBT失敗 + NBT標籤選項 + 錯誤:剪貼板中的鍵已經在該Compound中存在! + 錯誤:無法覆蓋標籤:未知的父標籤類型 + 錯誤:無法在空的父標籤里覆蓋NBT + 錯誤:無法作為子標籤粘貼:未知的父標籤類型 + 錯誤:不能從空列表移除NBT + 重命名NBT標籤 + 重命名 + 錯誤:父標籤已經包含該鍵 + 錯誤:該Compound中已存在該鍵 + 錯誤:只能在Compound或List中添加子標籤 + 沒有數據更改,無需保存 + 您真的要保存您的更改嗎? + 前往標記位置 + 找不到玩家 + 找不到出生點 + 玩家位置 + 出生點 + + %1$s + (%2$.1f, + %3$.1f, + %4$.1f) + + %1$s + (%2$d, + %3$d, + %4$d). + + 沒有有效的地圖 + 尋找玩家中…… + 檢索玩家數據失敗 + 前往玩家位置 + 前往單機玩家位置 + 前往其他玩家位置 + 前往! + 前往坐標 + 已傳送玩家到: + 這個標記不可被移除! + 區段 + 選擇一個區段(0至15): + 篩選標記 + 顯示地圖 + 選擇地圖 + 單機玩家NBT + 聯機玩家NBT + 地圖NBT + 主世界 + 俯瞰 + 洞穴 + 史萊姆區塊 + 高度圖 + 生態系 + 植被顏色 + 透視 + 光照強度 + 地獄 + 地圖 + 終末之界 + 地圖選項 + 網格開關 + 標記開關 + 高級選項 + BiomeData NBT + Overworld NBT + Villages NBT + Portals NBT + dimension0 NBT + dimension1 NBT + dimension2 NBT + AutonomousEntities NBT + 按名稱打開NBT + 生存 + 創造 + 冒險 + + (%1$.1f, + %2$.1f) + 區塊(%3$d, + %4$d) + + 傳送! + 前往出生點 + [網易] + 沒找到地圖。 + + 注意,新版的Minecraft默認將地圖放到它的私有存儲區。 + 因此,所有外部工具不能接入這些地圖。 + 您需要設置Minecraft使用「外部」的存儲方式,方法是: + Minecraft→設置→檔案→文件存儲位置,將選項又「應用程序」改為「外部」。 + 然後,新創建的地圖將能被Blocktopograph接入。您可以上網查詢如何將之前的存檔移動到外部。 + + 創建平坦地圖 + 名字: + 我的地圖 + 1.2.13至今 + 版本: + 層: + 未知錯誤。 + 請等待... + 數量: + 所有層的數量總和應該至少是0而至多是127。 + 添加一層... + 編輯 + 選取方塊 + + "1. 拖拽方塊圖標可以排序。" + "2. 點擊任一條目可以編輯。" + "3. 點擊「添加」按鈕可以新增一層。" + "4. 左劃刪除。" + + 至少要有一層。 + 好了~ + 失敗。 + 創建以後,地圖會在重啟Minecraft後顯示在列表裡。 + 測試頁 + 喵~ + "§c歡迎~ 喵嗚~""§r該地圖由""§3Blocktopograph""§r生成。""§1從Play商店/Github""§1/貼吧/mineBBS獲取,""§5創建你的自定義地圖。""""§r生成於""§d%1$s" + 地圖配料表: + " §r..以及更多" + 由Blocktopograph.txt + "歡迎~ 喵嗚~""該地圖由Blocktopograph創建,""一款Minecraft的編輯和地圖查看工具。""從Play商店/Github/貼吧/mineBBS獲取,並創建你的自定義地圖。" + 玩家 + 在%4$s的(%1$d, %2$d, %3$d) + 高級查找... + 標記 + 坐標 + 截取地圖全圖 + 生成圖片 + 這會生成地圖的完整圖片,並崩潰。 + (沒用) + (沒用) + 忽略 + 取消並返回 + 版本太舊,無法讀取。 + 沒找到地形。 + 正在分析 + 正在生成 + 預覽; + 保存 + 圖片會保存到你的「下載」目錄。 + 已保存。 + 分享 + 分享 + 生成預覽... + 放大倍數: + 每個方塊會是1像素大小。如果你選擇小一點的區域,就能夠放大圖片。 + 生成 + 開始框選 + 取消選區 + 選區選項 + 選區調整 + 從 [ + + ] + 到[ %1$d, %2$d ](含起點、終點) + 範圍 + x + 好的 + 寬度和高度至少該是1。 + 操作 + 為火把裝燈罩 + 這會給範圍內的火把加上玻璃燈罩。適用於Minecraft基岩版1.4.x或更高版本的地圖。建議您在Blocktopograph進行編輯前,備份您的地圖。 + 查找在 + 背景 + 前景 + 任何 + 全部 + 查找方塊 + 前景層: + 背景層: + 然後放置在 + 前景和背景 + 查找&替換 + 忽略子類型 + 簡單的查找替換可以無視背景層。從Minecraft BE 1.4.x開始,背景層被用於存儲與其他方塊共存的水,不過其實可以放任何方塊。作為高級地圖作者,您可以利用這個特性。 + 使用前先備份,請!(震聲) + 生物群系: + 數字ID,默認21(叢林) + 刪除區塊 + 這會【刪除】您選擇區域所涉及的區塊。Minecraft稍後能重新生成這片區域,但是您在當中的進度會丟失。除非你知道你在做什麼以及為什麼這麼做,請不要繼續。 + 自動調整並繼續 + 這東西很危險,用之前請先備份! + 您選擇的區域沒有對齊到區塊邊界。Blocktopograph可以自動調整。實際刪除的區域會比您選擇的稍大。準確說,每個方向上會多出0~15方塊。這是因為區域必須按整個區塊刪除,才能被重新生成。如果不喜歡自動調整,您可以取消並手動調節。 + 標記過多! + 屏幕上有太多標記,比如怪物。您可以在滑動抽屜頁點擊「標記開關」來關閉,或者設置過濾選項。 + 打開抽屜 + + 這個地圖沒法被Blocktopograph理解,可能版本過舊或者過新。 + 選擇生態群系 + 更改生態群系 + 對於 + 全部 + 特定的群系 + 改為 + 你可以長按地圖,選擇「開始框選」然後嘗試編輯。 + 地圖太大 + 太♂大了。你可以:(1) 在電腦上使用同類工具;(2) 或者框選一部分區域然後從選區選項里選擇截圖。 + 你可以放大圖片。每個方塊至少1像素。 + 選區太大 + 你選擇的區域太♂大了。寬度和高度都應該在%1$d方塊以內,同時面積在%2$d方塊²以內。 + 生成圖片 + 大約%1$dx%2$d。 + 雙擊屏幕以打開抽屜。 + 位置未知 + 出了點問題。。 + 抱歉,出現了一些問題,所以您沒法使用這個應用。簡單來說,缺失了一個重要的組成部分。您是否從其他擁有此應用程序的人那裡獲得了安裝包?如果是,那麼該應用是針對Ta的設備優化的,即使您們的機型一樣,也無法使用。請嘗試卸載並從Play商店重新安裝,或從GitHub等渠道下載完整版。可能需要先卸載。抱歉,但是這是由於錯誤的使用習慣導致的。 + 自動備份中... + [自動] + 自動刪除超過3天前的備份(不多於3個時將不刪除) + 每次打開地圖時,自動備份 + 備份與恢復 + 刪除備份 + 您正在刪除備份!請確保選擇了確實要刪除的那一個。 + 這是這個遊戲地圖的備份文件夾,由Blocktopograph軟體創建和管理。 + 已有的備份 + 關閉 + 創建新備份 + 每次您打開這個地圖,Blocktopograph將自動創建備份。取決於地圖的大小,這可能花費額外的時間,並佔用存儲空間。 + 啟用自動備份 + 已取消。 + 刪除 + 可以留空 + 恢復 + 恢復先前的備份文件 + 這將撤銷所有在該備份創建以後進行的更改!您確定嗎?注意不要丟失進度。 + 損壞的地圖 +
diff --git a/app/src/main/res/values-zh-rMO/strings.xml b/app/src/main/res/values-zh-rMO/strings.xml new file mode 100644 index 00000000..6f171388 --- /dev/null +++ b/app/src/main/res/values-zh-rMO/strings.xml @@ -0,0 +1,421 @@ + + + 由Proto Lambda製作 + 請選擇一個地圖 + 地圖 + 地圖 + 打開導航欄 + 關閉導航欄 + 設定 + 關於 + 幫助 + 更新內容 + "無法打開地圖,沒有存儲的讀寫許可權! + 請嘗試重啟應用並接受對讀/寫許可權的請求,或者在應用設置/手機管家中開啟本應用的存儲許可權。" + 沒有自定義標記! + 還沒有自定義標記! + 你可以在地圖上你想要的地方長按來創建一個標記, + 然後點擊「創建自定義標記」。 + 然後選擇一個標記圖標和一個Y坐標。 + 最後在地圖上檢查一下你有沒有成功創建它! + 查看本應用的文檔(長期未更新): + + blocktopograph.protolambda.com/help + . + 地圖種子碼: + + 本應用由Proto Lambda(應其要求,已移除鏈接)原創, + @MithrilMania、 + @flagmaggot、 + @MeowCat、 + @MiemieMethod、 + Manuel和其他人參與更新和維護。 + 感謝百度貼吧minecraftpe吧的朋友們提供反饋。 + 可以在Google Play、Github的項目release頁面(PC版網頁)下載或百度貼吧搜索。 + 有賬號的可以點一下Star~ + 歡迎在Github查看源代碼,並參與更新維護(包括增強翻譯): + github.com/oO0oO0oO0o0o00/blocktopograph + 使用前請備份你的重要存檔,以免發生意外。一點小問題都可能導致Minecraft無法載入整個存檔→_→ + 本應用支持MCPE 0.14至1.9(當前)的存檔格式,更舊或者更新的版本【可能】不完全兼容,但不妨一試。 + 原作者網站:blocktopograph.protolambda.com + 免責聲明 + 此應用程序與Minecraft、Mojang AB或Microsoft無關。 + 這不是一個官方的而是一個飯制的APP。 + Minecraft是Mojang的一個商標。 + 請注意: + • 【這不是一個官方的MINECRAFT產品。並未經MOJANG批准並且與其無關。】 + • 【該APP「按原樣」提供,不提供任何形式的保證。】 + 使用的庫 + • FloatingActionButton + • + Tileview,mithrilmania的版本庫分支 + • leveldb-mcpe + with + android-leveldb,mithrilmania的版本庫分支 + + + + 版本: %1$s +
+ 2018之前的更新記錄可以到: + + blocktopograph.protolambda.com/changelog + 查看。]]> +
+ + 標記圖標: + • default_marker(默認標記)、blue_marker(藍標記)、green_marker(綠標記)、red_marker(紅標記) + • 實體的數據名(大小寫敏感) + • 方塊的數據名(大小寫敏感) + + 已刷新地圖列表 + 找不到任何地圖! + 無法讀/寫地圖 + 輸入文件路徑…… + 從自定義路徑打開地圖 + 打開 + + 您使用的路徑:%1$s + + 已在%2$s + 路徑中搜索包含Minecraft地圖的文件夾。 + + 在您輸入的路徑中沒有找到文件或者文件夾! + + 文件路徑(可以以「/level.dat」結尾)不是文件夾! + + 沒找到level.dat文件 + 打開地圖時發生錯誤 + 您想關閉該地圖嗎? + 輸入levelDB中的鍵…… + 從資料庫中打開NBT + 無效的鍵名 + 無法在資料庫中找到具有該名字的記錄! + + 不能從該地圖的資料庫中讀取%1$s"。 + + 未找到聯機玩家的數據 + 選擇玩家 + 打開NBT + 無法從資料庫中打開玩家的記錄。鍵: + %1$s + + 當前的Minecraft地圖無法打開。 + 如果你已在Minecraft打開該地圖,可以嘗試從Minecraft退出,然後重啟本應用。 + + 您真要關閉該地圖嗎? + 您真要關閉該NBT編輯器嗎? + 傳送單機玩家 + 創建自定義標記 + 移除標記 + 打開該區塊中實體的NBT + 打開該區塊中方塊實體的NBT + 該區塊的實體數據 + 該區塊的方塊實體數據 + 該區塊的NBT + + %1$s + (%2$d, + %3$d, + %4$d) + + + 已傳送玩家到(%1$.1f, + %2$.1f, + %3$.1f) + + 傳送玩家失敗 + 找不到或者無法編輯本地玩家數據 + 我的自定義標記 + 無效的標記名! + 無效的圖標名! + 無效的X坐標! + 無效的Y坐標! + 無效的Z坐標! + 錯誤:創建標記失敗 + + 載入%1$s失敗 + + NBT編輯器 + + 該區塊尚未具有該類型的數據。 + 它首先需要存在,您要創建它嗎? + 正在創建和保存該區塊的新NBT數據…… + 已創建和保存該區塊的新NBT數據! + 錯誤:創建或保存該區塊的新NBT數據失敗 + 錯誤:無法打開地圖詳情;地圖信息丟失 + 錯誤:無法打開地圖 + 沒有有效的存檔數據 + 地圖名字: + 地圖大小: + 遊戲模式: + 上次遊玩: + 地圖種子碼: + 文件路徑: + 載入地圖中…… + + 「%1$s」無效 + + 取消 + 複製 + 粘貼(覆蓋該標籤) + 粘貼(作為該標籤的子標籤) + 刪除 + 重命名 + 添加子標籤 + 添加新NBT標籤 + 作為子標籤粘貼 + 移除所有NBT標籤 + 不能修改根NBT標籤。 + 根NBT標籤選項 + 輸入標籤名字…… + 創建NBT標籤 + 創建 + 剪貼板為空…… + 真的要刪除所有的NBT標籤嗎? + " 刪!除!" + 錯誤:修改NBT失敗 + NBT標籤選項 + 錯誤:剪貼板中的鍵已經在該Compound中存在! + 錯誤:無法覆蓋標籤:未知的父標籤類型 + 錯誤:無法在空的父標籤里覆蓋NBT + 錯誤:無法作為子標籤粘貼:未知的父標籤類型 + 錯誤:不能從空列表移除NBT + 重命名NBT標籤 + 重命名 + 錯誤:父標籤已經包含該鍵 + 錯誤:該Compound中已存在該鍵 + 錯誤:只能在Compound或List中添加子標籤 + 沒有數據更改,無需保存 + 您真的要保存您的更改嗎? + 前往標記位置 + 找不到玩家 + 找不到出生點 + 玩家位置 + 出生點 + + %1$s + (%2$.1f, + %3$.1f, + %4$.1f) + + %1$s + (%2$d, + %3$d, + %4$d). + + 沒有有效的地圖 + 尋找玩家中…… + 檢索玩家數據失敗 + 前往玩家位置 + 前往單機玩家位置 + 前往其他玩家位置 + 前往! + 前往坐標 + 已傳送玩家到: + 這個標記不可被移除! + 區段 + 選擇一個區段(0至15): + 篩選標記 + 顯示地圖 + 選擇地圖 + 單機玩家NBT + 聯機玩家NBT + 地圖NBT + 主世界 + 俯瞰 + 洞穴 + 史萊姆區塊 + 高度圖 + 生態系 + 植被顏色 + 透視 + 光照強度 + 地獄 + 地圖 + 終末之界 + 地圖選項 + 網格開關 + 標記開關 + 高級選項 + BiomeData NBT + Overworld NBT + Villages NBT + Portals NBT + dimension0 NBT + dimension1 NBT + dimension2 NBT + AutonomousEntities NBT + 按名稱打開NBT + 生存 + 創造 + 冒險 + + (%1$.1f, + %2$.1f) + 區塊(%3$d, + %4$d) + + 傳送! + 前往出生點 + [網易] + 沒找到地圖。 + + 注意,新版的Minecraft默認將地圖放到它的私有存儲區。 + 因此,所有外部工具不能接入這些地圖。 + 您需要設置Minecraft使用「外部」的存儲方式,方法是: + Minecraft→設置→檔案→文件存儲位置,將選項又「應用程序」改為「外部」。 + 然後,新創建的地圖將能被Blocktopograph接入。您可以上網查詢如何將之前的存檔移動到外部。 + + 創建平坦地圖 + 名字: + 我的地圖 + 1.2.13至今 + 版本: + 層: + 未知錯誤。 + 請等待... + 數量: + 所有層的數量總和應該至少是0而至多是127。 + 添加一層... + 編輯 + 選取方塊 + + "1. 拖拽方塊圖標可以排序。" + "2. 點擊任一條目可以編輯。" + "3. 點擊「添加」按鈕可以新增一層。" + "4. 左劃刪除。" + + 至少要有一層。 + 好了~ + 失敗。 + 創建以後,地圖會在重啟Minecraft後顯示在列表裡。 + 測試頁 + 喵~ + "§c歡迎~ 喵嗚~""§r該地圖由""§3Blocktopograph""§r生成。""§1從Play商店/Github""§1/貼吧/mineBBS獲取,""§5創建你的自定義地圖。""""§r生成於""§d%1$s" + 地圖配料表: + " §r..以及更多" + 由Blocktopograph.txt + "歡迎~ 喵嗚~""該地圖由Blocktopograph創建,""一款Minecraft的編輯和地圖查看工具。""從Play商店/Github/貼吧/mineBBS獲取,並創建你的自定義地圖。" + 玩家 + 在%4$s的(%1$d, %2$d, %3$d) + 高級查找... + 標記 + 坐標 + 截取地圖全圖 + 生成圖片 + 這會生成地圖的完整圖片,並崩潰。 + (沒用) + (沒用) + 忽略 + 取消並返回 + 版本太舊,無法讀取。 + 沒找到地形。 + 正在分析 + 正在生成 + 預覽; + 保存 + 圖片會保存到你的「下載」目錄。 + 已保存。 + 分享 + 分享 + 生成預覽... + 放大倍數: + 每個方塊會是1像素大小。如果你選擇小一點的區域,就能夠放大圖片。 + 生成 + 開始框選 + 取消選區 + 選區選項 + 選區調整 + 從 [ + + ] + 到[ %1$d, %2$d ](含起點、終點) + 範圍 + x + 好的 + 寬度和高度至少該是1。 + 操作 + 為火把裝燈罩 + 這會給範圍內的火把加上玻璃燈罩。適用於Minecraft基岩版1.4.x或更高版本的地圖。建議您在Blocktopograph進行編輯前,備份您的地圖。 + 查找在 + 背景 + 前景 + 任何 + 全部 + 查找方塊 + 前景層: + 背景層: + 然後放置在 + 前景和背景 + 查找&替換 + 忽略子類型 + 簡單的查找替換可以無視背景層。從Minecraft BE 1.4.x開始,背景層被用於存儲與其他方塊共存的水,不過其實可以放任何方塊。作為高級地圖作者,您可以利用這個特性。 + 使用前先備份,請!(震聲) + 生物群系: + 數字ID,默認21(叢林) + 刪除區塊 + 這會【刪除】您選擇區域所涉及的區塊。Minecraft稍後能重新生成這片區域,但是您在當中的進度會丟失。除非你知道你在做什麼以及為什麼這麼做,請不要繼續。 + 自動調整並繼續 + 這東西很危險,用之前請先備份! + 您選擇的區域沒有對齊到區塊邊界。Blocktopograph可以自動調整。實際刪除的區域會比您選擇的稍大。準確說,每個方向上會多出0~15方塊。這是因為區域必須按整個區塊刪除,才能被重新生成。如果不喜歡自動調整,您可以取消並手動調節。 + 標記過多! + 屏幕上有太多標記,比如怪物。您可以在滑動抽屜頁點擊「標記開關」來關閉,或者設置過濾選項。 + 打開抽屜 + + 這個地圖沒法被Blocktopograph理解,可能版本過舊或者過新。 + 選擇生態群系 + 更改生態群系 + 對於 + 全部 + 特定的群系 + 改為 + 你可以長按地圖,選擇「開始框選」然後嘗試編輯。 + 地圖太大 + 太♂大了。你可以:(1) 在電腦上使用同類工具;(2) 或者框選一部分區域然後從選區選項里選擇截圖。 + 你可以放大圖片。每個方塊至少1像素。 + 選區太大 + 你選擇的區域太♂大了。寬度和高度都應該在%1$d方塊以內,同時面積在%2$d方塊²以內。 + 生成圖片 + 大約%1$dx%2$d。 + 雙擊屏幕以打開抽屜。 + 位置未知 + 出了點問題。。 + 抱歉,出現了一些問題,所以您沒法使用這個應用。簡單來說,缺失了一個重要的組成部分。您是否從其他擁有此應用程序的人那裡獲得了安裝包?如果是,那麼該應用是針對Ta的設備優化的,即使您們的機型一樣,也無法使用。請嘗試卸載並從Play商店重新安裝,或從GitHub等渠道下載完整版。可能需要先卸載。抱歉,但是這是由於錯誤的使用習慣導致的。 + 自動備份中... + [自動] + 自動刪除超過3天前的備份(不多於3個時將不刪除) + 每次打開地圖時,自動備份 + 備份與恢復 + 刪除備份 + 您正在刪除備份!請確保選擇了確實要刪除的那一個。 + 這是這個遊戲地圖的備份文件夾,由Blocktopograph軟體創建和管理。 + 已有的備份 + 關閉 + 創建新備份 + 每次您打開這個地圖,Blocktopograph將自動創建備份。取決於地圖的大小,這可能花費額外的時間,並佔用存儲空間。 + 啟用自動備份 + 已取消。 + 刪除 + 可以留空 + 恢復 + 恢復先前的備份文件 + 這將撤銷所有在該備份創建以後進行的更改!您確定嗎?注意不要丟失進度。 + 損壞的地圖 +
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d4996ab9..e88a622c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -364,7 +364,7 @@ 背景層: 然後放置在 前景和背景 - 查找&替換 + 查找&替換 忽略子類型 簡單的查找替換可以無視背景層。從Minecraft BE 1.4.x開始,背景層被用於存儲與其他方塊共存的水,不過其實可以放任何方塊。作為高級地圖作者,您可以利用這個特性。 使用前先備份,請!(震聲) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh/strings.xml similarity index 100% rename from app/src/main/res/values-zh-rCN/strings.xml rename to app/src/main/res/values-zh/strings.xml diff --git a/build.gradle b/build.gradle index 4ebd7d84..a5732f7e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,17 +1,14 @@ buildscript { repositories { - jcenter() google() - maven { - url 'https://maven.fabric.io/public' - } + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' - - classpath 'com.google.gms:google-services:4.3.3' + classpath 'com.android.tools.build:gradle:7.0.0' +// classpath 'com.guardsquare:proguard-gradle:7.1.0' +// classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' - classpath 'io.fabric.tools:gradle:1.29.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -20,7 +17,6 @@ buildscript { allprojects { repositories { - jcenter() google() mavenCentral() maven { url "https://jitpack.io" } diff --git a/docs/_config.yml b/docs/_config.yml new file mode 100644 index 00000000..3397c9a4 --- /dev/null +++ b/docs/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-architect \ No newline at end of file diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 00000000..2a37fcc9 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,37 @@ +## Welcome to GitHub Pages + +You can use the [editor on GitHub](https://github.com/NguyenDuck/blocktopograph/edit/master/docs/index.md) to maintain and preview the content for your website in Markdown files. + +Whenever you commit to this repository, GitHub Pages will run [Jekyll](https://jekyllrb.com/) to rebuild the pages in your site, from the content in your Markdown files. + +### Markdown + +Markdown is a lightweight and easy-to-use syntax for styling your writing. It includes conventions for + +```markdown +Syntax highlighted code block + +# Header 1 +## Header 2 +### Header 3 + +- Bulleted +- List + +1. Numbered +2. List + +**Bold** and _Italic_ and `Code` text + +[Link](url) and ![Image](src) +``` + +For more details see [Basic writing and formatting syntax](https://docs.github.com/en/github/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax). + +### Jekyll Themes + +Your Pages site will use the layout and styles from the Jekyll theme you have selected in your [repository settings](https://github.com/NguyenDuck/blocktopograph/settings/pages). The name of this theme is saved in the Jekyll `_config.yml` configuration file. + +### Support or Contact + +Having trouble with Pages? Check out our [documentation](https://docs.github.com/categories/github-pages-basics/) or [contact support](https://support.github.com/contact) and we’ll help you sort it out. diff --git a/gradle.properties b/gradle.properties index 57c5ef2f..eeb01698 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,10 +7,10 @@ # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Default value: -Xmx10248m -XX:MaxPermSize=256m -# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true +org.gradle.parallel=true android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file +android.enableJetifier=true +org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 48b2ae3a..ed820d1f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip diff --git a/leveldb/src/main/cpp/leveldb-mcpe b/leveldb/src/main/cpp/leveldb-mcpe new file mode 160000 index 00000000..8fb637be --- /dev/null +++ b/leveldb/src/main/cpp/leveldb-mcpe @@ -0,0 +1 @@ +Subproject commit 8fb637be077c3747cae1a8aecff1a14570d39921 diff --git a/tileview/build.gradle b/tileview/build.gradle index 973aef05..cbb0d5ac 100644 --- a/tileview/build.gradle +++ b/tileview/build.gradle @@ -5,8 +5,6 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 29 - versionCode 33 - versionName "2.2.2" } buildTypes { release {