From aeccc22c240111467e4ba2f962c1b3b70e7f73cc Mon Sep 17 00:00:00 2001 From: cuccuc377-dev <257740650+cuccuc377-dev@users.noreply.github.com> Date: Fri, 23 Oct 2026 01:26:09 +0800 Subject: [PATCH 1/9] Import Wild Wind 26.2 mod source, assets, docs and tests --- .gitattributes | 5 + .github/workflows/build.yml | 36 + .gitignore | 63 + CHANGE_LOG.MD | 184 ++ LICENSE | 32 + LICENSE_ASSETS | 427 +++ LICENSE_CODE | 674 +++++ README.md | 263 ++ build.gradle.kts | 180 ++ docs/AZALEA_AND_REACH_ARROWS.md | 81 + docs/DEVELOPMENT.md | 96 + docs/GAMEPLAY.md | 186 ++ docs/KILN.md | 82 + docs/MUDDY_PIG.md | 57 + docs/PROVENANCE.md | 37 + docs/STRUCTURES.md | 158 ++ docs/UPSTREAM_MERGE.md | 46 + ...\344\271\213\347\256\255(Tipped Arrow).md" | 64 + ...4\272\347\211\214(Azalea Hanging Sign).md" | 103 + ...2\347\244\272\347\211\214(Azalea Sign).md" | 142 + ...\347\244\272\346\236\266(Azalea Shelf).md" | 116 + .../\347\252\221\347\202\211(Kiln).md" | 90 + gradle.properties | 37 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 251 ++ gradlew.bat | 94 + modules/hfas/build.gradle.kts | 76 + settings.gradle.kts | 21 + src/hfas/gametest/config/ww_hfas-common.toml | 2 + .../hfas/test/AzaleaAndArrowGameTests.java | 243 ++ .../hfas/test/FluidEntityRulesGameTests.java | 218 ++ .../wildwind/hfas/test/GameplayGameTests.java | 270 ++ .../wildwind/hfas/test/KilnGameTests.java | 231 ++ .../wildwind/hfas/test/MuddyPigGameTests.java | 106 + .../test/SkeletonAndFarmlandGameTests.java | 156 ++ .../test/UpstreamIntegrationGameTests.java | 84 + .../resources/META-INF/neoforge.mods.toml | 14 + .../data/ww_hfas_tests/structure/empty.nbt | Bin 0 -> 113 bytes .../test_instance/azalea_shelf.json | 7 + .../test_instance/azalea_shelf_chain.json | 7 + .../test_instance/azalea_signs.json | 7 + .../test_instance/cobweb_tick_event.json | 7 + .../test_instance/cobweb_timers.json | 7 + .../test_instance/crafter_shears.json | 7 + .../test_instance/creative_tab.json | 7 + .../ww_hfas_tests/test_instance/entity.json | 7 + .../test_instance/farmland_protection.json | 7 + .../test_instance/fluid_effects.json | 7 + .../test_instance/fluid_entity_rules.json | 7 + .../ww_hfas_tests/test_instance/kiln.json | 7 + .../test_instance/kiln_inventory.json | 7 + .../test_instance/kiln_villages.json | 7 + .../test_instance/land_choke.json | 7 + .../ww_hfas_tests/test_instance/melting.json | 7 + .../reach_arrow_acquisition.json | 7 + .../test_instance/reach_arrows.json | 7 + .../test_instance/skeleton_melee.json | 7 + .../test_instance/skeleton_spawns.json | 7 + .../ww_hfas_tests/test_instance/spawning.json | 7 + .../test_instance/upstream_integration.json | 7 + .../test_instance/wool_recipe.json | 7 + .../polaris2023/wildwind/hfas/HFASMod.java | 72 + .../wildwind/hfas/arrow/ArrowFletching.java | 62 + .../wildwind/hfas/arrow/ArrowHead.java | 107 + .../wildwind/hfas/arrow/ArrowShaft.java | 103 + .../wildwind/hfas/arrow/ReachArrows.java | 20 + .../wildwind/hfas/block/AzaleaShelfBlock.java | 22 + .../hfas/block/FletchingTableBlock.java | 56 + .../wildwind/hfas/block/KilnBlock.java | 59 + .../wildwind/hfas/block/ModBlocks.java | 611 ++++ .../entity/FletchingTableBlockEntity.java | 132 + .../hfas/block/entity/KilnBlockEntity.java | 101 + .../hfas/block/entity/ModBlockEntities.java | 50 + .../wildwind/hfas/client/AzaleaSignState.java | 6 + .../wildwind/hfas/client/KilnScreen.java | 38 + .../wildwind/hfas/client/ModClientHooks.java | 83 + .../hfas/client/ModEntityRenderers.java | 26 + .../wildwind/hfas/client/MuddyPigModel.java | 71 + .../hfas/client/MuddyPigRenderer.java | 63 + .../client/entity/model/MudcrabModel.java | 32 + .../client/entity/model/PiranhaModel.java | 28 + .../entity/renderer/MudcrabRenderer.java | 83 + .../entity/renderer/PiranhaRenderer.java | 24 + .../renderstate/MudcrabRenderState.java | 12 + .../renderstate/PiranhaRenderState.java | 9 + .../eventsub/EntitiesClientHandler.java | 18 + .../client/tooltip/ClientOmniClawTooltip.java | 102 + .../hfas/component/ArrowComponent.java | 124 + .../hfas/component/OmniClawTools.java | 375 +++ .../wildwind/hfas/config/ModCommonConfig.java | 59 + .../wildwind/hfas/datagen/HFASDatagen.java | 59 + .../datagen/provider/ModDataMapsProvider.java | 34 + .../datagen/provider/ModDatapackProvider.java | 28 + .../datagen/provider/ModLootProvider.java | 87 + .../datagen/provider/ModModelProvider.java | 217 ++ .../datagen/provider/ModRecipeProvider.java | 94 + .../provider/lang/EnUsLanguageProvider.java | 126 + .../provider/lang/ZhCnLanguageProvider.java | 130 + .../lang/ZhEnCombineLangProvider.java | 72 + .../hfas/datagen/provider/loot/BlockLoot.java | 91 + .../provider/tag/ModBiomeTagsProvider.java | 54 + .../provider/tag/ModBlockTagsProvider.java | 216 ++ .../tag/ModEntityTypeTagsProvider.java | 43 + .../provider/tag/ModItemTagsProvider.java | 238 ++ .../wildwind/hfas/effect/FluidEffects.java | 80 + .../wildwind/hfas/effect/ModEffects.java | 20 + .../hfas/effect/WildWindMobEffect.java | 31 + .../hfas/enchantment/MeltingEnchantment.java | 92 + .../hfas/entity/ModEntityTypeTags.java | 20 + .../hfas/entity/ModSpawnPlacementTypes.java | 50 + .../wildwind/hfas/entity/MuddyPig.java | 39 + .../wildwind/hfas/entity/ReachArrow.java | 33 + .../wildwind/hfas/entity/WindupAttackMob.java | 77 + ...lertOthersNearestAttackableTargetGoal.java | 91 + .../ai/goal/ChargingMeleeAttackGoal.java | 42 + .../wildwind/hfas/entity/animal/Mudcrab.java | 1097 ++++++++ .../hfas/entity/animal/MudcrabVariant.java | 68 + .../wildwind/hfas/entity/animal/Piranha.java | 155 ++ .../hfas/event/AzaleaAndArrowEvents.java | 40 + .../wildwind/hfas/event/CobwebBreaking.java | 86 + .../wildwind/hfas/event/EntitiesHandler.java | 34 + .../hfas/event/FarmlandProtection.java | 34 + .../event/FletchingTableReplaceHandler.java | 87 + .../wildwind/hfas/event/FuelHandler.java | 86 + .../wildwind/hfas/event/SkeletonBehavior.java | 28 + .../wildwind/hfas/item/ModFoods.java | 31 + .../wildwind/hfas/item/OmniClawItem.java | 407 +++ .../wildwind/hfas/item/ReachArrowItem.java | 41 + .../hfas/menu/FletchingTableMenu.java | 128 + .../wildwind/hfas/menu/KilnMenu.java | 85 + .../wildwind/hfas/menu/ModMenus.java | 34 + .../hfas/mixin/AbstractArrowAccessor.java | 15 + .../hfas/mixin/AbstractSkeletonMixin.java | 25 + .../wildwind/hfas/mixin/AzaleaBlockMixin.java | 38 + .../hfas/mixin/AzaleaSignRendererMixin.java | 76 + .../hfas/mixin/CrafterBlockMixin.java | 25 + .../hfas/mixin/EnchantmentHelperMixin.java | 25 + .../hfas/mixin/EntityFluidMovementMixin.java | 17 + .../hfas/mixin/FurnaceFuelAccessor.java | 12 + .../hfas/mixin/IronGolemAirSupplyMixin.java | 27 + .../wildwind/hfas/mixin/ItemStackMixin.java | 52 + .../hfas/mixin/LootPoolEntriesAccessor.java | 14 + .../hfas/mixin/LootTablePoolsAccessor.java | 12 + .../wildwind/hfas/mixin/MobMixin.java | 45 + .../wildwind/hfas/mixin/PlayerMixin.java | 36 + .../hfas/mixin/ReachArrowCraftingMixin.java | 17 + .../hfas/mixin/ReachArrowLootMixin.java | 18 + .../hfas/mixin/ServerPlayerGameModeMixin.java | 50 + .../hfas/mixin/SignRenderStateMixin.java | 13 + .../hfas/mixin/SinglePoolElementMixin.java | 31 + .../hfas/mixin/WaterAnimalAirSupplyMixin.java | 17 + .../wildwind/hfas/network/HFASNetwork.java | 28 + .../ServerBoundSelectOmniClawItemPayload.java | 73 + .../wildwind/hfas/recipe/KilnRecipes.java | 36 + .../wildwind/hfas/recipe/ModRecipes.java | 20 + .../hfas/recipe/WoolToStringRecipe.java | 70 + .../hfas/registry/DatadrivenRegistryKey.java | 19 + .../wildwind/hfas/registry/ModAttributes.java | 59 + .../hfas/registry/ModCreativeTabs.java | 75 + .../hfas/registry/ModDataComponents.java | 42 + .../wildwind/hfas/registry/ModEntities.java | 54 + .../registry/ModEntityDataSerializers.java | 39 + .../wildwind/hfas/registry/ModItems.java | 89 + .../wildwind/hfas/registry/ModMobEffects.java | 62 + .../wildwind/hfas/registry/ModPotions.java | 72 + .../hfas/registry/ModSoundEvents.java | 30 + .../wildwind/hfas/tag/ModBiomeTags.java | 37 + .../wildwind/hfas/tag/ModBlockTags.java | 25 + .../wildwind/hfas/tag/ModItemTags.java | 16 + .../hfas/worldgen/MasonKilnProcessor.java | 57 + .../hfas/worldgen/ModBiomeModifiers.java | 104 + .../hfas/worldgen/ModConfiguredFeatures.java | 105 + .../hfas/worldgen/ModPlacedFeatures.java | 77 + .../hfas/worldgen/ModTreeGrowers.java | 41 + .../resources/META-INF/accesstransformer.cfg | 1 + .../ww_hfas/blockstates/azalea_button.json | 118 + .../ww_hfas/blockstates/azalea_door.json | 124 + .../ww_hfas/blockstates/azalea_fence.json | 48 + .../blockstates/azalea_fence_gate.json | 80 + .../blockstates/azalea_hanging_sign.json | 124 + .../ww_hfas/blockstates/azalea_log.json | 16 + .../ww_hfas/blockstates/azalea_planks.json | 7 + .../blockstates/azalea_pressure_plate.json | 10 + .../ww_hfas/blockstates/azalea_shelf.json | 402 +++ .../ww_hfas/blockstates/azalea_sign.json | 64 + .../ww_hfas/blockstates/azalea_slab.json | 13 + .../ww_hfas/blockstates/azalea_stairs.json | 209 ++ .../ww_hfas/blockstates/azalea_trapdoor.json | 68 + .../blockstates/azalea_wall_hanging_sign.json | 19 + .../ww_hfas/blockstates/azalea_wall_sign.json | 19 + .../ww_hfas/blockstates/azalea_wood.json | 16 + .../ww_hfas/blockstates/blaze_button.json | 118 + .../ww_hfas/blockstates/blaze_door.json | 124 + .../ww_hfas/blockstates/blaze_fence.json | 48 + .../ww_hfas/blockstates/blaze_fence_gate.json | 80 + .../blockstates/blaze_hanging_sign.json | 124 + .../ww_hfas/blockstates/blaze_leaves.json | 7 + .../assets/ww_hfas/blockstates/blaze_log.json | 16 + .../ww_hfas/blockstates/blaze_planks.json | 7 + .../blockstates/blaze_pressure_plate.json | 10 + .../ww_hfas/blockstates/blaze_sapling.json | 7 + .../ww_hfas/blockstates/blaze_sign.json | 64 + .../ww_hfas/blockstates/blaze_slab.json | 13 + .../ww_hfas/blockstates/blaze_stairs.json | 209 ++ .../ww_hfas/blockstates/blaze_trapdoor.json | 68 + .../blockstates/blaze_wall_hanging_sign.json | 19 + .../ww_hfas/blockstates/blaze_wall_sign.json | 19 + .../ww_hfas/blockstates/blaze_wood.json | 16 + .../ww_hfas/blockstates/fletching_table.json | 7 + .../assets/ww_hfas/blockstates/kiln.json | 34 + .../blockstates/potted_blaze_sapling.json | 7 + .../blockstates/potted_soul_sapling.json | 7 + .../ww_hfas/blockstates/scorched_dirt.json | 7 + .../ww_hfas/blockstates/scorched_grass.json | 7 + .../blockstates/scorched_grass_block.json | 7 + .../ww_hfas/blockstates/scorched_twig.json | 7 + .../ww_hfas/blockstates/soul_button.json | 118 + .../assets/ww_hfas/blockstates/soul_door.json | 124 + .../ww_hfas/blockstates/soul_fence.json | 48 + .../ww_hfas/blockstates/soul_fence_gate.json | 80 + .../blockstates/soul_hanging_sign.json | 124 + .../ww_hfas/blockstates/soul_leaves.json | 7 + .../assets/ww_hfas/blockstates/soul_log.json | 16 + .../ww_hfas/blockstates/soul_planks.json | 7 + .../blockstates/soul_pressure_plate.json | 10 + .../ww_hfas/blockstates/soul_sapling.json | 7 + .../assets/ww_hfas/blockstates/soul_sign.json | 64 + .../assets/ww_hfas/blockstates/soul_slab.json | 13 + .../ww_hfas/blockstates/soul_stairs.json | 209 ++ .../ww_hfas/blockstates/soul_trapdoor.json | 68 + .../blockstates/soul_wall_hanging_sign.json | 19 + .../ww_hfas/blockstates/soul_wall_sign.json | 19 + .../assets/ww_hfas/blockstates/soul_wood.json | 16 + .../blockstates/stripped_azalea_log.json | 16 + .../blockstates/stripped_azalea_wood.json | 16 + .../blockstates/stripped_blaze_log.json | 16 + .../blockstates/stripped_blaze_wood.json | 16 + .../blockstates/stripped_soul_log.json | 16 + .../blockstates/stripped_soul_wood.json | 16 + .../ww_hfas/blockstates/tiny_cactus.json | 7 + .../animations/entity/mudcrab.animation.json | 2470 +++++++++++++++++ .../animations/entity/piranha.animation.json | 415 +++ .../geckolib/models/entity/mudcrab.geo.json | 128 + .../geckolib/models/entity/piranha.geo.json | 175 ++ .../assets/ww_hfas/items/azalea_boat.json | 6 + .../assets/ww_hfas/items/azalea_button.json | 6 + .../ww_hfas/items/azalea_chest_boat.json | 6 + .../assets/ww_hfas/items/azalea_door.json | 6 + .../assets/ww_hfas/items/azalea_fence.json | 6 + .../ww_hfas/items/azalea_fence_gate.json | 6 + .../ww_hfas/items/azalea_hanging_sign.json | 6 + .../assets/ww_hfas/items/azalea_log.json | 6 + .../assets/ww_hfas/items/azalea_planks.json | 6 + .../ww_hfas/items/azalea_pressure_plate.json | 6 + .../assets/ww_hfas/items/azalea_shelf.json | 6 + .../assets/ww_hfas/items/azalea_sign.json | 6 + .../assets/ww_hfas/items/azalea_slab.json | 6 + .../assets/ww_hfas/items/azalea_stairs.json | 6 + .../assets/ww_hfas/items/azalea_trapdoor.json | 6 + .../assets/ww_hfas/items/azalea_wood.json | 6 + .../assets/ww_hfas/items/baked_seeds.json | 6 + .../assets/ww_hfas/items/blaze_boat.json | 6 + .../assets/ww_hfas/items/blaze_button.json | 6 + .../ww_hfas/items/blaze_chest_boat.json | 6 + .../assets/ww_hfas/items/blaze_door.json | 6 + .../assets/ww_hfas/items/blaze_fence.json | 6 + .../ww_hfas/items/blaze_fence_gate.json | 6 + .../ww_hfas/items/blaze_hanging_sign.json | 6 + .../assets/ww_hfas/items/blaze_leaves.json | 12 + .../assets/ww_hfas/items/blaze_log.json | 6 + .../assets/ww_hfas/items/blaze_planks.json | 6 + .../ww_hfas/items/blaze_pressure_plate.json | 6 + .../assets/ww_hfas/items/blaze_sapling.json | 6 + .../assets/ww_hfas/items/blaze_sign.json | 6 + .../assets/ww_hfas/items/blaze_slab.json | 6 + .../assets/ww_hfas/items/blaze_stairs.json | 6 + .../assets/ww_hfas/items/blaze_trapdoor.json | 6 + .../assets/ww_hfas/items/blaze_wood.json | 6 + .../assets/ww_hfas/items/calamari.json | 6 + .../assets/ww_hfas/items/cooked_calamari.json | 6 + .../assets/ww_hfas/items/cooked_egg.json | 6 + .../ww_hfas/items/cooked_frog_legs.json | 6 + .../assets/ww_hfas/items/duckweed.json | 6 + .../assets/ww_hfas/items/frog_legs.json | 6 + .../resources/assets/ww_hfas/items/kiln.json | 6 + .../ww_hfas/items/muddy_pig_spawn_egg.json | 6 + .../assets/ww_hfas/items/scorched_dirt.json | 6 + .../assets/ww_hfas/items/scorched_grass.json | 6 + .../ww_hfas/items/scorched_grass_block.json | 6 + .../assets/ww_hfas/items/scorched_twig.json | 6 + .../assets/ww_hfas/items/soul_boat.json | 6 + .../assets/ww_hfas/items/soul_button.json | 6 + .../assets/ww_hfas/items/soul_chest_boat.json | 6 + .../assets/ww_hfas/items/soul_door.json | 6 + .../assets/ww_hfas/items/soul_fence.json | 6 + .../assets/ww_hfas/items/soul_fence_gate.json | 6 + .../ww_hfas/items/soul_hanging_sign.json | 6 + .../assets/ww_hfas/items/soul_leaves.json | 12 + .../assets/ww_hfas/items/soul_log.json | 6 + .../assets/ww_hfas/items/soul_planks.json | 6 + .../ww_hfas/items/soul_pressure_plate.json | 6 + .../assets/ww_hfas/items/soul_sapling.json | 6 + .../assets/ww_hfas/items/soul_sign.json | 6 + .../assets/ww_hfas/items/soul_slab.json | 6 + .../assets/ww_hfas/items/soul_stairs.json | 6 + .../assets/ww_hfas/items/soul_trapdoor.json | 6 + .../assets/ww_hfas/items/soul_wood.json | 6 + .../ww_hfas/items/stripped_azalea_log.json | 6 + .../ww_hfas/items/stripped_azalea_wood.json | 6 + .../ww_hfas/items/stripped_blaze_log.json | 6 + .../ww_hfas/items/stripped_blaze_wood.json | 6 + .../ww_hfas/items/stripped_soul_log.json | 6 + .../ww_hfas/items/stripped_soul_wood.json | 6 + .../assets/ww_hfas/items/tiny_cactus.json | 6 + .../assets/ww_hfas/items/tipped_arrow.json | 12 + .../resources/assets/ww_hfas/lang/en_us.json | 97 + .../resources/assets/ww_hfas/lang/zh_cn.json | 97 + .../ww_hfas/models/block/azalea_button.json | 6 + .../models/block/azalea_button_inventory.json | 6 + .../models/block/azalea_button_pressed.json | 6 + .../models/block/azalea_door_bottom_left.json | 7 + .../block/azalea_door_bottom_left_open.json | 7 + .../block/azalea_door_bottom_right.json | 7 + .../block/azalea_door_bottom_right_open.json | 7 + .../models/block/azalea_door_top_left.json | 7 + .../block/azalea_door_top_left_open.json | 7 + .../models/block/azalea_door_top_right.json | 7 + .../block/azalea_door_top_right_open.json | 7 + .../models/block/azalea_fence_gate.json | 6 + .../models/block/azalea_fence_gate_open.json | 6 + .../models/block/azalea_fence_gate_wall.json | 6 + .../block/azalea_fence_gate_wall_open.json | 6 + .../models/block/azalea_fence_inventory.json | 6 + .../models/block/azalea_fence_post.json | 6 + .../models/block/azalea_fence_side.json | 6 + .../azalea_hanging_sign_attached_rot_0.json | 7 + .../azalea_hanging_sign_attached_rot_1.json | 7 + .../azalea_hanging_sign_attached_rot_2.json | 7 + .../azalea_hanging_sign_attached_rot_3.json | 7 + .../block/azalea_hanging_sign_rot_0.json | 7 + .../block/azalea_hanging_sign_rot_1.json | 7 + .../block/azalea_hanging_sign_rot_2.json | 7 + .../block/azalea_hanging_sign_rot_3.json | 7 + .../ww_hfas/models/block/azalea_log.json | 7 + .../models/block/azalea_log_horizontal.json | 7 + .../ww_hfas/models/block/azalea_planks.json | 6 + .../models/block/azalea_pressure_plate.json | 6 + .../block/azalea_pressure_plate_down.json | 6 + .../ww_hfas/models/block/azalea_shelf.json | 7 + .../models/block/azalea_shelf_center.json | 7 + .../models/block/azalea_shelf_inventory.json | 7 + .../models/block/azalea_shelf_left.json | 7 + .../models/block/azalea_shelf_right.json | 7 + .../block/azalea_shelf_unconnected.json | 7 + .../models/block/azalea_shelf_unpowered.json | 7 + .../models/block/azalea_sign_rot_0.json | 7 + .../models/block/azalea_sign_rot_1.json | 7 + .../models/block/azalea_sign_rot_2.json | 7 + .../models/block/azalea_sign_rot_3.json | 7 + .../ww_hfas/models/block/azalea_slab.json | 8 + .../ww_hfas/models/block/azalea_slab_top.json | 8 + .../ww_hfas/models/block/azalea_stairs.json | 8 + .../models/block/azalea_stairs_inner.json | 8 + .../models/block/azalea_stairs_outer.json | 8 + .../models/block/azalea_trapdoor_bottom.json | 6 + .../models/block/azalea_trapdoor_open.json | 6 + .../models/block/azalea_trapdoor_top.json | 6 + .../block/azalea_wall_hanging_sign.json | 7 + .../models/block/azalea_wall_sign.json | 7 + .../ww_hfas/models/block/azalea_wood.json | 7 + .../ww_hfas/models/block/blaze_button.json | 6 + .../models/block/blaze_button_inventory.json | 6 + .../models/block/blaze_button_pressed.json | 6 + .../models/block/blaze_door_bottom_left.json | 7 + .../block/blaze_door_bottom_left_open.json | 7 + .../models/block/blaze_door_bottom_right.json | 7 + .../block/blaze_door_bottom_right_open.json | 7 + .../models/block/blaze_door_top_left.json | 7 + .../block/blaze_door_top_left_open.json | 7 + .../models/block/blaze_door_top_right.json | 7 + .../block/blaze_door_top_right_open.json | 7 + .../models/block/blaze_fence_gate.json | 6 + .../models/block/blaze_fence_gate_open.json | 6 + .../models/block/blaze_fence_gate_wall.json | 6 + .../block/blaze_fence_gate_wall_open.json | 6 + .../models/block/blaze_fence_inventory.json | 6 + .../models/block/blaze_fence_post.json | 6 + .../models/block/blaze_fence_side.json | 6 + .../blaze_hanging_sign_attached_rot_0.json | 7 + .../blaze_hanging_sign_attached_rot_1.json | 7 + .../blaze_hanging_sign_attached_rot_2.json | 7 + .../blaze_hanging_sign_attached_rot_3.json | 7 + .../block/blaze_hanging_sign_rot_0.json | 7 + .../block/blaze_hanging_sign_rot_1.json | 7 + .../block/blaze_hanging_sign_rot_2.json | 7 + .../block/blaze_hanging_sign_rot_3.json | 7 + .../ww_hfas/models/block/blaze_leaves.json | 6 + .../ww_hfas/models/block/blaze_log.json | 7 + .../models/block/blaze_log_horizontal.json | 7 + .../ww_hfas/models/block/blaze_planks.json | 6 + .../models/block/blaze_pressure_plate.json | 6 + .../block/blaze_pressure_plate_down.json | 6 + .../ww_hfas/models/block/blaze_sapling.json | 6 + .../models/block/blaze_sign_rot_0.json | 7 + .../models/block/blaze_sign_rot_1.json | 7 + .../models/block/blaze_sign_rot_2.json | 7 + .../models/block/blaze_sign_rot_3.json | 7 + .../ww_hfas/models/block/blaze_slab.json | 8 + .../ww_hfas/models/block/blaze_slab_top.json | 8 + .../ww_hfas/models/block/blaze_stairs.json | 8 + .../models/block/blaze_stairs_inner.json | 8 + .../models/block/blaze_stairs_outer.json | 8 + .../models/block/blaze_trapdoor_bottom.json | 6 + .../models/block/blaze_trapdoor_open.json | 6 + .../models/block/blaze_trapdoor_top.json | 6 + .../models/block/blaze_wall_hanging_sign.json | 7 + .../ww_hfas/models/block/blaze_wall_sign.json | 7 + .../ww_hfas/models/block/blaze_wood.json | 7 + .../ww_hfas/models/block/fletching_table.json | 6 + .../models/block/potted_blaze_sapling.json | 6 + .../models/block/potted_soul_sapling.json | 6 + .../ww_hfas/models/block/scorched_dirt.json | 6 + .../ww_hfas/models/block/scorched_grass.json | 6 + .../models/block/scorched_grass_block.json | 6 + .../ww_hfas/models/block/scorched_twig.json | 6 + .../ww_hfas/models/block/soul_button.json | 6 + .../models/block/soul_button_inventory.json | 6 + .../models/block/soul_button_pressed.json | 6 + .../models/block/soul_door_bottom_left.json | 7 + .../block/soul_door_bottom_left_open.json | 7 + .../models/block/soul_door_bottom_right.json | 7 + .../block/soul_door_bottom_right_open.json | 7 + .../models/block/soul_door_top_left.json | 7 + .../models/block/soul_door_top_left_open.json | 7 + .../models/block/soul_door_top_right.json | 7 + .../block/soul_door_top_right_open.json | 7 + .../ww_hfas/models/block/soul_fence_gate.json | 6 + .../models/block/soul_fence_gate_open.json | 6 + .../models/block/soul_fence_gate_wall.json | 6 + .../block/soul_fence_gate_wall_open.json | 6 + .../models/block/soul_fence_inventory.json | 6 + .../ww_hfas/models/block/soul_fence_post.json | 6 + .../ww_hfas/models/block/soul_fence_side.json | 6 + .../soul_hanging_sign_attached_rot_0.json | 7 + .../soul_hanging_sign_attached_rot_1.json | 7 + .../soul_hanging_sign_attached_rot_2.json | 7 + .../soul_hanging_sign_attached_rot_3.json | 7 + .../models/block/soul_hanging_sign_rot_0.json | 7 + .../models/block/soul_hanging_sign_rot_1.json | 7 + .../models/block/soul_hanging_sign_rot_2.json | 7 + .../models/block/soul_hanging_sign_rot_3.json | 7 + .../ww_hfas/models/block/soul_leaves.json | 6 + .../assets/ww_hfas/models/block/soul_log.json | 7 + .../models/block/soul_log_horizontal.json | 7 + .../ww_hfas/models/block/soul_planks.json | 6 + .../models/block/soul_pressure_plate.json | 6 + .../block/soul_pressure_plate_down.json | 6 + .../ww_hfas/models/block/soul_sapling.json | 6 + .../ww_hfas/models/block/soul_sign_rot_0.json | 7 + .../ww_hfas/models/block/soul_sign_rot_1.json | 7 + .../ww_hfas/models/block/soul_sign_rot_2.json | 7 + .../ww_hfas/models/block/soul_sign_rot_3.json | 7 + .../ww_hfas/models/block/soul_slab.json | 8 + .../ww_hfas/models/block/soul_slab_top.json | 8 + .../ww_hfas/models/block/soul_stairs.json | 8 + .../models/block/soul_stairs_inner.json | 8 + .../models/block/soul_stairs_outer.json | 8 + .../models/block/soul_trapdoor_bottom.json | 6 + .../models/block/soul_trapdoor_open.json | 6 + .../models/block/soul_trapdoor_top.json | 6 + .../models/block/soul_wall_hanging_sign.json | 7 + .../ww_hfas/models/block/soul_wall_sign.json | 7 + .../ww_hfas/models/block/soul_wood.json | 7 + .../models/block/stripped_azalea_log.json | 7 + .../block/stripped_azalea_log_horizontal.json | 7 + .../models/block/stripped_azalea_wood.json | 7 + .../models/block/stripped_blaze_log.json | 7 + .../block/stripped_blaze_log_horizontal.json | 7 + .../models/block/stripped_blaze_wood.json | 7 + .../models/block/stripped_soul_log.json | 7 + .../block/stripped_soul_log_horizontal.json | 7 + .../models/block/stripped_soul_wood.json | 7 + .../ww_hfas/models/block/tiny_cactus.json | 6 + .../models/entity/pig/pig_muddy.bbmodel | 1 + .../models/entity/pig/pig_muddy_baby.bbmodel | 1 + .../ww_hfas/models/item/azalea_boat.json | 6 + .../models/item/azalea_chest_boat.json | 6 + .../ww_hfas/models/item/azalea_door.json | 6 + .../models/item/azalea_hanging_sign.json | 6 + .../ww_hfas/models/item/azalea_sign.json | 6 + .../ww_hfas/models/item/baked_seeds.json | 6 + .../ww_hfas/models/item/blaze_boat.json | 6 + .../ww_hfas/models/item/blaze_chest_boat.json | 6 + .../ww_hfas/models/item/blaze_door.json | 6 + .../models/item/blaze_hanging_sign.json | 6 + .../ww_hfas/models/item/blaze_sapling.json | 6 + .../ww_hfas/models/item/blaze_sign.json | 6 + .../assets/ww_hfas/models/item/calamari.json | 6 + .../ww_hfas/models/item/cooked_calamari.json | 6 + .../ww_hfas/models/item/cooked_egg.json | 6 + .../ww_hfas/models/item/cooked_frog_legs.json | 6 + .../assets/ww_hfas/models/item/duckweed.json | 6 + .../assets/ww_hfas/models/item/frog_legs.json | 6 + .../assets/ww_hfas/models/item/omni_claw.json | 101 + .../assets/ww_hfas/models/item/soul_boat.json | 6 + .../ww_hfas/models/item/soul_chest_boat.json | 6 + .../assets/ww_hfas/models/item/soul_door.json | 6 + .../models/item/soul_hanging_sign.json | 6 + .../ww_hfas/models/item/soul_sapling.json | 6 + .../assets/ww_hfas/models/item/soul_sign.json | 6 + src/hfas/resources/assets/ww_hfas/sounds.json | 16 + .../sounds/entity_piranha_attack_1.ogg | Bin 0 -> 7717 bytes .../sounds/entity_piranha_attack_2.ogg | Bin 0 -> 8026 bytes .../sounds/entity_piranha_attack_3.ogg | Bin 0 -> 8763 bytes .../ww_hfas/sounds/entity_piranha_death.ogg | Bin 0 -> 20617 bytes .../textures/block/azalea_door_bottom.png | Bin 0 -> 450 bytes .../textures/block/azalea_door_top.png | Bin 0 -> 415 bytes .../textures/block/azalea_hanging_sign.png | Bin 0 -> 868 bytes .../ww_hfas/textures/block/azalea_log.png | Bin 0 -> 428 bytes .../ww_hfas/textures/block/azalea_log_top.png | Bin 0 -> 449 bytes .../ww_hfas/textures/block/azalea_planks.png | Bin 0 -> 432 bytes .../ww_hfas/textures/block/azalea_shelf.png | Bin 0 -> 804 bytes .../ww_hfas/textures/block/azalea_sign.png | Bin 0 -> 812 bytes .../textures/block/azalea_trapdoor.png | Bin 0 -> 493 bytes .../textures/block/blaze_door_bottom.png | Bin 0 -> 456 bytes .../ww_hfas/textures/block/blaze_door_top.png | Bin 0 -> 484 bytes .../ww_hfas/textures/block/blaze_leaves.png | Bin 0 -> 559 bytes .../ww_hfas/textures/block/blaze_log.png | Bin 0 -> 2846 bytes .../textures/block/blaze_log.png.mcmeta | 24 + .../ww_hfas/textures/block/blaze_log_top.png | Bin 0 -> 2574 bytes .../textures/block/blaze_log_top.png.mcmeta | 24 + .../ww_hfas/textures/block/blaze_planks.png | Bin 0 -> 484 bytes .../ww_hfas/textures/block/blaze_sapling.png | Bin 0 -> 464 bytes .../ww_hfas/textures/block/blaze_trapdoor.png | Bin 0 -> 538 bytes .../textures/block/cinder_door_bottom.png | Bin 0 -> 456 bytes .../textures/block/cinder_door_top.png | Bin 0 -> 484 bytes .../ww_hfas/textures/block/cinder_leaves.png | Bin 0 -> 559 bytes .../ww_hfas/textures/block/cinder_log.png | Bin 0 -> 2846 bytes .../textures/block/cinder_log.png.mcmeta | 24 + .../ww_hfas/textures/block/cinder_log_top.png | Bin 0 -> 2574 bytes .../textures/block/cinder_log_top.png.mcmeta | 24 + .../ww_hfas/textures/block/cinder_planks.png | Bin 0 -> 484 bytes .../ww_hfas/textures/block/cinder_sapling.png | Bin 0 -> 464 bytes .../textures/block/cinder_trapdoor.png | Bin 0 -> 538 bytes .../textures/block/ember_door_bottom.png | Bin 0 -> 441 bytes .../ww_hfas/textures/block/ember_door_top.png | Bin 0 -> 453 bytes .../ww_hfas/textures/block/ember_leaves.png | Bin 0 -> 656 bytes .../ww_hfas/textures/block/ember_log.png | Bin 0 -> 3030 bytes .../textures/block/ember_log.png.mcmeta | 24 + .../ww_hfas/textures/block/ember_log_top.png | Bin 0 -> 3952 bytes .../textures/block/ember_log_top.png.mcmeta | 24 + .../ww_hfas/textures/block/ember_planks.png | Bin 0 -> 492 bytes .../ww_hfas/textures/block/ember_sapling.png | Bin 0 -> 513 bytes .../ww_hfas/textures/block/ember_trapdoor.png | Bin 0 -> 491 bytes .../ww_hfas/textures/block/scorched_dirt.png | Bin 0 -> 522 bytes .../ww_hfas/textures/block/scorched_grass.png | Bin 0 -> 232 bytes .../block/scorched_grass_block_side.png | Bin 0 -> 539 bytes .../block/scorched_grass_block_top.png | Bin 0 -> 333 bytes .../ww_hfas/textures/block/scorched_twig.png | Bin 0 -> 347 bytes .../textures/block/scorched_twig_wall.png | Bin 0 -> 323 bytes .../textures/block/soul_door_bottom.png | Bin 0 -> 441 bytes .../ww_hfas/textures/block/soul_door_top.png | Bin 0 -> 453 bytes .../ww_hfas/textures/block/soul_leaves.png | Bin 0 -> 656 bytes .../ww_hfas/textures/block/soul_log.png | Bin 0 -> 3030 bytes .../textures/block/soul_log.png.mcmeta | 24 + .../ww_hfas/textures/block/soul_log_top.png | Bin 0 -> 3952 bytes .../textures/block/soul_log_top.png.mcmeta | 24 + .../ww_hfas/textures/block/soul_planks.png | Bin 0 -> 492 bytes .../ww_hfas/textures/block/soul_sapling.png | Bin 0 -> 513 bytes .../ww_hfas/textures/block/soul_trapdoor.png | Bin 0 -> 491 bytes .../textures/block/stripped_azalea_log.png | Bin 0 -> 384 bytes .../block/stripped_azalea_log_top.png | Bin 0 -> 422 bytes .../textures/block/stripped_blaze_log.png | Bin 0 -> 337 bytes .../textures/block/stripped_blaze_log_top.png | Bin 0 -> 397 bytes .../textures/block/stripped_cinder_log.png | Bin 0 -> 337 bytes .../block/stripped_cinder_log_top.png | Bin 0 -> 397 bytes .../textures/block/stripped_ember_log.png | Bin 0 -> 498 bytes .../textures/block/stripped_ember_log_top.png | Bin 0 -> 538 bytes .../textures/block/stripped_soul_log.png | Bin 0 -> 498 bytes .../textures/block/stripped_soul_log_top.png | Bin 0 -> 538 bytes .../ww_hfas/textures/block/tiny_cactus.png | Bin 0 -> 461 bytes .../ww_hfas/textures/entity/boat/azalea.png | Bin 0 -> 3440 bytes .../ww_hfas/textures/entity/boat/cinder.png | Bin 0 -> 2873 bytes .../textures/entity/boat/cinder_boat.png | Bin 0 -> 2873 bytes .../ww_hfas/textures/entity/boat/ember.png | Bin 0 -> 2866 bytes .../textures/entity/boat/ember_boat.png | Bin 0 -> 2866 bytes .../textures/entity/chest_boat/azalea.png | Bin 0 -> 5527 bytes .../textures/entity/chest_boat/cinder.png | Bin 0 -> 5262 bytes .../entity/chest_boat/cinder_chest_boat.png | Bin 0 -> 5262 bytes .../textures/entity/chest_boat/ember.png | Bin 0 -> 5396 bytes .../entity/chest_boat/ember_chest_boat.png | Bin 0 -> 5396 bytes .../ww_hfas/textures/entity/mudcrab/cold.png | Bin 0 -> 1297 bytes .../textures/entity/mudcrab/temperate.png | Bin 0 -> 1353 bytes .../ww_hfas/textures/entity/mudcrab/warm.png | Bin 0 -> 1255 bytes .../ww_hfas/textures/entity/pig/pig_muddy.png | Bin 0 -> 1929 bytes .../textures/entity/pig/pig_muddy_baby.png | Bin 0 -> 1118 bytes .../ww_hfas/textures/entity/piranha.png | Bin 0 -> 856 bytes .../ww_hfas/textures/entity/signs/azalea.png | Bin 0 -> 850 bytes .../ww_hfas/textures/entity/signs/cinder.png | Bin 0 -> 936 bytes .../textures/entity/signs/cinder_sign.png | Bin 0 -> 936 bytes .../ww_hfas/textures/entity/signs/ember.png | Bin 0 -> 908 bytes .../textures/entity/signs/ember_sign.png | Bin 0 -> 908 bytes .../textures/entity/signs/hanging/azalea.png | Bin 0 -> 1023 bytes .../textures/entity/signs/hanging/cinder.png | Bin 0 -> 1070 bytes .../signs/hanging/cinder_hanging_sign.png | Bin 0 -> 1070 bytes .../textures/entity/signs/hanging/ember.png | Bin 0 -> 1063 bytes .../signs/hanging/ember_hanging_sign.png | Bin 0 -> 1063 bytes .../textures/gui/hanging_signs/azalea.png | Bin 0 -> 434 bytes .../textures/gui/hanging_signs/cinder.png | Bin 0 -> 462 bytes .../textures/gui/hanging_signs/ember.png | Bin 0 -> 479 bytes .../ww_hfas/textures/gui/signs/azalea.png | Bin 0 -> 362 bytes .../ww_hfas/textures/item/azalea_boat.png | Bin 0 -> 471 bytes .../textures/item/azalea_chest_boat.png | Bin 0 -> 548 bytes .../ww_hfas/textures/item/azalea_door.png | Bin 0 -> 306 bytes .../textures/item/azalea_hanging_sign.png | Bin 0 -> 405 bytes .../ww_hfas/textures/item/azalea_sign.png | Bin 0 -> 345 bytes .../ww_hfas/textures/item/baked_seeds.png | Bin 0 -> 317 bytes .../ww_hfas/textures/item/blaze_door.png | Bin 0 -> 382 bytes .../assets/ww_hfas/textures/item/calamari.png | Bin 0 -> 420 bytes .../ww_hfas/textures/item/cinder_boat.png | Bin 0 -> 632 bytes .../textures/item/cinder_chest_boat.png | Bin 0 -> 691 bytes .../ww_hfas/textures/item/cinder_door.png | Bin 0 -> 382 bytes .../textures/item/cinder_hanging_sign.png | Bin 0 -> 472 bytes .../ww_hfas/textures/item/cinder_sign.png | Bin 0 -> 409 bytes .../ww_hfas/textures/item/cooked_calamari.png | Bin 0 -> 428 bytes .../ww_hfas/textures/item/cooked_egg.png | Bin 0 -> 376 bytes .../textures/item/cooked_frog_legs.png | Bin 0 -> 396 bytes .../ww_hfas/textures/item/cooked_piranha.png | Bin 0 -> 610 bytes .../ww_hfas/textures/item/crab_claw.png | Bin 0 -> 188 bytes .../assets/ww_hfas/textures/item/duckweed.png | Bin 0 -> 447 bytes .../ww_hfas/textures/item/ember_boat.png | Bin 0 -> 652 bytes .../textures/item/ember_chest_boat.png | Bin 0 -> 697 bytes .../ww_hfas/textures/item/ember_door.png | Bin 0 -> 370 bytes .../textures/item/ember_hanging_sign.png | Bin 0 -> 444 bytes .../ww_hfas/textures/item/ember_sign.png | Bin 0 -> 399 bytes .../assets/ww_hfas/textures/item/fang.png | Bin 0 -> 331 bytes .../ww_hfas/textures/item/frog_legs.png | Bin 0 -> 394 bytes .../ww_hfas/textures/item/mudcrab_bucket.png | Bin 0 -> 254 bytes .../textures/item/mudcrab_spawn_egg.png | Bin 0 -> 432 bytes .../ww_hfas/textures/item/omni_claw.png | Bin 0 -> 261 bytes .../assets/ww_hfas/textures/item/piranha.png | Bin 0 -> 593 bytes .../ww_hfas/textures/item/piranha_bucket.png | Bin 0 -> 511 bytes .../textures/item/piranha_spawn_egg.png | Bin 0 -> 536 bytes .../ww_hfas/textures/item/soul_door.png | Bin 0 -> 370 bytes .../ww_hfas/textures/mob_effect/choke.png | Bin 0 -> 213 bytes .../ww_hfas/textures/mob_effect/sink.png | Bin 0 -> 177 bytes .../textures/screens/cinder_hanging_sign.png | Bin 0 -> 462 bytes .../textures/screens/ember_hanging_sign.png | Bin 0 -> 479 bytes .../data/c/tags/block/fence_gates/wooden.json | 7 + .../resources/data/c/tags/block/fences.json | 7 + .../data/c/tags/block/fences/wooden.json | 7 + .../data/c/tags/block/stripped_logs.json | 7 + .../data/c/tags/block/stripped_woods.json | 7 + .../data/c/tags/item/fence_gates/wooden.json | 7 + .../data/c/tags/item/fences/wooden.json | 7 + .../data/c/tags/item/stripped_logs.json | 7 + .../data/c/tags/item/stripped_woods.json | 7 + .../tags/block/all_hanging_signs.json | 28 + .../data/minecraft/tags/block/all_signs.json | 28 + .../tags/block/ceiling_hanging_signs.json | 5 + .../data/minecraft/tags/block/dirt.json | 6 + .../data/minecraft/tags/block/doors.json | 7 + .../minecraft/tags/block/fence_gates.json | 7 + .../data/minecraft/tags/block/fences.json | 7 + .../minecraft/tags/block/flower_pots.json | 12 + .../data/minecraft/tags/block/leaves.json | 6 + .../data/minecraft/tags/block/logs.json | 16 + .../minecraft/tags/block/logs_that_burn.json | 16 + .../minecraft/tags/block/mineable/axe.json | 49 + .../tags/block/mineable/pickaxe.json | 5 + .../tags/block/overworld_natural_logs.json | 6 + .../data/minecraft/tags/block/planks.json | 7 + .../data/minecraft/tags/block/saplings.json | 6 + .../minecraft/tags/block/standing_signs.json | 5 + .../data/minecraft/tags/block/trapdoors.json | 7 + .../tags/block/wall_hanging_signs.json | 5 + .../data/minecraft/tags/block/wall_signs.json | 5 + .../minecraft/tags/block/wooden_buttons.json | 7 + .../minecraft/tags/block/wooden_doors.json | 7 + .../minecraft/tags/block/wooden_fences.json | 7 + .../tags/block/wooden_pressure_plates.json | 7 + .../minecraft/tags/block/wooden_shelves.json | 5 + .../minecraft/tags/block/wooden_slabs.json | 7 + .../minecraft/tags/block/wooden_stairs.json | 7 + .../tags/block/wooden_trapdoors.json | 7 + .../tags/enchantment/non_treasure.json | 6 + .../minecraft/tags/entity_type/arrows.json | 6 + .../entity_type/can_breathe_under_water.json | 6 + .../tags/entity_type/can_equip_saddle.json | 6 + .../data/minecraft/tags/item/arrows.json | 5 + .../data/minecraft/tags/item/boats.json | 16 + .../data/minecraft/tags/item/buttons.json | 7 + .../data/minecraft/tags/item/chest_boats.json | 16 + .../data/minecraft/tags/item/doors.json | 7 + .../data/minecraft/tags/item/fence_gates.json | 7 + .../minecraft/tags/item/hanging_signs.json | 5 + .../data/minecraft/tags/item/leaves.json | 6 + .../data/minecraft/tags/item/logs.json | 16 + .../minecraft/tags/item/logs_that_burn.json | 16 + .../data/minecraft/tags/item/planks.json | 7 + .../data/minecraft/tags/item/saplings.json | 6 + .../data/minecraft/tags/item/signs.json | 5 + .../data/minecraft/tags/item/trapdoors.json | 7 + .../minecraft/tags/item/wooden_buttons.json | 7 + .../minecraft/tags/item/wooden_doors.json | 7 + .../minecraft/tags/item/wooden_fences.json | 7 + .../tags/item/wooden_pressure_plates.json | 7 + .../minecraft/tags/item/wooden_shelves.json | 5 + .../minecraft/tags/item/wooden_slabs.json | 7 + .../minecraft/tags/item/wooden_stairs.json | 7 + .../minecraft/tags/item/wooden_trapdoors.json | 7 + .../data/minecraft/tags/potion/tradeable.json | 7 + .../neoforge/data_maps/block/strippables.json | 22 + .../building_blocks/azalea_planks.json | 32 + .../recipes/building_blocks/azalea_slab.json | 32 + .../building_blocks/azalea_stairs.json | 32 + .../recipes/building_blocks/azalea_wood.json | 32 + .../recipes/building_blocks/blaze_planks.json | 32 + .../recipes/building_blocks/blaze_slab.json | 32 + .../recipes/building_blocks/blaze_stairs.json | 32 + .../recipes/building_blocks/blaze_wood.json | 32 + .../recipes/building_blocks/soul_planks.json | 32 + .../recipes/building_blocks/soul_slab.json | 32 + .../recipes/building_blocks/soul_stairs.json | 32 + .../recipes/building_blocks/soul_wood.json | 32 + .../recipes/decorations/azalea_fence.json | 32 + .../decorations/azalea_hanging_sign.json | 32 + .../recipes/decorations/azalea_shelf.json | 32 + .../recipes/decorations/azalea_sign.json | 32 + .../recipes/decorations/blaze_fence.json | 32 + .../decorations/blaze_hanging_sign.json | 32 + .../recipes/decorations/blaze_sign.json | 32 + .../advancement/recipes/decorations/kiln.json | 32 + .../recipes/decorations/soul_fence.json | 32 + .../decorations/soul_hanging_sign.json | 32 + .../recipes/decorations/soul_sign.json | 32 + .../recipes/redstone/azalea_button.json | 32 + .../recipes/redstone/azalea_door.json | 32 + .../recipes/redstone/azalea_fence_gate.json | 32 + .../redstone/azalea_pressure_plate.json | 32 + .../recipes/redstone/azalea_trapdoor.json | 32 + .../recipes/redstone/blaze_button.json | 32 + .../recipes/redstone/blaze_door.json | 32 + .../recipes/redstone/blaze_fence_gate.json | 32 + .../redstone/blaze_pressure_plate.json | 32 + .../recipes/redstone/blaze_trapdoor.json | 32 + .../recipes/redstone/soul_button.json | 32 + .../recipes/redstone/soul_door.json | 32 + .../recipes/redstone/soul_fence_gate.json | 32 + .../recipes/redstone/soul_pressure_plate.json | 32 + .../recipes/redstone/soul_trapdoor.json | 32 + .../recipes/transportation/azalea_boat.json | 32 + .../transportation/azalea_chest_boat.json | 32 + .../recipes/transportation/blaze_boat.json | 32 + .../transportation/blaze_chest_boat.json | 32 + .../recipes/transportation/soul_boat.json | 32 + .../transportation/soul_chest_boat.json | 32 + .../data/ww_hfas/enchantment/melting.json | 21 + .../loot_table/blocks/azalea_button.json | 20 + .../loot_table/blocks/azalea_door.json | 29 + .../loot_table/blocks/azalea_fence.json | 20 + .../loot_table/blocks/azalea_fence_gate.json | 20 + .../blocks/azalea_hanging_sign.json | 20 + .../ww_hfas/loot_table/blocks/azalea_log.json | 20 + .../loot_table/blocks/azalea_planks.json | 20 + .../blocks/azalea_pressure_plate.json | 20 + .../loot_table/blocks/azalea_shelf.json | 20 + .../loot_table/blocks/azalea_sign.json | 20 + .../loot_table/blocks/azalea_slab.json | 20 + .../loot_table/blocks/azalea_stairs.json | 20 + .../loot_table/blocks/azalea_trapdoor.json | 20 + .../blocks/azalea_wall_hanging_sign.json | 20 + .../loot_table/blocks/azalea_wall_sign.json | 20 + .../loot_table/blocks/azalea_wood.json | 20 + .../loot_table/blocks/blaze_button.json | 20 + .../ww_hfas/loot_table/blocks/blaze_door.json | 29 + .../loot_table/blocks/blaze_fence.json | 20 + .../loot_table/blocks/blaze_fence_gate.json | 20 + .../loot_table/blocks/blaze_hanging_sign.json | 20 + .../loot_table/blocks/blaze_leaves.json | 130 + .../ww_hfas/loot_table/blocks/blaze_log.json | 20 + .../loot_table/blocks/blaze_planks.json | 20 + .../blocks/blaze_pressure_plate.json | 20 + .../loot_table/blocks/blaze_sapling.json | 20 + .../ww_hfas/loot_table/blocks/blaze_sign.json | 20 + .../ww_hfas/loot_table/blocks/blaze_slab.json | 20 + .../loot_table/blocks/blaze_stairs.json | 20 + .../loot_table/blocks/blaze_trapdoor.json | 20 + .../blocks/blaze_wall_hanging_sign.json | 20 + .../loot_table/blocks/blaze_wall_sign.json | 20 + .../ww_hfas/loot_table/blocks/blaze_wood.json | 20 + .../loot_table/blocks/fletching_table.json | 20 + .../data/ww_hfas/loot_table/blocks/kiln.json | 29 + .../blocks/potted_blaze_sapling.json | 34 + .../blocks/potted_soul_sapling.json | 34 + .../loot_table/blocks/scorched_dirt.json | 20 + .../loot_table/blocks/scorched_grass.json | 20 + .../blocks/scorched_grass_block.json | 20 + .../loot_table/blocks/scorched_twig.json | 20 + .../loot_table/blocks/soul_button.json | 20 + .../ww_hfas/loot_table/blocks/soul_door.json | 29 + .../ww_hfas/loot_table/blocks/soul_fence.json | 20 + .../loot_table/blocks/soul_fence_gate.json | 20 + .../loot_table/blocks/soul_hanging_sign.json | 20 + .../loot_table/blocks/soul_leaves.json | 130 + .../ww_hfas/loot_table/blocks/soul_log.json | 20 + .../loot_table/blocks/soul_planks.json | 20 + .../blocks/soul_pressure_plate.json | 20 + .../loot_table/blocks/soul_sapling.json | 20 + .../ww_hfas/loot_table/blocks/soul_sign.json | 20 + .../ww_hfas/loot_table/blocks/soul_slab.json | 20 + .../loot_table/blocks/soul_stairs.json | 20 + .../loot_table/blocks/soul_trapdoor.json | 20 + .../blocks/soul_wall_hanging_sign.json | 20 + .../loot_table/blocks/soul_wall_sign.json | 20 + .../ww_hfas/loot_table/blocks/soul_wood.json | 20 + .../blocks/stripped_azalea_log.json | 20 + .../blocks/stripped_azalea_wood.json | 20 + .../loot_table/blocks/stripped_blaze_log.json | 20 + .../blocks/stripped_blaze_wood.json | 20 + .../loot_table/blocks/stripped_soul_log.json | 20 + .../loot_table/blocks/stripped_soul_wood.json | 20 + .../loot_table/blocks/tiny_cactus.json | 20 + .../loot_table/entities/muddy_pig.json | 14 + .../biome_modifier/add_azalea_tree.json | 6 + .../biome_modifier/add_blaze_tree.json | 6 + .../biome_modifier/add_muddy_pig.json | 10 + .../biome_modifier/add_soul_tree.json | 6 + .../remove_vanilla_azalea_tree.json | 6 + .../data/ww_hfas/recipe/azalea_boat.json | 14 + .../data/ww_hfas/recipe/azalea_button.json | 10 + .../ww_hfas/recipe/azalea_chest_boat.json | 11 + .../data/ww_hfas/recipe/azalea_door.json | 16 + .../data/ww_hfas/recipe/azalea_fence.json | 15 + .../ww_hfas/recipe/azalea_fence_gate.json | 15 + .../ww_hfas/recipe/azalea_hanging_sign.json | 16 + .../data/ww_hfas/recipe/azalea_planks.json | 12 + .../ww_hfas/recipe/azalea_pressure_plate.json | 13 + .../data/ww_hfas/recipe/azalea_shelf.json | 15 + .../data/ww_hfas/recipe/azalea_sign.json | 16 + .../data/ww_hfas/recipe/azalea_slab.json | 14 + .../data/ww_hfas/recipe/azalea_stairs.json | 16 + .../data/ww_hfas/recipe/azalea_trapdoor.json | 15 + .../data/ww_hfas/recipe/azalea_wood.json | 15 + .../data/ww_hfas/recipe/blaze_boat.json | 14 + .../data/ww_hfas/recipe/blaze_button.json | 10 + .../data/ww_hfas/recipe/blaze_chest_boat.json | 11 + .../data/ww_hfas/recipe/blaze_door.json | 16 + .../data/ww_hfas/recipe/blaze_fence.json | 15 + .../data/ww_hfas/recipe/blaze_fence_gate.json | 15 + .../ww_hfas/recipe/blaze_hanging_sign.json | 17 + .../data/ww_hfas/recipe/blaze_planks.json | 12 + .../ww_hfas/recipe/blaze_pressure_plate.json | 13 + .../data/ww_hfas/recipe/blaze_sign.json | 17 + .../data/ww_hfas/recipe/blaze_slab.json | 14 + .../data/ww_hfas/recipe/blaze_stairs.json | 16 + .../data/ww_hfas/recipe/blaze_trapdoor.json | 15 + .../data/ww_hfas/recipe/blaze_wood.json | 15 + .../resources/data/ww_hfas/recipe/kiln.json | 16 + .../data/ww_hfas/recipe/soul_boat.json | 14 + .../data/ww_hfas/recipe/soul_button.json | 10 + .../data/ww_hfas/recipe/soul_chest_boat.json | 11 + .../data/ww_hfas/recipe/soul_door.json | 16 + .../data/ww_hfas/recipe/soul_fence.json | 15 + .../data/ww_hfas/recipe/soul_fence_gate.json | 15 + .../ww_hfas/recipe/soul_hanging_sign.json | 17 + .../data/ww_hfas/recipe/soul_planks.json | 12 + .../ww_hfas/recipe/soul_pressure_plate.json | 13 + .../data/ww_hfas/recipe/soul_sign.json | 17 + .../data/ww_hfas/recipe/soul_slab.json | 14 + .../data/ww_hfas/recipe/soul_stairs.json | 16 + .../data/ww_hfas/recipe/soul_trapdoor.json | 15 + .../data/ww_hfas/recipe/soul_wood.json | 15 + .../data/ww_hfas/recipe/wool_to_string.json | 3 + .../data/ww_hfas/tags/block/azalea_logs.json | 8 + .../data/ww_hfas/tags/block/blaze_logs.json | 8 + .../tags/block/muddy_pig_spawnable_on.json | 8 + .../data/ww_hfas/tags/block/soul_logs.json | 8 + .../tags/entity_type/choke_affected.json | 49 + .../tags/entity_type/sink_affected.json | 47 + .../tags/entity_type/water_breathing.json | 33 + .../data/ww_hfas/tags/item/azalea_logs.json | 8 + .../data/ww_hfas/tags/item/blaze_logs.json | 8 + .../data/ww_hfas/tags/item/kiln_excluded.json | 10 + .../ww_hfas/tags/item/kiln_metal_outputs.json | 7 + .../data/ww_hfas/tags/item/soul_logs.json | 8 + .../tags/worldgen/biome/spawns_muddy_pig.json | 7 + .../configured_feature/azalea_tree.json | 71 + .../configured_feature/blaze_tree.json | 62 + .../configured_feature/soul_tree.json | 62 + .../placed_feature/azalea_tree_placed.json | 48 + .../placed_feature/blaze_tree_placed.json | 4 + .../placed_feature/soul_tree_placed.json | 4 + src/hfas/resources/ww_hfas.mixins.json | 35 + .../hfas/client/MuddyPigModelTest.java | 60 + .../ww_structures/definitions/blocked.json | 7 + .../ww_structures/definitions/disabled.json | 6 + .../ww_structures/definitions/smoke.json | 9 + .../ww_structures/templates/wide_ruins.nbt | Bin 0 -> 1275 bytes .../structures/test/StructureGameTests.java | 99 + .../test/mixin/GameTestServerMixin.java | 14 + .../minecraft/worldgen/world_preset/flat.json | 21 + .../test_instance/generation.json | 7 + .../resources/ww_hfas_tests.mixins.json | 7 + .../wildwind/structures/StructureModule.java | 35 + .../structures/command/StructureCommands.java | 91 + .../config/ConfigStructurePack.java | 229 ++ .../config/StructureDefinition.java | 135 + .../worldgen/ConfiguredStructure.java | 111 + .../worldgen/ConfiguredTemplatePiece.java | 44 + .../worldgen/GeneratedStructureIndex.java | 69 + .../resources/examples/example_ruins.json | 23 + .../resources/examples/example_ruins.nbt | Bin 0 -> 315 bytes .../config/StructureConfigTest.java | 137 + .../worldgen/GeneratedStructureIndexTest.java | 29 + src/templates/META-INF/neoforge.mods.toml | 105 + 917 files changed, 28770 insertions(+) create mode 100644 .gitattributes create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 CHANGE_LOG.MD create mode 100644 LICENSE create mode 100644 LICENSE_ASSETS create mode 100644 LICENSE_CODE create mode 100644 README.md create mode 100644 build.gradle.kts create mode 100644 docs/AZALEA_AND_REACH_ARROWS.md create mode 100644 docs/DEVELOPMENT.md create mode 100644 docs/GAMEPLAY.md create mode 100644 docs/KILN.md create mode 100644 docs/MUDDY_PIG.md create mode 100644 docs/PROVENANCE.md create mode 100644 docs/STRUCTURES.md create mode 100644 docs/UPSTREAM_MERGE.md create mode 100644 "docs/specifications/\345\273\266\345\261\225\344\271\213\347\256\255(Tipped Arrow).md" create mode 100644 "docs/specifications/\346\202\254\346\214\202\345\274\217\346\235\234\351\271\203\346\234\250\345\221\212\347\244\272\347\211\214(Azalea Hanging Sign).md" create mode 100644 "docs/specifications/\346\235\234\351\271\203\346\234\250\345\221\212\347\244\272\347\211\214(Azalea Sign).md" create mode 100644 "docs/specifications/\346\235\234\351\271\203\346\234\250\345\261\225\347\244\272\346\236\266(Azalea Shelf).md" create mode 100644 "docs/specifications/\347\252\221\347\202\211(Kiln).md" create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 modules/hfas/build.gradle.kts create mode 100644 settings.gradle.kts create mode 100644 src/hfas/gametest/config/ww_hfas-common.toml create mode 100644 src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java create mode 100644 src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java create mode 100644 src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java create mode 100644 src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java create mode 100644 src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java create mode 100644 src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java create mode 100644 src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java create mode 100644 src/hfas/gametest/resources/META-INF/neoforge.mods.toml create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/structure/empty.nbt create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/azalea_shelf.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/azalea_shelf_chain.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/azalea_signs.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/cobweb_tick_event.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/cobweb_timers.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/crafter_shears.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/creative_tab.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/entity.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/farmland_protection.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/fluid_effects.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/fluid_entity_rules.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/kiln.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/kiln_inventory.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/kiln_villages.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/land_choke.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/melting.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/reach_arrow_acquisition.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/reach_arrows.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/skeleton_melee.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/skeleton_spawns.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/spawning.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/upstream_integration.json create mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/wool_recipe.json create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/HFASMod.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowFletching.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowHead.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowShaft.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ReachArrows.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/block/AzaleaShelfBlock.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/block/FletchingTableBlock.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/block/KilnBlock.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/block/ModBlocks.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/FletchingTableBlockEntity.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/KilnBlockEntity.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/ModBlockEntities.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/AzaleaSignState.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/KilnScreen.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/ModClientHooks.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/ModEntityRenderers.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigModel.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigRenderer.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/MudcrabModel.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/PiranhaModel.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/MudcrabRenderer.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/PiranhaRenderer.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/MudcrabRenderState.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/PiranhaRenderState.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/eventsub/EntitiesClientHandler.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/client/tooltip/ClientOmniClawTooltip.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/component/ArrowComponent.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/component/OmniClawTools.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/config/ModCommonConfig.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/HFASDatagen.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModLootProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModEntityTypeTagsProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModItemTagsProvider.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/effect/FluidEffects.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/effect/ModEffects.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/effect/WildWindMobEffect.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/enchantment/MeltingEnchantment.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModEntityTypeTags.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModSpawnPlacementTypes.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/MuddyPig.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/ReachArrow.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/WindupAttackMob.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/ChargingMeleeAttackGoal.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Mudcrab.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/MudcrabVariant.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Piranha.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/event/AzaleaAndArrowEvents.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/event/CobwebBreaking.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/event/EntitiesHandler.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/event/FarmlandProtection.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/event/FletchingTableReplaceHandler.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/event/FuelHandler.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/event/SkeletonBehavior.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/item/ModFoods.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/item/OmniClawItem.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/item/ReachArrowItem.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/menu/FletchingTableMenu.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/menu/KilnMenu.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/menu/ModMenus.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractArrowAccessor.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractSkeletonMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaBlockMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaSignRendererMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/CrafterBlockMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EnchantmentHelperMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EntityFluidMovementMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/FurnaceFuelAccessor.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/IronGolemAirSupplyMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ItemStackMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/LootPoolEntriesAccessor.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/LootTablePoolsAccessor.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/MobMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/PlayerMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowCraftingMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowLootMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ServerPlayerGameModeMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SignRenderStateMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SinglePoolElementMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/mixin/WaterAnimalAirSupplyMixin.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/network/HFASNetwork.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/network/payload/ServerBoundSelectOmniClawItemPayload.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/recipe/KilnRecipes.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/recipe/ModRecipes.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/recipe/WoolToStringRecipe.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/DatadrivenRegistryKey.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModAttributes.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModCreativeTabs.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModDataComponents.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntities.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntityDataSerializers.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModItems.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModMobEffects.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModPotions.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModSoundEvents.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBiomeTags.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBlockTags.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModItemTags.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/MasonKilnProcessor.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java create mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModTreeGrowers.java create mode 100644 src/hfas/resources/META-INF/accesstransformer.cfg create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_button.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_door.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence_gate.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_planks.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_pressure_plate.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_shelf.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_slab.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_stairs.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_trapdoor.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_button.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_door.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence_gate.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_leaves.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_planks.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_pressure_plate.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_slab.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_stairs.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_trapdoor.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/fletching_table.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/kiln.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/potted_blaze_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/potted_soul_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/scorched_dirt.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass_block.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/scorched_twig.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_button.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_door.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_fence.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_fence_gate.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_leaves.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_planks.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_pressure_plate.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_slab.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_stairs.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_trapdoor.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/tiny_cactus.json create mode 100644 src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/mudcrab.animation.json create mode 100644 src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/piranha.animation.json create mode 100644 src/hfas/resources/assets/ww_hfas/geckolib/models/entity/mudcrab.geo.json create mode 100644 src/hfas/resources/assets/ww_hfas/geckolib/models/entity/piranha.geo.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_button.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_chest_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_door.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_fence.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_fence_gate.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_planks.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_pressure_plate.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_shelf.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_slab.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_stairs.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_trapdoor.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/baked_seeds.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_button.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_chest_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_door.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_fence.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_fence_gate.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_leaves.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_planks.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_pressure_plate.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_slab.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_stairs.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_trapdoor.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/calamari.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/cooked_calamari.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/cooked_egg.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/cooked_frog_legs.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/duckweed.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/frog_legs.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/kiln.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/muddy_pig_spawn_egg.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/scorched_dirt.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/scorched_grass.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/scorched_grass_block.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/scorched_twig.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_button.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_chest_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_door.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_fence.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_fence_gate.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_leaves.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_planks.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_pressure_plate.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_slab.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_stairs.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_trapdoor.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_azalea_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_azalea_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_blaze_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_blaze_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_soul_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_soul_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/tiny_cactus.json create mode 100644 src/hfas/resources/assets/ww_hfas/items/tipped_arrow.json create mode 100644 src/hfas/resources/assets/ww_hfas/lang/en_us.json create mode 100644 src/hfas/resources/assets/ww_hfas/lang/zh_cn.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_button.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_button_inventory.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_button_pressed.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_inventory.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_post.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_side.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_0.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_1.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_2.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_3.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_0.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_1.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_2.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_3.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_log_horizontal.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_planks.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate_down.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_center.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_inventory.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_left.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_right.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unconnected.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unpowered.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_0.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_1.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_2.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_3.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_slab.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_slab_top.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_inner.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_outer.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_bottom.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_top.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_button.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_button_inventory.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_button_pressed.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_inventory.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_post.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_side.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_0.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_1.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_2.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_3.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_0.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_1.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_2.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_3.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_leaves.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_log_horizontal.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_planks.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate_down.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_0.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_1.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_2.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_3.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_slab.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_slab_top.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_inner.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_outer.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_bottom.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_top.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/fletching_table.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/potted_blaze_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/potted_soul_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/scorched_dirt.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/scorched_grass.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/scorched_grass_block.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/scorched_twig.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_button.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_button_inventory.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_button_pressed.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_fence_inventory.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_fence_post.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_fence_side.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_0.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_1.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_2.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_3.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_0.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_1.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_2.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_3.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_leaves.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_log_horizontal.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_planks.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate_down.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_0.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_1.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_2.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_3.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_slab.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_slab_top.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_stairs.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_inner.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_outer.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_bottom.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_open.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_top.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_wall_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_wall_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log_horizontal.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log_horizontal.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log_horizontal.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_wood.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/block/tiny_cactus.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy.bbmodel create mode 100644 src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy_baby.bbmodel create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/azalea_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/azalea_chest_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/azalea_door.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/azalea_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/azalea_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/baked_seeds.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/blaze_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/blaze_chest_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/blaze_door.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/blaze_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/blaze_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/blaze_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/calamari.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/cooked_calamari.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/cooked_egg.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/cooked_frog_legs.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/duckweed.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/frog_legs.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/omni_claw.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/soul_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/soul_chest_boat.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/soul_door.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/soul_hanging_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/soul_sapling.json create mode 100644 src/hfas/resources/assets/ww_hfas/models/item/soul_sign.json create mode 100644 src/hfas/resources/assets/ww_hfas/sounds.json create mode 100644 src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_1.ogg create mode 100644 src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_2.ogg create mode 100644 src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_3.ogg create mode 100644 src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_death.ogg create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/azalea_door_bottom.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/azalea_door_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/azalea_hanging_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/azalea_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/azalea_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/azalea_planks.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/azalea_shelf.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/azalea_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/azalea_trapdoor.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_door_bottom.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_door_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_leaves.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_log.png.mcmeta create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_log_top.png.mcmeta create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_planks.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_sapling.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/blaze_trapdoor.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_door_bottom.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_door_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_leaves.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_log.png.mcmeta create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_log_top.png.mcmeta create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_planks.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_sapling.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/cinder_trapdoor.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_door_bottom.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_door_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_leaves.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_log.png.mcmeta create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_log_top.png.mcmeta create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_planks.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_sapling.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/ember_trapdoor.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/scorched_dirt.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass_block_side.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass_block_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig_wall.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_door_bottom.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_door_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_leaves.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_log.png.mcmeta create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_log_top.png.mcmeta create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_planks.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_sapling.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/soul_trapdoor.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_azalea_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_azalea_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_blaze_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_blaze_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_cinder_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_cinder_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_ember_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_ember_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_soul_log.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/stripped_soul_log_top.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/block/tiny_cactus.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/boat/azalea.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/boat/cinder.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/boat/cinder_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/azalea.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/cinder.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/cinder_chest_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember_chest_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/cold.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/temperate.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/warm.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/pig/pig_muddy.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/pig/pig_muddy_baby.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/piranha.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/azalea.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/ember.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/ember_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/azalea.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/cinder.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/cinder_hanging_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember_hanging_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/azalea.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/cinder.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/ember.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/gui/signs/azalea.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/azalea_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/azalea_chest_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/azalea_door.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/azalea_hanging_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/azalea_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/baked_seeds.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/blaze_door.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/calamari.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/cinder_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/cinder_chest_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/cinder_door.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/cinder_hanging_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/cinder_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/cooked_calamari.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/cooked_egg.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/cooked_frog_legs.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/cooked_piranha.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/crab_claw.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/duckweed.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/ember_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/ember_chest_boat.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/ember_door.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/ember_hanging_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/ember_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/fang.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/frog_legs.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/mudcrab_bucket.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/mudcrab_spawn_egg.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/omni_claw.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/piranha.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/piranha_bucket.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/piranha_spawn_egg.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/item/soul_door.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/mob_effect/choke.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/mob_effect/sink.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/screens/cinder_hanging_sign.png create mode 100644 src/hfas/resources/assets/ww_hfas/textures/screens/ember_hanging_sign.png create mode 100644 src/hfas/resources/data/c/tags/block/fence_gates/wooden.json create mode 100644 src/hfas/resources/data/c/tags/block/fences.json create mode 100644 src/hfas/resources/data/c/tags/block/fences/wooden.json create mode 100644 src/hfas/resources/data/c/tags/block/stripped_logs.json create mode 100644 src/hfas/resources/data/c/tags/block/stripped_woods.json create mode 100644 src/hfas/resources/data/c/tags/item/fence_gates/wooden.json create mode 100644 src/hfas/resources/data/c/tags/item/fences/wooden.json create mode 100644 src/hfas/resources/data/c/tags/item/stripped_logs.json create mode 100644 src/hfas/resources/data/c/tags/item/stripped_woods.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/all_hanging_signs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/all_signs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/ceiling_hanging_signs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/dirt.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/doors.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/fence_gates.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/fences.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/flower_pots.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/leaves.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/logs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/logs_that_burn.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/mineable/axe.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/mineable/pickaxe.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/overworld_natural_logs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/planks.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/saplings.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/standing_signs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/trapdoors.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wall_hanging_signs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wall_signs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_buttons.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_doors.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_fences.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_pressure_plates.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_shelves.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_slabs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_stairs.json create mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_trapdoors.json create mode 100644 src/hfas/resources/data/minecraft/tags/enchantment/non_treasure.json create mode 100644 src/hfas/resources/data/minecraft/tags/entity_type/arrows.json create mode 100644 src/hfas/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json create mode 100644 src/hfas/resources/data/minecraft/tags/entity_type/can_equip_saddle.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/arrows.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/boats.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/buttons.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/chest_boats.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/doors.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/fence_gates.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/hanging_signs.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/leaves.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/logs.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/logs_that_burn.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/planks.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/saplings.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/signs.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/trapdoors.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_buttons.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_doors.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_fences.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_pressure_plates.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_shelves.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_slabs.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_stairs.json create mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_trapdoors.json create mode 100644 src/hfas/resources/data/minecraft/tags/potion/tradeable.json create mode 100644 src/hfas/resources/data/neoforge/data_maps/block/strippables.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_planks.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_slab.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_stairs.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_planks.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_slab.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_stairs.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_planks.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_slab.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_stairs.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_fence.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_shelf.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_fence.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/kiln.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_fence.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_button.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_door.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_fence_gate.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_pressure_plate.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_trapdoor.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_button.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_door.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_fence_gate.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_pressure_plate.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_trapdoor.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_button.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_door.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_fence_gate.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_pressure_plate.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_trapdoor.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_chest_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_chest_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_chest_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/enchantment/melting.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_button.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_door.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence_gate.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_log.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_planks.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_pressure_plate.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_shelf.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_slab.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_stairs.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_trapdoor.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_button.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_door.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence_gate.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_leaves.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_log.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_planks.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_pressure_plate.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sapling.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_slab.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_stairs.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_trapdoor.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/fletching_table.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/kiln.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_blaze_sapling.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_soul_sapling.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_dirt.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass_block.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_twig.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_button.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_door.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence_gate.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_leaves.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_log.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_planks.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_pressure_plate.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sapling.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_slab.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_stairs.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_trapdoor.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_log.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_log.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_log.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/tiny_cactus.json create mode 100644 src/hfas/resources/data/ww_hfas/loot_table/entities/muddy_pig.json create mode 100644 src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_azalea_tree.json create mode 100644 src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_blaze_tree.json create mode 100644 src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_muddy_pig.json create mode 100644 src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_soul_tree.json create mode 100644 src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/remove_vanilla_azalea_tree.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_button.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_chest_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_door.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_fence.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_fence_gate.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_planks.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_pressure_plate.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_shelf.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_slab.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_stairs.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_trapdoor.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_button.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_chest_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_door.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_fence.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_fence_gate.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_planks.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_pressure_plate.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_slab.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_stairs.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_trapdoor.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/kiln.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_button.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_chest_boat.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_door.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_fence.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_fence_gate.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_hanging_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_planks.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_pressure_plate.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_sign.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_slab.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_stairs.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_trapdoor.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_wood.json create mode 100644 src/hfas/resources/data/ww_hfas/recipe/wool_to_string.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/block/azalea_logs.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/block/blaze_logs.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/block/muddy_pig_spawnable_on.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/block/soul_logs.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/entity_type/choke_affected.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/entity_type/sink_affected.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/entity_type/water_breathing.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/item/azalea_logs.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/item/blaze_logs.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/item/kiln_excluded.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/item/kiln_metal_outputs.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/item/soul_logs.json create mode 100644 src/hfas/resources/data/ww_hfas/tags/worldgen/biome/spawns_muddy_pig.json create mode 100644 src/hfas/resources/data/ww_hfas/worldgen/configured_feature/azalea_tree.json create mode 100644 src/hfas/resources/data/ww_hfas/worldgen/configured_feature/blaze_tree.json create mode 100644 src/hfas/resources/data/ww_hfas/worldgen/configured_feature/soul_tree.json create mode 100644 src/hfas/resources/data/ww_hfas/worldgen/placed_feature/azalea_tree_placed.json create mode 100644 src/hfas/resources/data/ww_hfas/worldgen/placed_feature/blaze_tree_placed.json create mode 100644 src/hfas/resources/data/ww_hfas/worldgen/placed_feature/soul_tree_placed.json create mode 100644 src/hfas/resources/ww_hfas.mixins.json create mode 100644 src/hfas/test/org/polaris2023/wildwind/hfas/client/MuddyPigModelTest.java create mode 100644 src/structures/gametest/config/ww_structures/definitions/blocked.json create mode 100644 src/structures/gametest/config/ww_structures/definitions/disabled.json create mode 100644 src/structures/gametest/config/ww_structures/definitions/smoke.json create mode 100644 src/structures/gametest/config/ww_structures/templates/wide_ruins.nbt create mode 100644 src/structures/gametest/java/org/polaris2023/wildwind/structures/test/StructureGameTests.java create mode 100644 src/structures/gametest/java/org/polaris2023/wildwind/structures/test/mixin/GameTestServerMixin.java create mode 100644 src/structures/gametest/resources/data/minecraft/worldgen/world_preset/flat.json create mode 100644 src/structures/gametest/resources/data/ww_hfas_tests/test_instance/generation.json create mode 100644 src/structures/gametest/resources/ww_hfas_tests.mixins.json create mode 100644 src/structures/java/org/polaris2023/wildwind/structures/StructureModule.java create mode 100644 src/structures/java/org/polaris2023/wildwind/structures/command/StructureCommands.java create mode 100644 src/structures/java/org/polaris2023/wildwind/structures/config/ConfigStructurePack.java create mode 100644 src/structures/java/org/polaris2023/wildwind/structures/config/StructureDefinition.java create mode 100644 src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredStructure.java create mode 100644 src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredTemplatePiece.java create mode 100644 src/structures/java/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndex.java create mode 100644 src/structures/resources/examples/example_ruins.json create mode 100644 src/structures/resources/examples/example_ruins.nbt create mode 100644 src/structures/test/org/polaris2023/wildwind/structures/config/StructureConfigTest.java create mode 100644 src/structures/test/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndexTest.java create mode 100644 src/templates/META-INF/neoforge.mods.toml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b7bbcc4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Disable autocrlf on generated files, they always generate with LF +# Add any extra files or paths here to make git stop saying they +# are changed when only line endings change. +src/generated/**/.cache/* text eol=lf +src/generated/**/*.json text eol=lf diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..ba3c772 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,36 @@ +name: Build + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + + - name: Setup JDK 25 + uses: actions/setup-java@v4 + with: + java-version: '25' + distribution: 'temurin' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + # This is needed to be able to run ./gradlew below + # You can run `git update-index --chmod +x gradlew` then remove this step. + - name: Make Gradle wrapper executable + run: chmod +x ./gradlew + + - name: Generate client resources + run: ./gradlew :hfas:runClientData + + - name: Generate server resources + run: ./gradlew :hfas:runServerData + + - name: Build and run integration tests + run: ./gradlew build :hfas:runGameTest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4b9835f --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +### Gradle ### +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/**/build/ + +### IntelliJ IDEA ### +.idea/modules +.idea/*.xml +.idea/.name +*.iws +*.iml +*.ipr +out/ +!**/src/**/out/ + +.run/ + +### Eclipse ### +.apt_generated +.classpath +.eclipse/ +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/**/bin/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store + +### Minecraft Modding ### +run/ +modules/*/logs/ +!**/src/**/run/ +**/src/generated/**/.cache/ +repo/ +!**/src/**/repo/ + +### Local-only files and generated caches ### +.idea/ +.cache/ +.tools/ +.codex/ +*.log +*.tmp +*.bak +*.zip +*.class +*.jar +!gradle/wrapper/gradle-wrapper.jar +.env +.env.* +!.env.example +logs/ +crash-reports/ +Thumbs.db +Desktop.ini diff --git a/CHANGE_LOG.MD b/CHANGE_LOG.MD new file mode 100644 index 0000000..e2262ac --- /dev/null +++ b/CHANGE_LOG.MD @@ -0,0 +1,184 @@ +# Changelog + +All notable changes to the Wild Wind Module project will be documented in this file. + +--- + +## 项目总结 - HFAS 模块 + +### 模组概述 +**HFAS (Wild Wind - Fletching Table and Saplings)** 是 Wild Wind Module 的子模块,专注于: +- 制箭台功能扩展 +- 自定义木质方块套件 +- 世界生成增强 + +### 核心功能 + +#### 1. 制箭台替换系统 +- **区块加载替换** - 使用 `ChunkEvent.Load` 事件自动替换原版制箭台 +- **配置控制** - 通过 `worldgen.replaceVanillaFletchingTable` 配置项控制开关 +- **GUI系统** - 自定义制箭台带有交互界面(3个输入槽位) + +#### 2. 木质方块套件 +| 木材类型 | 方块数量 | 特点 | +|--------------|------|-----------| +| 焚烬木 (Blaze) | 16种 | 橙色调,下界风格 | +| 灵焰木 (Soul) | 16种 | 青色调,灵魂主题 | +| 杜鹃木 (Azalea) | 13种 | 浅绿色调,繁茂洞穴 | + +每种套件包含:原木、木头、去皮原木、去皮木头、木板、楼梯、台阶、栅栏、栅栏门、门、活板门、压力板、按钮、树叶、树苗 + +#### 3. 世界生成 +- **焚烬木** - 下界废土群系 (Nether Wastes) +- **灵焰木** - 灵魂沙峡谷群系 (Soul Sand Valley) +- **杜鹃木** - 繁茂洞穴群系 (Lush Caves),替换原版杜鹃树 + +#### 4. 杜鹃树增强 +- **Mixin 注入** - 修改杜鹃花催熟行为,生成杜鹃木原木 +- **生物群系修改** - 移除原版杜鹃树,添加自定义杜鹃树 +- **保留原版树叶** - 使用原版杜鹃树叶和开花杜鹃树叶 + +#### 5. 木质方块功能 +- **去皮功能** - 使用斧头可将原木/木头去皮 +- **堆肥功能** - 树叶和树苗可用于堆肥(30%概率) +- **燃料功能** - 木质方块可作为熔炉燃料(300 tick) + +### 技术实现 + +#### 数据生成 +| 提供器 | 功能 | +|------------------------|--------------| +| `HFASDatagen` | 数据生成入口 | +| `ModModelProvider` | 模型生成(支持染色树叶) | +| `ModBlockTagsProvider` | 方块标签生成 | +| `ModItemTagsProvider` | 物品标签生成 | +| `ModLootProvider` | 战利品表生成 | +| `ModDatapackProvider` | 数据包提供器 | +| `ModDataMapsProvider` | 数据映射提供器 | +| `EnUsLanguageProvider` | 英文语言文件 | +| `ZhCnLanguageProvider` | 中文语言文件 | + +#### 世界生成系统 +| 类 | 功能 | +|-------------------------|------------| +| `ModConfiguredFeatures` | 配置特征(树木结构) | +| `ModPlacedFeatures` | 放置特征 | +| `ModBiomeModifiers` | 生物群系修改器 | +| `ModTreeGrowers` | 树苗生长器 | + +#### 事件处理 +| 类 | 功能 | +|--------------------------------|------------| +| `FletchingTableReplaceHandler` | 区块加载时替换制箭台 | +| `BlockFeaturesHandler` | 方块功能(堆肥等) | +| `FuelHandler` | 燃料事件处理 | + +#### Mixin 注入 +| 类 | 功能 | +|--------------------|-----------| +| `AzaleaBlockMixin` | 修改杜鹃花催熟行为 | + +#### 自定义类型 +| 类型 | 用途 | +|----------------|------------------------| +| `BlockSetType` | 焚烬木、灵焰木、杜鹃木的门/活板门/按钮类型 | +| `WoodType` | 对应木材类型 | +| `TreeGrower` | 自定义树木生长逻辑 | + +### 文件结构 +``` +src/hfas/java/org/polaris2023/wildwind/hfas/ +├── block/ # 方块注册 +│ ├── ModBlocks.java # 方块定义 +│ ├── FletchingTableBlock.java +│ └── entity/ # 方块实体 +│ └── FletchingTableBlockEntity.java +├── worldgen/ # 世界生成 +│ ├── ModConfiguredFeatures.java +│ ├── ModPlacedFeatures.java +│ ├── ModBiomeModifiers.java +│ └── ModTreeGrowers.java +├── datagen/ # 数据生成 +│ ├── HFASDatagen.java +│ └── provider/ +│ ├── loot/ # 实体掉落 +│ ├── lang/ # 语言系统 +│ ├── tag/ # Tag标签 +│ ├── ModModelProvider.java +│ ├── ModLootProvider.java +│ ├── ModDatapackProvider.java +│ ├── ModDataMapsProvider.java +├── event/ # 事件处理 +│ ├── FletchingTableReplaceHandler.java +│ ├── BlockFeaturesHandler.java +│ └── FuelHandler.java +├── mixin/ # Mixin 注入 +│ └── AzaleaBlockMixin.java +├── config/ # 配置文件 +│ └── ModCommonConfig.java +├── menu/ # GUI 菜单 +│ └── FletchingTableMenu.java +└── groups/ # 创造模式物品栏 + └── ModCreativeTabs.java +``` + +### 生成资源统计 +| 类型 | 数量 | +|------|---------------------------| +| 方块模型 | 118+ | +| 物品模型 | 60+ | +| 方块状态 | 45+ | +| 战利品表 | 45+ | +| 语言条目 | 90+ (en_us) / 90+ (zh_cn) | + +--- + +## [1.0.0] - 2026.04.15 + +### Added +- **区块加载替换机制** - 使用 `ChunkEvent.Load` 事件在区块加载时替换制箭台 +- **制箭台GUI系统** - `FletchingTableBlock`、`FletchingTableBlockEntity`、`FletchingTableMenu` +- **数据生成系统** - 模型、战利品表、语言文件、数据映射生成 +- **焚烬木套件** - 16种方块(原木、木板、楼梯、门等) +- **灵焰木套件** - 16种方块 +- **杜鹃木套件** - 13种方块(不含树叶和树苗,使用原版) +- **树木自然生成** - 焚烬木(下界)、灵焰木(灵魂沙峡谷)、杜鹃木(繁茂洞穴) +- **杜鹃树增强** - Mixin 修改催熟行为,使用杜鹃木原木 +- **配置文件系统** - `worldgen.replaceVanillaFletchingTable` 配置项 +- **方块放置事件处理器** - `FletchingTableReplaceHandler` +- **焦灰草方块、焦土、焦灰草丛、焦灰枝条、仙人球** +- **制箭台(带GUI功能)** +- **创造模式物品栏自动排序** +- **木头去皮功能** - 使用 NeoForge DataMaps 注册去皮映射 +- **树叶堆肥功能** - 树叶和树苗30%概率增加堆肥等级 +- **木质方块燃料功能** - 木质方块可作为熔炉燃料(300 tick) +- **模型数据生成** - 使用 `BlockModelGenerators.family()` 和 `woodProvider()` 自动生成方块和物品模型 +- **标签数据生成** - 使用 `ModBlockTagsProvider` 和 `ModItemTagsProvider` 为木质方块添加原版标签(logs、planks、wooden_stairs 等) + +### Changed +- 移除 `StructureTemplateMixin`,改用事件监听方式 +- 使用 `BiomeModifiers.RemoveFeaturesBiomeModifier` 移除原版杜鹃树 +- 使用自定义 `BlockSetType` 和 `WoodType` +- 优化 `ModModelProvider` 使用 `family()` 方法批量生成木质方块模型 + +--- + +## 开发计划 + +### 已完成功能 +- [x] 模组制箭台GUI功能 +- [x] 世界生成时替换结构内制箭台 +- [x] 创造模式物品栏排序 +- [x] 焚烬木/灵焰木/杜鹃木套件 +- [x] 树木自然生成 +- [x] 杜鹃树催熟增强 +- [x] 木头去皮功能 +- [x] 树叶堆肥功能 +- [x] 木质方块燃料功能 +- [x] 模型数据生成 +- [x] 标签数据生成 + +### 待开发功能 +- [ ] 更多下界植物 +- [ ] 制箭台配方系统 +- [ ] 成就系统 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..19ff625 --- /dev/null +++ b/LICENSE @@ -0,0 +1,32 @@ +# SPDX-License-Identifier: GPL-3.0-only AND CC-BY-SA-4.0 + +This repository contains both code and resources under different licenses. + +## Code (GPL-3.0-only) + +All source code files (`java`, `kotlin`, etc.) are licensed under the **GNU General Public License v3.0**. +a +See [LICENSE_CODE](LICENSE_CODE) for the full license text. + +## Resources/Assets (CC-BY-SA-4.0) + +All non-code resources, including but not limited to: +- Images and graphics +- Data files (`.json`, `.png`, `.bbmodel`, etc.) +- Documentation and text +- Configuration files + +are licensed under the **Creative Commons Attribution-ShareAlike 4.0 International**. + +See [LICENSE_ASSETS](LICENSE_ASSETS) for the full license text. + +## Summary + +| Component | License | Key Requirements | +|-----------|---------|------------------| +| Code | GPL-3.0-only | Disclose source, same license for derivatives | +| Assets | CC-BY-SA-4.0 | Attribution, share-alike | + +## Questions? + +For any licensing questions, please open an issue or contact the repository maintainers. \ No newline at end of file diff --git a/LICENSE_ASSETS b/LICENSE_ASSETS new file mode 100644 index 0000000..7d4f96c --- /dev/null +++ b/LICENSE_ASSETS @@ -0,0 +1,427 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/LICENSE_CODE b/LICENSE_CODE new file mode 100644 index 0000000..e72bfdd --- /dev/null +++ b/LICENSE_CODE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..909144c --- /dev/null +++ b/README.md @@ -0,0 +1,263 @@ +# WildWindMod · 原野之风 + +面向 Minecraft NeoForge 的模块化模组项目,围绕木材、植物、生物、世界生成和制箭玩法扩展原版内容。 + +本仓库由 [Polari-Stars-MC/WildWindModule](https://github.com/Polari-Stars-MC/WildWindModule) 的当前开发版本整理而来,包含本地已实现的新功能。上游来源、贡献者与整理范围见 [来源说明](docs/PROVENANCE.md)。 + +> 当前说明对应 Minecraft `26.2` 适配代码,已合并远端 `26.2` 分支的 `26ad2da`。**结构、新物品、泥猪、泥沼蟹、恐鱼及新增玩法均在同一个 `ww_hfas` 模组中;另需安装 GeckoLib 依赖库。** + +[开发指南](docs/DEVELOPMENT.md) · [历史变更](CHANGE_LOG.MD) · [问题反馈](https://github.com/cuccuc377-dev/WildWindMod/issues) · [许可证](LICENSE) + +## 版本与环境 + +| 项目 | 当前配置 | +| --- | --- | +| Minecraft | `26.2`(依赖范围为精确版本 `[26.2]`) | +| 模组加载器 | NeoForge `26.2.0.93` | +| Java 开发工具链 | JDK `25` | +| Gradle Wrapper | `9.4.1` | +| ModDevGradle | `2.0.148` | +| GeckoLib(必需,客户端与服务端) | `5.5.4`,Minecraft 26.2 NeoForge 版本 | +| 模组版本 | `1.0.1`(构建配置值) | +| 统一模组 ID / 主资源命名空间 | `ww_hfas` | +| 结构资源兼容命名空间(不是独立模组) | `ww_structures` | + +版本以 [gradle.properties](gradle.properties) 和 [构建脚本](build.gradle.kts) 为准。`1.0.1` 是源码中的版本号,不代表已经发布稳定版。 + +## 模块规划 + +| 模块 | 名称 | 当前分支状态 | +| --- | --- | --- | +| `hfas` | Wild Wind HFAS | 唯一启用的 Gradle 模组,包含木材、植物、新物品、泥猪、结构生成及制箭系统基础代码 | +| `structures` | 内部结构生成功能 | 源码保留在 `src/structures/`,由 HFAS 入口注册、编译并打包,不单独安装 | +| `deco` | Wild Wind Decoration · 装饰 | 旧版模块规划,尚未在当前分支启用 | +| `adv` | Wild Wind Adventure · 冒险 | 旧版模块规划,尚未在当前分支启用 | +| `vpp` | Wild Wind Vanilla++ · 原版修饰 | 旧版模块规划,尚未在当前分支启用 | + +模块启用列表见 [settings.gradle.kts](settings.gradle.kts)。 + +## HFAS 内容 + +### 木材与植物 + +源码已注册三组木质方块: + +| 木材 | 注册内容 | 树木相关实现 | +| --- | --- | --- | +| 焚烬木 `blaze` | 15 种方块 | 独立树叶、树苗;配置在下界废土生成 | +| 灵焰木 `soul` | 15 种方块 | 独立树叶、树苗;配置在灵魂沙峡谷生成 | +| 杜鹃木 `azalea` | 13 种方块 | 复用原版杜鹃植物与树叶;配置替换繁茂洞穴的原版杜鹃树生成 | + +三组木材均包含原木、木头、去皮原木、去皮木头、木板、楼梯、台阶、栅栏、栅栏门、门、活板门、压力板和按钮。焚烬木、灵焰木另有树叶和树苗。 + +此外已注册焦灰草方块、焦土、焦灰草丛、焦灰枝条、仙人球,并实现木材去皮映射和部分木质物品的燃料处理。方块物品统一放入创造模式「原野之风」分页。杜鹃施加骨粉的行为通过 Mixin 接入自定义树木生成。 + +### 泥猪 + +泥猪 `ww_hfas:muddy_pig` 使用项目提供的成年/幼年 Blockbench 模型与贴图,沿用原版猪的行走、转头动画、成年/幼年音效、食物与基础行为。两只泥猪可繁殖出泥猪幼崽,不与普通猪混种;掉落复用原版猪的掉落表。 + +- **自然生成**:沼泽 `minecraft:swamp`、红树林沼泽 `minecraft:mangrove_swamp`,生成权重 `10`,每群 `2–4` 只。 +- **生成条件**:允许原版动物生成地面、泥巴和沾泥的红树根;使用原版动物亮度条件(大于 `8`)与陆地空间检查,不在水中或实体碰撞空间内生成。仍受原版被动生物数量上限等自然生成规则约束。 +- **刷怪蛋**:`ww_hfas:muddy_pig_spawn_egg`,位于创造模式「原野之风」分页;图标复用原版猪刷怪蛋。对成年泥猪使用可生成泥猪幼崽。 + +```mcfunction +/summon ww_hfas:muddy_pig ~ ~ ~ +/summon ww_hfas:muddy_pig ~ ~ ~ {Age:-24000} +/give @s ww_hfas:muddy_pig_spawn_egg +``` + +资源与数据包调整方法、构建和测试说明见 [泥猪开发说明](docs/MUDDY_PIG.md)。 + +### 普通物品 + +以下七个物品均为普通材料,最大堆叠数量为 64,位于创造模式「原野之风」分页,使用提供的 16×16 图标。当前不附加食用、方块放置、合成或掉落行为。 + +| 中文名称 | 物品 ID | +| --- | --- | +| 浮萍 | `ww_hfas:duckweed` | +| 鱿鱼须 | `ww_hfas:calamari` | +| 熟鱿鱼须 | `ww_hfas:cooked_calamari` | +| 煎蛋 | `ww_hfas:cooked_egg` | +| 烤种子 | `ww_hfas:baked_seeds` | +| 熟蛙腿 | `ww_hfas:cooked_frog_legs` | +| 生蛙腿 | `ww_hfas:frog_legs` | + +例如 `/give @s ww_hfas:duckweed 64`。物品注册位于 `registry/ModItems.java`,图标保存在 `assets/ww_hfas/textures/item/`;模型与中英文翻译同时接入数据生成器。 + +### 杜鹃木告示牌、展示架与延展之箭 + +杜鹃木新增普通/悬挂式告示牌与展示架,提供原版双面文字、涂蜡、红石联动、快捷栏交换和漏斗交互。延展之箭注册为独立物品与实体,支持合成、制箭师随机交易及村庄英雄礼物。 + +```mcfunction +/give @s ww_hfas:azalea_sign +/give @s ww_hfas:azalea_hanging_sign +/give @s ww_hfas:azalea_shelf +/give @s ww_hfas:tipped_arrow 64 +/give @s ww_hfas:tipped_arrow[potion_contents={potion:"ww_hfas:long_reach"}] 64 +``` + +全部放入「原野之风」分页。配方、两种箭的时长、红石规则与测试说明见 [杜鹃木功能方块与延展之箭](docs/AZALEA_AND_REACH_ARROWS.md)。 + +### 窑炉 + +新增功能方块 **窑炉 `ww_hfas:kiln`**,暂时复用原版熔炉的模型、贴图、火焰粒子、声音和界面贴图,位于创造模式「原野之风」分页。 + +- 红砖按 `空/砖/空`、`砖/熔炉/砖`、`泥坯/泥坯/泥坯` 合成一个窑炉。 +- 每 **100 游戏刻(5 秒)** 烧炼一件;兼容符合条件的熔炉配方,排除矿物及金属装备。砂子、黏土球、圆石、仙人掌、木头、湿海绵等可用。 +- 支持上下/侧面漏斗、燃料容器返还、经验存储与领取、比较器、铁砧命名及物品谓词锁。燃烧时亮度 13,需要木镐或更好的镐采集,不能被活塞移动。 +- 新生成村庄的六种原版石匠屋模板会在切石机旁增加窑炉,原有石匠工作站保留;已生成的房屋不自动修改。 + +```mcfunction +/give @s ww_hfas:kiln +``` + +完整规则、燃料用量和测试命令见 [窑炉说明](docs/KILN.md)。 + +### 从远端合并的内容 + +`1.0.1` 在保留本地结构与玩法功能的基础上,合并了远端 `26.2` 分支(提交 `26ad2da`,2026 年 10 月 17 日)。包含泥沼蟹 `ww_hfas:mudcrab`、恐鱼 `ww_hfas:piranha`、对应刷怪蛋/生物桶、万用蟹钳、延展效果与药水,以及木材资源和配方更新。生物动画使用 GeckoLib。 + +泥沼蟹有温带、暖地、寒地三种数据驱动变种,恐鱼沿用远端丛林与沼泽生成设置。两种生物均已接入水下免缺氧名单。原食人鱼现统一显示为「恐鱼(Direfish)」,生鱼、熟鱼、刷怪蛋、鱼桶和音效字幕同步更名;为兼容已有存档,实体与相关物品继续使用原有的 `piranha` 注册 ID。召唤恐鱼使用 `/summon ww_hfas:piranha`。 + +远端附带的船、焚烬木/灵焰木告示牌和盆栽树苗仍未注册(杜鹃木告示牌已实现),其资源保留在源码中,对应无效配方、掉落表和进度不会打包。合并细节与验证范围见 [合并记录](docs/UPSTREAM_MERGE.md)。 + +### 合成、蜘蛛网与状态效果 + +- **羊毛拆线**:任意颜色的一个羊毛与剪刀无序合成两个线。返还原剪刀,每次使用消耗一点耐久,受耐久附魔影响;最后一点耐久耗尽时剪刀损坏。支持背包、工作台与自动合成器。 +- **挣脱蜘蛛网**:实体在接触的蜘蛛网中持续移动 `30` 游戏刻后破坏该蜘蛛网;下坠接触时需 `160` 游戏刻。停止移动或离开会重置计时。蜘蛛、洞穴蜘蛛、旁观玩家和正在飞行的创造玩家不会触发。 +- **沉溺 `ww_hfas:sink`**:仅对设定名单中的 41 种原版实体及泥猪生效,阻止它们在流体中向上移动,保留水平与向下移动。 +- **窒息 `ww_hfas:choke`**:对名单中的 43 种原版实体及泥猪加快水下氧气消耗,I 级为 `2` 倍、II 级为 `3` 倍;保留水下呼吸药水与水下呼吸附魔的保护。蝌蚪、美西螈不加入该标签,单独在离水后加快缺氧;入水后无效。 +- **水下免缺氧名单**:按设定为 25 种原版生物提供水下呼吸保护,包括海豚、沼骸和指定亡灵等;即使获得窒息也不会因水下缺氧受伤。完整名单及泥沼蟹/恐鱼的兼容状态见 [生物适用名单](docs/GAMEPLAY.md#生物适用名单)。水下免缺氧与效果适用名单独立;幻翼现在不受沉溺和窒息影响。 + +### 骷髅近战与耕地保护 + +- 骷髅、流浪者、沼骸、焦骸(`minecraft:parched`)生成装备时,有 **10%** 概率使用石剑并切换为近战 AI;读档不会重新判定。 +- 流浪者近战命中造成 **30 秒缓慢 I**,沼骸造成 **4 秒中毒 I**,焦骸造成 **30 秒虚弱 I**;普通骷髅没有额外近战效果。 +- 穿戴具有「摔落缓冲」附魔的盔甲,或具有「缓降」效果的实体,落到耕地上不会踩坏耕地。只保护耕地,伤害继续遵循原版规则;手持附魔盔甲无效。 + +### 创造模式分页 + +所有已注册的模组方块物品、材料、食物、生物桶、刷怪蛋和万用蟹钳统一放入「原野之风」分页,同时收录延展药水各形态、延展药箭及熔炼附魔书。原版分类不再重复显示这些内容,全局搜索仍可找到它们。 + +### 熔炼附魔 + +**熔炼 `ww_hfas:melting`** 为最高 I 级的工具附魔。玩家用附魔工具挖掘时,按熔炉配方转换掉落物,每熔炼一个输入物品消耗 **1 点经验值(不是 1 级)**。 + +精准采集优先:工具有精准采集时不熔炼、不扣经验;有时运时先计算掉落数量,再判断熔炼。当前经验不足以处理本次全部可熔炼掉落时,整次保留原掉落且不扣经验。无熔炉配方的物品不受影响。 + +```mcfunction +/effect give @s ww_hfas:sink 60 +/effect give @s ww_hfas:choke 60 +/enchant @s ww_hfas:melting 1 +``` + +效果、附魔获取方式、完整规则及测试覆盖见 [新增玩法说明](docs/GAMEPLAY.md)。这些功能与结构、新物品、泥猪一起打包在同一个 `ww_hfas` 模组中。 + +### 制箭系统(开发中) + +目前包含自定义制箭台方块、方块实体、菜单、箭羽/箭杆/箭头枚举和箭矢数据组件。客户端界面与实际合成流程尚未完成,箭矢配方生成方法仍为空;当前不能视作完整可玩的制箭系统。 + +模型、语言、标签、掉落表和世界生成数据由数据生成器输出;从源码构建前请阅读[开发指南](docs/DEVELOPMENT.md)。纹理与注册 ID 的一致性也仍需整理。 + +## 安装与配置 + +### 结构生成模块 + +安装统一的 `ww_hfas-mc26.2-1.0.1.jar`,并同时安装 `geckolib-neoforge-26.2-5.5.4.jar`。客户端与服务端均需要匹配版本。构建命令为 `./gradlew :hfas:build`(Windows 使用 `.\gradlew.bat`),从源码构建前先完成下方两类数据生成。 + +从之前的双 JAR 版本更新时,将旧 HFAS JAR 替换为此文件,并移除旧的 `ww_structures` JAR,避免重复注册。已有 `config/ww_structures/`、`ww_structures:<结构名称>` ID 和存档中的坐标记录继续使用,无需改名。 + +首次创建或打开世界后,会在游戏/服务端实例目录创建: + +```text +config/ww_structures/ +├── definitions/ # 每个结构一个 JSON 配置 +├── templates/ # 原版结构方块导出的压缩 .nbt 文件 +│ └── example_ruins.nbt # 随附 7 × 4 × 7 遗迹示例 +└── example_ruins.json.disabled # 配置示例,默认不参与生成 +``` + +把示例配置复制为 `definitions/example_ruins.json`,将 `enabled` 改为 `true`,重启世界/服务器后即可在符合条件的新区块生成。可以配置模板文件名、群系与群系标签、生成间距、概率、随机盐、高度、旋转、地形起伏、流体与基础地形方块条件。 + +```mcfunction +/wwstructure list +/wwstructure locate example_ruins +/wwstructure search example_ruins 16 +``` + +`locate` 返回当前维度已记录的生成结构中,水平距离最近的一处坐标;记录随存档保存。`search` 使用原版结构搜索,可以查找尚未探索区域中的生成位置。命令需要管理员权限(与原版 `/locate` 一致)。 + +完整配置、条件含义、结构导出方法、停用规则和测试命令见 **[结构生成模块指南](docs/STRUCTURES.md)**。配置变更需要重启;不会给已生成区块补生成结构。 + +### HFAS 模块 + +取得经过验证、与上述 Minecraft / NeoForge 版本匹配的模组 JAR 后,将其放入对应实例的 `mods/` 目录。从源码生成 JAR 的步骤见下方。当前开发状态与待完善项见[开发指南](docs/DEVELOPMENT.md#待完善事项)。 + +HFAS 注册了一个 COMMON 配置项: + +| 配置键 | 默认值 | 作用 | +| --- | --- | --- | +| `worldgen.replaceVanillaFletchingTable` | `true` | 启用服务端原版制箭台替换逻辑 | + +替换发生在方块放置事件及区块加载时。**已有存档中加载的区块也会受影响**:当前区块扫描从世界最低建造高度至固定 `Y=200`,将其中的原版制箭台替换为模组制箭台。关闭配置只会停止后续替换,不会自动恢复已经替换的方块。由于制箭流程尚未完成,测试前请结合这一行为选择配置。 + +## 从源码开始 + +准备 JDK 25,取得包含本次 26.2 适配的源码后,在仓库根目录执行。首次运行需要联网下载 Gradle、插件与游戏依赖。模组自身版本仍为 `1.0.1`,目标游戏版本为 `26.2`,JAR 文件名包含游戏版本以便区分。 + +```powershell +# Windows PowerShell +.\gradlew.bat :hfas:runClientData +.\gradlew.bat :hfas:runServerData +.\gradlew.bat build +``` + +```bash +# Linux / macOS +chmod +x gradlew +./gradlew :hfas:runClientData +./gradlew :hfas:runServerData +./gradlew build +``` + +数据生成成功后再构建;若生成任务报错,请先处理报错,不要把缺少生成资源的 JAR 当作完整发行包。当前构建脚本未将数据生成任务自动接入 `build`。 + +HFAS 构建产物位于 `modules/hfas/build/libs/`,按当前配置命名为 `ww_hfas-mc26.2-1.0.1.jar`。开发客户端可通过 `:hfas:runClient` 启动。 + +## 项目结构 + +```text +WildWindMod/ +├── src/ +│ ├── hfas/ +│ │ ├── java/ # HFAS 注册、玩法、配置与数据生成代码 +│ │ └── resources/ # 纹理、Blockbench 源文件、Mixin 配置等 +│ ├── structures/ +│ │ ├── java/ # 配置数据包、结构生成、坐标记录与指令 +│ │ ├── resources/ # 随统一 JAR 打包的示例配置、NBT 模板 +│ │ ├── test/ # JUnit 配置与持久化测试 +│ │ └── gametest/ # 接入 HFAS 的结构游戏测试与配置 +│ └── templates/ # 各模块共用的模组元数据模板 +├── modules/hfas/ # Gradle 配置时创建的子项目目录 +│ └── build/ # HFAS JAR、生成元数据和开发运行目录 +├── build/generated/hfas/ # 数据生成输出(client/、server/) +├── docs/DEVELOPMENT.md # 开发命令、源码导航与待完善项 +├── docs/STRUCTURES.md # 结构配置与坐标查询指南 +├── .github/workflows/build.yml # GitHub Actions 构建流程 +├── build.gradle.kts # 共用构建配置与模块任务 +├── settings.gradle.kts # 模块启用列表与项目目录映射 +├── gradle.properties # 版本、工具与模组属性 +└── CHANGE_LOG.MD # 历史变更记录 +``` + +`modules/hfas/` 是 Gradle 子项目目录,实际源码位于 `src/hfas/` 和 `src/structures/`,共同编译进一个模组。生成目录不纳入 Git;不要直接修改其中的文件,修改对应的数据生成器后重新生成。 + +## 参与开发 + +欢迎通过 Issue 反馈问题、讨论功能,并通过 Pull Request 提交修改。提交前请阅读[开发指南](docs/DEVELOPMENT.md),注明目标分支、对应 Minecraft / NeoForge 版本、复现步骤及验证结果。历史记录见 [CHANGE_LOG.MD](CHANGE_LOG.MD),当前实现状态以本分支源码为准。 + +## 许可证 + +仓库 [LICENSE](LICENSE) 声明采用分项许可:源码使用 [GPL-3.0-only](LICENSE_CODE),资源、文档和配置等非代码内容使用 [CC-BY-SA-4.0](LICENSE_ASSETS)。具体条款请阅读对应文件。 + +当前 `gradle.properties` 中的 `modLicense` 仍为 `All Rights Reserved`,与上述仓库声明存在差异,需维护者统一元数据。 diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..acda0fe --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,180 @@ +import org.slf4j.event.Level.INFO +import java.util.Locale + +plugins { + `java-library` + `maven-publish` + id("net.neoforged.moddev") version("2.0.148") + idea + base +} + + +//tasks.named("wrapper").configure { +// distributionType = Wrapper.DistributionType.BIN +//} + +val minecraftVersion: String by rootProject +val minecraftVersionRange: String by rootProject +val modName: String by rootProject +val modLicense: String by rootProject + +val geocklibVersion: String by rootProject + +allprojects { + apply(plugin = "java-library") + apply(plugin = "maven-publish") + apply(plugin = "idea") + apply(plugin = "net.neoforged.moddev") + apply(plugin = "base") + val modGroupId: String by project + val modId: String by project + var projectModId = rootProject.name + "_" + project.name.lowercase(Locale.ROOT) + val modVersion: String by project + val neoVersion: String by project + if (project == rootProject) return@allprojects + group = modGroupId + version = modVersion + configure { + archivesName = "$projectModId-mc$minecraftVersion" + + } + + var generateModMetadata = tasks.register("generatedMetadata") { + val replaceProperties = mapOf( + "minecraft_version" to minecraftVersion, + "minecraft_version_range" to minecraftVersionRange, + "neo_version" to neoVersion, + "mod_id" to projectModId, + "mod_name" to modName, + "mod_description" to "Wild Wind: plants, materials, muddy pigs and configurable structure generation.", + "mod_license" to modLicense, + "mod_version" to modVersion, + "geocklib_version" to geocklibVersion + ) + inputs.properties(replaceProperties) + expand(replaceProperties) + from(rootProject.file("src/templates")) + into("build/generated/sources/modMetadata") + } + + + sourceSets { + rootProject.file("src/${project.name}/java").resolve(modGroupId.replace('.', '/')).mkdirs() + main { + java { + srcDir(rootProject.file("src/${project.name}/java")) + } + resources { + srcDir(generateModMetadata) + srcDir(rootProject.file("build/generated/${project.name}/server")) + srcDir(rootProject.file("build/generated/${project.name}/client")) + srcDir(rootProject.file("src/${project.name}/resources")) + + exclude("**/*.bbmodel") + exclude("build/generated/**/.cache") + exclude("**/.cache/**") + } + } + } + + repositories { + exclusiveContent { + forRepository { + maven { + name = "GeckoLib" + url = uri("https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/") + } + } + + filter { + includeGroupAndSubgroups("com.geckolib") + } + } + } + + java.toolchain.languageVersion = JavaLanguageVersion.of(25) + + neoForge { + version = neoVersion + + accessTransformers.from(rootProject.file("src/${project.name}/resources/META-INF/accesstransformer.cfg")) + + runs { + register("client") { + client() + systemProperty("neoforge.enabledGameTestNamespaces", projectModId) + gameDirectory = layout.buildDirectory.dir("runs/${project.name}/client").get().asFile + } + register("server") { + server() + programArgument("--nogui") + systemProperty("neoforge.enabledGameTestNamespaces", projectModId) + gameDirectory = layout.buildDirectory.dir("runs/${project.name}/server").get().asFile + } + register("clientData") { + clientData() + gameDirectory = layout.buildDirectory.dir("runs/${project.name}/datagen").get().asFile + programArguments.addAll( + listOf( + "--mod", projectModId, + "--all", + "--output", rootProject.file("build/generated/${project.name}/client").absolutePath, + "--existing", rootProject.file("src/${project.name}/resources").absolutePath, + ) + ) + } + register("serverData") { + serverData() + gameDirectory = layout.buildDirectory.dir("runs/${project.name}/datagen").get().asFile + programArguments.addAll( + listOf( + "--mod", projectModId, + "--all", + "--output", rootProject.file("build/generated/${project.name}/server").absolutePath, + "--existing", rootProject.file("src/${project.name}/resources").absolutePath, + ) + ) + } + configureEach { + systemProperty("forge.logging.markers", "REGISTRIES") + logLevel.set(INFO) + } + } + + mods { + register(projectModId) { + sourceSet(sourceSets["main"]) + } + } + + + } + + neoForge.ideSyncTask(generateModMetadata) + + val localRuntime by configurations.registering + + configurations { + runtimeClasspath { + extendsFrom(localRuntime.get()) + } + } + + dependencies { + compileOnly("org.projectlombok:lombok:1.18.44") + annotationProcessor("org.projectlombok:lombok:1.18.44") + implementation("com.geckolib:geckolib-neoforge-$minecraftVersion:$geocklibVersion") + } + + tasks.withType().configureEach { + options.encoding = "UTF-8" + } + + idea { + module { + isDownloadJavadoc = true + isDownloadSources = true + } + } +} diff --git a/docs/AZALEA_AND_REACH_ARROWS.md b/docs/AZALEA_AND_REACH_ARROWS.md new file mode 100644 index 0000000..483f965 --- /dev/null +++ b/docs/AZALEA_AND_REACH_ARROWS.md @@ -0,0 +1,81 @@ +# 杜鹃木功能方块与延展之箭 + +适用:Minecraft 26.2 / NeoForge 26.2.0.93,统一模组 `ww_hfas`。所有新增物品在创造模式「原野之风」分页,也可以全局搜索。本文档中的 ID 使用项目实际命名空间 `ww_hfas`;需求稿中的 `wwhfas` 统一为该命名空间。 + +## 获取与配方 + +| 内容 | 物品 ID | 配方 | 数量 | +| --- | --- | --- | --- | +| 杜鹃木告示牌 | `ww_hfas:azalea_sign` | 前两行各 3 块杜鹃木板,第三行中间 1 根木棍 | 3 | +| 悬挂式杜鹃木告示牌 | `ww_hfas:azalea_hanging_sign` | 第一行左右各 1 根铁链,后两行各 3 根去皮杜鹃原木 | 6 | +| 杜鹃木展示架 | `ww_hfas:azalea_shelf` | 第一、三行各 3 根去皮杜鹃原木,中间一行留空 | 6 | +| 延展之箭 | `ww_hfas:tipped_arrow` | 中央滞留型延展药水,周围 8 支原版箭 | 8 | + +```mcfunction +/give @s ww_hfas:azalea_sign 3 +/give @s ww_hfas:azalea_hanging_sign 6 +/give @s ww_hfas:azalea_shelf 6 +/give @s ww_hfas:tipped_arrow 64 +/give @s ww_hfas:tipped_arrow[potion_contents={potion:"ww_hfas:long_reach"}] 64 +/give @s minecraft:lingering_potion[potion_contents={potion:"ww_hfas:reach"}] +/give @s minecraft:lingering_potion[potion_contents={potion:"ww_hfas:long_reach"}] +``` + +两种告示牌最大堆叠 16,展示架与箭最大堆叠 64。方块不添加自然生成。 + +## 告示牌 + +普通告示牌有站立和墙面两种方块,悬挂式有吊顶和墙面两种方块。墙面 ID 分别为 `ww_hfas:azalea_wall_sign`、`ww_hfas:azalea_wall_hanging_sign`,由同一对应物品根据放置位置选择。 + +- 继承原版朝向、支撑检查、含水、链条连接与碰撞行为。普通和吊顶告示牌无碰撞,墙面悬挂式仅上方横杆有碰撞。 +- 正反面各四行文字,支持放置时编辑、再次编辑、染料、荧光墨囊、墨囊与蜜脾涂蜡。沿用原版编辑者锁定及服务器文本校验。 +- 沿用原版告示牌方块实体,因此保留非管理员不能设置方块实体数据的保护。 +- 杜鹃木告示牌的世界内文本按需求色表渲染,亮度不随环境照明变化;发光文本使用更亮的颜色和对应描边。其他木种的渲染不变。 +- 两类告示牌硬度与抗爆性均为 1,活塞不可推拉,火焰不会烧毁;燃料时间分别为 200 和 800 刻。 +- 使用现有杜鹃木物品图标,补齐 26.2 方块模型所需的贴图布局与普通告示牌编辑背景。木色取自已有杜鹃木板,链条保留铁色。 + +## 展示架 + +展示架复用原版 `ShelfBlockEntity`,客户端也使用原版展示架物品渲染器。 + +- 正面三槽,每槽一组物品;右键槽位交换主手整组物品。 +- 红石激活后隐藏内部隔板。相邻、同朝向且激活的展示架最多三个连接,右键分别交换快捷栏右侧 3 格、6 格或全部 9 格。 +- 背面比较器输出左槽 1、中槽 2、右槽 4 的和,范围 0–7。其他方向不输出该读数。 +- 支持漏斗等原版容器交互及 NeoForge 物品能力接口。按槽位从左到右处理,每个展示架保有独立库存。 +- 破坏后掉落方块和内容物,存档保存物品。默认物品居中,管理员可改为底部对齐: + +```mcfunction +/data merge block {align_items_to_bottom:1b} +``` + +硬度 2、抗爆性 3;活塞不可推拉;引燃值 30、烧毁值 20,含水时不燃;作为燃料燃烧 300 刻。模型复用原版展示架几何,配套杜鹃木色贴图。 + +## 延展之箭 + +独立物品为 `ww_hfas:tipped_arrow`,射出的实体为 `ww_hfas:arrow`。直接给予该物品时默认带普通延展药水成分。 + +| 中央药水 | 箭命中后效果 | +| --- | --- | +| 滞留型延展药水:基础药水时长 3:00 | 延展 I,450 刻(22.5 秒,界面显示约 22 秒) | +| 滞留型延展药水:基础药水时长 8:00 | 延展 I,1200 刻(1 分钟) | + +滞留型药水提示的实际云效果会按原版滞留药水倍率缩短;合成箭按基础药水时长的 1/8 计算,不再额外乘一次滞留倍率。 + +- 弓、弩和发射器均生成专用箭实体,保留原版箭的飞行、伤害、拾取、穿透及武器附魔处理。 +- 无限魔咒不免除延展之箭的消耗。箭插在方块内累计到 600 刻时失去药水成分,拾取获得 `minecraft:arrow`。 +- 原版药箭合成配方在产物是延展/长效延展时返回模组物品;其他药水箭保持原版产物。 +- 两种延展药水加入 `minecraft:tradeable` 药水标签。大师制箭师仍从原版三个选项抽取两个,因此药箭交易出现率为 2/3;该交易再从可交易药水池随机选一种,延展不是固定占 67%。价格为 2 绿宝石 + 5 箭,换 5 支药箭。 +- 村庄英雄的制箭师礼物随机池增加普通延展之箭,保留原有箭与药箭选择,不额外保证赠送一支。 +- 旧存档中的原版 `minecraft:tipped_arrow` 延展箭仍可使用;不会自动批量替换已有物品。 + +## 已执行验证 + +客户端/服务端数据生成、构建、11 项单元测试、24 组服务端 GameTest 均通过。另启动开发客户端完成资源加载并正常退出,未发现本次新增资源缺失或 Mixin 加载错误;日志仍有原项目制箭台、焦灰草方块及未注册木材资源的既有材质警告,本次未修改这些内容。新增五组测试覆盖: + +1. 四种告示牌的有效方块实体、双面文字/颜色/发光/蜡存档、管理员数据限制、掉落、含水属性、硬度、活塞和燃料。 +2. 展示架所有 8 种比较器组合、主手整组交换、库存与对齐存档、漏斗抽取、物品能力、燃料和可燃性。 +3. 红石连接的一至三个展示架实际右键交换 3/6/9 个快捷栏物品,以及第二次交换恢复原物品。 +4. 原版合成路径产出两种延展箭、弓/发射器实体类型、可用弹药标签、无限判定、命中持续时间,以及第 599/600 刻退化边界。 +5. 真实交易数据的价格与大师两选三规则,固定随机种子抽取 2048 次交易和 1024 次英雄礼物,覆盖两种延展交易及原版候选保留。 + +创造分页回归测试同时核对两种延展箭分别出现且不在原版分页重复。以上服务端测试不替代人工检查告示牌编辑界面、荧光文字和展示架三维显示。 diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md new file mode 100644 index 0000000..586cb27 --- /dev/null +++ b/docs/DEVELOPMENT.md @@ -0,0 +1,96 @@ +# 开发指南 + +本指南对应 Minecraft `26.2` 适配代码。项目介绍、版本与模块状态见 [README](../README.md)。 + +## 环境与构建 + +- 使用 JDK 25;`build.gradle.kts` 为模块设置了 Java 25 工具链。 +- 使用仓库自带的 Gradle Wrapper,无需单独安装 Gradle。 +- Gradle 配置了 Foojay 工具链解析器,但首次依赖下载仍需要可用网络。 +- 当前只启用 `hfas`(`ww_hfas`)一个子项目;新物品、泥猪与 `src/structures/` 中的结构功能统一编译和打包。 +- 远端生物依赖 GeckoLib 5.5.4;Gradle 从 GeckoLib 官方 Maven 仓库获取依赖,游戏客户端与服务端也需要安装对应 26.2 NeoForge JAR。 + +以下命令均在仓库根目录执行,Windows 使用 `.\gradlew.bat`,Linux / macOS 使用 `./gradlew`: + +| 操作 | Windows PowerShell 命令 | +| --- | --- | +| 查看模块任务 | `.\gradlew.bat :hfas:tasks --all` | +| 生成客户端数据 | `.\gradlew.bat :hfas:runClientData` | +| 生成服务端数据 | `.\gradlew.bat :hfas:runServerData` | +| 构建项目 | `.\gradlew.bat build` | +| 启动开发客户端 | `.\gradlew.bat :hfas:runClient` | +| 启动开发服务端 | `.\gradlew.bat :hfas:runServer` | +| 清理构建输出 | `.\gradlew.bat clean` | +| 全部单元测试(模型与结构) | `.\gradlew.bat :hfas:test` | +| 联合游戏测试(物品、泥猪、结构与新增玩法) | `.\gradlew.bat :hfas:runGameTest` | +| 构建统一模组 | `.\gradlew.bat :hfas:build` | + +这些运行入口来自构建脚本中的 `client`、`server`、`clientData`、`serverData` 配置。依赖解析成功是运行任务的前提。 + +### 数据生成顺序 + +HFAS 首次构建、清理后构建,或修改数据生成代码后,按顺序执行客户端数据生成、服务端数据生成、`build`。开发运行前也应先生成所需资源。任一步失败时,先解决失败原因再继续。结构功能的资源已直接包含在源码中并随 HFAS 打包,无需单独的数据生成,配置与测试说明见 [STRUCTURES.md](STRUCTURES.md)。 + +| 输出目录 | 来源与内容 | +| --- | --- | +| `build/generated/hfas/client/` | 模型、`en_us` / `zh_cn` 语言文件 | +| `build/generated/hfas/server/` | 方块与物品标签、掉落表、世界生成、数据映射、配方生成入口 | +| `modules/hfas/build/generated/sources/modMetadata/` | 从 `src/templates/` 展开的模组元数据 | +| `modules/hfas/build/libs/` | 构建的 JAR | +| `modules/hfas/build/runs/hfas/` | 开发客户端、服务端及数据生成的运行目录 | + +泥猪的实体贴图、刷怪蛋定义、七个普通物品的贴图与模型、最低限度的中英文翻译与生成/掉落数据直接保存在源码中,单独运行 `:hfas:build` 也能打包;数据生成后的完整翻译及物品模型优先于源码中的备用文件。其他 HFAS 内容仍应遵循上述数据生成顺序。 + +生成资源被加入模块的资源集,但 `build` 不会自动先运行数据生成,`clean` 会删除生成结果。生成器是否输出了完整内容还取决于其具体实现,例如当前箭矢配方生成方法为空。 + +CI 使用 JDK 25,按顺序执行客户端数据生成、服务端数据生成、构建及统一 GameTest。`.bbmodel` 文件作为建模源文件保存在源码资源目录中,打包时被排除。生成的 JSON 优先于源码备用资源;未注册的船、焚烬木/灵焰木告示牌、盆栽树苗相关资源过滤规则见 `modules/hfas/build.gradle.kts`。 + +## 源码导航 + +HFAS Java 包根目录为 `src/hfas/java/org/polaris2023/wildwind/hfas/`。 + +| 入口 / 目录 | 职责 | +| --- | --- | +| `HFASMod.java` | 模组入口,注册方块、物品、菜单、方块实体、组件与配置 | +| `block/`、`block/entity/` | 方块、制箭台及窑炉方块实体 | +| `registry/` | 统一物品、实体、属性、效果、药水、数据组件和创造物品栏注册 | +| `item/` | 万用蟹钳行为、恐鱼食物属性 | +| `entity/`、`client/` | 泥猪、泥沼蟹、恐鱼行为及模型渲染,呼吸/沉溺/窒息实体标签 | +| `menu/` | 制箭台与窑炉菜单、槽位逻辑 | +| `arrow/`、`component/` | 箭矢部件定义与数据组件序列化 | +| `config/` | COMMON 配置规范 | +| `event/` | 制箭台替换、燃料事件、蜘蛛网计时、骷髅近战与耕地保护 | +| `recipe/` | 羊毛与剪刀的无序合成、剪刀返还及耐久 | +| `effect/`、`enchantment/` | 沉溺、窒息效果与消耗经验的熔炼附魔 | +| `worldgen/` | 树木、放置特征、生物群系修改器及石匠屋窑炉处理器 | +| `mixin/` | 杜鹃骨粉生长、自动合成器剪刀耐久、流体中上浮限制、蝌蚪/美西螈离水窒息、铁傀儡窒息耗氧 | +| `datagen/` | 客户端 / 服务端数据生成入口和各类 Provider | + +修改资源时注意命名空间 `ww_hfas`,同时核对注册 ID、模型纹理引用、语言键、标签与配方。`gradle.properties` 中的 `modId=wild_wind` 没有直接作为 HFAS 的最终 ID;当前构建脚本通过根项目名 `ww` 与模块名 `hfas` 组合得到 `ww_hfas`。 + +## 模块维护 + +当前构建约定将 `src/<模块名>/java/` 和 `src/<模块名>/resources/` 接入相应子项目。`modules/hfas/build.gradle.kts` 额外接入 `src/structures/` 的代码、资源和测试,由 `HFASMod` 调用 `StructureModule.register`;结构功能没有独立 `@Mod` 入口。`modules/<模块名>/` 在配置阶段创建。新增模块需要同步修改 `settings.gradle.kts` 的启用列表,并核对模组入口、资源命名空间、Mixin 配置与共用元数据模板。仅在 README 增加模块名称不会生成可用模块。 + +## 待完善事项 + +以下项目根据当前源码整理,是后续开发清单,不代表已完成功能: + +- **制箭交互**:补齐客户端 Screen 与注册,核对菜单和方块实体的容器连接、槽位数量及快捷移动索引;当前制箭台没有注册对应方块物品。 +- **箭矢玩法**:实现配方生成及实际合成流程,并验证部件数据的保存、网络同步与效果行为。 +- **未完成木材内容**:远端已补入 `blaze_*` / `soul_*` 纹理;船、焚烬木/灵焰木告示牌、盆栽树苗仍未注册;杜鹃木告示牌与展示架已实现,相关不可用数据暂不打包。 +- **数据生成与打包**:CI 已显式生成数据并运行测试;本地 `build` 仍不自动触发数据生成,须遵循本页顺序。 +- **存档行为**:验证制箭台对旧区块的替换逻辑、扫描范围与性能;README 已记录默认开启和不会自动回滚的行为。 +- **元数据**:由维护者统一 `modLicense` 与仓库许可证声明。 +- **其他模块**:`deco`、`adv`、`vpp` 尚未加入当前分支的 Gradle 模块列表,需要分别实现后再更新状态。 + +## 提交前验证 + +新增合成、蜘蛛网、状态效果和熔炼的行为与游戏测试覆盖见 [GAMEPLAY.md](GAMEPLAY.md)。统一游戏测试共 24 组,包含骷髅生成与近战、耕地保护、创造分页、远端内容集成、生物适用名单、两栖生物离水窒息、窑炉烧炼/容器/村庄生成、杜鹃木告示牌/展示架及延展之箭获取与行为,以及原有的物品、泥猪与结构测试。 + +文档改动应核对相对链接、命令、版本和模块状态,并执行 `git diff --check`。 + +涉及代码或资源的改动,应按影响范围运行数据生成与构建,再进行对应客户端或服务端验证;世界生成与制箭台替换需要同时关注新世界及已有区块。Pull Request 中应写明实际执行的检查,以及尚未验证的部分。 + + +杜鹃木告示牌和展示架通过 `BlockEntityTypeAddBlocksEvent` 扩展原版方块实体支持,沿用原版网络包、渲染器和库存能力。告示牌文本的客户端 Mixin 仅修改杜鹃木颜色与亮度。`ReachArrowItem` / `ReachArrow` 沿用原版药箭行为;合成与药水掉落函数仅在延展药水时转换物品,村民交易继续使用原版数据池。详细设计与测试见 [AZALEA_AND_REACH_ARROWS.md](AZALEA_AND_REACH_ARROWS.md)。 diff --git a/docs/GAMEPLAY.md b/docs/GAMEPLAY.md new file mode 100644 index 0000000..e550be1 --- /dev/null +++ b/docs/GAMEPLAY.md @@ -0,0 +1,186 @@ +# 新增玩法说明 + +适用于当前 Minecraft 26.2 / NeoForge 的统一模组 `ww_hfas`。安装文件为 `ww_hfas-mc26.2-1.0.1.jar`,同时包含结构生成、泥猪、七个普通物品及本页玩法。 + +## 窑炉 + +`ww_hfas:kiln` 是同一模组内的功能方块,使用原版熔炉外观,每 100 刻烧炼一件非矿物、非金属装备材料。完整获取方式、漏斗、经验、命名、锁定和村庄生成规则见 [窑炉说明](KILN.md)。 + +## 羊毛拆线 + +任意颜色的 **1 个羊毛 + 1 把剪刀 → 2 个线**,无序配方;支持背包 2×2、工作台 3×3 和自动合成器。 + +- 手动合成后剪刀返还原合成槽;自动合成器会输出线和剪刀,需要自行回收剪刀。 +- 每次合成尝试消耗剪刀 1 点耐久,调用原版耐久规则,因此耐久附魔有概率免除本次损耗。 +- 剪刀的附魔、自定义名称等组件保留;耗尽最后一点耐久时剪刀消失。 +- 每次实际合成都独立判定耐久,连续/Shift 合成同样适用。 +- 配方 ID 与序列化类型均为 `ww_hfas:wool_to_string`。这是自定义特殊配方,直接放入材料即可合成。 + +## 蜘蛛网挣脱 + +服务器分别记录每个实体对每个正在接触的蜘蛛网的移动时间: + +| 情况 | 所需连续移动时间 | +| --- | --- | +| 通常在网中移动 | 30 游戏刻,正常 20 TPS 下为 1.5 秒 | +| 下坠进入蜘蛛网 | 160 游戏刻,正常 20 TPS 下为 8 秒 | +| 停止位移 | 清零,重新移动后重新计时 | +| 离开该蜘蛛网 | 清零,重新接触后重新计时 | + +下坠/通常移动模式在该次连续接触开始移动时确定。多个蜘蛛网分别计时,达到时限只破坏实际接触且完成计时的蜘蛛网,采用正常方块破坏掉落规则。计时不写入存档。 + +蜘蛛、洞穴蜘蛛、旁观玩家、正在飞行的创造玩家不触发;地面上的创造玩家仍可触发。移动按实际位置变化判断,包括外力推动。 + +## 状态效果 + +这次注册的是两个负面状态效果及图标,没有新增药水物品或酿造配方。可通过指令、数据包或其他模组施加。 + +| 效果 | ID | 行为 | +| --- | --- | --- | +| 沉溺 | `ww_hfas:sink` | 只对下方沉溺名单生效。接触流体时限制向上位移与向上速度,包括水与熔岩;水平、向下移动仍可进行。更高等级不叠加额外限制。 | +| 窒息 | `ww_hfas:choke` | 对下方窒息名单中的实体,眼睛浸在水中时加速消耗氧气;I 级 2 倍、II 级 3 倍,依此类推。蝌蚪、美西螈单独在陆地处理。 | + +窒息名单中的青蛙、海龟、骆驼尸壳及铁傀儡也会消耗水下氧气。水下呼吸、潮涌能量、鹦鹉螺之息的药水效果及气泡柱仍提供呼吸保护,创造模式无敌玩家也不受影响;水下呼吸附魔跳过消耗的刻仍保持零消耗。普通名单内实体离水后正常恢复氧气。 + +### 生物适用名单 + +**不会因水下缺氧窒息的原版生物(25 种,重复的溺尸合并)**:鳕鱼、鲑鱼、热带鱼、河豚、鱿鱼、发光鱿鱼、海豚、溺尸、守卫者、远古守卫者、沼骸、史莱姆、岩浆怪、僵尸、僵尸村民、尸壳、骷髅、流浪者、凋灵骷髅、僵尸猪灵、僵尸疣猪兽、幻翼、僵尸马、骷髅马、凋灵。 + +这些生物在水下恢复氧气,优先于窒息效果;即使原先氧气已经耗尽,也不会继续因缺氧受伤。此规则不取消离水干燥伤害、火焰伤害或其他非缺氧伤害,也不移除其他生物原有的水下呼吸能力。 + +**沉溺生效的原版实体(41 种)**:玩家、狐狸、骆驼、骆驼尸壳、鸡、哞菇、牛、驴、马、骡、鹦鹉、猪、兔子、绵羊、嗅探兽、蝌蚪、海龟、流浪商人、山羊、村民、美西螈、猫、青蛙、豹猫、雪傀儡、蜜蜂、熊猫、铁傀儡、羊驼、北极熊、行商羊驼、狼、唤魔者、疣猪兽、猪灵蛮兵、掠夺者、劫掠兽、卫道士、监守者、女巫、猪灵。 + +**窒息在水中生效的原版实体(43 种)**:玩家、狐狸、骆驼、骆驼尸壳、鸡、哞菇、牛、驴、马、骡、鹦鹉、猪、兔子、绵羊、嗅探兽、海龟、流浪商人、山羊、村民、猫、青蛙、豹猫、雪傀儡、蜜蜂、熊猫、铁傀儡、羊驼、北极熊、行商羊驼、狼、唤魔者、疣猪兽、猪灵蛮兵、掠夺者、劫掠兽、卫道士、监守者、女巫、苦力怕、洞穴蜘蛛、蜘蛛、末影人、猪灵。 + +**蝌蚪、美西螈的窒息特例**:不放入 `choke_affected` 标签。代码单独检查 `isInWater()`,在水中不触发;离水后将原版缺氧/干燥消耗提高至 I 级 2 倍、II 级 3 倍。氧气耗尽时继续使用原版伤害与重置规则。美西螈仍保留雨水补水及 NoAI 时不干燥的原版行为。入水后恢复原版补氧。 + +**模组生物**:泥猪 `ww_hfas:muddy_pig` 继续同时受沉溺和水中窒息影响;泥沼蟹与恐鱼继续免于水下缺氧。 + +两份效果名单均按实体 ID 精确匹配。幻翼现不受这两个效果影响;哞菇、行商羊驼现已加入两份名单。所有其他未列入的实体不受相应效果的移动限制或额外氧气消耗,包括用户列出的不生效实体。窒息不生效不等于获得新的水下呼吸能力,未获免缺氧保护的生物仍可能正常溺水。哞兽 `moobloom` 和冻尸 `frosted_zombie` 当前未注册,也未添加任何必需标签引用。 + +模组水下免缺氧兼容项的来源与当前状态: + +| 生物 | 实体 ID | 状态 | +| --- | --- | --- | +| 泥沼蟹 | `ww_hfas:mudcrab` | 已随远端 `26.2` 分支合并,当前版本实际注册并通过水下呼吸测试 | +| 恐鱼(Direfish,原食人鱼) | `ww_hfas:piranha` | 已实际注册并通过水下呼吸测试;更名后沿用原 ID,兼容已有存档 | + +上述两个 ID 以 `required: false` 加入标签。`1.0.1` 已包含泥沼蟹和恐鱼的完整实现;恐鱼、生恐鱼、熟恐鱼、恐鱼刷怪蛋、恐鱼桶及音效字幕均使用新名称,英文为 Direfish。召唤恐鱼使用 `/summon ww_hfas:piranha`。标签中旧的可选预留项 `ww_hfas:direfish` 保留兼容,但它不是已注册的实体 ID,也不是召唤别名。安装时需要 GeckoLib 5.5.4 的 Minecraft 26.2 NeoForge 版本。 + +### 用数据包调整名单 + +| 标签 | 数据包文件 | +| --- | --- | +| `ww_hfas:water_breathing` | `data/ww_hfas/tags/entity_type/water_breathing.json` | +| `ww_hfas:sink_affected` | `data/ww_hfas/tags/entity_type/sink_affected.json` | +| `ww_hfas:choke_affected` | `data/ww_hfas/tags/entity_type/choke_affected.json` | + +在数据包中使用同路径 JSON 即可扩展名单。例如,让自定义生物受到沉溺影响: + +```json +{ + "replace": false, + "values": [ + { "id": "your_mod:your_entity", "required": false } + ] +} +``` + +`replace: false` 追加,`replace: true` 替换该标签名单。执行 `/reload` 后生效,标签通过原版数据同步传给客户端。`minecraft:can_breathe_under_water` 标签也引用了免缺氧名单,使原版呼吸判定保持一致。 + +```mcfunction +# 持续 60 秒,默认 I 级 +/effect give @s ww_hfas:sink 60 +/effect give @s ww_hfas:choke 60 +# 窒息 II,指令中的等级参数从 0 开始 +/effect give @s ww_hfas:choke 60 1 +/effect clear @s ww_hfas:sink +/effect clear @s ww_hfas:choke +``` + +## 熔炼附魔 + +- ID:`ww_hfas:melting`,中文「熔炼」,英文「Melting」,最高 I 级。 +- 支持 `minecraft:enchantable/mining` 标签中的工具,包括镐、斧、锹、锄与剪刀。 +- 加入原版非宝藏附魔标签,沿用原版相应的附魔台、附魔书交易及随机附魔入口。 +- 手持工具执行 `/enchant @s ww_hfas:melting 1` 可直接添加。 + +处理顺序如下: + +1. 原版先生成挖掘掉落,包含时运的增量。 +2. 如果工具有精准采集,直接保留所有原掉落,不扣经验。 +3. 查询当前世界的熔炉配方,计算全部可转换掉落需要的经验。 +4. 当前可用经验不足时,整次不转换、不扣经验。 +5. 经验足够时,扣除经验并替换对应掉落;没有熔炉配方的掉落保持原样。 + +**每个输入物品需要 1 点经验值,不是 1 级。** 例如时运产出 3 个粗铁时,需要 3 点经验并得到 3 个铁锭;只有 2 点经验时仍掉落 3 个粗铁。配方产出数量大于 1 时,费用仍按输入数量计算。经验会跨等级准确扣除,采用当前等级与经验条余额,不采用可能因附魔或指令而失真的累计经验计数。 + +熔炼不额外发放熔炉经验。判断发生在方块掉落事件,不会转换玩家背包中已有的物品或生物掉落;没有玩家作为破坏者的自动采矿不触发。精准采集、时运与熔炼可以同时保留在工具上,实际执行仍遵循上述优先级。 + +## 骷髅生成与近战 + +骷髅、流浪者、沼骸、焦骸(`minecraft:skeleton`、`minecraft:stray`、`minecraft:bogged`、`minecraft:parched`)在初始化生成装备时独立进行一次 10% 判定,将主手弓替换为石剑。原版会按武器选择近战/远程 AI;读档和重新加载区块不会重新抽取。凋灵骷髅继续使用原版装备规则。 + +| 生物 | 近战成功命中的效果 | +| --- | --- | +| 骷髅 | 无额外效果 | +| 流浪者 | 缓慢 I,600 游戏刻/30 秒 | +| 沼骸 | 中毒 I,80 游戏刻/4 秒 | +| 焦骸 | 虚弱 I,600 游戏刻/30 秒 | + +仅对成功伤害到的活体目标添加效果;失败攻击不触发。箭矢保留各自的原版效果。 + +测试时可用对应原版刷怪蛋观察生成概率;要直接验证近战,可以生成生物后将其武器换成石剑: + +```mcfunction +/summon minecraft:stray ~ ~ ~ +/item replace entity @e[type=minecraft:stray,sort=nearest,limit=1] weapon.mainhand with minecraft:stone_sword +``` + +在生存模式被命中后检查缓慢 I;替换实体 ID 为 `minecraft:bogged` 或 `minecraft:parched` 可检查另外两种效果。 + +## 耕地保护 + +生物或玩家满足下列任一条件,摔落到耕地时不会使其退化为泥土: + +- 任意已穿戴盔甲槽中有「摔落缓冲」附魔,I 级即可;仅放在手上或背包中无效。 +- 当前具有原版「缓降」效果(`minecraft:slow_falling`)。 + +保护仅阻止摔落踩踏,不取消摔落伤害,不影响缺水、上方被方块阻挡等原版退化规则。可在湿润耕地上分别用普通靴子、摔落缓冲靴子和 `/effect give @s minecraft:slow_falling 60` 对照测试。 + +## 创造模式物品栏 + +所有已注册的模组方块物品与普通物品集中在「原野之风」分页,ID 为 `ww_hfas:wild_wind`,图标使用泥沼蟹桶。另收录两种延展药水的普通/喷溅/滞留形态、对应药箭和熔炼 I 附魔书。原版分类中的重复入口已移除,全局搜索仍能找到模组内容。以后加入 `ModBlocks.ITEMS` 或 `ModItems.ITEMS` 的物品会自动收录。 + +## 开发与验证 + +代码位于 `src/hfas/java/org/polaris2023/wildwind/hfas/`: + +| 路径 | 用途 | +| --- | --- | +| `recipe/` | 羊毛配方匹配、输出与剪刀耐久 | +| `mixin/CrafterBlockMixin.java` | 自动合成器的剪刀返还与耐久处理 | +| `event/CobwebBreaking.java` | 服务端蜘蛛网接触与移动计时 | +| `effect/` | 状态效果注册、速度限制与氧气消耗 | +| `mixin/EntityFluidMovementMixin.java` | 在实际位移入口限制流体中上浮 | +| `enchantment/MeltingEnchantment.java` | 熔炼掉落计划、经验计算及扣除 | +| `mixin/AbstractSkeletonMixin.java`、`event/SkeletonBehavior.java` | 生成武器判定与近战命中效果;命中入口位于 `MobMixin` | +| `event/FarmlandProtection.java` | 摔落缓冲/缓降的耕地踩踏保护 | +| `registry/ModCreativeTabs.java` | 独立创造分页及原版重复内容移除 | + +配方、附魔及附魔标签直接保存在 `src/hfas/resources/data/`;效果图标位于 `assets/ww_hfas/textures/mob_effect/`。中英文翻译同步维护源码备用资源与语言数据生成器。 + +在 JDK 25 环境执行: + +```powershell +.\gradlew.bat :hfas:runClientData +.\gradlew.bat :hfas:runServerData +.\gradlew.bat :hfas:build :hfas:runGameTest +``` + +`GameplayGameTests` 注册 16 组游戏测试:所有颜色羊毛与槽位顺序、手动连续合成及 Shift 转移、剪刀损坏与耐久附魔、红石驱动的自动合成器、水/熔岩中的沉溺、窒息与呼吸保护、蜘蛛网 30/160 刻边界及豁免、实际实体刻事件、精准采集与时运优先级、经验不足、跨等级扣费及原版方块掉落路径。其中 `FluidEntityRulesGameTests` 核对两份效果名单的完整 ID 集合,逐类验证水下免缺氧名单(含泥沼蟹与恐鱼)、沉溺移动限制,以及所有窒息生效实体的实际水中耗氧、等级倍率和呼吸保护。另有 `land_choke` 测试蝌蚪与美西螈的真实陆地耗氧、伤害阈值、移除效果及返回水中的恢复,并确认共享基类中的鳕鱼不受影响。`UpstreamIntegrationGameTests` 检查泥沼蟹变种、生物桶、恐鱼熔炉配方、延展属性,以及万用蟹钳中的熔炼工具通过真实玩家挖掘路径扣费并产生铁锭。`SkeletonAndFarmlandGameTests` 新增四组测试:固定种子下四类骷髅各 200 次真实生成及武器 AI,三种近战效果的时长/等级和失败攻击,真实摔落路径的耕地保护与剩余伤害,以及模组分页完整性、药水去重与全局搜索。`KilnGameTests` 的三组测试验证窑炉的合成与方块属性、100 刻边界、原料排除、燃料及读档、输出阻塞、湿海绵装水、漏斗流向与取出顺序、经验领取、命名锁定、比较器、破坏掉落,以及六种石匠屋各四个旋转方向的真实结构池放置。另有原来的物品、泥猪与结构测试,加上杜鹃木告示牌、展示架、展示架红石联动、延展箭行为及获取途径五组测试,合计 24 组游戏测试。预留的 `direfish` 项只验证不阻断标签加载,无法执行实体行为测试。 + + +## 杜鹃木功能方块与延展之箭 + +普通/悬挂式告示牌、三槽展示架及独立延展之箭已接入同一个模组,全部位于“原野之风”分页。获取命令、配方、红石交换、交易与英雄礼物规则见 [详细说明](AZALEA_AND_REACH_ARROWS.md)。 diff --git a/docs/KILN.md b/docs/KILN.md new file mode 100644 index 0000000..7dfb55c --- /dev/null +++ b/docs/KILN.md @@ -0,0 +1,82 @@ +# 窑炉(Kiln) + +窑炉是 Minecraft 26.2 / NeoForge 统一模组 `ww_hfas` 中的功能方块,方块和物品 ID 均为 `ww_hfas:kiln`。目前复用原版熔炉四向模型、点燃模型、界面贴图、烟雾/火焰粒子和燃烧声,显示名称为「窑炉」。后续可以独立替换模型。 + +## 获取与合成 + +位于创造模式「原野之风」分页,沿用本项目所有模组物品集中分页的设置。最大堆叠为 64。 + +```mcfunction +/give @s ww_hfas:kiln +/setblock ~ ~ ~ ww_hfas:kiln[facing=north] +``` + +工作台配方如下,红砖使用 `minecraft:brick`,泥坯使用 `minecraft:packed_mud`: + +| 左 | 中 | 右 | +| --- | --- | --- | +| 空 | 红砖 | 空 | +| 红砖 | 熔炉 | 红砖 | +| 泥坯 | 泥坯 | 泥坯 | + +合成产出 1 个窑炉,获取熔炉后解锁该合成配方。 + +## 烧炼与燃料 + +窑炉读取当前世界的熔炉配方,输出数量、物品组件和经验值沿用该配方,每次固定烧炼 **100 游戏刻**,在 20 TPS 下为 5 秒、每分钟 12 件。砂子、黏土球、圆石、石头、仙人掌、海泡菜、木头、湿海绵及符合条件的其他材料可用。按需求中“矿物、金属工具、武器和盔甲以外”的范围,具有普通熔炉配方的食物也可以烧炼;不会为原本没有配方的物品新增烧炼产物。 + +原料限制由以下规则共同决定: + +- `ww_hfas:kiln_excluded` 排除标签默认包含公共的矿石、粗金属、锭、粒、宝石标签。 +- 具有高炉配方的原料排除,覆盖原版矿物和金属装备回收。 +- 可损耗耐久的物品若烧炼产物属于 `ww_hfas:kiln_metal_outputs`(默认锭、粒),也会排除。 + +上方输入槽和顶部漏斗拒绝不符合条件的物品。即使使用指令强行写入不合格原料也不会烧炼或点火。数据包可扩展这两个物品标签;已有配方随世界配方加载/重载生效。 + +使用普通熔炉燃料及燃烧时长,因此一块煤提供 1600 刻燃烧时间,连续烧炼最多 16 件普通单件产物。持续燃烧期间即使缺料或输出堵塞也会消耗剩余燃料。冷炉无有效原料、无空间容纳完整产物时不会消耗新的燃料。移除燃料导致熄火时,未完成进度按原版速度回退;更换不同原料会重新计时。 + +岩浆桶作为燃料会返还铁桶;燃烧期间烧炼湿海绵且燃料槽内存在铁桶时,会得到水桶。燃料容器返还遵循原版及 NeoForge 的 crafting remainder 规则。 + +## 容器、自动化与经验 + +界面上方为烧炼槽、下方为燃料槽、右侧为成品槽,各槽遵循物品自身的最大堆叠限制,支持 Shift 转移。界面使用原版熔炉背景与进度图案,当前不附带配方书。 + +| 漏斗位置 | 行为 | +| --- | --- | +| 上方 | 将可用原料放入烧炼槽 | +| 侧面 | 将燃料放入燃料槽 | +| 下方 | 先取成品,再取燃料槽中的铁桶/水桶 | + +也提供 NeoForge 分面物品传输能力。红石比较器统计全部三个槽位的占用比例,空容器为 0,全部装满为 15。 + +经验按成功完成的原版配方累计并保存。漏斗取出成品保留经验;玩家从成品槽拿取或 Shift 取出时释放此前存储的经验并清空记录。破坏窑炉会掉落内容物并释放剩余经验。物品、燃料时间、进度、配方经验记录、名称及锁定条件均持久化。 + +## 方块属性与采集 + +硬度 3.5,爆炸抗性 3.5。完整实心方块,可使生物窒息、传导红石并压断占位的红石线;不能被活塞推拉。音符盒乐器为底鼓,地图颜色暂用石头色。未燃烧时不发光,燃烧时亮度为 13。 + +用木镐或更好的镐可采集窑炉本体,其他工具不能获得本体;容器内物品和存储经验仍按破坏流程释放。原材料可再生,因此可通过合成持续获得。 + +## 命名与锁定 + +铁砧重命名窑炉物品后再放置,界面显示该名称;用正确工具采集后名称保留。也可用指令修改已放置的方块实体(将坐标替换为目标位置): + +```mcfunction +/data merge block ~ ~ ~ {CustomName:"建筑窑炉"} +/data merge block ~ ~ ~ {lock:{items:"minecraft:brick"}} +/data remove block ~ ~ ~ lock +``` + +上例将锁设为手持红砖才能打开;锁使用当前原版 `lock` 物品谓词格式。旁观模式沿用原版访问规则。锁限制玩家开启界面,不阻止漏斗。 + +## 村庄生成 + +原版沙漠、平原、热带草原、积雪平原(两种)和针叶林共六种石匠屋模板,在通过村庄结构池生成时增加一个窑炉。窑炉朝向随房屋旋转,保留原有切石机和石匠职业工作站。只影响后续新生成的建筑,不扫描或修改存档内已有石匠屋。 + +实现按模板 ID 和已核对的局部位置附加结构处理器,不覆盖原版结构池 JSON 或模板文件。如果数据包在目标位置放了不同方块,会跳过该位置,避免覆盖改造后的箱子或工作站。直接 `/place template` 放置原版模板不会触发结构池附加处理。 + +## 验证与代码入口 + +`KilnGameTests` 提供 `kiln`、`kiln_inventory`、`kiln_villages` 三组服务器游戏测试,涵盖配方、100 刻边界、物品筛选、燃料与保存、容器自动化、经验、锁定、比较器、掉落及六种石匠屋四个旋转方向的结构池放置。客户端界面已编译并注册,尚未进行人工游戏内界面检查。 + +主要实现位于 `block/KilnBlock.java`、`block/entity/KilnBlockEntity.java`、`menu/KilnMenu.java`、`client/KilnScreen.java`、`recipe/KilnRecipes.java`、`worldgen/MasonKilnProcessor.java`。数据生成器维护合成配方、战利品表、挖掘标签、模型引用与中英文名称;源码资源包含无需运行数据生成时的备用文件。 diff --git a/docs/MUDDY_PIG.md b/docs/MUDDY_PIG.md new file mode 100644 index 0000000..34e4a6b --- /dev/null +++ b/docs/MUDDY_PIG.md @@ -0,0 +1,57 @@ +# 泥猪 · Muddy Pig + +泥猪加入 HFAS(`ww_hfas`),使用 Minecraft **26.2**、NeoForge **26.2.0.93**、Java **25**。与新物品及结构生成共用同一个模组和 JAR。 + +## 资源和动画 + +- 实体 ID:`ww_hfas:muddy_pig`。 +- 刷怪蛋 ID:`ww_hfas:muddy_pig_spawn_egg`,复用原版猪刷怪蛋图标。 +- 提供的 `pig_muddy.bbmodel`、`pig_muddy_baby.bbmodel` 原样保留在 `src/hfas/resources/assets/ww_hfas/models/entity/pig/`,不会打入 JAR。 +- 成年 64×64、幼年 32×32 PNG 原样保留在 `src/hfas/resources/assets/ww_hfas/textures/entity/pig/`。 +- `MuddyPigModel` 将两个模型转换成 Java 模型层。Blockbench 坐标转换为 `(-x, 24-y, z)`,成年身体旋转后重新设置中心;腿部使用关节轴,头饰与头共用动画。 +- 模型继承原版 `PigModel`,不引入 GeckoLib 或额外动画库;声音和 AI 继承原版 `Pig`。成年和幼年使用各自的模型/贴图,不重复缩放幼年模型。 +- 属性为原版猪的 10 点生命和 0.25 移动速度;食物使用 `minecraft:pig_food` 标签。两只泥猪繁殖出泥猪,普通猪不会与泥猪交配。掉落表引用 `minecraft:entities/pig`。 + +修改 `.bbmodel` 后,需同步调整 `client/MuddyPigModel.java` 中的几何与 UV;游戏不会直接读取 Blockbench 文件。 + +## 自然生成与数据包 + +默认在沼泽和红树林沼泽生成,权重 10、每群 2–4 只。权重是群系生物列表内的相对权重,不代表百分比或每区块固定数量。沿用原版动物亮度大于 8 的条件,以及陆地空间、碰撞、距离和生物数量上限检查。 + +以下源码资源可作为数据包覆盖目标,命名空间都是 `ww_hfas`: + +| 路径(相对 `src/hfas/resources/`) | 用途 | +| --- | --- | +| `data/ww_hfas/neoforge/biome_modifier/add_muddy_pig.json` | `neoforge:add_spawns`,调整权重和每群数量 | +| `data/ww_hfas/tags/worldgen/biome/spawns_muddy_pig.json` | 默认仅包含 `minecraft:swamp`、`minecraft:mangrove_swamp` | +| `data/ww_hfas/tags/block/muddy_pig_spawnable_on.json` | `#minecraft:animals_spawnable_on`、泥巴、沾泥的红树根 | +| `data/ww_hfas/loot_table/entities/muddy_pig.json` | 引用原版猪的掉落表 | + +自定义生成群系时,数据包可用 `replace: true` 覆盖群系标签。新增地面仍须满足原版陆地生成的承载与空间检查。更改群系修改器后重启世界/服务器;自然生成仍受原版规则限制,进入群系不保证立即看到泥猪。 + +## 构建和验证 + +在仓库根目录使用 JDK 25 按顺序执行: + +```powershell +.\gradlew.bat :hfas:runClientData +.\gradlew.bat :hfas:runServerData +.\gradlew.bat build +.\gradlew.bat :hfas:runGameTest +``` + +输出 `modules/hfas/build/libs/ww_hfas-mc26.2-1.0.1.jar`。客户端与服务端都安装匹配版本的 HFAS JAR,并安装远端生物所需的 GeckoLib 5.5.4(26.2 NeoForge)。泥猪本身仍使用原版模型动画代码。不要将测试模组或 `.bbmodel` 作为游戏模组安装。 + +`build` 包含模型单元测试:检查成年/幼年模型边界和九个原始立方体,比较两种年龄的头部/四腿动画与原版猪。统一 GameTest 模组仅用于 `:hfas:runGameTest`,检查实体属性、食物、繁殖、生物蛋、掉落表加载、两个目标群系的实际生成列表,以及草地/泥地/沾泥红树根的生成条件和水/障碍拒绝条件。普通客户端和服务端运行不加载测试模组。 + +手动检查命令: + +```mcfunction +/summon ww_hfas:muddy_pig ~ ~ ~ +/summon ww_hfas:muddy_pig ~ ~ ~ {Age:-24000} +/give @s ww_hfas:muddy_pig_spawn_egg +/locate biome minecraft:swamp +/locate biome minecraft:mangrove_swamp +``` + +观察成年和幼年的纹理、头饰、转头、行走与音效,再到满足亮度和生成空间条件的目标群系观察自然生成。 diff --git a/docs/PROVENANCE.md b/docs/PROVENANCE.md new file mode 100644 index 0000000..bd3b7c5 --- /dev/null +++ b/docs/PROVENANCE.md @@ -0,0 +1,37 @@ +# 项目来源与整理范围 + +本仓库于 2026-10-23 从 WildWindModule 的当前工作区建立独立源码快照,包含已提交代码及当时尚未提交的功能实现。 + +- 上游项目:https://github.com/Polari-Stars-MC/WildWindModule +- 上游分支:`26.2` +- 已合并的上游提交:`26ad2da288d7018a1eb39d5bfbf30b2ad0a1520c` +- 整理前本地基线:`39e327eca50f258c645097332d76319c9553e8d4` +- 新增内容:统一结构生成、材料和生物、沉溺/窒息、熔炼、骷髅与耕地规则、窑炉、杜鹃木功能方块、延展之箭及测试。 + +## 保留内容 + +源码、自动测试及测试夹具、游戏资源、Blockbench 模型源文件、Gradle Wrapper、构建配置、GitHub Actions、功能文档、需求说明与原有许可证。泥猪源模型和七种物品图标已经包含在资源目录,不重复复制外部素材目录。 + +## 排除内容 + +本地 IDE 配置、Gradle 缓存、数据生成缓存、构建输出、运行日志、测试世界、JDK 与辅助工具、安装 ZIP/JAR 以及父目录的飞书抓取临时文件。Gradle Wrapper JAR 是构建所需的例外,予以保留。 + +这是独立的初始快照,不复制原仓库的 `.git` 历史、凭据或远端配置。旧项目保留,可用于查询完整开发历史。 + +## 上游贡献署名 + +整理前可达提交记录中的作者名称如下(保留原有各源文件署名): + +- Assistant +- CarrotLegend +- Codex +- Mon#Landis +- MonLandis +- baka4n +- cuccuc377-dev +- mdjfnfn +- 刘冬煜 + +## 许可证 + +保留 `LICENSE`、`LICENSE_CODE`、`LICENSE_ASSETS`,未变更许可声明。原项目构建元数据中的许可标识差异继续记录在 README 中。 diff --git a/docs/STRUCTURES.md b/docs/STRUCTURES.md new file mode 100644 index 0000000..817b96c --- /dev/null +++ b/docs/STRUCTURES.md @@ -0,0 +1,158 @@ +# 结构生成功能 · 内置于 ww_hfas + +为 Minecraft **26.2 / NeoForge 26.2.0.93 / Java 25** 添加可配置的世界结构。本功能与新物品、泥猪共用 `ww_hfas` 模组和同一个 JAR;`ww_structures` 仅作为兼容旧配置与存档的资源命名空间保留。每个结构由一个 JSON 配置与一个原版压缩 NBT 模板组成,无需编写 Java 或手工创建数据包。 + +## 1. 创建第一个结构 + +1. 安装统一的 `ww_hfas-mc26.2-1.0.1.jar`(更新旧版时移除原来的独立 `ww_structures` JAR),创建或打开世界,使配置目录初始化,然后关闭世界/服务器。 +2. 在实例目录中找到 `config/ww_structures/`。专用服务器使用服务器自己的目录;客户端加入服务器时,以服务器配置为准。 +3. 将 `example_ruins.json.disabled` 复制到 `definitions/example_ruins.json`,把 `enabled` 改为 `true`。 +4. 保留随附的 `templates/example_ruins.nbt`,或换成自己的结构方块模板。 +5. 重启并进入允许的群系,探索新区块。世界必须启用原版的结构生成开关。 +6. 用 `/wwstructure search example_ruins` 搜索生成位置;探索该处后用 `/wwstructure locate example_ruins` 查询已生成记录。 + +目录结构: + +```text +config/ww_structures/ +├── definitions/ +│ ├── example_ruins.json +│ └── forest_house.json +├── templates/ +│ ├── example_ruins.nbt +│ └── houses/forest_house.nbt +└── example_ruins.json.disabled +``` + +只读取 `definitions/` 直属目录下以 `.json` 结尾的文件。模板允许子目录;配置中的路径相对于 `templates/`,使用 `/` 分隔,禁止绝对路径和越界链接。 + +**配置和模板在世界启动时读取。修改后必须完整关闭并重新打开世界/重启服务器,`/reload` 不更新这些结构配置。** 同一实例中的存档共用配置,坐标索引则按存档、维度分别保存。 + +## 2. 配置示例 + +```json +{ + "name": "forest_house", + "enabled": true, + "template": "houses/forest_house.nbt", + "biomes": ["minecraft:plains", "#minecraft:is_forest"], + "placement": { + "spacing": 32, + "separation": 8, + "salt": 18372954, + "frequency": 1.0 + }, + "heightmap": "WORLD_SURFACE_WG", + "y_offset": -1, + "rotation": "random", + "include_entities": false, + "conditions": { + "min_y": 60, + "max_y": 160, + "max_terrain_difference": 6, + "avoid_fluids": true, + "ground_blocks": ["minecraft:stone", "#minecraft:dirt", "minecraft:sand"] + } +} +``` + +### 基本字段 + +| 字段 | 默认值 | 含义 | +| --- | --- | --- | +| `name` | 必填 | 唯一名称,匹配 `[a-z0-9_][a-z0-9_-]{0,63}`。生成 ID 为 `ww_structures:`,也是指令使用的名称 | +| `enabled` | `true` | 是否参与自然生成。`false` 仍加载定义和模板,保留已有结构记录 | +| `template` | 必填 | 相对模板文件名,必须是 `.nbt` | +| `biomes` | 必填、非空 | 群系 ID 或以 `#` 开头的群系标签,列表之间为“或”关系 | +| `heightmap` | `WORLD_SURFACE_WG` | 生成高度基准;也支持 `OCEAN_FLOOR_WG`,适合水底结构 | +| `y_offset` | `0` | 在中心采样点第一格空位高度上加的偏移,范围 `-256..256`;地板在模板第 0 层时可设 `-1` 嵌入地面 | +| `rotation` | `random` | `random`、`none`、`clockwise_90`、`clockwise_180`、`counterclockwise_90` | +| `include_entities` | `false` | 是否生成模板保存的实体;方块实体如箱子不受此开关影响 | + +群系遵循原版结构起点检查,不要求整个建筑覆盖范围都位于同一群系。没有额外维度过滤:在使用相同群系的自定义维度中也可能生成。下界和末地可填写对应的群系 ID;地表高度模式不提供下界洞穴底面专用搜索。 + +### 生成管理:`placement` + +| 字段 | 默认值 | 含义 | +| --- | --- | --- | +| `spacing` | `32` | 原版 random-spread 网格间距,单位为区块(每区块 16 格),范围 `1..4096` | +| `separation` | `8` | 网格内候选点的间隔约束,单位为区块;必须 `0 <= separation < spacing` | +| `salt` | 根据名称计算 | `0..2147483647` 的随机盐。不同结构建议使用不同值,减少候选点重合 | +| `frequency` | `1.0` | 候选点通过概率,必须大于 `0` 且不超过 `1`;`0.25` 表示约四分之一候选点继续检查条件 | + +间距不是从玩家位置量起的固定距离,也不保证每个网格必定生成。群系、高度和地形条件可能排除候选点。同一个世界种子、相同配置下的候选位置具有确定性;改变盐值、间距或条件只影响尚未生成的区块。不同结构之间没有额外的互斥或防重叠规则。 + +### 生成条件:`conditions` + +所有条件按“且”组合。模块在旋转后模板覆盖范围的四角与中心共 **5 个点**采样基础地形,不加载相邻区块。 + +| 字段 | 默认值 | 含义 | +| --- | --- | --- | +| `min_y` / `max_y` | `-64` / `320` | 各采样点的第一格空位高度范围,含边界;不是模板最终最低/最高 Y。取值范围 `-2032..2031`,最小值不得超过最大值 | +| `max_terrain_difference` | `8` | 5 点最高与最低高度差的上限,`0..512`。设 `0` 要求采样点等高 | +| `avoid_fluids` | `true` | 排除采样点地面方块或其上方含流体的位置。水底结构通常应设 `false` | +| `ground_blocks` | `[]` | 地面基础方块 ID/标签的允许列表,空数组表示不限;各采样点均须匹配其中之一 | + +采样发生在原版地表装饰之前。**`ground_blocks` 检查噪声生成器的基础地形,而非最终可见草皮、积雪或树叶;例如主世界常为 `minecraft:stone`。** 只填 `minecraft:grass_block` 可能导致完全不生成。5 点采样不能保证整个底面无坑洞或无水;模块也不会自动铺地基、平整山体或防止与其他结构相交。 + +最终模板底部到顶部必须处于当前维度的建筑高度范围内;不满足条件的候选点会被跳过。 + +## 3. 模板制作 + +使用原版结构方块的保存模式制作结构。保存后的压缩 `.nbt` 文件通常在存档的 `generated/<命名空间>/structure/` 下,将它复制到 `config/ww_structures/templates/`,然后在配置中填写文件名。文件必须包含原版 `size`、`blocks` 和 `palette`/`palettes` 数据。 + +- 最大尺寸为 **64 × 256 × 64**(X × Y × Z),压缩文件最大 16 MiB,解压读取预算为 64 MiB。 +- 支持方块状态和方块实体 NBT。箱子的物品/战利品表按模板保存的数据处理;模块不会自动配置战利品。 +- 模板中的空气会替换覆盖位置的方块;需要保留地形的位置请在保存时使用结构空位方块(structure void)。 +- 结构方块本身会被过滤,DATA 标记没有额外的自定义处理逻辑。拼图方块沿用原版模板片段处理,不提供递归拼接建筑功能。 +- `include_entities=true` 时实体按原版模板生成逻辑放置;请自行控制模板实体数量。 +- 不支持直接加载 `.schem`、`.schematic`、`.litematic` 或 `.snbt`。 +- 引用其他模组方块时,客户端和服务器需安装对应模组;移除依赖可能使模板内容无法正确加载。 + +随附 `example_ruins.nbt` 是 7 × 4 × 7 的苔石基座和四根石砖柱,默认不参与自然生成,可用来验证安装。 + +## 4. 指令与坐标 + +这些命令使用与原版 `/locate` 相同的管理员权限(GAMEMASTER,通常为 OP 等级 2)。支持名称补全,结构名可省略 `ww_structures:`。 + +| 指令 | 作用 | +| --- | --- | +| `/wwstructure list` | 列出已加载的配置结构与当前维度有历史记录的结构名称 | +| `/wwstructure locate forest_house` | 查询当前维度已生成记录中,距离执行位置最近的结构 | +| `/wwstructure search forest_house [radius]` | 使用原版搜索算法查找结构起点,默认半径 `16`,允许 `1..64` | +| `/locate structure ww_structures:forest_house` | 也可以使用原版结构定位指令 | + +`locate` 按 **XZ 平面距离**比较,返回结构包围盒底面中心的 X、Y、Z、维度和距离。它查询已保存的坐标索引,不会为搜索额外生成区块。起始区块完成生成并加载后才入库;仅调用 `search` 得到候选位置不会让它自动成为“已生成记录”。跨区块结构的其他部分会随着相邻区块生成而补全。 + +索引随存档按维度保存,服务器重启后仍保留。玩家拆除建筑不会删除历史记录。旧存档的既有结构会在其起始区块重新加载时补记,模块不扫描整个存档的区域文件,因此不会声称能找到从未记录、从未重新加载的所有旧结构。 + +`search` 可以访问未探索区块的结构起点,返回原版定位位置(其 Y 可能为原版的占位高度),不保证整座建筑已经生成。`radius` 是原版结构候选网格的搜索圈数,**不是方块数或普通区块半径**;大间距和复杂条件可能使搜索明显耗时。先用小半径,未找到不等于整个世界不存在该结构。 + +## 5. 修改、停用与错误排查 + +- 停止继续生成:设置 `enabled=false`,保留 JSON 与模板,重启。已有建筑、结构定义和历史索引会保留;原版搜索可能因不再有放置规则而找不到它,已生成记录仍可用 `locate` 查询。 +- 彻底移除/改名:先备份存档。删除定义或修改 `name` 会改变动态注册表 ID,原版可能丢弃旧区块的对应结构元数据;不会替你拆除已有方块。 +- 修改模板:关闭世界后修改再重启。尚未生成的区块使用新模板;跨区块结构若已生成一部分,应保留旧模板以避免接缝。不要在存档的 `generated/ww_structures/structure/` 下保存同名模板,否则原版存档模板优先级可能覆盖配置模板。 +- 已生成区块不补生成。改变配置后请探索新区块或新建测试世界。 +- JSON 拼写错误、参数类型错误、重名、缺失/越界模板、尺寸不合法会带文件名报错并阻止加载,避免悄悄使用错误规则。未知的群系/方块 ID 或缺失标签由原版数据包注册表加载校验,检查服务器日志。 +- 找不到结构时先核对 `enabled`、世界结构生成开关、群系、Y 范围、地形起伏、流体和基础方块限制。新区块生成仍遵循概率,不能保证刚进世界就遇到。 + +## 6. 开发与验证 + +Windows PowerShell: + +```powershell +.\gradlew.bat :hfas:test +.\gradlew.bat :hfas:runGameTest +.\gradlew.bat :hfas:build +``` + +Linux / macOS 将 `.\gradlew.bat` 换成 `./gradlew`。单元测试覆盖配置边界、路径越界、关闭生成时保留定义、资源输出、模板尺寸与坐标索引序列化。统一 GameTest 模组联合加载新物品、泥猪与结构功能,检查配置数据包加载、原版搜索、实际区块生成、模板方块、片段 NBT 保存恢复和指令执行;不会打包进发行 JAR。 + +GameTest 使用 `modules/hfas/build/runs/hfas/gameTest/` 下的专用临时世界;重复运行会重置该测试世界。测试报告为该目录的 `results.xml`。开发运行首次需要下载游戏资源;Gradle 的资源下载工具还可能自动安装 JDK 21,游戏与编译继续使用 JDK 25。 + +测试模组在专用 GameTest 世界启用原版默认关闭的结构生成,并为超平坦预设添加测试结构集合。这些改动只存在于测试资源中。普通超平坦世界若指定了 `structure_overrides`,也需将自己的结构集合加入允许列表;常规默认地形世界没有这项超平坦限制。 + +若中文 Windows 路径下 JUnit 报 `ClassNotFoundException`,但对应 `.class` 已存在,可临时使用 `.\gradlew.bat :hfas:test "-Dorg.gradle.jvmargs=-Xmx1G -Dfile.encoding=GBK"`,使 Gradle 参数文件与本机 Java 启动器编码一致。源码仍以 UTF-8 编译;此参数无需写入仓库配置。 + +实际代码在 `src/structures/java/`,直接编入 HFAS,由 `StructureModule.register` 初始化:`config` 负责配置和不可变资源快照,`worldgen` 注册结构类型/模板片段及坐标索引,`command` 注册查询指令。配置资源通过强制启用的服务器数据包 `ww_structures/config` 接入原版世界生成。 diff --git a/docs/UPSTREAM_MERGE.md b/docs/UPSTREAM_MERGE.md new file mode 100644 index 0000000..3e171dc --- /dev/null +++ b/docs/UPSTREAM_MERGE.md @@ -0,0 +1,46 @@ +# 2026-10-22 远端 26.2 合并记录 + +- 远端:`Polari-Stars-MC/WildWindModule`,分支 `26.2`。 +- 本次重新 fetch 后确认的提交:`26ad2da288d7018a1eb39d5bfbf30b2ad0a1520c`,提交日期 2026-10-17。 +- 默认分支 `master/NeoForge-26.2` 的 `8592680` 是该提交的祖先,已一并包含。 +- 合并分支:`integrate/upstream-26.2-20261022`。 +- 本地功能恢复点:`backup/pre-upstream-20261022`,提交 `9db6d67`。 +- 模组版本从 `1.0.0` 更新为 `1.0.1`;游戏版本仍为 26.2,NeoForge 保留已验证的 26.2.0.93。 + +## 保留与集成 + +保留本地的可配置结构生成/坐标指令、泥猪、七个普通材料、羊毛拆线、蜘蛛网挣脱、沉溺/窒息、熔炼附魔以及生物适用名单。加入远端泥沼蟹、食人鱼、生物桶、万用蟹钳、延展效果与药水、木材资源及配方。 + +物品与实体统一使用 `registry/ModItems.java`、`registry/ModEntities.java`,入口只注册一次;泥猪属性和生成条件加入现有 `EntitiesHandler`。七个材料仍不具有食物组件。结构仍由唯一 `ww_hfas` 模组入口加载。 + +GeckoLib 5.5.4 是必需的外部依赖。开发运行、GameTest 与安装实例均需加载它;游戏测试的依赖配置已继承主代码依赖。 + +## 合并中修复的问题 + +- 合并双方的语言、Mixin、实体标签和资源生成逻辑。 +- 去除远端创造物品栏中对未注册船/告示牌字段的引用。保留源资源,过滤这些内容及未注册盆栽树苗的不可用配方、掉落表、进度、方块状态定义;相关标签使用可选引用。 +- 恢复方块掉落数据生成,并将三个活板门从双层门掉落逻辑改为自身掉落。 +- 泥猪继续使用源码中的原版猪掉落表引用,避免实体数据生成器漏表或在独立生成阶段无法解析原版引用。 +- 水下免缺氧名单继续与原版呼吸标签相连;泥沼蟹和食人鱼实际注册后加入行为测试。 +- 生成资源优先于源码备用 JSON,避免远端静态资源与生成文件重复导致打包失败;数据生成缓存不打包。 +- CI 加入两类数据生成与统一游戏测试。 + +## 验证与限制 + +验证命令: + +```powershell +.\gradlew.bat :hfas:runClientData +.\gradlew.bat :hfas:runServerData +.\gradlew.bat build :hfas:runGameTest +``` + +测试覆盖包括原有结构/泥猪/玩法,以及泥沼蟹变种、生物桶、食人鱼熔炉配方、延展属性和万用蟹钳内部熔炼工具的真实玩家挖掘流程。未进行长时间人工游玩或完整多人联机验证。资料里的 `direfish` 尚无独立实体实现;制箭系统、船、告示牌和盆栽树苗也仍有未完成内容。 + +本次本地验证结果:两类数据生成、完整构建、11 项 JUnit 单元测试与 11 组 GameTest 全部通过;最终游戏测试日志无 ERROR。已检查 JAR 包含本地功能、远端生物、动画资源和翻译,只有一个 `ww_hfas` 模组入口,未包含测试类、建模源文件或数据生成缓存。 + +此次工作为本地合并,没有向 GitHub 推送。 + +## 合并后的名称调整 + +按用户要求,远端食人鱼现统一显示为「恐鱼(Direfish)」,并同步修改生鱼、熟鱼、刷怪蛋、鱼桶和音效字幕的中英文名称。原有实体、物品、配方及资源 ID 保持兼容:恐鱼实体仍为 `ww_hfas:piranha`,召唤指令为 `/summon ww_hfas:piranha`。此前预留的 `ww_hfas:direfish` 不是独立实体或召唤别名。本文上方的食人鱼名称描述合并时的状态。 diff --git "a/docs/specifications/\345\273\266\345\261\225\344\271\213\347\256\255(Tipped Arrow).md" "b/docs/specifications/\345\273\266\345\261\225\344\271\213\347\256\255(Tipped Arrow).md" new file mode 100644 index 0000000..ac2ad0e --- /dev/null +++ "b/docs/specifications/\345\273\266\345\261\225\344\271\213\347\256\255(Tipped Arrow).md" @@ -0,0 +1,64 @@ +# 延展之箭\(Tipped Arrow\) + +**具有药水效果的箭变种,可以对击中的生物施加延展状态效果\.** + +**物品创造标签页:战斗物品** + +**最大堆叠:64** + +**可再生:是** + +**物品ID:wwhfas:tipped\_arrow** + +**实体ID:wwhfas:arrow** + +**获取** +**———————————————————** + +**交易:** + +**■交易目标:大师级制箭师村民** + +**▪概率:67%概率** + +**▪收购物品:绿宝石x2,箭x5** + +**▪出售物品:延展之箭x5** + +**药水箭的交易选项会从除水瓶、粗制的药水、平凡的药水和浓稠的药水制成的药箭外的所有生存模式可获取的药箭中随机选择,包括所有的改性变种\.其中也包含延展之箭\.** + +**礼物:** + +**制箭师会向带有村庄英雄效果的玩家投掷延展之箭\.** + +**当玩家在村庄获得村庄英雄效果后,制箭师会从箭、抗火之箭、伤害之箭、治疗之箭、隐身之箭、跳跃之箭、夜视之箭、剧毒之箭、再生之箭、迟缓之箭、力量之箭、迅捷之箭、水肺之箭、虚弱之箭、延展之箭中随机选取投掷给予玩家\.其中也包含延展之箭\.** + +**合成:** + +**■B** + +**▪第一行:箭,箭,箭\.** + +**▪第二行:箭,A,箭\.** + +**▪第三行:箭,箭,箭\.** + +**当A为滞留型延展药水\(03:00\)时,B为延展之箭\(00:22\)x8\.** + +**当A为滞留型延展药水\(08:00\)时,B为延展之箭\(01:00\)x8\.** + +**用途** +**———————————————————** + +**具有无限魔咒的弓在使用延展之箭射击时,药箭会被正常消耗\.** + +**行为** +**———————————————————** + +**延展之箭具有与箭相同的行为。** + +**延展之箭在卡进方块30秒后,会集中散发一次药水粒子效果,随后丢失所有的药水效果数据\.此时再次捡起只会获得普通的箭\.** + +**造成状态效果:** + +**延展之箭在命中生物时会对其施加延展状态效果\.** diff --git "a/docs/specifications/\346\202\254\346\214\202\345\274\217\346\235\234\351\271\203\346\234\250\345\221\212\347\244\272\347\211\214(Azalea Hanging Sign).md" "b/docs/specifications/\346\202\254\346\214\202\345\274\217\346\235\234\351\271\203\346\234\250\345\221\212\347\244\272\347\211\214(Azalea Hanging Sign).md" new file mode 100644 index 0000000..3fe3a4e --- /dev/null +++ "b/docs/specifications/\346\202\254\346\214\202\345\274\217\346\235\234\351\271\203\346\234\250\345\221\212\347\244\272\347\211\214(Azalea Hanging Sign).md" @@ -0,0 +1,103 @@ +# 悬挂式杜鹃木告示牌\(Azalea Hanging Sign\) + +**一种可以显示文本的方块\.** + +**合适挖掘工具:斧** + +**硬度:1** + +**爆炸抗性:1** + +**引燃几率:0** + +**烧毁几率:0** + +**熔岩可燃性:是** + +**窒息生物:否** + +**红石导体:否** +**压断红石线:否** + +**固体方块:是** + +**活塞推动行为:不可推动,不可拉动** + +**乐器:贝斯** + +**地图基色:暂未设定** + +**方块ID:azalea\_hanging\_sign** + +**物品创造标签页:功能方块** + +**烧炼时间:800游戏刻\(40秒,4个物品\)** + +**最大堆叠:16** + +**可再生:是** + +**物品ID:azalea\_hanging\_sign** + +**生成** +**———————————————————** +**悬挂式杜鹃木告示牌不会生成在世界中\.** + +**获取** +**———————————————————** + +**合成:** +**■悬挂式杜鹃木告示牌x6:** + +**▪第一行:铁链,空位,铁链** + +**▪第二行:去皮杜鹃原木,去皮杜鹃原木,去皮杜鹃原木** + +**▪第三行:去皮杜鹃原木,去皮杜鹃原木,去皮杜鹃原木** + +**破坏** +**———————————————————** + +**挖掘悬挂式杜鹃木告示牌的合适工具是斧\.** + +**悬挂式杜鹃木告示牌被破坏后会掉落自身\.** + +**用途** +**———————————————————** + +**放置:** + +**悬挂式杜鹃木告示牌必须放置在****中心完整****的方块底面或完整的方块侧面,或者其他悬挂式告示牌的底部或侧面\.** + +**放置在方块侧面的悬挂式杜鹃木告示牌有4个朝向,带有一根横杆,杆与牌之间由两条平行铁链相连\.** + +**放置在方块底面的悬挂式杜鹃木告示牌,其铁链直接固定于该面\.若该面完整,则两条铁链平行,玩家能以4个朝向放置此悬挂式杜鹃木告示牌,若该面仅中心完整,或玩家在潜行状态下放置,则两条铁链相交于面中心,玩家能以16个朝向放置此悬挂式杜鹃木告示牌\.** + +**放置在方块底面的悬挂式杜鹃木告示牌,会在其附着的方块移动或被移除的情况下破坏并掉落自身\.** + +**文本:** + +**悬挂式杜鹃木告示牌的正面和背面都可以显示文本,一个面最多可输入4行文本\.** + +**对有文字的悬挂式杜鹃木告示牌使用****染料****可以改变文本颜色\.对其使用****荧光墨囊****可以提高文本亮度,使用****墨囊****可以移除发亮效果\.** + +**对着悬挂式杜鹃木告示牌使用****蜜脾****可以涂蜡,涂蜡后的悬挂式杜鹃木告示牌不再能被编辑文字、染色或改变发亮效果,若要修改则需破坏后重新放置杜鹃木悬挂式告示牌\.** + +**交互:** + +**放在方块侧面的悬挂式杜鹃木告示牌有****碰撞箱****,但仅包含上方的横杆,放置后可以不依赖于该方块侧面而独立存在\.放在方块底面的悬挂式杜鹃木告示牌没有碰撞箱\.** + +**在活塞无法推动悬挂式杜鹃木告示牌\.悬挂式杜鹃木告示牌被活塞拉动时不会有反应\(除非它附在伸出的活塞头表面\)\.** + +**水****和****熔岩****会绕开悬挂式杜鹃木告示牌流动\.悬挂式杜鹃木告示牌不会被****火****燃尽\.** + +**燃料:** +**悬挂式杜鹃木告示牌可以作为熔炉、高炉和烟熏炉的燃料,每个悬挂式杜鹃木告示牌可以烧炼4个物品\.** + +**安全保护:** + +**悬挂式杜鹃木告示牌属于“仅管理员可设置数据”的方块\.** + +**非管理员玩家对悬挂式杜鹃木告示牌按下Ctrl\+选取方块时不会复制方块实体数据,放置物品栏中已有的带有方块实体数据的悬挂式杜鹃木告示牌也不会将数据实际加载\.** + +**管理员玩家的物品栏中带有方块实体数据的悬挂式杜鹃木告示牌的物品****提示框****中会显示警告信息\.** diff --git "a/docs/specifications/\346\235\234\351\271\203\346\234\250\345\221\212\347\244\272\347\211\214(Azalea Sign).md" "b/docs/specifications/\346\235\234\351\271\203\346\234\250\345\221\212\347\244\272\347\211\214(Azalea Sign).md" new file mode 100644 index 0000000..ac3bafc --- /dev/null +++ "b/docs/specifications/\346\235\234\351\271\203\346\234\250\345\221\212\347\244\272\347\211\214(Azalea Sign).md" @@ -0,0 +1,142 @@ +# 杜鹃木告示牌\(Azalea Sign\) + +**一种可以显示文本的方块\.** + +**合适挖掘工具:斧** + +**硬度:1** + +**爆炸抗性:1** + +**引燃几率:0** + +**烧毁几率:0** + +**熔岩可燃性:是** + +**窒息生物:否** + +**红石导体:否** +**压断红石线:否** + +**固体方块:是** + +**活塞推动行为:不可推动,不可拉动** + +**乐器:贝斯** + +**地图基色:暂未设定** + +**方块ID:azalea\_sign** + +**物品创造标签页:功能方块** + +**烧炼时间:200游戏刻\(10秒,1个物品\)** + +**最大堆叠:16** + +**可再生:是** + +**物品ID:azalea\_sign** + +**生成** +**———————————————————** +**杜鹃木告示牌不会生成在世界中\.** + +**获取** +**———————————————————** + +**合成:** +**■杜鹃木告示牌x3:** + +**▪第一行:杜鹃木板,杜鹃木板,杜鹃木板** + +**▪第二行:杜鹃木板,杜鹃木板,杜鹃木板** + +**▪第三行:空位,木棍,空位** + +**破坏** +**———————————————————** + +**挖掘杜鹃木告示牌的合适工具是斧\.** + +**杜鹃木告示牌被破坏后会掉落自身\.** + +**用途** +**———————————————————** + +**放置:** + +**杜鹃木告示牌必须放置在固体方块(包括栅栏、玻璃、其他告示牌)的顶部或侧面。放置在方块顶部的杜鹃木告示牌会竖立在一根短标杆上,朝向放置此杜鹃木告示牌的玩家,总共可朝向16个不同的方向\.放置在方块侧面的杜鹃木告示牌会附在该方块的侧表面,当该方块侧面不完整时则飘浮在其所在格的侧表面\.** + +**杜鹃木告示牌会在其附着的方块移动或被移除的情况下被破坏并掉落自身\.** + +**文本:** + +**杜鹃木告示牌的正面和背面都可以显示文本,一个面最多可输入4行文本。** + +**放置杜鹃木告示牌时会自动打开杜鹃木告示牌正面的文本编辑界面。如果放置的杜鹃木告示牌已经有文本了\(如通过物品数据添加\),那么杜鹃木告示牌被放置后不会出现文本输入界面\.** + +**输入时可使用鼠标或方向键移动光标位置。点击“完成”或者Esc按钮可以关闭文本输入界面\.** + +**当编辑窗口关闭后,对着已放置的杜鹃木告示牌按下使用键可重新打开编辑窗口,以编辑其正面或背面的文本\.** + +**对着杜鹃木告示牌使用蜜脾可以涂蜡,涂蜡后的杜鹃木告示牌不再能被编辑文字、染色或改变发亮效果,若要修改则需破坏后重新放置杜鹃木告示牌\.** + +**对有文字的杜鹃木告示牌使用染料可以改变文本颜色\.** + +**■杜鹃木告示牌上显示的文字不受周围亮度影响\.对杜鹃木告示牌使用荧光墨囊可以提高文本亮度,使用墨囊可以移除发亮效果\.杜鹃木告示牌文字被增亮后会出现外边框,边框颜色随文字颜色而定:** + +**▪文字颜色为黑色时,十六进制颜色码为\#000000,边框十六进制颜色码为\#F0EBCC,** + +**▪文字颜色为红色时,十六进制颜色码为\#FF0000,边框十六进制颜色码为\#660000,** + +**▪文字颜色为绿色时,十六进制颜色码为\#00FF00,边框十六进制颜色码为\#006600,** + +**▪文字颜色为棕色时,十六进制颜色码为\#8B4513,边框十六进制颜色码为\#371B07,** + +**▪文字颜色为蓝色时,十六进制颜色码为\#0000FF,边框十六进制颜色码为\#000066,** + +**▪文字颜色为紫色时,十六进制颜色码为\#A020F0,边框十六进制颜色码为\#400C60,** + +**▪文字颜色为青色时,十六进制颜色码为\#00FFFF,边框十六进制颜色码为\#006666,** + +**▪文字颜色为浅灰色时,十六进制颜色码为\#D3D3D3,边框十六进制颜色码为\#545454,** + +**▪文字颜色为灰色时,十六进制颜色码为\#808080,边框十六进制颜色码为\#333333,** + +**▪文字颜色为粉色时,十六进制颜色码为\#FF69B4,边框十六进制颜色码为\#662A48,** + +**▪文字颜色为黄绿色时,十六进制颜色码为\#BFFF00,边框十六进制颜色码为\#4C6600,** + +**▪文字颜色为黄色时,十六进制颜色码为\#FFFF00,边框十六进制颜色码为\#666600,** + +**▪文字颜色为浅蓝色时,十六进制颜色码为\#9AC0CD,边框十六进制颜色码为\#3D4C52,** + +**▪文字颜色为品红色时,十六进制颜色码为\#FF00FF,边框十六进制颜色码为\#660066,** + +**▪文字颜色为橙色时,十六进制颜色码为\#FF681F,边框十六进制颜色码为\#66290C,** + +**▪文字颜色为白色时,十六进制颜色码为\#FFFFFF,边框十六进制颜色码为\#666666,** + +**杜鹃木告示牌文本可以包含****格式化代码****\.杜鹃木告示牌文本可使用****文本组件****\.** + +**如果有其他玩家正在编辑杜鹃木告示牌内容,则不能与该杜鹃木告示牌进行任何交互\.** + +**交互:** + +**杜鹃木告示牌没有碰撞箱,因此****实体****可以穿过杜鹃木告示牌\.其他方块\(包括其他告示牌\)可以被放在杜鹃木告示牌的任何一角\.** + +**活塞无法推动杜鹃木告示牌\.杜鹃木告示牌被活塞拉动时不会有反应\(除非杜鹃木告示牌附在伸出的活塞头表面\)\.** + +**水****和****熔岩****会绕开杜鹃木告示牌流动\.杜鹃木告示牌不会被****火****燃尽\.** + +**燃料:** +**杜鹃木告示牌可以作为熔炉、高炉和烟熏炉的燃料,每个杜鹃木告示牌可以烧炼1个物品\.** + +**安全保护:** +**杜鹃木告示牌属于“仅管理员可设置数据”的方块\.** + +**非管理员玩家对杜鹃木告示牌按下Ctrl\+选取方块时不会复制方块实体数据,放置物品栏中已有的带有方块实体数据的杜鹃木告示牌也不会将数据实际加载\.** + +**管理员玩家的物品栏中如果携带着有方块实体数据的杜鹃木告示牌,物品****提示框****中会显示警告信息\.** diff --git "a/docs/specifications/\346\235\234\351\271\203\346\234\250\345\261\225\347\244\272\346\236\266(Azalea Shelf).md" "b/docs/specifications/\346\235\234\351\271\203\346\234\250\345\261\225\347\244\272\346\236\266(Azalea Shelf).md" new file mode 100644 index 0000000..35a9ab5 --- /dev/null +++ "b/docs/specifications/\346\235\234\351\271\203\346\234\250\345\261\225\347\244\272\346\236\266(Azalea Shelf).md" @@ -0,0 +1,116 @@ +# 杜鹃木展示架\(Azalea Shelf\) + +**一种可用于存放和展示物品的功能方块\.** + +**合适挖掘工具:斧** + +**硬度:2** + +**爆炸抗性:3** + +**引燃几率:30** + +**烧毁几率:20** + +**熔岩可燃性:是** + +**窒息生物:否** + +**红石导体:否** +**压断红石线:否** + +**固体方块:是** + +**活塞推动行为:不可推动,不可拉动** + +**乐器:贝斯** + +**地图基色:暂未设定** + +**方块ID:azalea\_shelf** + +**物品创造标签页:功能方块** + +**烧炼时间:300游戏刻\(15秒,1\.5个物品\)** + +**最大堆叠:64** + +**可再生:是** + +**物品ID:azalea\_shelf** + +**生成** +**———————————————————** +**杜鹃木展示架不会生成在世界中\.** + +**获取** +**———————————————————** + +**合成:** +**■杜鹃木展示架x6:** + +**▪第一行:去皮杜鹃原木,去皮杜鹃原木,去皮杜鹃原木** + +**▪第二行:空位,空位,空位** + +**▪第三行:去皮杜鹃原木,去皮杜鹃原木,去皮杜鹃原木** + +**破坏** +**———————————————————** + +**挖掘杜鹃木展示架的合适工具是斧\.** + +**杜鹃木展示架被破坏后会掉落自身和内容物\.** + +**用途** +**———————————————————** + +**存放物品:** + +**杜鹃木展示架正面有3个槽位,可存放最多3组物品\.与任意槽位交互时,玩家的主手物品会与所交互槽位的物品交换\.** + +**类似于物品展示框,杜鹃木展示架会在正面展示其包含的所有物品\.但与之不同的是其内部物品不可旋转\.** + +**方块实体数据align\_items\_to\_bottom控制了杜鹃木展示架槽位中展示物品的位置\.其值为false\(默认值\)时,物品位置居中;其值为true时,物品置于底部隔板上方\.无法通过命令以外的其他方式修改其值\.** + +**激活:** + +**■杜鹃木展示架可以被红石信号激活,此时其正面纹理会随之改变,槽位之间的“隔板”会消失\.激活的杜鹃木展示架可以与其他激活的展示架相互连接,最多可以连接3个,相互连接的展示架连接处的“隔板”会消失\.此时,杜鹃木展示架的行为如下:** + +**▪与单个杜鹃木展示架交互时,其包含的所有物品会与玩家快捷栏右起3个物品交换\.** + +**▪与两个相连接的展示架交互时,其包含的所有物品会与玩家快捷栏右起6个物品交换\.** + +**▪与三个相连接的展示架交互时,其包含的所有物品会与玩家快捷栏的所有物品交换\.** + +**红石比较器:** + +**■红石比较器可以从背面检测展示架内的物品排布,并输出相应强度的红石信号,范围为0–7\.计算方式类似于二进制:** + +**▪所有槽位均无物品时,信号强度为0\.** + +**▪左、中、右槽位有物品时,信号强度分别增加1、2、4\.** + +**■若以○表示该槽位有物品,×表示该槽位无物品:** + +**▪槽位顺序为×××时,信号强度增加0,** + +**▪槽位顺序为○××时,信号强度增加1,** + +**▪槽位顺序为×○×时,信号强度增加2,** + +**▪槽位顺序为○○×时,信号强度增加3,** + +**▪槽位顺序为××○时,信号强度增加4,** + +**▪槽位顺序为○×○时,信号强度增加5,** + +**▪槽位顺序为×○○时,信号强度增加6,** + +**▪槽位顺序为○○○时,信号强度增加7,** + +**容器交互:** +**漏斗****可以为杜鹃木展示架放入或取出物品,****投掷器****和****合成器****可以为杜鹃木展示架放入物品,****漏斗矿车****可以为杜鹃木展示架取出物品\.无论位于杜鹃木展示架的哪一侧,它们总是会与满足条件的左起第一个槽位交互,即以从左到右的顺序放入或取出物品\.多个展示架相连接时,这些方块只会与其直接连接的展示架交互,而无法与连接的其他展示架交互。** + +**燃料:** +**杜鹃木展示架可以作为熔炉、高炉和烟熏炉的燃料,每个杜鹃木展示架可以烧炼1\.5个物品\.** diff --git "a/docs/specifications/\347\252\221\347\202\211(Kiln).md" "b/docs/specifications/\347\252\221\347\202\211(Kiln).md" new file mode 100644 index 0000000..0e5c604 --- /dev/null +++ "b/docs/specifications/\347\252\221\347\202\211(Kiln).md" @@ -0,0 +1,90 @@ +# 窑炉\(Kiln\) + +**专用于烧炼各类建筑材料和染料等杂物的****熔炉****变种\.** + +**合适挖掘工具:镐** + +**硬度:3\.5** + +**爆炸抗性:3\.5** + +**窒息生物:是** + +**红石导体:是** +**压断红石线:是** + +**固体方块:是** + +**活塞推动行为:不可推动,不可拉动** + +**乐器:底鼓** + +**地图基色:暂未设定** + +**亮度:13\(燃料燃烧时\)** + +**方块ID:kiln** + +**物品创造标签页:功能方块** + +**最大堆叠:64** + +**可再生:是** + +**物品ID:kiln** + +**生成** +**———————————————————** +**自然生成:** + +**窑炉会生成在****村庄****的石匠屋中\.** + +**获取** +**———————————————————** + +**合成:** +**■窑炉:** + +**▪第一行:空位,红砖,空位** + +**▪第二行:红砖,熔炉,红砖** + +**▪第三行:泥坯,泥坯,泥坯** + +**破坏** +**———————————————————** + +**挖掘窑炉的合适工具是镐。窑炉需要木镐或品质更好的镐来挖掘,否则挖掘时间将延长且不会掉落\.** + +**窑炉被破坏后会掉落自身、内容物和储存的经验值\.** + +**用途** +**———————————————————** + +**窑炉不能被****活塞****推动\.** + +**烧炼:** +**窑炉只能****烧炼****矿物、金属工具、武器和盔甲以外的物品\.速度为每100****游戏刻****\(5秒\)烧炼一个物品,即每分钟烧炼12个物品,是****熔炉****的2倍\.** + +**使用窑炉可以打开它的界面\.下方的槽位为"燃料槽",用于放置燃料\(最多1组\),上方的槽位为“烧炼槽”,用于放置烧炼物\(最多1组\),右侧的槽位为"成品槽",烧炼成品会存放于此\(最多1组\)\.** + +**连接到窑炉上面的****漏斗****会向烧炼槽中添加烧炼物,连接到窑炉侧面的漏斗会向燃料槽中添加燃料,窑炉下面的漏斗会取走成品槽中的成品和燃料槽中的****铁桶****,如果铁桶与成品槽的成品同时存在会优先吸取成品\.** + +**烧炼产生的经验会存储在窑炉中,当玩家取出成品槽中的成品或窑炉被破坏时一并给予玩家\.** + +**燃烧中的窑炉会生成烟雾和火焰****粒子****\.** + +**红石比较器:** +**红石比较器****可检测窑炉的内容物占空比,烧炼槽、燃料槽和成品槽都会被统计\.** + +**光源:** + +**燃烧中的窑炉会发出****亮度****等级为13级的光\.** + +**自定义名称:** + +**窑炉界面的标题默认为“窑炉”,可以在未放置之前使用铁砧重命名来进行更改,也可以通过使用****`/`****`data`****命令修改窑炉的****`CustomName`****标签进行更改\.** + +**锁定:** + +**窑炉可以被****`lock`****标签上锁\.如果窑炉的该标签不是空白的,那么这个窑炉必须使用符合该标签表示的物品谓词的物品打开\.** diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..814ac06 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,37 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +org.gradle.jvmargs=-Xmx1G +org.gradle.daemon=true +org.gradle.parallel=true +org.gradle.caching=true +org.gradle.configuration-cache=true + +# Environment Properties +# You can find the latest versions here: https://projects.neoforged.net/neoforged/neoforge +# The Minecraft version must agree with the Neo version to get a valid artifact +minecraftVersion=26.2 +# The Minecraft version range can use any release version of Minecraft as bounds. +# Snapshots, pre-releases, and release candidates are not guaranteed to sort properly +# as they do not follow standard versioning conventions. +minecraftVersionRange=[26.2] +# The Neo version must agree with the Minecraft version to get a valid artifact +neoVersion=26.2.0.93 + +## Mod Properties + +# The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} +# Must match the String constant located in the main mod class annotated with @Mod. +modId=wild_wind +# The human-readable display name for the mod. +modName=Wild Wind +# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. +modLicense=All Rights Reserved +# The mod version. See https://semver.org/ +modVersion=1.0.1 +# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. +# This should match the base package used for the mod sources. +# See https://maven.apache.org/guides/mini/guide-naming-conventions.html +modGroupId=org.polaris2023.wildwind + +## Dependencies + +geocklibVersion = 5.5.4 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1b33c55baabb587c669f562ae36f953de2481846 GIT binary patch literal 43764 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH="\\\"\\\"" + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..db3a6ac --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH= + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/modules/hfas/build.gradle.kts b/modules/hfas/build.gradle.kts new file mode 100644 index 0000000..8c3204c --- /dev/null +++ b/modules/hfas/build.gradle.kts @@ -0,0 +1,76 @@ +// Structure generation is an internal feature of HFAS and shares its mod entry point. +sourceSets.main { + java.srcDir(rootProject.file("src/structures/java")) + resources.srcDir(rootProject.file("src/structures/resources")) +} + +// Generated files take precedence over checked-in fallbacks for builds without datagen. +tasks.processResources { + filesMatching(listOf("assets/**/*.json", "data/**/*.json")) { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + } + // Keep filtering unfinished boats, non-azalea signs and potted saplings. + // Keep the source assets, but do not load recipes/loot/advancements for absent content. + listOf("azalea", "blaze", "soul").forEach { wood -> + val unfinished = if (wood == "azalea") listOf("boat", "chest_boat") + else listOf("boat", "chest_boat", "sign", "hanging_sign", "wall_sign", "wall_hanging_sign") + unfinished.forEach { kind -> + exclude("data/ww_hfas/recipe/${wood}_${kind}.json") + exclude("data/ww_hfas/loot_table/blocks/${wood}_${kind}.json") + exclude("data/ww_hfas/advancement/recipes/**/${wood}_${kind}.json") + exclude("assets/ww_hfas/blockstates/${wood}_${kind}.json") + } + exclude("data/ww_hfas/loot_table/blocks/potted_${wood}_sapling.json") + exclude("assets/ww_hfas/blockstates/potted_${wood}_sapling.json") + } +} + +sourceSets.test { + java.srcDir(rootProject.file("src/hfas/test")) + java.srcDir(rootProject.file("src/structures/test")) +} +repositories { mavenCentral() } +dependencies { + testImplementation(platform("org.junit:junit-bom:5.13.4")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} +tasks.test { + useJUnitPlatform() + val runtimeDirectory = layout.buildDirectory.dir("test-runtime") + workingDir(runtimeDirectory) + doFirst { runtimeDirectory.get().asFile.mkdirs() } +} +val gameTest by sourceSets.creating { + java.srcDir(rootProject.file("src/hfas/gametest/java")) + java.srcDir(rootProject.file("src/structures/gametest/java")) + resources.srcDir(rootProject.file("src/hfas/gametest/resources")) + resources.srcDir(rootProject.file("src/structures/gametest/resources")) + compileClasspath += sourceSets.main.get().output + runtimeClasspath += sourceSets.main.get().output +} +configurations[gameTest.implementationConfigurationName].extendsFrom(configurations.implementation.get()) +configurations[gameTest.runtimeOnlyConfigurationName].extendsFrom(configurations.runtimeOnly.get()) +val prepareGameTest by tasks.registering(Sync::class) { + from(rootProject.file("src/hfas/gametest/config")) + from(rootProject.file("src/structures/gametest/config")) + from(rootProject.file("src/structures/resources/examples/example_ruins.nbt")) { + into("ww_structures/templates") + } + into(layout.buildDirectory.dir("runs/hfas/gameTest/config")) +} +neoForge { + addModdingDependenciesTo(sourceSets.test.get()) + addModdingDependenciesTo(gameTest) + val mainMod = mods.getByName("ww_hfas") + val testMod = mods.create("ww_hfas_tests") { sourceSet(gameTest) } + runs.configureEach { loadedMods.set(setOf(mainMod)) } + runs.register("gameTest") { + type = "gameTestServer" + sourceSet = gameTest + loadedMods.set(setOf(mainMod, testMod)) + gameDirectory = layout.buildDirectory.dir("runs/hfas/gameTest") + programArguments.addAll("--tests", "ww_hfas_tests:*", "--report", "results.xml") + taskBefore(prepareGameTest) + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..247830d --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,21 @@ +pluginManagement { + repositories { + gradlePluginPortal() + } +} + +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version("1.0.0") +} + +val let = listOf("hfas") +let.forEach { + include(it) + + var f = file("modules/$it") + f.mkdirs() + project(":$it").projectDir = f +} + + +rootProject.name = "ww" diff --git a/src/hfas/gametest/config/ww_hfas-common.toml b/src/hfas/gametest/config/ww_hfas-common.toml new file mode 100644 index 0000000..5d8abe1 --- /dev/null +++ b/src/hfas/gametest/config/ww_hfas-common.toml @@ -0,0 +1,2 @@ +[worldgen] +replaceVanillaFletchingTable = false diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java new file mode 100644 index 0000000..9009c98 --- /dev/null +++ b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java @@ -0,0 +1,243 @@ +package org.polaris2023.wildwind.hfas.test; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.ShelfBlock; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.ShelfBlockEntity; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.entity.SignText; +import net.minecraft.world.level.block.entity.HopperBlockEntity; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.entity.ReachArrow; +import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.hfas.registry.ModItems; +import org.polaris2023.wildwind.hfas.registry.ModMobEffects; +import org.polaris2023.wildwind.hfas.registry.ModPotions; + +final class AzaleaAndArrowGameTests { + private static void check(GameTestHelper h, boolean value, String message) { + h.assertTrue(value, Component.literal(message)); + } + + static void signs(GameTestHelper h) { + var level = h.getLevel(); + var blocks = List.of(ModBlocks.AZALEA_SIGN.get(), ModBlocks.AZALEA_WALL_SIGN.get(), + ModBlocks.AZALEA_HANGING_SIGN.get(), ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); + int x = 1; + for (var block : blocks) { + var rel = new BlockPos(x++, 2, 2); + var pos = h.absolutePos(rel); + var state = block.defaultBlockState(); + level.setBlock(pos, state, 2); + check(h, level.getBlockEntity(pos) instanceof SignBlockEntity, "All sign variants must create native sign entities"); + var sign = (SignBlockEntity) level.getBlockEntity(pos); + check(h, sign.getType().onlyOpCanSetNbt(), "Sign custom data must retain native administrator-only protection"); + check(h, sign.getType().isValid(state), "Native sign type must accept azalea blocks"); + sign.setText(new SignText().setMessage(0, Component.literal("Front")).setColor(DyeColor.RED).setHasGlowingText(true), true); + sign.setText(new SignText().setMessage(3, Component.literal("Back")), false); + sign.setWaxed(true); + var saved = sign.saveWithFullMetadata(level.registryAccess()); + var loaded = (SignBlockEntity) BlockEntity.loadStatic(pos, state, saved, level.registryAccess()); + check(h, loaded != null && loaded.isWaxed() && loaded.getFrontText().hasGlowingText() + && loaded.getFrontText().getColor() == DyeColor.RED + && loaded.getBackText().getMessage(3, false).getString().equals("Back"), "Both faces, dye, glow and wax must survive saving"); + check(h, state.getPistonPushReaction() == net.minecraft.world.level.material.PushReaction.BLOCK, "Signs must block pistons"); + check(h, state.getDestroySpeed(level, pos) == 1 && block.getExplosionResistance() == 1, "Sign hardness/resistance must be one"); + check(h, state.getFlammability(level, pos, Direction.UP) == 0, "Signs must not burn in fire"); + check(h, !Block.getDrops(state, level, pos, sign).isEmpty(), "Every sign variant must drop its item"); + check(h, state.hasProperty(BlockStateProperties.WATERLOGGED), "Signs must support waterlogging"); + } + check(h, ModBlocks.AZALEA_SIGN.get().asItem().getDefaultInstance().getMaxStackSize() == 16 + && ModBlocks.AZALEA_HANGING_SIGN.get().asItem().getDefaultInstance().getMaxStackSize() == 16, "Signs stack to 16"); + check(h, new ItemStack(ModBlocks.AZALEA_SIGN.get()).getBurnTime(null, level.fuelValues()) == 200 + && new ItemStack(ModBlocks.AZALEA_HANGING_SIGN.get()).getBurnTime(null, level.fuelValues()) == 800, "Sign fuel values must match specification"); + h.succeed(); + } + + static void shelf(GameTestHelper h) { + var level = h.getLevel(); + var rel = new BlockPos(3, 2, 3); + var pos = h.absolutePos(rel); + var state = ModBlocks.AZALEA_SHELF.get().defaultBlockState().setValue(ShelfBlock.FACING, Direction.NORTH); + level.setBlock(pos, state, 3); + var shelf = (ShelfBlockEntity) level.getBlockEntity(pos); + check(h, shelf != null && shelf.getType().isValid(state), "Shelf must use a valid native container"); + check(h, !shelf.getAlignItemsToBottom(), "Shelf display alignment must default to centered"); + for (int mask = 0; mask < 8; mask++) { + for (int slot = 0; slot < 3; slot++) shelf.setItem(slot, (mask & 1 << slot) == 0 ? ItemStack.EMPTY : new ItemStack(Items.DIAMOND, 64)); + check(h, state.getAnalogOutputSignal(level, pos, Direction.SOUTH) == mask, "Shelf comparator must encode all eight occupancy patterns"); + check(h, state.getAnalogOutputSignal(level, pos, Direction.NORTH) == 0, "Comparator only reads from the rear"); + } + shelf.clearContent(); + var player = h.makeMockPlayer(GameType.SURVIVAL); + player.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(Items.EMERALD, 32)); + h.useBlock(rel, player, new BlockHitResult(new Vec3(pos.getX() + 0.8, pos.getY() + 0.5, pos.getZ()), Direction.NORTH, pos, false)); + check(h, shelf.getItem(0).is(Items.EMERALD) && shelf.getItem(0).getCount() == 32 && player.getMainHandItem().isEmpty(), "Clicking left slot must swap the entire main-hand stack"); + player.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(Items.DIAMOND, 7)); + h.useBlock(rel, player, new BlockHitResult(new Vec3(pos.getX() + 0.8, pos.getY() + 0.5, pos.getZ()), Direction.NORTH, pos, false)); + check(h, shelf.getItem(0).is(Items.DIAMOND) && player.getMainHandItem().is(Items.EMERALD), "Occupied slot must return its previous stack"); + var saved = shelf.saveWithFullMetadata(level.registryAccess()); + saved.putBoolean("align_items_to_bottom", true); + var loaded = (ShelfBlockEntity) BlockEntity.loadStatic(pos, state, saved, level.registryAccess()); + check(h, loaded != null && loaded.getAlignItemsToBottom() && loaded.getItem(0).getCount() == 7, "Alignment and contents must persist"); + h.setBlock(3, 1, 3, Blocks.HOPPER); + var hopper = (HopperBlockEntity) level.getBlockEntity(pos.below()); + check(h, HopperBlockEntity.suckInItems(level, hopper) && hopper.getItem(0).is(Items.DIAMOND), "Hopper must extract leftmost occupied slot"); + check(h, level.getCapability(net.neoforged.neoforge.capabilities.Capabilities.Item.BLOCK, pos, Direction.UP) != null, "Shelf must expose native item capability"); + check(h, state.getFlammability(level, pos, Direction.UP) == 20 && state.getFireSpreadSpeed(level, pos, Direction.UP) == 30, "Shelf fire values must be 30/20"); + check(h, new ItemStack(ModBlocks.AZALEA_SHELF.get()).getBurnTime(null, level.fuelValues()) == 300, "Shelf fuel value must be 300"); + h.succeed(); + } + + static void shelfChain(GameTestHelper h) { + var level = h.getLevel(); + for (int count = 1; count <= 3; count++) { + for (int x = 1; x <= 4; x++) { + h.setBlock(x, 2, 3, Blocks.AIR); + h.setBlock(x, 1, 3, Blocks.AIR); + } + for (int x = 1; x <= count; x++) { + h.setBlock(x, 1, 3, Blocks.REDSTONE_BLOCK); + h.setBlock(x, 2, 3, ModBlocks.AZALEA_SHELF.get().defaultBlockState() + .setValue(ShelfBlock.FACING, Direction.NORTH).setValue(ShelfBlock.POWERED, true)); + } + var rel = new BlockPos(1, 2, 3); + var pos = h.absolutePos(rel); + check(h, ModBlocks.AZALEA_SHELF.get().getAllBlocksConnectedTo(level, pos).size() == count, "Powered shelf chain must connect up to three shelves"); + var player = h.makeMockPlayer(GameType.SURVIVAL); + for (int slot = 0; slot < 9; slot++) player.getInventory().setItem(slot, new ItemStack(Items.DIAMOND, slot + 1)); + h.useBlock(rel, player, new BlockHitResult(new Vec3(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ()), Direction.NORTH, pos, false)); + for (int slot = 0; slot < 9; slot++) check(h, player.getInventory().getItem(slot).isEmpty() == (slot >= 9 - 3 * count), "Powered shelves must swap rightmost 3/6/9 hotbar slots"); + h.useBlock(rel, player, new BlockHitResult(new Vec3(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ()), Direction.NORTH, pos, false)); + for (int slot = 0; slot < 9; slot++) check(h, player.getInventory().getItem(slot).getCount() == slot + 1, "Second swap must restore exact hotbar stacks"); + } + h.succeed(); + } + + static void arrows(GameTestHelper h) { + var level = h.getLevel(); + var owner = h.makeMockPlayer(GameType.SURVIVAL); + var target = EntityTypes.COW.create(level, EntitySpawnReason.COMMAND); + for (var potion : List.of(ModPotions.REACH, ModPotions.LONG_REACH)) { + var slots = new ArrayList(); + for (int i = 0; i < 9; i++) slots.add(new ItemStack(Items.ARROW)); + slots.set(4, PotionContents.createItemStack(Items.LINGERING_POTION, potion)); + var input = CraftingInput.of(3, 3, slots); + var recipe = level.recipeAccess().getRecipeFor(RecipeType.CRAFTING, input, level).orElseThrow(); + var result = recipe.value().assemble(input); + check(h, result.is(ModItems.TIPPED_ARROW.get()) && result.getCount() == 8, "Vanilla surround recipe must produce eight mod Reach arrows"); + check(h, result.is(ItemTags.ARROWS), "Reach arrows must be valid bow and crossbow ammunition"); + var arrow = ModItems.TIPPED_ARROW.get().createArrow(level, result, owner, new ItemStack(Items.BOW)); + check(h, arrow.getType() == ModEntities.REACH_ARROW.get() && arrow.getOwner() == owner, "Bow must spawn the custom arrow type with owner"); + check(h, !ModItems.TIPPED_ARROW.get().isInfinite(result, new ItemStack(Items.BOW), owner), "Infinity must not save potion arrows"); + var hitArrow = new TestArrow(level, h.absoluteVec(new Vec3(2.5, 2.5, 2.5)), result); + target.removeAllEffects(); + hitArrow.hit(target); + int expected = potion == ModPotions.REACH ? 450 : 1200; + check(h, target.getEffect(ModMobEffects.REACH).getDuration() == expected, "Arrow must apply exactly 450/1200 ticks of Reach"); + h.setBlock(2, 2, 2, Blocks.STONE); + for (int tick = 0; tick < 599; tick++) hitArrow.tick(); + check(h, hitArrow.getPickupItemStackOrigin().is(ModItems.TIPPED_ARROW.get()), "Potion must remain before 600 ground ticks"); + hitArrow.tick(); + check(h, hitArrow.getPickupItemStackOrigin().is(Items.ARROW) && hitArrow.getColor() == -1, "At 600 ground ticks pickup must become an ordinary arrow"); + } + check(h, DispenserBlock.DISPENSER_REGISTRY.containsKey(ModItems.TIPPED_ARROW.get()), "Dispenser projectile behavior must be registered"); + var dispensed = ModItems.TIPPED_ARROW.get().asProjectile(level, Vec3.ZERO, new ItemStack(ModItems.TIPPED_ARROW.get()), Direction.NORTH); + check(h, dispensed.getType() == ModEntities.REACH_ARROW.get() && ((AbstractArrow) dispensed).pickup == AbstractArrow.Pickup.ALLOWED, "Dispensed arrows must be recoverable custom arrows"); + var poison = PotionContents.createItemStack(Items.TIPPED_ARROW, Potions.POISON); + check(h, org.polaris2023.wildwind.hfas.arrow.ReachArrows.convert(poison) == poison, "Other potion arrows must remain vanilla"); + h.succeed(); + } + + static void acquisition(GameTestHelper h) { + var level = h.getLevel(); + var villager = EntityTypes.VILLAGER.create(level, EntitySpawnReason.COMMAND); + var tag = TagKey.create(Registries.POTION, Identifier.withDefaultNamespace("tradeable")); + var potions = level.registryAccess().lookupOrThrow(Registries.POTION).getOrThrow(tag); + check(h, potions.contains(ModPotions.REACH) && potions.contains(ModPotions.LONG_REACH), "Both Reach variants must join the survival potion trade pool"); + var params = new LootParams.Builder(level).withParameter(LootContextParams.ORIGIN, Vec3.ZERO) + .withParameter(LootContextParams.THIS_ENTITY, villager) + .withParameter(LootContextParams.ADDITIONAL_COST_COMPONENT_ALLOWED, net.minecraft.util.Unit.INSTANCE) + .create(LootContextParamSets.VILLAGER_TRADE); + var context = new LootContext.Builder(params).withOptionalRandomSeed(271828L).create(java.util.Optional.empty()); + var trades = level.registryAccess().lookupOrThrow(Registries.VILLAGER_TRADE); + var trade = trades.getOrThrow(ResourceKey.create(Registries.VILLAGER_TRADE, + Identifier.withDefaultNamespace("fletcher/5/arrow_and_emerald_tipped_arrow"))).value(); + var set = level.registryAccess().lookupOrThrow(Registries.TRADE_SET).getOrThrow(ResourceKey.create(Registries.TRADE_SET, + Identifier.withDefaultNamespace("fletcher/level_5"))).value(); + check(h, set.calculateNumberOfTrades(context) == 2 && set.getTrades().size() == 3 && !set.allowDuplicates(), + "Master fletcher must keep vanilla two-of-three trade selection"); + boolean normal = false, longReach = false, other = false; + for (int i = 0; i < 2048; i++) { + var offer = trade.getOffer(context); + check(h, offer != null && offer.getBaseCostA().is(Items.EMERALD) && offer.getBaseCostA().getCount() == 2 + && offer.getCostB().is(Items.ARROW) && offer.getCostB().getCount() == 5 && offer.getResult().getCount() == 5, + "Fletcher potion-arrow cost must remain two emeralds plus five arrows for five arrows"); + var result = offer.getResult(); + if (result.is(ModItems.TIPPED_ARROW.get())) { + var potion = result.get(DataComponents.POTION_CONTENTS).potion().orElseThrow(); + normal |= potion.is(ModPotions.REACH.getKey()); + longReach |= potion.is(ModPotions.LONG_REACH.getKey()); + } else other |= result.is(Items.TIPPED_ARROW); + } + check(h, normal && longReach && other, "Random trade must offer both custom Reach arrows and vanilla alternatives"); + var gift = level.getServer().reloadableRegistries().getLootTable(ResourceKey.create(Registries.LOOT_TABLE, + Identifier.withDefaultNamespace("gameplay/hero_of_the_village/fletcher_gift"))); + var giftParams = new LootParams.Builder(level).withParameter(LootContextParams.ORIGIN, Vec3.ZERO) + .withParameter(LootContextParams.THIS_ENTITY, villager).create(LootContextParamSets.GIFT); + var random = net.minecraft.util.RandomSource.create(314159L); + boolean reachGift = false, vanillaGift = false; + for (int i = 0; i < 1024; i++) { + var results = gift.getRandomItems(giftParams, random); + check(h, results.size() <= 1, "Reach gift must join the existing random choice, not add an extra gift"); + for (var result : results) { + reachGift |= result.is(ModItems.TIPPED_ARROW.get()); + vanillaGift |= result.is(Items.ARROW) || result.is(Items.TIPPED_ARROW); + } + } + check(h, reachGift && vanillaGift, "Hero gifts must include Reach and preserve vanilla choices"); + h.succeed(); + } + + private static class TestArrow extends ReachArrow { + TestArrow(Level level, Vec3 pos, ItemStack stack) { super(level, pos.x, pos.y, pos.z, stack, null); } + void hit(LivingEntity target) { doPostHurtEffects(target); } + } +} diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java new file mode 100644 index 0000000..aadd37d --- /dev/null +++ b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java @@ -0,0 +1,218 @@ +package org.polaris2023.wildwind.hfas.test; + +import java.util.List; +import java.util.Set; +import java.util.HashSet; +import net.minecraft.tags.TagKey; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.EntityTypeTags; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.CommonHooks; +import org.polaris2023.wildwind.hfas.effect.FluidEffects; +import org.polaris2023.wildwind.hfas.effect.ModEffects; +import org.polaris2023.wildwind.hfas.entity.ModEntityTypeTags; + +final class FluidEntityRulesGameTests { + private FluidEntityRulesGameTests() {} + + private static void check(GameTestHelper h, boolean condition, String message) { + h.assertTrue(condition, Component.literal(message)); + } + + private static LivingEntity submerged(GameTestHelper h, EntityType type) { + var entity = type == EntityTypes.PLAYER ? h.makeMockServerPlayer(GameType.SURVIVAL) + : (LivingEntity) type.create(h.getLevel(), EntitySpawnReason.COMMAND); + check(h, entity != null, "Must create test entity " + type); + if (entity instanceof ServerPlayer player) { + var connection = new net.minecraft.network.Connection(net.minecraft.network.protocol.PacketFlow.SERVERBOUND); + new io.netty.channel.embedded.EmbeddedChannel(connection); + h.getLevel().getServer().getPlayerList().placeNewPlayer(connection, player, + net.minecraft.server.network.CommonListenerCookie.createInitial(player.getGameProfile(), false)); + } + if (entity instanceof Mob mob) mob.setNoAi(true); + entity.setNoGravity(true); + entity.setPos(h.absoluteVec(new Vec3(3.5, 1.5, 3.5))); + // Initialize actual fluid contact and eye immersion without adding mobs to the world. + entity.baseTick(); + check(h, entity.isEyeInFluid(FluidTags.WATER), "Test entity must be submerged: " + type); + return entity; + } + + static void run(GameTestHelper h) { + for (int x = 1; x <= 6; x++) for (int y = 1; y <= 4; y++) for (int z = 1; z <= 6; z++) { + h.setBlock(x, y, z, Blocks.WATER); + } + var registry = h.getLevel().registryAccess().lookupOrThrow(Registries.ENTITY_TYPE); + var protectedTypes = registry.getOrThrow(ModEntityTypeTags.WATER_BREATHING); + check(h, protectedTypes.size() >= 25, "All 25 distinct requested vanilla water-breathing types must load"); + for (var holder : protectedTypes) { + var entity = submerged(h, holder.value()); + check(h, entity.is(EntityTypeTags.CAN_BREATHE_UNDER_WATER), "Vanilla breathing tag must include " + holder); + entity.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200, 3)); + entity.setAirSupply(-20); + float health = entity.getHealth(); + CommonHooks.onLivingBreathe(entity, h.getLevel(), 1, 4); + check(h, entity.getAirSupply() == entity.getMaxAirSupply() && entity.getHealth() == health, + "Protected type must recover empty air and resist Choke without drowning: " + holder); + entity.addEffect(new MobEffectInstance(ModEffects.SINK, 200)); + check(h, !FluidEffects.cannotRise(entity), "Unlisted water-breather must not be affected by Sink: " + holder); + } + + var affectedTypes = registry.getOrThrow(ModEntityTypeTags.SINK_AFFECTED); + assertWhitelist(h, ModEntityTypeTags.SINK_AFFECTED, """ + player fox camel camel_husk chicken mooshroom cow donkey horse mule parrot pig rabbit sheep + sniffer tadpole turtle wandering_trader goat villager axolotl cat frog ocelot snow_golem bee + panda iron_golem llama polar_bear trader_llama wolf evoker hoglin piglin_brute pillager + ravager vindicator warden witch piglin + """); + assertWhitelist(h, ModEntityTypeTags.CHOKE_AFFECTED, """ + player fox camel camel_husk chicken mooshroom cow donkey horse mule parrot pig rabbit sheep + sniffer turtle wandering_trader goat villager cat frog ocelot snow_golem bee panda iron_golem + llama polar_bear trader_llama wolf evoker hoglin piglin_brute pillager ravager vindicator + warden witch creeper cave_spider spider enderman piglin + """); + for (var holder : affectedTypes) { + var entity = submerged(h, holder.value()); + entity.addEffect(new MobEffectInstance(ModEffects.SINK, 200)); + double y = entity.getY(); + entity.move(MoverType.SELF, new Vec3(0, 0.1, 0)); + check(h, entity.getY() == y, "Sink must prevent actual upward motion for " + holder); + entity.removeEffect(ModEffects.SINK); + entity.move(MoverType.SELF, new Vec3(0, 0.1, 0)); + check(h, entity.getY() > y, "Removing Sink must restore upward motion for " + holder); + } + + for (var type : List.of(EntityTypes.BAT, EntityTypes.CREEPER, EntityTypes.SPIDER, + EntityTypes.PHANTOM, EntityTypes.COD)) { + var entity = submerged(h, type); + entity.addEffect(new MobEffectInstance(ModEffects.SINK, 200)); + double y = entity.getY(); + entity.move(MoverType.SELF, new Vec3(0, 0.1, 0)); + check(h, entity.getY() > y, "Unlisted type/subclass must retain upward movement: " + type); + } + + for (var holder : registry.getOrThrow(ModEntityTypeTags.CHOKE_AFFECTED)) { + var type = holder.value(); + var entity = submerged(h, type); + entity.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200)); + entity.setAirSupply(200); + entity.baseTick(); + check(h, entity.getAirSupply() == 198, "Choke I must double actual underwater air loss: " + type); + entity.setAirSupply(200); + CommonHooks.onLivingBreathe(entity, h.getLevel(), 0, 4); + check(h, entity.getAirSupply() == 200, "Choke must preserve Respiration's skipped consumption: " + type); + entity.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200, 1)); + entity.baseTick(); + check(h, entity.getAirSupply() == 197, "Choke II must triple underwater air loss: " + type); + entity.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 200)); + entity.setAirSupply(200); + entity.baseTick(); + check(h, entity.getAirSupply() >= 200, "Water Breathing must protect against Choke: " + type); + entity.removeEffect(MobEffects.WATER_BREATHING); + entity.setPos(h.absoluteVec(new Vec3(3.5, 6, 3.5))); + entity.baseTick(); + entity.setAirSupply(200); + entity.baseTick(); + check(h, entity.getAirSupply() == 204, "Ordinary Choke targets must recover air on land: " + type); + } + for (var type : List.of(EntityTypes.BAT, EntityTypes.ALLAY)) { + var entity = submerged(h, type); + entity.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200, 2)); + entity.setAirSupply(200); + entity.baseTick(); + check(h, entity.getAirSupply() == 199, "Unlisted types must retain normal air consumption: " + type); + } + var phantom = submerged(h, EntityTypes.PHANTOM); + phantom.addEffect(new MobEffectInstance(ModEffects.SINK, 200)); + phantom.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200)); + phantom.setAirSupply(0); + CommonHooks.onLivingBreathe(phantom, h.getLevel(), 1, 4); + check(h, !FluidEffects.cannotRise(phantom) && phantom.getAirSupply() > 0, + "Phantom must now resist both effects"); + var player = (ServerPlayer) submerged(h, EntityTypes.PLAYER); + // The mock fixes gameMode() to its constructor value; set the abilities used by the breathing hook. + GameType.CREATIVE.updatePlayerAbilities(player.getAbilities()); + player.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200)); + player.setAirSupply(200); + player.baseTick(); + check(h, player.getAirSupply() >= 200, "Creative invulnerability must protect against Choke: air=" + + player.getAirSupply() + ", invulnerable=" + player.getAbilities().invulnerable); + h.succeed(); + } + + private static void assertWhitelist(GameTestHelper h, TagKey> tag, String vanillaNames) { + Set expected = new HashSet<>(); + for (String name : vanillaNames.strip().split("\\s+")) expected.add("minecraft:" + name); + expected.add("ww_hfas:muddy_pig"); + Set actual = new HashSet<>(); + for (var holder : h.getLevel().registryAccess().lookupOrThrow(Registries.ENTITY_TYPE).getOrThrow(tag)) { + actual.add(BuiltInRegistries.ENTITY_TYPE.getKey(holder.value()).toString()); + } + check(h, actual.equals(expected), "Exact whitelist must match " + tag + ": " + actual); + } + + static void landChoke(GameTestHelper h) { + for (int x = 1; x <= 6; x++) for (int y = 1; y <= 4; y++) for (int z = 1; z <= 6; z++) { + h.setBlock(x, y, z, Blocks.WATER); + } + // Keep the dry position sheltered so rain cannot rehydrate the axolotl. + h.setBlock(3, 8, 3, Blocks.STONE); + for (var type : List.of(EntityTypes.TADPOLE, EntityTypes.AXOLOTL)) { + var entity = submerged(h, type); + ((Mob) entity).setNoAi(false); + check(h, !entity.is(ModEntityTypeTags.CHOKE_AFFECTED), "Land-only types must not enter the water Choke tag"); + entity.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200)); + entity.setAirSupply(200); + entity.baseTick(); + check(h, entity.getAirSupply() == entity.getMaxAirSupply(), "Choke must not affect submerged " + type); + entity.setPos(h.absoluteVec(new Vec3(3.5, 6, 3.5))); + entity.baseTick(); + check(h, !entity.isInWater(), "Special Choke test must be on dry land"); + entity.setAirSupply(200); + entity.baseTick(); + check(h, entity.getAirSupply() == 198, "Choke I must double real land drying: " + type); + entity.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200, 1)); + entity.setAirSupply(200); + entity.baseTick(); + check(h, entity.getAirSupply() == 197, "Choke II must triple real land drying: " + type); + entity.removeEffect(ModEffects.CHOKE); + entity.setAirSupply(200); + entity.baseTick(); + check(h, entity.getAirSupply() == 199, "Removing Choke must restore vanilla drying: " + type); + entity.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200)); + entity.setAirSupply(-18); + entity.invulnerableTime = 0; + float health = entity.getHealth(); + entity.baseTick(); + check(h, entity.getHealth() == health - 2 && entity.getAirSupply() == 0, + "Land Choke must use vanilla drying damage exactly once: " + type + + ", health " + health + " -> " + entity.getHealth() + ", air=" + entity.getAirSupply()); + entity.setPos(h.absoluteVec(new Vec3(3.5, 1.5, 3.5))); + entity.baseTick(); + check(h, entity.getAirSupply() == entity.getMaxAirSupply(), "Returning to water must stop Choke and refill air: " + type); + } + var cod = submerged(h, EntityTypes.COD); + cod.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200, 2)); + cod.setPos(h.absoluteVec(new Vec3(3.5, 6, 3.5))); + cod.baseTick(); + cod.setAirSupply(200); + cod.baseTick(); + check(h, cod.getAirSupply() == 199, "Shared WaterAnimal mixin must not accelerate other fish drying"); + h.succeed(); + } +} diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java new file mode 100644 index 0000000..872ff61 --- /dev/null +++ b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java @@ -0,0 +1,270 @@ +package org.polaris2023.wildwind.hfas.test; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.MoverType; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.CrafterBlockEntity; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.common.CommonHooks; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.level.BlockDropsEvent; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.effect.ModEffects; +import org.polaris2023.wildwind.hfas.enchantment.MeltingEnchantment; +import org.polaris2023.wildwind.hfas.event.CobwebBreaking; +import org.polaris2023.wildwind.hfas.recipe.WoolToStringRecipe; + +public final class GameplayGameTests { + private GameplayGameTests() {} + public static void register(IEventBus bus) { + DeferredRegister> tests = DeferredRegister.create(Registries.TEST_FUNCTION, "ww_hfas_tests"); + tests.register("wool_recipe", () -> GameplayGameTests::woolRecipe); + tests.register("crafter_shears", () -> GameplayGameTests::crafterShears); + tests.register("fluid_effects", () -> GameplayGameTests::fluidEffects); + tests.register("fluid_entity_rules", () -> FluidEntityRulesGameTests::run); + tests.register("land_choke", () -> FluidEntityRulesGameTests::landChoke); + tests.register("azalea_signs", () -> AzaleaAndArrowGameTests::signs); + tests.register("azalea_shelf", () -> AzaleaAndArrowGameTests::shelf); + tests.register("azalea_shelf_chain", () -> AzaleaAndArrowGameTests::shelfChain); + tests.register("reach_arrow_acquisition", () -> AzaleaAndArrowGameTests::acquisition); + tests.register("reach_arrows", () -> AzaleaAndArrowGameTests::arrows); + tests.register("kiln", () -> KilnGameTests::cooking); + tests.register("kiln_inventory", () -> KilnGameTests::inventory); + tests.register("kiln_villages", () -> KilnGameTests::villages); + tests.register("upstream_integration", () -> UpstreamIntegrationGameTests::run); + tests.register("cobweb_timers", () -> GameplayGameTests::cobwebTimers); + tests.register("cobweb_tick_event", () -> GameplayGameTests::cobwebTickEvent); + tests.register("melting", () -> GameplayGameTests::melting); + tests.register("skeleton_spawns", () -> SkeletonAndFarmlandGameTests::skeletonSpawns); + tests.register("skeleton_melee", () -> SkeletonAndFarmlandGameTests::skeletonMelee); + tests.register("farmland_protection", () -> SkeletonAndFarmlandGameTests::farmland); + tests.register("creative_tab", () -> SkeletonAndFarmlandGameTests::creativeTab); + tests.register(bus); + } + private static void check(GameTestHelper h, boolean ok, String message) { + h.assertTrue(ok, Component.literal(message)); + } + + private static void woolRecipe(GameTestHelper h) { + var level = h.getLevel(); + var recipe = WoolToStringRecipe.INSTANCE; + var shears = new ItemStack(Items.SHEARS); + shears.set(DataComponents.CUSTOM_NAME, Component.literal("Test shears")); + for (var wool : level.registryAccess().lookupOrThrow(Registries.ITEM).getOrThrow(ItemTags.WOOL)) { + for (int woolSlot = 0; woolSlot < 4; woolSlot++) { + var stacks = new ArrayList<>(List.of(ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY, ItemStack.EMPTY)); + stacks.set(woolSlot, new ItemStack(wool)); + stacks.set((woolSlot + 1) % 4, shears.copy()); + var input = CraftingInput.of(2, 2, stacks); + var found = level.recipeAccess().getRecipeFor(RecipeType.CRAFTING, input, level); + check(h, found.isPresent() && found.get().value() instanceof WoolToStringRecipe, "All wool colors and slot orders must match registered recipe"); + check(h, recipe.assemble(input).is(Items.STRING) && recipe.assemble(input).getCount() == 2, "One wool must give two string"); + var remainder = recipe.remainingItems(input, level).stream().filter(s -> !s.isEmpty()).findFirst().orElseThrow(); + check(h, remainder.getDamageValue() == 1 && remainder.getHoverName().getString().equals("Test shears"), "Shears must retain data and take one damage"); + check(h, shears.getDamageValue() == 0, "Crafting must not mutate ingredient during preview"); + } + } + check(h, !recipe.matches(CraftingInput.of(2, 2, List.of(new ItemStack(Items.WOOL.white()), shears, new ItemStack(Items.DIRT), ItemStack.EMPTY)), level), "Extra ingredients must fail"); + check(h, !recipe.matches(CraftingInput.of(2, 1, List.of(new ItemStack(Items.WOOL.white()), new ItemStack(Items.STRING))), level), "Wrong tool must fail"); + var broken = shears.copy(); broken.setDamageValue(broken.getMaxDamage() - 1); + check(h, recipe.remainingItems(CraftingInput.of(2, 1, List.of(new ItemStack(Items.WOOL.white()), broken)), level).stream().allMatch(ItemStack::isEmpty), "Last durability must break the shears"); + var enchanted = shears.copy(); + var unbreaking = level.registryAccess().lookupOrThrow(Registries.ENCHANTMENT).getOrThrow(Enchantments.UNBREAKING); + enchanted.enchant(unbreaking, 3); + int damage = 0; + for (int i = 0; i < 256; i++) { + var remainder = recipe.remainingItems(CraftingInput.of(2, 1, List.of(new ItemStack(Items.WOOL.white()), enchanted)), level).get(1); + check(h, remainder.getEnchantments().getLevel(unbreaking) == 3, "Unbreaking must survive crafting"); + damage += remainder.getDamageValue(); + } + check(h, damage > 0 && damage < 160, "Unbreaking III must probabilistically reduce crafting damage"); + var player = (ServerPlayer) h.makeMockServerPlayer(GameType.SURVIVAL); + var connection = new net.minecraft.network.Connection(net.minecraft.network.protocol.PacketFlow.SERVERBOUND); + new io.netty.channel.embedded.EmbeddedChannel(connection); + level.getServer().getPlayerList().placeNewPlayer(connection, player, + net.minecraft.server.network.CommonListenerCookie.createInitial(player.getGameProfile(), false)); + var menu = new CraftingMenu(0, player.getInventory(), ContainerLevelAccess.create(level, h.absolutePos(new BlockPos(2, 1, 2)))); + menu.getSlot(1).set(new ItemStack(Items.WOOL.white(), 3)); + menu.getSlot(2).set(shears.copy()); + // Invoke the real result-slot path twice, including CommonHooks crafting-player context. + for (int i = 0; i < 2; i++) { + var result = menu.getSlot(0).remove(2); + check(h, result.is(Items.STRING) && result.getCount() == 2, "Crafting menu must offer the registered output"); + menu.getSlot(0).onTake(player, result); + } + check(h, menu.getSlot(1).getItem().getCount() == 1 && menu.getSlot(2).getItem().getDamageValue() == 2, "Repeated crafts must consume one wool and one durability each"); + menu.getSlot(1).set(new ItemStack(Items.WOOL.white(), 3)); + for (int i = 0; i < 3; i++) menu.quickMoveStack(player, 0); + check(h, menu.getSlot(1).getItem().isEmpty() && menu.getSlot(2).getItem().getDamageValue() == 5, + "Shift-click crafts must return shears and charge durability for every wool"); + check(h, player.getInventory().countItem(Items.STRING) == 6, "Shift-click must transfer all six string"); + h.succeed(); + } + + private static void crafterShears(GameTestHelper h) { + var pos = new BlockPos(3, 2, 3); + h.setBlock(pos, Blocks.CRAFTER); + var crafter = (CrafterBlockEntity) h.getLevel().getBlockEntity(h.absolutePos(pos)); + crafter.setItem(0, new ItemStack(Items.WOOL.white())); + crafter.setItem(1, new ItemStack(Items.SHEARS)); + h.setBlock(pos.below(), Blocks.REDSTONE_BLOCK); + h.runAfterDelay(10, () -> { + var drops = h.getLevel().getEntitiesOfClass(ItemEntity.class, new AABB(h.absolutePos(pos)).inflate(4)); + check(h, drops.stream().anyMatch(e -> e.getItem().is(Items.STRING) && e.getItem().getCount() == 2), "Crafter must eject two string"); + check(h, drops.stream().anyMatch(e -> e.getItem().is(Items.SHEARS) && e.getItem().getDamageValue() == 1), "Crafter must eject damaged shears using server durability rules"); + h.succeed(); + }); + } + + private static void fluidEffects(GameTestHelper h) { + for (int x = 1; x <= 3; x++) for (int y = 1; y <= 4; y++) for (int z = 1; z <= 3; z++) h.setBlock(x, y, z, Blocks.WATER); + for (int x = 5; x <= 6; x++) for (int y = 1; y <= 4; y++) for (int z = 1; z <= 3; z++) h.setBlock(x, y, z, Blocks.LAVA); + var pig = h.spawn(EntityTypes.PIG, 2, 2, 2); pig.setNoAi(true); pig.setNoGravity(true); + var lavaPig = h.spawn(EntityTypes.PIG, 5, 2, 2); lavaPig.setNoAi(true); lavaPig.setNoGravity(true); lavaPig.setInvulnerable(true); + pig.addEffect(new MobEffectInstance(ModEffects.SINK, 200)); + pig.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200)); + lavaPig.addEffect(new MobEffectInstance(ModEffects.SINK, 200)); + h.runAfterDelay(3, () -> { + double y = pig.getY(); pig.move(MoverType.SELF, new Vec3(0, 0.25, 0)); + check(h, pig.getY() == y, "Sink must stop actual upward water movement"); + double lavaY = lavaPig.getY(); lavaPig.move(MoverType.SELF, new Vec3(0, 0.25, 0)); + check(h, lavaPig.getY() == lavaY, "Sink must also stop lava buoyancy"); + pig.move(MoverType.SELF, new Vec3(0.05, -0.05, 0)); + check(h, pig.getY() < y, "Sink must allow downward and horizontal motion"); + pig.setAirSupply(200); CommonHooks.onLivingBreathe(pig, h.getLevel(), 1, 4); + check(h, pig.getAirSupply() == 198, "Choke I must consume two air per normal breathing tick"); + pig.addEffect(new MobEffectInstance(ModEffects.CHOKE, 200, 1)); + pig.setAirSupply(200); CommonHooks.onLivingBreathe(pig, h.getLevel(), 1, 4); + check(h, pig.getAirSupply() == 197, "Choke II must consume three air"); + pig.setAirSupply(200); CommonHooks.onLivingBreathe(pig, h.getLevel(), 0, 4); + check(h, pig.getAirSupply() == 200, "Respiration's skipped consumption must remain skipped"); + pig.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 200)); + CommonHooks.onLivingBreathe(pig, h.getLevel(), 1, 4); + check(h, pig.getAirSupply() == 200, "Water breathing must continue to protect oxygen"); + pig.removeEffect(ModEffects.SINK); double before = pig.getY(); pig.move(MoverType.SELF, new Vec3(0, 0.1, 0)); + check(h, pig.getY() > before, "Removing Sink must restore upward movement"); + h.succeed(); + }); + } + + private static void moveWeb(Entity entity, int ticks, boolean falling) { + for (int i = 0; i < ticks; i++) { + entity.setPos(entity.getX() + (falling ? 0 : (i % 2 == 0 ? 0.001 : -0.001)), entity.getY() - (falling ? 0.001 : 0), entity.getZ()); + CobwebBreaking.tick(entity); + } + } + private static void cobwebTimers(GameTestHelper h) { + var pos = new BlockPos(3, 2, 3); + h.setBlock(pos, Blocks.COBWEB); + var pig = h.spawn(EntityTypes.PIG, 3.5F, 2.3F, 3.5F); pig.setNoAi(true); pig.setNoGravity(true); pig.setOnGround(true); + CobwebBreaking.tick(pig); moveWeb(pig, 29, false); + h.assertBlockPresent(Blocks.COBWEB, pos); + CobwebBreaking.tick(pig); // No displacement resets the counter. + moveWeb(pig, 29, false); h.assertBlockPresent(Blocks.COBWEB, pos); + moveWeb(pig, 1, false); h.assertBlockPresent(Blocks.AIR, pos); + h.setBlock(pos, Blocks.COBWEB); pig.setOnGround(false); + moveWeb(pig, 159, true); h.assertBlockPresent(Blocks.COBWEB, pos); + moveWeb(pig, 1, true); h.assertBlockPresent(Blocks.AIR, pos); + h.setBlock(pos, Blocks.COBWEB); + var spider = h.spawn(EntityTypes.SPIDER, 3.5F, 2.3F, 3.5F); + var caveSpider = h.spawn(EntityTypes.CAVE_SPIDER, 3.5F, 2.3F, 3.5F); + for (var entity : List.of(spider, caveSpider)) { CobwebBreaking.tick(entity); moveWeb(entity, 200, false); } + h.assertBlockPresent(Blocks.COBWEB, pos); + for (var mode : List.of(GameType.SPECTATOR, GameType.CREATIVE)) { + var player = h.makeMockPlayer(mode); player.getAbilities().flying = true; + player.setPos(pig.position()); CobwebBreaking.tick(player); moveWeb(player, 200, false); + h.assertBlockPresent(Blocks.COBWEB, pos); + } + // Counter belongs to the touched block, not a global web timer. + pig.setOnGround(true); CobwebBreaking.tick(pig); moveWeb(pig, 20, false); + pig.setPos(h.absoluteVec(new Vec3(6.5, 2.3, 3.5))); CobwebBreaking.tick(pig); + pig.setPos(h.absoluteVec(new Vec3(3.5, 2.3, 3.5))); CobwebBreaking.tick(pig); + moveWeb(pig, 29, false); h.assertBlockPresent(Blocks.COBWEB, pos); + moveWeb(pig, 1, false); h.assertBlockPresent(Blocks.AIR, pos); + h.succeed(); + } + + private static void cobwebTickEvent(GameTestHelper h) { + var pos = new BlockPos(3, 2, 3); h.setBlock(pos, Blocks.COBWEB); + var pig = h.spawn(EntityTypes.PIG, 3.5F, 2.3F, 3.5F); pig.setNoAi(true); pig.setNoGravity(true); + // Actual entity tick events must drive the timer, even with no explicit calls to the handler. + for (int i = 1; i <= 35; i++) { + final int tick = i; + h.runAfterDelay(i, () -> pig.setPos(pig.getX() + (tick % 2 == 0 ? 0.001 : -0.001), pig.getY(), pig.getZ())); + } + h.runAfterDelay(37, () -> { h.assertBlockPresent(Blocks.AIR, pos); h.succeed(); }); + } + + private static BlockDropsEvent drops(GameTestHelper h, ServerPlayer player, ItemStack tool, List stacks) { + var entities = new ArrayList(); + for (var stack : stacks) entities.add(new ItemEntity(h.getLevel(), 0, 0, 0, stack)); + var event = new BlockDropsEvent(h.getLevel(), h.absolutePos(new BlockPos(3, 1, 3)), Blocks.IRON_ORE.defaultBlockState(), null, entities, player, tool); + NeoForge.EVENT_BUS.post(event); + return event; + } + private static int count(BlockDropsEvent event, net.minecraft.world.item.Item item) { + return event.getDrops().stream().map(ItemEntity::getItem).filter(s -> s.is(item)).mapToInt(ItemStack::getCount).sum(); + } + private static void melting(GameTestHelper h) { + var level = h.getLevel(); + var player = (ServerPlayer) h.makeMockServerPlayer(GameType.SURVIVAL); + var registry = level.registryAccess().lookupOrThrow(Registries.ENCHANTMENT); + var tool = new ItemStack(Items.DIAMOND_PICKAXE); tool.enchant(registry.getOrThrow(MeltingEnchantment.MELTING), 1); + player.setExperienceLevels(0); player.setExperiencePoints(2); player.totalExperience = 9999; + var event = drops(h, player, tool, List.of(new ItemStack(Items.RAW_IRON, 3))); + check(h, count(event, Items.RAW_IRON) == 3 && MeltingEnchantment.availableExperience(player) == 2, "Insufficient current XP must preserve entire drop; lifetime total is not fuel"); + player.setExperiencePoints(5); + event = drops(h, player, tool, List.of(new ItemStack(Items.RAW_IRON, 3), new ItemStack(Items.DIAMOND, 2))); + check(h, count(event, Items.IRON_INGOT) == 3 && count(event, Items.DIAMOND) == 2 && MeltingEnchantment.availableExperience(player) == 2, "Melt only smeltable drops and charge one point per input"); + var silk = tool.copy(); silk.enchant(registry.getOrThrow(Enchantments.SILK_TOUCH), 1); + event = drops(h, player, silk, List.of(new ItemStack(Items.IRON_ORE))); + check(h, count(event, Items.IRON_ORE) == 1 && MeltingEnchantment.availableExperience(player) == 2, "Silk Touch must take precedence without XP use"); + player.setExperienceLevels(1); player.setExperiencePoints(0); + event = drops(h, player, tool, List.of(new ItemStack(Items.RAW_IRON))); + check(h, count(event, Items.IRON_INGOT) == 1 && player.experienceLevel == 0 && MeltingEnchantment.availableExperience(player) == 6, "Spend exactly one point across level boundary"); + var fortune = tool.copy(); fortune.enchant(registry.getOrThrow(Enchantments.FORTUNE), 3); + player.setExperienceLevels(10); player.setExperiencePoints(0); + var loot = Block.getDrops(Blocks.IRON_ORE.defaultBlockState(), level, h.absolutePos(new BlockPos(3, 1, 3)), null, player, fortune); + int inputCount = loot.stream().filter(s -> s.is(Items.RAW_IRON)).mapToInt(ItemStack::getCount).sum(); + long before = MeltingEnchantment.availableExperience(player); + event = drops(h, player, fortune, loot); + check(h, inputCount > 0 && count(event, Items.IRON_INGOT) == inputCount && MeltingEnchantment.availableExperience(player) == before - inputCount, "Fortune loot must be determined first and fully charged"); + for (int currentLevel : new int[]{16, 17, 30, 31, 32}) { + player.setExperienceLevels(currentLevel); player.setExperiencePoints(0); before = MeltingEnchantment.availableExperience(player); + event = drops(h, player, tool, List.of(new ItemStack(Items.RAW_IRON))); + check(h, count(event, Items.IRON_INGOT) == 1 && MeltingEnchantment.availableExperience(player) == before - 1, "XP formula at level " + currentLevel); + } + // Exercise vanilla block dropping, rather than only posting the event directly. + var pos = h.absolutePos(new BlockPos(5, 2, 5)); before = MeltingEnchantment.availableExperience(player); + Block.dropResources(Blocks.IRON_ORE.defaultBlockState(), level, pos, null, player, tool); + check(h, MeltingEnchantment.availableExperience(player) == before - 1 + && level.getEntitiesOfClass(ItemEntity.class, new AABB(pos).inflate(1)).stream().anyMatch(e -> e.getItem().is(Items.IRON_INGOT)), + "Vanilla block loot path must invoke Melting"); + h.succeed(); + } +} diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java new file mode 100644 index 0000000..ee01637 --- /dev/null +++ b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java @@ -0,0 +1,231 @@ +package org.polaris2023.wildwind.hfas.test; + +import java.util.List; +import java.util.Arrays; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.Registries; +import net.minecraft.advancements.predicates.ItemPredicate; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.LockCode; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.ExperienceOrb; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.HopperBlock; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.entity.HopperBlockEntity; +import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement; +import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.LiquidSettings; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.polaris2023.wildwind.hfas.worldgen.MasonKilnProcessor; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.AbstractFurnaceBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.block.entity.KilnBlockEntity; +import org.polaris2023.wildwind.hfas.recipe.KilnRecipes; + +final class KilnGameTests { + private KilnGameTests() {} + + private static void check(GameTestHelper h, boolean ok, String message) { + h.assertTrue(ok, Component.literal(message)); + } + + static void cooking(GameTestHelper h) { + var pos = h.absolutePos(new net.minecraft.core.BlockPos(2, 1, 2)); + h.setBlock(2, 1, 2, ModBlocks.KILN.get()); + BlockEntity raw = h.getLevel().getBlockEntity(pos); + check(h, raw instanceof KilnBlockEntity, "Kiln must create its block entity"); + var kiln = (KilnBlockEntity) raw; + var state = kiln.getBlockState(); + check(h, state.getDestroySpeed(h.getLevel(), pos) == 3.5F && ModBlocks.KILN.get().getExplosionResistance() == 3.5F, + "Kiln hardness and blast resistance must both be 3.5"); + check(h, state.getPistonPushReaction() == net.minecraft.world.level.material.PushReaction.BLOCK + && state.isRedstoneConductor(h.getLevel(), pos) && state.isSuffocating(h.getLevel(), pos), + "Kiln must be a solid conductor that pistons cannot move"); + var recipeInput = net.minecraft.world.item.crafting.CraftingInput.of(3, 3, List.of( + ItemStack.EMPTY, new ItemStack(Items.BRICK), ItemStack.EMPTY, + new ItemStack(Items.BRICK), new ItemStack(Items.FURNACE), new ItemStack(Items.BRICK), + new ItemStack(Items.PACKED_MUD), new ItemStack(Items.PACKED_MUD), new ItemStack(Items.PACKED_MUD))); + check(h, h.getLevel().recipeAccess().getRecipeFor(net.minecraft.world.item.crafting.RecipeType.CRAFTING, recipeInput, h.getLevel()) + .orElseThrow().value().assemble(recipeInput).is(ModBlocks.KILN.get().asItem()), "Requested kiln crafting pattern must work"); + kiln.setItem(0, new ItemStack(Items.CACTUS, 2)); + kiln.setItem(1, new ItemStack(Items.COAL)); + check(h, KilnRecipes.find(h.getLevel(), kiln.getItem(0)).isPresent(), "Cactus must be kiln-smeltable"); + check(h, KilnRecipes.find(h.getLevel(), new ItemStack(Items.IRON_ORE)).isEmpty(), "Ore must be excluded"); + for (var denied : List.of(Items.RAW_IRON, Items.IRON_PICKAXE, Items.GOLDEN_CHESTPLATE, Items.ANCIENT_DEBRIS)) { + check(h, KilnRecipes.find(h.getLevel(), new ItemStack(denied)).isEmpty(), "Metal/mineral must be excluded: " + denied); + check(h, !kiln.canPlaceItem(0, new ItemStack(denied)), "Automated input must reject excluded materials"); + } + for (var allowed : List.of(Items.SAND, Items.CLAY_BALL, Items.COBBLESTONE, Items.OAK_LOG, Items.WET_SPONGE, Items.POTATO)) { + check(h, KilnRecipes.find(h.getLevel(), new ItemStack(allowed)).isPresent(), "Non-mineral smelting recipe must work: " + allowed); + } + tick(h, kiln, 99); + check(h, kiln.getItem(2).isEmpty(), "Nothing may finish before tick 100"); + var ticker = ModBlocks.KILN.get().getTicker(h.getLevel(), state, + org.polaris2023.wildwind.hfas.block.entity.ModBlockEntities.KILN.get()); + check(h, ticker != null, "Kiln must have a registered server ticker"); + ticker.tick(h.getLevel(), pos, h.getLevel().getBlockState(pos), kiln); + check(h, kiln.getItem(0).getCount() == 1, "Kiln must consume exactly one input after 100 ticks"); + check(h, kiln.getItem(2).is(Items.DYE.green()) && kiln.getItem(2).getCount() == 1, + "Kiln must produce one cactus green dye"); + check(h, kiln.getItem(1).isEmpty(), "One coal must be consumed when the kiln starts"); + check(h, h.getLevel().getBlockState(pos).getValue(AbstractFurnaceBlock.LIT), + "Kiln must be lit while its fuel remains"); + check(h, h.getLevel().getBlockState(pos).getLightEmission() == 13, "Burning kiln must emit light 13"); + var saved = kiln.saveWithFullMetadata(h.getLevel().registryAccess()); + var loaded = (KilnBlockEntity) BlockEntity.loadStatic(pos, kiln.getBlockState(), saved, h.getLevel().registryAccess()); + check(h, loaded != null && loaded.getItem(2).is(Items.DYE.green()), "Contents must survive reload"); + loaded.setLevel(h.getLevel()); + tick(h, loaded, 100); + check(h, loaded.getItem(2).getCount() == 2 && loaded.getItem(0).isEmpty(), "Fuel/progress must continue after reload"); + kiln.setItem(0, new ItemStack(Items.CACTUS)); + kiln.setItem(2, new ItemStack(Items.DYE.green(), 64)); + tick(h, kiln, 100); + check(h, kiln.getItem(0).getCount() == 1 && kiln.getItem(2).getCount() == 64, "Full output must prevent consumption"); + kiln.setItem(2, new ItemStack(Items.STONE)); + tick(h, kiln, 100); + check(h, kiln.getItem(0).getCount() == 1 && kiln.getItem(2).is(Items.STONE), "Different output must prevent cooking"); + kiln.setItem(0, new ItemStack(Items.IRON_ORE)); + kiln.setItem(2, ItemStack.EMPTY); + tick(h, kiln, 100); + check(h, kiln.getItem(2).isEmpty() && kiln.getItem(0).is(Items.IRON_ORE), "Forced excluded input must not cook"); + kiln.setItem(0, new ItemStack(Items.WET_SPONGE)); + kiln.setItem(1, new ItemStack(Items.BUCKET)); + tick(h, kiln, 100); + check(h, kiln.getItem(2).is(Items.SPONGE) && kiln.getItem(1).is(Items.WATER_BUCKET), "Wet sponge must fill the fuel-slot bucket"); + var longFuel = kiln.saveWithFullMetadata(h.getLevel().registryAccess()); + longFuel.putInt("lit_time_remaining", 50000); + longFuel.putInt("lit_total_time", 50000); + var longBurn = (KilnBlockEntity) BlockEntity.loadStatic(pos, kiln.getBlockState(), longFuel, h.getLevel().registryAccess()); + longBurn.setLevel(h.getLevel()); + tick(h, longBurn, 1); + check(h, longBurn.saveCustomOnly(h.getLevel().registryAccess()).getIntOr("lit_time_remaining", 0) == 49999, + "Long modded fuel timers must not be truncated by network short scaling"); + h.succeed(); + } + + private static void tick(GameTestHelper h, KilnBlockEntity kiln, int ticks) { + for (int i = 0; i < ticks; i++) KilnBlockEntity.tick(h.getLevel(), kiln.getBlockPos(), h.getLevel().getBlockState(kiln.getBlockPos()), kiln); + } + + static void inventory(GameTestHelper h) { + var level = h.getLevel(); + var pos = h.absolutePos(new BlockPos(3, 2, 3)); + h.setBlock(3, 2, 3, ModBlocks.KILN.get()); + var kiln = (KilnBlockEntity) level.getBlockEntity(pos); + check(h, Arrays.equals(kiln.getSlotsForFace(Direction.UP), new int[]{0}) + && Arrays.equals(kiln.getSlotsForFace(Direction.DOWN), new int[]{2, 1}) + && Arrays.equals(kiln.getSlotsForFace(Direction.EAST), new int[]{1}), "Sided slots must match the specification"); + h.setBlock(3, 3, 3, Blocks.HOPPER); + var top = (HopperBlockEntity) level.getBlockEntity(pos.above()); + top.setItem(0, new ItemStack(Items.CACTUS)); + HopperBlockEntity.pushItemsTick(level, top.getBlockPos(), top.getBlockState(), top); + check(h, kiln.getItem(0).is(Items.CACTUS), "Top hopper must insert ingredients"); + h.setBlock(4, 2, 3, Blocks.HOPPER.defaultBlockState().setValue(HopperBlock.FACING, Direction.WEST)); + var side = (HopperBlockEntity) level.getBlockEntity(pos.east()); + side.setItem(0, new ItemStack(Items.LAVA_BUCKET)); + HopperBlockEntity.pushItemsTick(level, side.getBlockPos(), side.getBlockState(), side); + check(h, kiln.getItem(1).is(Items.LAVA_BUCKET), "Side hopper must insert fuel"); + tick(h, kiln, 100); + check(h, kiln.getItem(1).is(Items.BUCKET), "Lava fuel must return an empty bucket"); + h.setBlock(3, 1, 3, Blocks.HOPPER); + var bottom = (HopperBlockEntity) level.getBlockEntity(pos.below()); + check(h, HopperBlockEntity.suckInItems(level, bottom), "Bottom hopper must pull output"); + check(h, bottom.getItem(0).is(Items.DYE.green()) && kiln.getItem(1).is(Items.BUCKET), "Output must be pulled before the bucket"); + check(h, HopperBlockEntity.suckInItems(level, bottom) && kiln.getItem(1).isEmpty(), "Bottom hopper must next pull the bucket"); + check(h, kiln.saveCustomOnly(level.registryAccess()).getCompound("RecipesUsed").orElseThrow().size() > 0, + "Hopper extraction must retain stored experience"); + kiln.clearContent(); + check(h, AbstractContainerMenu.getRedstoneSignalFromBlockEntity(kiln) == 0, "Empty kiln comparator must be zero"); + kiln.setItem(0, new ItemStack(Items.CACTUS, 64)); + kiln.setItem(1, new ItemStack(Items.COAL, 64)); + kiln.setItem(2, new ItemStack(Items.DYE.green(), 64)); + check(h, kiln.getBlockState().getAnalogOutputSignal(level, pos, Direction.NORTH) == 15, "Comparator must count all three slots"); + kiln.clearContent(); + var player = connectedPlayer(h); + var named = new ItemStack(ModBlocks.KILN.get()); + named.set(DataComponents.CUSTOM_NAME, Component.literal("Test kiln")); + named.set(DataComponents.LOCK, new LockCode(ItemPredicate.Builder.item() + .of(level.registryAccess().lookupOrThrow(Registries.ITEM), Items.BRICK).build())); + kiln.applyComponentsFromItemStack(named); + check(h, kiln.getName().getString().equals("Test kiln") && !kiln.canOpen(player), "Custom name and lock must apply"); + player.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(Items.BRICK)); + check(h, kiln.canOpen(player), "Matching key item must unlock kiln"); + var menu = kiln.createMenu(1, player.getInventory(), player); + check(h, menu != null && !menu.getSlot(0).mayPlace(new ItemStack(Items.IRON_ORE)), "GUI must reject excluded input"); + check(h, !menu.getSlot(2).mayPlace(new ItemStack(Items.STONE)), "Output slot must reject insertion"); + kiln.setItem(0, new ItemStack(Items.CACTUS)); + tick(h, kiln, 100); + var outputSlot = menu.getSlot(2); + var result = outputSlot.remove(1); + outputSlot.onTake(player, result); + check(h, kiln.saveCustomOnly(level.registryAccess()).getCompound("RecipesUsed").orElseThrow().isEmpty(), + "Manual extraction must release and clear stored experience"); + check(h, !level.getEntitiesOfClass(ExperienceOrb.class, new AABB(player.blockPosition()).inflate(2)).isEmpty(), "Manual extraction must spawn stored experience"); + kiln.setItem(0, new ItemStack(Items.CACTUS)); + tick(h, kiln, 100); + var state = kiln.getBlockState(); + check(h, Block.getDrops(state, level, pos, kiln, player, new ItemStack(Items.WOODEN_PICKAXE)).stream() + .anyMatch(stack -> stack.is(ModBlocks.KILN.get().asItem())), "Wooden pickaxe must allow kiln loot"); + check(h, !player.hasCorrectToolForDrops(state), "A held brick must not qualify for kiln drops"); + player.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(Items.WOODEN_PICKAXE)); + check(h, player.hasCorrectToolForDrops(state), "Wooden pickaxe must qualify for kiln drops"); + level.destroyBlock(pos, true, player); + var dropped = level.getEntitiesOfClass(ItemEntity.class, new AABB(pos).inflate(2)); + check(h, dropped.stream().anyMatch(e -> e.getItem().is(ModBlocks.KILN.get().asItem())) + && dropped.stream().anyMatch(e -> e.getItem().is(Items.DYE.green())), "Breaking must drop the kiln and its inventory"); + check(h, !level.getEntitiesOfClass(ExperienceOrb.class, new AABB(pos).inflate(2)).isEmpty(), "Breaking must release stored experience"); + h.succeed(); + } + + private static ServerPlayer connectedPlayer(GameTestHelper h) { + var player = (ServerPlayer) h.makeMockServerPlayer(GameType.SURVIVAL); + var connection = new net.minecraft.network.Connection(net.minecraft.network.protocol.PacketFlow.SERVERBOUND); + new io.netty.channel.embedded.EmbeddedChannel(connection); + h.getLevel().getServer().getPlayerList().placeNewPlayer(connection, player, + net.minecraft.server.network.CommonListenerCookie.createInitial(player.getGameProfile(), false)); + player.setPos(h.absoluteVec(new Vec3(6.5, 2, 6.5))); + return player; + } + + static void villages(GameTestHelper h) { + var level = h.getLevel(); + var templates = level.getStructureManager(); + int index = 0; + for (var house : MasonKilnProcessor.HOUSES.entrySet()) { + for (var rotation : Rotation.values()) { + var origin = h.absolutePos(new BlockPos(30 + index++ * 20, 3, 30)); + var template = templates.getOrCreate(house.getKey()); + var settings = new StructurePlaceSettings().setRotation(rotation); + var box = template.getBoundingBox(settings, origin); + var pool = StructurePoolElement.legacy(house.getKey().toString()).apply(StructureTemplatePool.Projection.RIGID); + check(h, pool.place(templates, level, level.structureManager(), level.getChunkSource().getGenerator(), + origin, origin, rotation, box, level.getRandom(), LiquidSettings.IGNORE_WATERLOGGING, false), + "Mason house must place through the real pool path: " + house.getKey()); + var kilnPos = net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate + .calculateRelativePosition(settings, house.getValue().target()).offset(origin); + check(h, level.getBlockState(kilnPos).is(ModBlocks.KILN.get()) && level.getBlockEntity(kilnPos) instanceof KilnBlockEntity, + "Every mason house rotation must contain a functional kiln: " + house.getKey() + " " + rotation); + check(h, level.getBlockState(kilnPos).getValue(AbstractFurnaceBlock.FACING) == rotation.rotate(house.getValue().facing()), + "Kiln facing must rotate with its house"); + for (var cutter : template.filterBlocks(origin, settings, Blocks.STONECUTTER)) { + check(h, level.getBlockState(cutter.pos()).is(Blocks.STONECUTTER), "Mason workstation must be preserved"); + } + } + } + h.succeed(); + } +} diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java new file mode 100644 index 0000000..e7dab63 --- /dev/null +++ b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java @@ -0,0 +1,106 @@ +package org.polaris2023.wildwind.hfas.test; + +import java.util.function.Consumer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.SpawnEggItem; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.block.Blocks; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.structures.test.StructureGameTests; + +@Mod("ww_hfas_tests") +public final class MuddyPigGameTests { + public MuddyPigGameTests(IEventBus bus) { + StructureGameTests.register(bus); + GameplayGameTests.register(bus); + DeferredRegister> functions = DeferredRegister.create(Registries.TEST_FUNCTION, "ww_hfas_tests"); + functions.register("entity", () -> MuddyPigGameTests::entity); + functions.register("spawning", () -> MuddyPigGameTests::spawning); + functions.register(bus); + } + + private static void check(GameTestHelper helper, boolean condition, String message) { + helper.assertTrue(condition, Component.literal(message)); + } + + private static void entity(GameTestHelper helper) { + var level = helper.getLevel(); + var type = ModEntities.MUDDY_PIG.get(); + var pig = helper.spawn(type, 2, 2, 2); + var partner = helper.spawn(type, 4, 2, 2); + check(helper, pig.getMaxHealth() == 10 && pig.getAttributeValue(Attributes.MOVEMENT_SPEED) == 0.25, + "Muddy pig must receive vanilla pig attributes"); + check(helper, pig.isFood(Items.CARROT.getDefaultInstance()) && !pig.isFood(Items.WHEAT.getDefaultInstance()), + "Muddy pig must use vanilla pig food tag"); + check(helper, SpawnEggItem.getType(org.polaris2023.wildwind.hfas.registry.ModItems.MUDDY_PIG_SPAWN_EGG.toStack()) == type, + "Spawn egg entity component must point to muddy pig"); + var baby = pig.getBreedOffspring(level, partner); + check(helper, baby != null && baby.getType() == type, "Breeding must create a muddy pig rather than vanilla pig"); + baby.setBaby(true); + check(helper, baby.isBaby(), "Offspring must support baby state"); + pig.setInLove(null); + partner.setInLove(null); + check(helper, pig.canMate(partner) && !pig.canMate(pig), "Two adult muddy pigs must be able to mate"); + var vanilla = helper.spawn(EntityTypes.PIG, 6, 2, 2); + vanilla.setInLove(null); + check(helper, !pig.canMate(vanilla) && !vanilla.canMate(pig), "Vanilla pigs must remain a separate breeding species"); + var eggBaby = SpawnEggItem.spawnOffspringFromSpawnEgg(helper.makeMockServerPlayerInLevel(), pig, + type, level, pig.position(), org.polaris2023.wildwind.hfas.registry.ModItems.MUDDY_PIG_SPAWN_EGG.toStack()); + check(helper, eggBaby.isPresent() && eggBaby.get().isBaby() && eggBaby.get().getType() == type, + "Using the spawn egg on an adult must create a muddy pig baby"); + check(helper, level.getServer().reloadableRegistries().getLootTable(pig.getLootTable().orElseThrow()) + != net.minecraft.world.level.storage.loot.LootTable.EMPTY, "Muddy pig loot table must be loaded"); + helper.succeed(); + } + + private static void spawning(GameTestHelper helper) { + var level = helper.getLevel(); + var type = ModEntities.MUDDY_PIG.get(); + var biomes = level.registryAccess().lookupOrThrow(Registries.BIOME); + for (var biome : biomes.listElements().toList()) { + var entries = biome.value().getMobSettings().getMobs(MobCategory.CREATURE).unwrap(); + var matches = entries.stream().filter(entry -> entry.value().type() == type).toList(); + boolean expected = biome.is(Biomes.SWAMP) || biome.is(Biomes.MANGROVE_SWAMP); + check(helper, matches.size() == (expected ? 1 : 0), "Biome spawn membership: " + biome.key().identifier()); + if (expected) { + var entry = matches.getFirst(); + check(helper, entry.weight() == 10 && entry.value().minCount() == 2 && entry.value().maxCount() == 4, + "Spawn weight and group bounds must be 10 / 2-4"); + } + } + var pos = new BlockPos(3, 2, 3); + var absolute = helper.absolutePos(pos); + helper.setBlock(pos, Blocks.AIR); + helper.setBlock(pos.above(), Blocks.AIR); + helper.setBlock(pos.above(2), Blocks.GLOWSTONE); + helper.runAfterDelay(5, () -> { + for (var block : new net.minecraft.world.level.block.Block[]{Blocks.GRASS_BLOCK, Blocks.MUD, Blocks.MUDDY_MANGROVE_ROOTS}) { + helper.setBlock(pos.below(), block); + check(helper, SpawnPlacements.isSpawnPositionOk(type, level, absolute) + && SpawnPlacements.checkSpawnRules(type, level, EntitySpawnReason.NATURAL, absolute, level.getRandom()), + "Natural spawning must accept " + block); + } + helper.setBlock(pos.below(), Blocks.STONE); + check(helper, !SpawnPlacements.checkSpawnRules(type, level, EntitySpawnReason.NATURAL, absolute, level.getRandom()), + "Natural spawning must reject stone"); + helper.setBlock(pos.below(), Blocks.MUD); + helper.setBlock(pos, Blocks.WATER); + check(helper, !SpawnPlacements.isSpawnPositionOk(type, level, absolute), "Natural spawning must reject water"); + helper.setBlock(pos, Blocks.STONE); + check(helper, !SpawnPlacements.isSpawnPositionOk(type, level, absolute), "Natural spawning must reject obstructed space"); + helper.succeed(); + }); + } +} diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java new file mode 100644 index 0000000..bec52e5 --- /dev/null +++ b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java @@ -0,0 +1,156 @@ +package org.polaris2023.wildwind.hfas.test; + +import java.util.List; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import net.minecraft.world.entity.monster.skeleton.AbstractSkeleton; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FarmlandBlock; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.registry.ModCreativeTabs; +import org.polaris2023.wildwind.hfas.registry.ModItems; +import org.polaris2023.wildwind.hfas.registry.ModPotions; + +final class SkeletonAndFarmlandGameTests { + private SkeletonAndFarmlandGameTests() {} + + private static void check(GameTestHelper h, boolean ok, String message) { + h.assertTrue(ok, Component.literal(message)); + } + + static void skeletonSpawns(GameTestHelper h) { + var level = h.getLevel(); + level.getRandom().setSeed(428136L); + for (var type : List.of(EntityTypes.SKELETON, EntityTypes.STRAY, EntityTypes.BOGGED, EntityTypes.PARCHED)) { + int swords = 0; + for (int i = 0; i < 200; i++) { + // Use the real initialization path used by spawn eggs and newly spawned mobs. + var skeleton = type.create(level, null, h.absolutePos(new BlockPos(2, 2, 2)), EntitySpawnReason.NATURAL, false, false); + check(h, skeleton != null, "Skeleton variant must initialize"); + var weapon = skeleton.getMainHandItem(); + check(h, weapon.is(Items.BOW) || weapon.is(Items.STONE_SWORD), "Spawn weapon must be bow or stone sword"); + boolean melee = skeleton.getGoalSelector().getAvailableGoals().stream() + .anyMatch(goal -> goal.getGoal() instanceof MeleeAttackGoal); + check(h, melee == weapon.is(Items.STONE_SWORD), "Weapon must select the matching combat AI"); + if (weapon.is(Items.STONE_SWORD)) swords++; + skeleton.discard(); + } + check(h, swords >= 5 && swords <= 45, "Fixed-seed spawn sample must contain roughly ten percent swords: " + type + " = " + swords); + } + var wither = EntityTypes.WITHER_SKELETON.create(level, null, h.absolutePos(new BlockPos(2, 2, 2)), EntitySpawnReason.NATURAL, false, false); + check(h, wither.getMainHandItem().is(Items.STONE_SWORD), "Wither skeleton must retain its vanilla equipment"); + wither.discard(); + h.succeed(); + } + + static void skeletonMelee(GameTestHelper h) { + checkHit(h, h.spawn(EntityTypes.STRAY, 2, 2, 2), MobEffects.SLOWNESS, 600); + checkHit(h, h.spawn(EntityTypes.BOGGED, 3, 2, 2), MobEffects.POISON, 80); + checkHit(h, h.spawn(EntityTypes.PARCHED, 4, 2, 2), MobEffects.WEAKNESS, 600); + var skeleton = h.spawn(EntityTypes.SKELETON, 5, 2, 2); + skeleton.setNoAi(true); + skeleton.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.STONE_SWORD)); + var target = h.spawn(EntityTypes.COW, 5, 2, 4); + target.setNoAi(true); + check(h, skeleton.doHurtTarget(h.getLevel(), target) && target.getActiveEffects().isEmpty(), "Normal skeleton melee must not add a special effect"); + h.succeed(); + } + + private static void checkHit(GameTestHelper h, AbstractSkeleton skeleton, Holder effect, int ticks) { + skeleton.setNoAi(true); + skeleton.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.STONE_SWORD)); + var target = h.spawn(EntityTypes.COW, 2, 2, 5); + target.setNoAi(true); + check(h, skeleton.doHurtTarget(h.getLevel(), target), "Stone sword must successfully damage target"); + var applied = target.getEffect(effect); + check(h, applied != null && applied.getDuration() == ticks && applied.getAmplifier() == 0, + "Melee must apply exactly the requested duration and level"); + var invulnerable = h.spawn(EntityTypes.COW, 3, 2, 5); + invulnerable.setNoAi(true); + invulnerable.setInvulnerable(true); + check(h, !skeleton.doHurtTarget(h.getLevel(), invulnerable) && !invulnerable.hasEffect(effect), + "Failed melee hits must not apply an effect"); + } + + static void farmland(GameTestHelper h) { + var level = h.getLevel(); + var cow = h.spawn(EntityTypes.COW, 2, 2, 2); + cow.setNoAi(true); + var pos = h.absolutePos(new BlockPos(3, 1, 3)); + var farmland = (FarmlandBlock) Blocks.FARMLAND; + var featherFalling = level.registryAccess().lookupOrThrow(Registries.ENCHANTMENT).getOrThrow(Enchantments.FEATHER_FALLING); + var boots = new ItemStack(Items.DIAMOND_BOOTS); + boots.enchant(featherFalling, 1); + cow.setItemSlot(EquipmentSlot.FEET, boots); + level.setBlockAndUpdate(pos, Blocks.FARMLAND.defaultBlockState()); + farmland.fallOn(level, level.getBlockState(pos), pos, cow, 6); + check(h, level.getBlockState(pos).is(Blocks.FARMLAND), "Worn Feather Falling I must protect farmland for non-player entities"); + check(h, cow.getHealth() < cow.getMaxHealth(), "Farmland protection must not cancel remaining fall damage"); + cow.setItemSlot(EquipmentSlot.FEET, ItemStack.EMPTY); + cow.setItemSlot(EquipmentSlot.MAINHAND, boots); + farmland.fallOn(level, level.getBlockState(pos), pos, cow, 6); + check(h, level.getBlockState(pos).is(Blocks.DIRT), "Holding enchanted armor must not protect farmland"); + level.setBlockAndUpdate(pos, Blocks.FARMLAND.defaultBlockState()); + cow.addEffect(new MobEffectInstance(MobEffects.SLOW_FALLING, 200)); + farmland.fallOn(level, level.getBlockState(pos), pos, cow, 6); + check(h, level.getBlockState(pos).is(Blocks.FARMLAND), "Slow Falling must protect farmland without worn armor"); + cow.removeEffect(MobEffects.SLOW_FALLING); + farmland.fallOn(level, level.getBlockState(pos), pos, cow, 6); + check(h, level.getBlockState(pos).is(Blocks.DIRT), "Removing protection must restore trampling"); + h.succeed(); + } + + static void creativeTab(GameTestHelper h) { + var params = new CreativeModeTab.ItemDisplayParameters(h.getLevel().enabledFeatures(), true, h.getLevel().registryAccess()); + var tab = ModCreativeTabs.WILD_WIND.get(); + tab.buildContents(params); + for (var register : List.of(ModBlocks.ITEMS, ModItems.ITEMS)) { + for (var item : register.getEntries()) { + check(h, tab.getDisplayItems().stream().filter(stack -> stack.is(item.get())).count() == (item == ModItems.TIPPED_ARROW ? 2 : 1), + "Every registered mod item/arrow variant must appear once in its own tab: " + item.getId()); + } + } + for (var potion : ModPotions.POTIONS.getEntries()) { + for (var item : List.of(Items.POTION, Items.SPLASH_POTION, Items.LINGERING_POTION, Items.TIPPED_ARROW)) { + check(h, tab.contains(org.polaris2023.wildwind.hfas.arrow.ReachArrows.convert(PotionContents.createItemStack(item, potion))), "Mod tab must include each Reach potion and arrow variant"); + } + } + for (var key : List.of(CreativeModeTabs.BUILDING_BLOCKS, CreativeModeTabs.NATURAL_BLOCKS, + CreativeModeTabs.INGREDIENTS, CreativeModeTabs.SPAWN_EGGS, CreativeModeTabs.FOOD_AND_DRINKS, CreativeModeTabs.COMBAT)) { + var vanilla = BuiltInRegistries.CREATIVE_MODE_TAB.getValueOrThrow(key); + vanilla.buildContents(params); + check(h, vanilla.getDisplayItems().stream().noneMatch(stack -> + BuiltInRegistries.ITEM.getKey(stack.getItem()).getNamespace().equals(HFASMod.MOD_ID)), + "Vanilla categories must not contain mod items"); + check(h, vanilla.getDisplayItems().stream().noneMatch(stack -> { + var contents = stack.get(DataComponents.POTION_CONTENTS); + return contents != null && contents.potion().isPresent() + && contents.potion().get().unwrapKey().orElseThrow().identifier().getNamespace().equals(HFASMod.MOD_ID); + }), "Vanilla categories must not duplicate mod potions"); + } + CreativeModeTabs.searchTab().buildContents(params); + check(h, CreativeModeTabs.searchTab().contains(ModItems.MUDDY_PIG_SPAWN_EGG.toStack()) + && CreativeModeTabs.searchTab().contains(PotionContents.createItemStack(Items.POTION, ModPotions.REACH)), + "Global creative search must still discover mod contents"); + h.succeed(); + } +} diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java new file mode 100644 index 0000000..ff3b748 --- /dev/null +++ b/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java @@ -0,0 +1,84 @@ +package org.polaris2023.wildwind.hfas.test; + +import java.util.List; +import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.polaris2023.wildwind.hfas.component.OmniClawTools; +import org.polaris2023.wildwind.hfas.enchantment.MeltingEnchantment; +import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; +import org.polaris2023.wildwind.hfas.registry.*; + +final class UpstreamIntegrationGameTests { + private UpstreamIntegrationGameTests() {} + + private static void check(GameTestHelper h, boolean ok, String message) { + h.assertTrue(ok, Component.literal(message)); + } + + static void run(GameTestHelper h) { + var level = h.getLevel(); + var crab = h.spawn(ModEntities.MUDCRAB.get(), 2, 2, 2); + crab.setNoAi(true); + check(h, crab.getMaxHealth() == 10 && crab.getVariant() != null, + "Merged mudcrab must spawn with attributes and a registered variant"); + check(h, level.registryAccess().lookupOrThrow(DatadrivenRegistryKey.MUDCRAB_VARIANT).size() == 3, + "All three mudcrab variants must be present"); + crab.setVariant(MudcrabVariant.lookup(level.registryAccess(), MudcrabVariant.WARM)); + check(h, crab.getVariant().is(MudcrabVariant.WARM) + && crab.getBucketItemStack().is(ModItems.MUDCRAB_BUCKET.get()), "Mudcrab variant and bucket must work"); + var fish = h.spawn(ModEntities.PIRANHA.get(), 4, 2, 2); + fish.setNoAi(true); + check(h, fish.getBucketItemStack().is(ModItems.PIRANHA_BUCKET.get()), "Piranha bucket must remain registered"); + var cooking = level.recipeAccess().getRecipeFor(RecipeType.SMELTING, + new SingleRecipeInput(ModItems.PIRANHA.toStack()), level); + check(h, cooking.isPresent() && cooking.get().value().assemble(new SingleRecipeInput(ModItems.PIRANHA.toStack())) + .is(ModItems.COOKED_PIRANHA.get()), "Upstream piranha smelting recipe must load"); + for (var material : ModItems.MATERIALS) { + check(h, !material.toStack().has(DataComponents.FOOD), "The seven local materials must stay ordinary items"); + } + check(h, !ModPotions.REACH.value().getEffects().isEmpty(), "Upstream Reach potion must remain registered"); + + var player = (ServerPlayer) h.makeMockServerPlayer(GameType.SURVIVAL); + var connection = new net.minecraft.network.Connection(net.minecraft.network.protocol.PacketFlow.SERVERBOUND); + new io.netty.channel.embedded.EmbeddedChannel(connection); + level.getServer().getPlayerList().placeNewPlayer(connection, player, + net.minecraft.server.network.CommonListenerCookie.createInitial(player.getGameProfile(), false)); + player.gameMode.changeGameModeForPlayer(GameType.SURVIVAL); + player.setPos(h.absoluteVec(new Vec3(6.5, 2, 6.5))); + player.addEffect(new MobEffectInstance(ModMobEffects.REACH, 200)); + check(h, player.getAttributeValue(ModAttributes.EXTRA_ITEM_PICKUP_RANGE) == 2, + "Upstream Reach attribute must work with merged player code"); + player.removeEffect(ModMobEffects.REACH); + + var pickaxe = new ItemStack(Items.DIAMOND_PICKAXE); + pickaxe.enchant(level.registryAccess().lookupOrThrow(Registries.ENCHANTMENT).getOrThrow(MeltingEnchantment.MELTING), 1); + var claw = ModItems.OMNI_CLAW.toStack(); + claw.set(ModDataComponents.OMNI_CLAW_TOOLS.get(), new OmniClawTools(List.of(pickaxe), 0)); + player.setItemInHand(InteractionHand.MAIN_HAND, claw); + player.setExperienceLevels(1); + player.setExperiencePoints(0); + var pos = new BlockPos(5, 2, 5); + h.setBlock(pos, Blocks.IRON_ORE); + check(h, player.gameMode.destroyBlock(h.absolutePos(pos)), "Omni Claw must break a real block through the player path"); + check(h, MeltingEnchantment.availableExperience(player) == 6, + "Melting on an Omni Claw's internal pickaxe must consume exactly one XP point"); + check(h, level.getEntitiesOfClass(ItemEntity.class, new AABB(h.absolutePos(pos)).inflate(1)).stream() + .anyMatch(e -> e.getItem().is(Items.IRON_INGOT)), "Omni Claw and Melting must produce smelted loot together"); + h.succeed(); + } +} diff --git a/src/hfas/gametest/resources/META-INF/neoforge.mods.toml b/src/hfas/gametest/resources/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..f27c8a3 --- /dev/null +++ b/src/hfas/gametest/resources/META-INF/neoforge.mods.toml @@ -0,0 +1,14 @@ +license="All Rights Reserved" +[[mods]] +modId="ww_hfas_tests" +version="1.0" +displayName="Wild Wind Integration Tests" +[[dependencies.ww_hfas_tests]] +modId="ww_hfas" +type="required" +versionRange="[1.0.0,)" +ordering="AFTER" +side="BOTH" + +[[mixins]] +config="ww_hfas_tests.mixins.json" diff --git a/src/hfas/gametest/resources/data/ww_hfas_tests/structure/empty.nbt b/src/hfas/gametest/resources/data/ww_hfas_tests/structure/empty.nbt new file mode 100644 index 0000000000000000000000000000000000000000..1b63d36657f1a88c48210084cfcced954ce71090 GIT binary patch literal 113 zcmV-%0FM73iwFP!00002|0T+?3V<*W1JH;?TgAoCadvieKjnl&t z8lXfwlG4l}%H@InbudvLE|EvTrc}8d>YEN$ new FletchingTableMenu(containerId, playerInventory), + CONTAINER_TITLE + ); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new FletchingTableBlockEntity(pos, state); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/KilnBlock.java b/src/hfas/java/org/polaris2023/wildwind/hfas/block/KilnBlock.java new file mode 100644 index 0000000..7f7768e --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/block/KilnBlock.java @@ -0,0 +1,59 @@ +package org.polaris2023.wildwind.hfas.block; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.AbstractFurnaceBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import org.jspecify.annotations.Nullable; +import org.polaris2023.wildwind.hfas.block.entity.KilnBlockEntity; +import org.polaris2023.wildwind.hfas.block.entity.ModBlockEntities; + +public class KilnBlock extends AbstractFurnaceBlock { + public static final MapCodec CODEC = simpleCodec(KilnBlock::new); + + public KilnBlock(Properties properties) { super(properties); } + + @Override + public MapCodec codec() { return CODEC; } + + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new KilnBlockEntity(pos, state); } + + @Override + public @Nullable BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) { + return level instanceof ServerLevel server ? createTickerHelper(type, ModBlockEntities.KILN.get(), + (ignored, pos, blockState, kiln) -> KilnBlockEntity.tick(server, pos, blockState, kiln)) : null; + } + + @Override + protected void openContainer(Level level, BlockPos pos, Player player) { + if (level.getBlockEntity(pos) instanceof KilnBlockEntity kiln) player.openMenu(kiln); + } + + @Override + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + if (!state.getValue(LIT)) return; + double x = pos.getX() + 0.5, y = pos.getY(), z = pos.getZ() + 0.5; + if (random.nextDouble() < 0.1) { + level.playLocalSound(x, y, z, SoundEvents.FURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1, 1, false); + } + Direction facing = state.getValue(FACING); + double offset = random.nextDouble() * 0.6 - 0.3; + double dx = facing.getAxis() == Direction.Axis.X ? facing.getStepX() * 0.52 : offset; + double dz = facing.getAxis() == Direction.Axis.Z ? facing.getStepZ() * 0.52 : offset; + double dy = random.nextDouble() * 6 / 16; + level.addParticle(ParticleTypes.SMOKE, x + dx, y + dy, z + dz, 0, 0, 0); + level.addParticle(ParticleTypes.FLAME, x + dx, y + dy, z + dz, 0, 0, 0); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/ModBlocks.java b/src/hfas/java/org/polaris2023/wildwind/hfas/block/ModBlocks.java new file mode 100644 index 0000000..c74db5d --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/block/ModBlocks.java @@ -0,0 +1,611 @@ +package org.polaris2023.wildwind.hfas.block; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.worldgen.ModTreeGrowers; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +/** + * 方块注册类 + * 使用NeoForge 26.1的DeferredRegister方式注册方块 + * 注意:方块和物品分开注册,避免延迟注册bug + * + * @author baka4n + * @since 2026/04/15 + */ +//TODO 考虑迁移至registry目录下,或将registry目录下的注册条目分散到各目录下 +public class ModBlocks { + // 方块注册器 + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(HFASMod.MOD_ID); + // 物品注册器 + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(HFASMod.MOD_ID); + + public static final DeferredBlock KILN = BLOCKS.registerBlock("kiln", p -> new KilnBlock(p + .mapColor(MapColor.STONE).instrument(net.minecraft.world.level.block.state.properties.NoteBlockInstrument.BASEDRUM) + .requiresCorrectToolForDrops().strength(3.5F, 3.5F).sound(SoundType.STONE) + .lightLevel(state -> state.getValue(KilnBlock.LIT) ? 13 : 0).pushReaction(PushReaction.BLOCK))); + + // ==================== 方块类型定义 ==================== + + // 焚烬木方块类型 + public static final BlockSetType BLAZE_BLOCK_SET = BlockSetType.register(new BlockSetType("blaze")); + // 焚烬木木材类型 + public static final WoodType BLAZE_WOOD_TYPE = WoodType.register(new WoodType("blaze", BLAZE_BLOCK_SET)); + + // 灵焰木方块类型 + public static final BlockSetType SOUL_BLOCK_SET = BlockSetType.register(new BlockSetType("soul")); + // 灵焰木木材类型 + public static final WoodType SOUL_WOOD_TYPE = WoodType.register(new WoodType("soul", SOUL_BLOCK_SET)); + + // 杜鹃木方块类型 + public static final BlockSetType AZALEA_BLOCK_SET = BlockSetType.register(new BlockSetType("azalea")); + // 杜鹃木木材类型 + public static final WoodType AZALEA_WOOD_TYPE = WoodType.register(new WoodType("ww_hfas:azalea", AZALEA_BLOCK_SET)); + + // ==================== 焚烬木套件 (blaze_wood) ==================== + + // 焚烬木原木 + public static final DeferredBlock BLAZE_LOG = BLOCKS.registerBlock( + "blaze_log", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木 + public static final DeferredBlock BLAZE_WOOD = BLOCKS.registerBlock( + "blaze_wood", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 去皮焚烬木原木 + public static final DeferredBlock STRIPPED_BLAZE_LOG = BLOCKS.registerBlock( + "stripped_blaze_log", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 去皮焚烬木 + public static final DeferredBlock STRIPPED_BLAZE_WOOD = BLOCKS.registerBlock( + "stripped_blaze_wood", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木木板 + public static final DeferredBlock BLAZE_PLANKS = BLOCKS.registerBlock( + "blaze_planks", + p -> new Block(p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木楼梯 + public static final DeferredBlock BLAZE_STAIRS = BLOCKS.registerBlock( + "blaze_stairs", + p -> new StairBlock(BLAZE_PLANKS.get().defaultBlockState(), p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木台阶 + public static final DeferredBlock BLAZE_SLAB = BLOCKS.registerBlock( + "blaze_slab", + p -> new SlabBlock(p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木栅栏 + public static final DeferredBlock BLAZE_FENCE = BLOCKS.registerBlock( + "blaze_fence", + p -> new FenceBlock(p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木栅栏门 + public static final DeferredBlock BLAZE_FENCE_GATE = BLOCKS.registerBlock( + "blaze_fence_gate", + p -> new FenceGateBlock(BLAZE_WOOD_TYPE, p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木门 + public static final DeferredBlock BLAZE_DOOR = BLOCKS.registerBlock( + "blaze_door", + p -> new DoorBlock(BLAZE_BLOCK_SET, p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木活板门 + public static final DeferredBlock BLAZE_TRAPDOOR = BLOCKS.registerBlock( + "blaze_trapdoor", + p -> new TrapDoorBlock(BLAZE_BLOCK_SET, p + .mapColor(MapColor.COLOR_ORANGE) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木压力板 + public static final DeferredBlock BLAZE_PRESSURE_PLATE = BLOCKS.registerBlock( + "blaze_pressure_plate", + p -> new PressurePlateBlock(BLAZE_BLOCK_SET, p + .mapColor(MapColor.COLOR_ORANGE) + .strength(0.5F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木按钮 + public static final DeferredBlock BLAZE_BUTTON = BLOCKS.registerBlock( + "blaze_button", + p -> new ButtonBlock(BLAZE_BLOCK_SET, 30, p + .mapColor(MapColor.COLOR_ORANGE) + .strength(0.5F) + .sound(SoundType.WOOD)) + ); + + // 焚烬木树叶 + public static final DeferredBlock BLAZE_LEAVES = BLOCKS.registerBlock( + "blaze_leaves", + p -> new TintedParticleLeavesBlock(0.01F,p + .mapColor(MapColor.COLOR_ORANGE) + .strength(0.2F) + .sound(SoundType.GRASS) + .noOcclusion() + .randomTicks()) + ); + + // 焚烬木树苗 + public static final DeferredBlock BLAZE_SAPLING = BLOCKS.registerBlock( + "blaze_sapling", + p -> new SaplingBlock(ModTreeGrowers.BLAZE, p + .mapColor(MapColor.COLOR_ORANGE) + .noCollision() + .instabreak() + .sound(SoundType.GRASS) + .randomTicks()) + ); + + // ==================== 灵焰木套件 (soul_wood) ==================== + + // 灵焰木原木 + public static final DeferredBlock SOUL_LOG = BLOCKS.registerBlock( + "soul_log", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木 + public static final DeferredBlock SOUL_WOOD = BLOCKS.registerBlock( + "soul_wood", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 去皮灵焰木原木 + public static final DeferredBlock STRIPPED_SOUL_LOG = BLOCKS.registerBlock( + "stripped_soul_log", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 去皮灵焰木 + public static final DeferredBlock STRIPPED_SOUL_WOOD = BLOCKS.registerBlock( + "stripped_soul_wood", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木木板 + public static final DeferredBlock SOUL_PLANKS = BLOCKS.registerBlock( + "soul_planks", + p -> new Block(p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木楼梯 + public static final DeferredBlock SOUL_STAIRS = BLOCKS.registerBlock( + "soul_stairs", + p -> new StairBlock(SOUL_PLANKS.get().defaultBlockState(), p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木台阶 + public static final DeferredBlock SOUL_SLAB = BLOCKS.registerBlock( + "soul_slab", + p -> new SlabBlock(p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木栅栏 + public static final DeferredBlock SOUL_FENCE = BLOCKS.registerBlock( + "soul_fence", + p -> new FenceBlock(p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木栅栏门 + public static final DeferredBlock SOUL_FENCE_GATE = BLOCKS.registerBlock( + "soul_fence_gate", + p -> new FenceGateBlock(SOUL_WOOD_TYPE, p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木门 + public static final DeferredBlock SOUL_DOOR = BLOCKS.registerBlock( + "soul_door", + p -> new DoorBlock(SOUL_BLOCK_SET, p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木活板门 + public static final DeferredBlock SOUL_TRAPDOOR = BLOCKS.registerBlock( + "soul_trapdoor", + p -> new TrapDoorBlock(SOUL_BLOCK_SET, p + .mapColor(MapColor.COLOR_CYAN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木压力板 + public static final DeferredBlock SOUL_PRESSURE_PLATE = BLOCKS.registerBlock( + "soul_pressure_plate", + p -> new PressurePlateBlock(SOUL_BLOCK_SET, p + .mapColor(MapColor.COLOR_CYAN) + .strength(0.5F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木按钮 + public static final DeferredBlock SOUL_BUTTON = BLOCKS.registerBlock( + "soul_button", + p -> new ButtonBlock(SOUL_BLOCK_SET, 30, p + .mapColor(MapColor.COLOR_CYAN) + .strength(0.5F) + .sound(SoundType.WOOD)) + ); + + // 灵焰木树叶 + public static final DeferredBlock SOUL_LEAVES = BLOCKS.registerBlock( + "soul_leaves", + p -> new TintedParticleLeavesBlock(0.01F, p + .mapColor(MapColor.COLOR_CYAN) + .strength(0.2F) + .sound(SoundType.GRASS) + .noOcclusion() + .randomTicks()) + ); + + // 灵焰木树苗 + public static final DeferredBlock SOUL_SAPLING = BLOCKS.registerBlock( + "soul_sapling", + p -> new SaplingBlock(ModTreeGrowers.SOUL, p + .mapColor(MapColor.COLOR_CYAN) + .noCollision() + .instabreak() + .sound(SoundType.GRASS) + .randomTicks()) + ); + + // ==================== 杜鹃木套件 (azalea_wood) ==================== + + // 杜鹃木原木 + public static final DeferredBlock AZALEA_LOG = BLOCKS.registerBlock( + "azalea_log", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木 + public static final DeferredBlock AZALEA_WOOD = BLOCKS.registerBlock( + "azalea_wood", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 去皮杜鹃木原木 + public static final DeferredBlock STRIPPED_AZALEA_LOG = BLOCKS.registerBlock( + "stripped_azalea_log", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 去皮杜鹃木 + public static final DeferredBlock STRIPPED_AZALEA_WOOD = BLOCKS.registerBlock( + "stripped_azalea_wood", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木木板 + public static final DeferredBlock AZALEA_PLANKS = BLOCKS.registerBlock( + "azalea_planks", + p -> new Block(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木楼梯 + public static final DeferredBlock AZALEA_STAIRS = BLOCKS.registerBlock( + "azalea_stairs", + p -> new StairBlock(AZALEA_PLANKS.get().defaultBlockState(), p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木台阶 + public static final DeferredBlock AZALEA_SLAB = BLOCKS.registerBlock( + "azalea_slab", + p -> new SlabBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木栅栏 + public static final DeferredBlock AZALEA_FENCE = BLOCKS.registerBlock( + "azalea_fence", + p -> new FenceBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木栅栏门 + public static final DeferredBlock AZALEA_FENCE_GATE = BLOCKS.registerBlock( + "azalea_fence_gate", + p -> new FenceGateBlock(AZALEA_WOOD_TYPE, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木门 + public static final DeferredBlock AZALEA_DOOR = BLOCKS.registerBlock( + "azalea_door", + p -> new DoorBlock(AZALEA_BLOCK_SET, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木活板门 + public static final DeferredBlock AZALEA_TRAPDOOR = BLOCKS.registerBlock( + "azalea_trapdoor", + p -> new TrapDoorBlock(AZALEA_BLOCK_SET, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木压力板 + public static final DeferredBlock AZALEA_PRESSURE_PLATE = BLOCKS.registerBlock( + "azalea_pressure_plate", + p -> new PressurePlateBlock(AZALEA_BLOCK_SET, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(0.5F) + .sound(SoundType.WOOD)) + ); + + // 杜鹃木按钮 + public static final DeferredBlock AZALEA_BUTTON = BLOCKS.registerBlock( + "azalea_button", + p -> new ButtonBlock(AZALEA_BLOCK_SET, 30, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(0.5F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_SIGN = BLOCKS.registerBlock("azalea_sign", + p -> new StandingSignBlock(AZALEA_WOOD_TYPE, p), () -> signProperties(Blocks.OAK_SIGN)); + public static final DeferredBlock AZALEA_WALL_SIGN = BLOCKS.registerBlock("azalea_wall_sign", + p -> new WallSignBlock(AZALEA_WOOD_TYPE, p.overrideLootTable(AZALEA_SIGN.get().getLootTable())), () -> signProperties(Blocks.OAK_WALL_SIGN)); + public static final DeferredBlock AZALEA_HANGING_SIGN = BLOCKS.registerBlock("azalea_hanging_sign", + p -> new CeilingHangingSignBlock(AZALEA_WOOD_TYPE, p), () -> signProperties(Blocks.OAK_HANGING_SIGN)); + public static final DeferredBlock AZALEA_WALL_HANGING_SIGN = BLOCKS.registerBlock("azalea_wall_hanging_sign", + p -> new WallHangingSignBlock(AZALEA_WOOD_TYPE, p.overrideLootTable(AZALEA_HANGING_SIGN.get().getLootTable())), () -> signProperties(Blocks.OAK_WALL_HANGING_SIGN)); + public static final DeferredBlock AZALEA_SHELF = BLOCKS.registerBlock("azalea_shelf", + AzaleaShelfBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_SHELF) + .strength(2.0F, 3.0F).mapColor(MapColor.COLOR_LIGHT_GREEN).pushReaction(PushReaction.BLOCK)); + + private static BlockBehaviour.Properties signProperties(Block template) { + return BlockBehaviour.Properties.ofFullCopy(template).strength(1.0F, 1.0F) + .mapColor(MapColor.COLOR_LIGHT_GREEN).pushReaction(PushReaction.BLOCK); + } + + // ==================== 其他方块 ==================== + + // 焦灰草方块 (scorched_grass_block) + public static final DeferredBlock SCORCHED_GRASS_BLOCK = BLOCKS.registerBlock( + "scorched_grass_block", + p -> new Block(p + .mapColor(MapColor.COLOR_BLACK) + .strength(0.6F) + .sound(SoundType.GRASS) + .randomTicks()) + ); + + // 焦土 (scorched_dirt) + public static final DeferredBlock SCORCHED_DIRT = BLOCKS.registerBlock( + "scorched_dirt", + p -> new Block(p + .mapColor(MapColor.COLOR_BLACK) + .strength(0.5F) + .sound(SoundType.GRAVEL)) + ); + + // 焦灰草丛 (scorched_grass) + public static final DeferredBlock SCORCHED_GRASS = BLOCKS.registerBlock( + "scorched_grass", + p -> new Block(p + .mapColor(MapColor.COLOR_BLACK) + .noCollision() + .instabreak() + .sound(SoundType.GRASS) + .pushReaction(PushReaction.DESTROY)) + ); + + // 焦灰枝条 (scorched_twig) + public static final DeferredBlock SCORCHED_TWIG = BLOCKS.registerBlock( + "scorched_twig", + p -> new Block(p + .mapColor(MapColor.COLOR_BLACK) + .noCollision() + .instabreak() + .sound(SoundType.WOOD) + .pushReaction(PushReaction.DESTROY)) + ); + + // 仙人球 (tiny_cactus) + public static final DeferredBlock TINY_CACTUS = BLOCKS.registerBlock( + "tiny_cactus", + p -> new Block(p + .mapColor(MapColor.PLANT) + .noCollision() + .instabreak() + .sound(SoundType.WOOL) + .pushReaction(PushReaction.DESTROY)) + ); + + // 制箭台 (fletching_table) - 使用自定义方块类支持GUI + public static final DeferredBlock FLETCHING_TABLE = BLOCKS.registerBlock( + "fletching_table", + p -> new FletchingTableBlock(p + .mapColor(MapColor.WOOD) + .strength(2.5F) + .sound(SoundType.WOOD)) + ); + + public static void blockItems() { + // 焚烬木套件物品 + ITEMS.registerSimpleBlockItem(BLAZE_LOG); + ITEMS.registerSimpleBlockItem(BLAZE_WOOD); + ITEMS.registerSimpleBlockItem(STRIPPED_BLAZE_LOG); + ITEMS.registerSimpleBlockItem(STRIPPED_BLAZE_WOOD); + ITEMS.registerSimpleBlockItem(BLAZE_PLANKS); + ITEMS.registerSimpleBlockItem(BLAZE_STAIRS); + ITEMS.registerSimpleBlockItem(BLAZE_SLAB); + ITEMS.registerSimpleBlockItem(BLAZE_FENCE); + ITEMS.registerSimpleBlockItem(BLAZE_FENCE_GATE); + ITEMS.registerSimpleBlockItem(BLAZE_DOOR); + ITEMS.registerSimpleBlockItem(BLAZE_TRAPDOOR); + ITEMS.registerSimpleBlockItem(BLAZE_PRESSURE_PLATE); + ITEMS.registerSimpleBlockItem(BLAZE_BUTTON); + ITEMS.registerSimpleBlockItem(BLAZE_LEAVES); + ITEMS.registerSimpleBlockItem(BLAZE_SAPLING); + + // 灵焰木套件物品 + ITEMS.registerSimpleBlockItem(SOUL_LOG); + ITEMS.registerSimpleBlockItem(SOUL_WOOD); + ITEMS.registerSimpleBlockItem(STRIPPED_SOUL_LOG); + ITEMS.registerSimpleBlockItem(STRIPPED_SOUL_WOOD); + ITEMS.registerSimpleBlockItem(SOUL_PLANKS); + ITEMS.registerSimpleBlockItem(SOUL_STAIRS); + ITEMS.registerSimpleBlockItem(SOUL_SLAB); + ITEMS.registerSimpleBlockItem(SOUL_FENCE); + ITEMS.registerSimpleBlockItem(SOUL_FENCE_GATE); + ITEMS.registerSimpleBlockItem(SOUL_DOOR); + ITEMS.registerSimpleBlockItem(SOUL_TRAPDOOR); + ITEMS.registerSimpleBlockItem(SOUL_PRESSURE_PLATE); + ITEMS.registerSimpleBlockItem(SOUL_BUTTON); + ITEMS.registerSimpleBlockItem(SOUL_LEAVES); + ITEMS.registerSimpleBlockItem(SOUL_SAPLING); + + // 杜鹃木套件物品 + ITEMS.registerSimpleBlockItem(AZALEA_LOG); + ITEMS.registerSimpleBlockItem(AZALEA_WOOD); + ITEMS.registerSimpleBlockItem(STRIPPED_AZALEA_LOG); + ITEMS.registerSimpleBlockItem(STRIPPED_AZALEA_WOOD); + ITEMS.registerSimpleBlockItem(AZALEA_PLANKS); + ITEMS.registerSimpleBlockItem(AZALEA_STAIRS); + ITEMS.registerSimpleBlockItem(AZALEA_SLAB); + ITEMS.registerSimpleBlockItem(AZALEA_FENCE); + ITEMS.registerSimpleBlockItem(AZALEA_FENCE_GATE); + ITEMS.registerSimpleBlockItem(AZALEA_DOOR); + ITEMS.registerSimpleBlockItem(AZALEA_TRAPDOOR); + ITEMS.registerSimpleBlockItem(AZALEA_PRESSURE_PLATE); + ITEMS.registerSimpleBlockItem(AZALEA_BUTTON); + ITEMS.registerItem("azalea_sign", p -> new net.minecraft.world.item.SignItem(AZALEA_SIGN.get(), AZALEA_WALL_SIGN.get(), p.stacksTo(16).useBlockDescriptionPrefix())); + ITEMS.registerItem("azalea_hanging_sign", p -> new net.minecraft.world.item.HangingSignItem(AZALEA_HANGING_SIGN.get(), AZALEA_WALL_HANGING_SIGN.get(), p.stacksTo(16).useBlockDescriptionPrefix())); + ITEMS.registerSimpleBlockItem(AZALEA_SHELF, () -> new Item.Properties().component(net.minecraft.core.component.DataComponents.CONTAINER, net.minecraft.world.item.component.ItemContainerContents.EMPTY)); + + // 其他方块物品 + ITEMS.registerSimpleBlockItem(SCORCHED_GRASS_BLOCK); + ITEMS.registerSimpleBlockItem(SCORCHED_DIRT); + ITEMS.registerSimpleBlockItem(SCORCHED_GRASS); + ITEMS.registerSimpleBlockItem(SCORCHED_TWIG); + ITEMS.registerSimpleBlockItem(TINY_CACTUS); + ITEMS.registerSimpleBlockItem(KILN); + } + + /** + * 注册方块和物品到事件总线 + * 必须在模组构造函数中调用 + */ + public static void register(IEventBus bus) { + BLOCKS.register(bus); + blockItems(); + ITEMS.register(bus); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/FletchingTableBlockEntity.java b/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/FletchingTableBlockEntity.java new file mode 100644 index 0000000..11eaaed --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/FletchingTableBlockEntity.java @@ -0,0 +1,132 @@ +package org.polaris2023.wildwind.hfas.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.world.Container; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; + +/** + * 制箭台方块实体 + * + * @author baka4n + * @since 2026/04/15 + */ +public class FletchingTableBlockEntity extends BlockEntity implements Container { + public static int CONTAINER_SIZE = 0; + public enum Slots { + SLOT_FLETCHING, // 箭羽槽 + SLOT_SHAFT, // 箭羽槽 + SLOT_HEAD, // 箭头槽 + SLOT_FUEL, // 消耗槽 + SLOT_RESULT // 输出槽 + ; + + public final int slot; + + Slots() { + slot = CONTAINER_SIZE; + CONTAINER_SIZE++; + } + + public Slot toSlot(Container c, int x, int z) { + return new Slot(c, slot, x, z); + } + + public ItemStack remove(Container c, int size) { + return c.removeItem(slot, size); + } + } + + private final NonNullList items = NonNullList.withSize(CONTAINER_SIZE, ItemStack.EMPTY); + + + public FletchingTableBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.FLETCHING_TABLE.get(), pos, state); + + } + + @Override + public int getContainerSize() { + return CONTAINER_SIZE; + } + + @Override + public boolean isEmpty() { + for (ItemStack stack : items) { + if (!stack.isEmpty()) { + return false; + } + } + return true; + } + + @Override + public ItemStack getItem(int slot) { + return slot >= 0 && slot < items.size() ? items.get(slot) : ItemStack.EMPTY; + } + + @Override + public ItemStack removeItem(int slot, int amount) { + return ContainerHelper.removeItem(items, slot, amount); + } + + @Override + public ItemStack removeItemNoUpdate(int slot) { + return ContainerHelper.takeItem(items, slot); + } + + @Override + public void setItem(int slot, ItemStack stack) { + if (slot >= 0 && slot < items.size()) { + items.set(slot, stack); + if (stack.getCount() > getMaxStackSize()) { + stack.setCount(getMaxStackSize()); + } + setChanged(); + } + } + + @Override + public void setChanged() { + super.setChanged(); + if (level != null) { + level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 3); + } + } + + @Override + public boolean stillValid(Player player) { + if (level == null) { + return false; + } + if (level.getBlockEntity(worldPosition) != this) { + return false; + } + return player.distanceToSqr(worldPosition.getX() + 0.5, worldPosition.getY() + 0.5, worldPosition.getZ() + 0.5) <= 64.0; + } + + @Override + public void clearContent() { + items.clear(); + setChanged(); + } + + @Override + protected void saveAdditional(ValueOutput output) { + super.saveAdditional(output); + ContainerHelper.saveAllItems(output, items); + } + + @Override + public void loadAdditional(ValueInput input) { + super.loadAdditional(input); + ContainerHelper.loadAllItems(input, items); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/KilnBlockEntity.java b/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/KilnBlockEntity.java new file mode 100644 index 0000000..3d8ca69 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/KilnBlockEntity.java @@ -0,0 +1,101 @@ +package org.polaris2023.wildwind.hfas.block.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.block.AbstractFurnaceBlock; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.polaris2023.wildwind.hfas.menu.KilnMenu; +import org.polaris2023.wildwind.hfas.recipe.KilnRecipes; +import org.polaris2023.wildwind.hfas.mixin.FurnaceFuelAccessor; + +/** Vanilla inventory, sided transfer, persistence, locking and experience accounting; kiln-specific cooking. */ +public class KilnBlockEntity extends AbstractFurnaceBlockEntity { + public KilnBlockEntity(BlockPos pos, BlockState state) { + super(ModBlockEntities.KILN.get(), pos, state, RecipeType.SMELTING); + } + + @Override + protected Component getDefaultName() { return Component.translatable("block.ww_hfas.kiln"); } + + @Override + protected AbstractContainerMenu createMenu(int id, Inventory inventory) { + return new KilnMenu(id, inventory, this, dataAccess); + } + + @Override + public boolean canPlaceItem(int slot, ItemStack stack) { + if (slot == SLOT_INPUT) return level != null && KilnRecipes.find(level, stack).isPresent(); + return super.canPlaceItem(slot, stack); + } + + public static void tick(ServerLevel level, BlockPos pos, BlockState state, KilnBlockEntity kiln) { + var data = kiln.dataAccess; + int rawRemaining = ((FurnaceFuelAccessor) kiln).wildwind$remainingFuel(); + boolean wasLit = rawRemaining > 0; + // Match the furnace's fuel countdown; fuel durations are unchanged (coal lasts 1600 ticks). + int remaining = Math.max(0, rawRemaining - 1); + data.set(DATA_LIT_TIME, remaining); + data.set(DATA_COOKING_TOTAL_TIME, KilnRecipes.COOK_TIME); + var input = kiln.items.get(SLOT_INPUT); + var fuel = kiln.items.get(SLOT_FUEL); + var recipe = KilnRecipes.find(level, input).orElse(null); + var result = recipe == null ? ItemStack.EMPTY : recipe.value().assemble(new SingleRecipeInput(input)); + boolean canCook = !result.isEmpty() && kiln.canAcceptResult(result); + boolean changed = wasLit; + if (remaining == 0 && canCook && !fuel.isEmpty()) { + remaining = kiln.getBurnDuration(level.fuelValues(), fuel); + data.set(DATA_LIT_TIME, remaining); + data.set(DATA_LIT_DURATION, remaining); + if (remaining > 0) { + var remainder = fuel.getCraftingRemainder(); + fuel.shrink(1); + if (fuel.isEmpty()) kiln.items.set(SLOT_FUEL, remainder == null ? ItemStack.EMPTY : remainder.create()); + changed = true; + } + } + int progress = data.get(DATA_COOKING_PROGRESS); + if (remaining > 0 && canCook) { + progress++; + if (progress >= KilnRecipes.COOK_TIME) { + progress = 0; + var output = kiln.items.get(SLOT_RESULT); + if (output.isEmpty()) kiln.items.set(SLOT_RESULT, result.copy()); + else output.grow(result.getCount()); + if (input.is(Items.WET_SPONGE) && kiln.items.get(SLOT_FUEL).is(Items.BUCKET)) { + kiln.items.set(SLOT_FUEL, new ItemStack(Items.WATER_BUCKET)); + } + input.shrink(1); + kiln.setRecipeUsed(recipe); + } + changed = true; + } else if (!canCook) { + changed |= progress != 0; + progress = 0; + } else if (progress > 0) { + progress = Math.max(0, progress - BURN_COOL_SPEED); + changed = true; + } + data.set(DATA_COOKING_PROGRESS, progress); + boolean isLit = remaining > 0; + if (state.getValue(AbstractFurnaceBlock.LIT) != isLit) { + level.setBlock(pos, state.setValue(AbstractFurnaceBlock.LIT, isLit), 3); + changed = true; + } + if (changed) kiln.setChanged(); + } + + private boolean canAcceptResult(ItemStack result) { + var output = items.get(SLOT_RESULT); + int limit = Math.min(getMaxStackSize(), result.getMaxStackSize()); + return output.isEmpty() ? result.getCount() <= limit + : ItemStack.isSameItemSameComponents(output, result) && output.getCount() + result.getCount() <= limit; + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/ModBlockEntities.java b/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/ModBlockEntities.java new file mode 100644 index 0000000..86650d9 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/ModBlockEntities.java @@ -0,0 +1,50 @@ +package org.polaris2023.wildwind.hfas.block.entity; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; + +/** + * 方块实体注册类 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModBlockEntities { + public static final DeferredRegister> BLOCK_ENTITIES = + DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, HFASMod.MOD_ID); + + // 制箭台方块实体 + public static final DeferredHolder, BlockEntityType> FLETCHING_TABLE = + BLOCK_ENTITIES.register( + "fletching_table", + () -> new BlockEntityType<>( + FletchingTableBlockEntity::new, + ModBlocks.FLETCHING_TABLE.get() + ) + ); + + public static void register(IEventBus bus) { + BLOCK_ENTITIES.register(bus); + bus.addListener(ModBlockEntities::registerCapabilities); + bus.addListener(ModBlockEntities::addVanillaBlocks); + } + + private static void addVanillaBlocks(net.neoforged.neoforge.event.BlockEntityTypeAddBlocksEvent event) { + event.modify(net.minecraft.world.level.block.entity.BlockEntityTypes.SIGN, ModBlocks.AZALEA_SIGN.get(), ModBlocks.AZALEA_WALL_SIGN.get()); + event.modify(net.minecraft.world.level.block.entity.BlockEntityTypes.HANGING_SIGN, ModBlocks.AZALEA_HANGING_SIGN.get(), ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); + event.modify(net.minecraft.world.level.block.entity.BlockEntityTypes.SHELF, ModBlocks.AZALEA_SHELF.get()); + } + + private static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent event) { + event.registerBlockEntity(net.neoforged.neoforge.capabilities.Capabilities.Item.BLOCK, KILN.get(), + net.neoforged.neoforge.transfer.item.WorldlyContainerWrapper::new); + } + + public static final DeferredHolder, BlockEntityType> KILN = + BLOCK_ENTITIES.register("kiln", () -> new BlockEntityType<>(KilnBlockEntity::new, ModBlocks.KILN.get())); +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/AzaleaSignState.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/AzaleaSignState.java new file mode 100644 index 0000000..4e7d941 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/AzaleaSignState.java @@ -0,0 +1,6 @@ +package org.polaris2023.wildwind.hfas.client; + +public interface AzaleaSignState { + boolean wildwind$isAzalea(); + void wildwind$setAzalea(boolean azalea); +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/KilnScreen.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/KilnScreen.java new file mode 100644 index 0000000..497eb48 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/KilnScreen.java @@ -0,0 +1,38 @@ +package org.polaris2023.wildwind.hfas.client; + +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Inventory; +import org.polaris2023.wildwind.hfas.menu.KilnMenu; + +/** Uses Minecraft's furnace artwork while keeping the kiln's server-side input rules. */ +public class KilnScreen extends AbstractContainerScreen { + private static final Identifier TEXTURE = Identifier.withDefaultNamespace("textures/gui/container/furnace.png"); + private static final Identifier FIRE = Identifier.withDefaultNamespace("container/furnace/lit_progress"); + private static final Identifier PROGRESS = Identifier.withDefaultNamespace("container/furnace/burn_progress"); + + public KilnScreen(KilnMenu menu, Inventory inventory, Component title) { super(menu, inventory, title); } + + @Override + protected void init() { + super.init(); + titleLabelX = (imageWidth - font.width(title)) / 2; + } + + @Override + public void extractBackground(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTick) { + super.extractBackground(graphics, mouseX, mouseY, partialTick); + graphics.blit(RenderPipelines.GUI_TEXTURED, TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight, 256, 256); + if (menu.isLit()) { + int height = Mth.ceil(menu.getLitProgress() * 13) + 1; + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, FIRE, 14, 14, 0, 14 - height, + leftPos + 56, topPos + 50 - height, 14, height); + } + int width = Mth.ceil(menu.getBurnProgress() * 24); + if (width > 0) graphics.blitSprite(RenderPipelines.GUI_TEXTURED, PROGRESS, 24, 16, 0, 0, leftPos + 79, topPos + 34, width, 16); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModClientHooks.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModClientHooks.java new file mode 100644 index 0000000..6ee0e30 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModClientHooks.java @@ -0,0 +1,83 @@ +package org.polaris2023.wildwind.hfas.client; + +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.RegisterClientTooltipComponentFactoriesEvent; +import net.neoforged.neoforge.client.event.ScreenEvent; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.client.tooltip.ClientOmniClawTooltip; +import org.polaris2023.wildwind.hfas.component.OmniClawTools; +import org.polaris2023.wildwind.hfas.network.payload.ServerBoundSelectOmniClawItemPayload; +import org.polaris2023.wildwind.hfas.registry.ModDataComponents; + +import java.util.List; + +/** + * 客户端侧钩子与界面注册入口喵~ + *

+ * 26.2 迁移说明:PacketDistributor.sendToServer 迁移至 ClientPacketDistributor; + * AbstractContainerScreen#getSlotUnderMouse 废弃,改用 getHoveredSlot()。 + */ +@EventBusSubscriber(modid = HFASMod.MOD_ID, value = Dist.CLIENT) +public class ModClientHooks { + + @SubscribeEvent + static void registerScreens(net.neoforged.neoforge.client.event.RegisterMenuScreensEvent event) { + event.register(org.polaris2023.wildwind.hfas.menu.ModMenus.KILN.get(), KilnScreen::new); + } + + /** + * 注册全能蟹钳的客户端提示组件工厂喵~ + * + * @param event 客户端提示组件注册事件喵~ + */ + @SubscribeEvent + static void onRegisterClientTooltipComponent(RegisterClientTooltipComponentFactoriesEvent event) { + event.register(OmniClawTools.class, ClientOmniClawTooltip::new); + } + + /** + * 处理容器界面中的滚轮选中工具切换并发包同步喵~ + * + * @param event 滚轮前事件喵~ + */ + @SubscribeEvent + static void onScreenPreMouseScroll(ScreenEvent.MouseScrolled.Pre event) { + if (!(event.getScreen() instanceof AbstractContainerScreen screen)) return; + Slot slot = screen.getHoveredSlot(); + + if (slot == null) return; + ItemStack hoverItem = slot.getItem(); + + if (!hoverItem.has(ModDataComponents.OMNI_CLAW_TOOLS.get())) return; + OmniClawTools tools = hoverItem.get(ModDataComponents.OMNI_CLAW_TOOLS.get()); + + if (tools.getNonEmptyItemCount() < 2) return; + double y = event.getScrollDeltaY(); + int index = tools.getSelectedToolIndex(); + int delta = (int) Math.signum(y == 0 ? event.getScrollDeltaX() : -y); + List toolStacks = tools.getTools(); + + int start = index; + int size = toolStacks.size(); + do { + index = (index + delta + size) % size; + + ItemStack stack = toolStacks.get(index); + if (stack != null && !stack.isEmpty()) { + break; + } + } while (index != start); + + ClientPacketDistributor.sendToServer(new ServerBoundSelectOmniClawItemPayload(slot.index, index)); + event.setCanceled(true); + } + + private ModClientHooks() { + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModEntityRenderers.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModEntityRenderers.java new file mode 100644 index 0000000..1ee3887 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModEntityRenderers.java @@ -0,0 +1,26 @@ +package org.polaris2023.wildwind.hfas.client; + +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.registry.ModEntities; + +@EventBusSubscriber(modid = HFASMod.MOD_ID, value = Dist.CLIENT) +public final class ModEntityRenderers { + private ModEntityRenderers() {} + + @SubscribeEvent + public static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { + event.registerEntityRenderer(ModEntities.MUDDY_PIG.get(), MuddyPigRenderer::new); + event.registerEntityRenderer(ModEntities.REACH_ARROW.get(), net.minecraft.client.renderer.entity.TippableArrowRenderer::new); + } + + @SubscribeEvent + public static void registerLayers(EntityRenderersEvent.RegisterLayerDefinitions event) { + event.registerLayerDefinition(MuddyPigRenderer.ADULT, MuddyPigModel::adultLayer); + event.registerLayerDefinition(MuddyPigRenderer.BABY, MuddyPigModel::babyLayer); + event.registerLayerDefinition(MuddyPigRenderer.SADDLE, MuddyPigModel::saddleLayer); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigModel.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigModel.java new file mode 100644 index 0000000..c4598ef --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigModel.java @@ -0,0 +1,71 @@ +package org.polaris2023.wildwind.hfas.client; + +import net.minecraft.client.model.animal.pig.PigModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.model.geom.builders.CubeListBuilder; +import net.minecraft.client.model.geom.builders.LayerDefinition; +import net.minecraft.client.model.geom.builders.MeshDefinition; +import net.minecraft.client.model.geom.builders.PartDefinition; + +/** Geometry/UVs from the supplied Blockbench files; animation is inherited from PigModel. */ +public final class MuddyPigModel extends PigModel { + public MuddyPigModel(ModelPart root) { + super(root); + } + + public static LayerDefinition adultLayer() { + return adultLayer(CubeDeformation.NONE, true); + } + + public static LayerDefinition saddleLayer() { + return adultLayer(new CubeDeformation(0.5F), false); + } + + private static LayerDefinition adultLayer(CubeDeformation deformation, boolean flower) { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition root = mesh.getRoot(); + CubeListBuilder head = CubeListBuilder.create() + .texOffs(0, 0).addBox(-4, -4, -8, 8, 8, 8, deformation) + .texOffs(16, 16).addBox(-2, 0, -9, 4, 3, 1, deformation); + if (flower) { + head.texOffs(24, -4).addBox(0, -10, -9, 0, 6, 6) + .texOffs(24, 2).addBox(-3, -10, -6, 6, 6, 0); + } + root.addOrReplaceChild("head", head, PartPose.offset(0, 10, -7)); + // Recenter the authored rotated body without changing its transformed geometry or UVs. + root.addOrReplaceChild("body", CubeListBuilder.create().texOffs(28, 8) + .addBox(-5, -8, -4, 10, 16, 8, deformation), + PartPose.offsetAndRotation(0, 14, 0, (float) (Math.PI / 2), 0, 0)); + leg(root, "right_hind_leg", -3, 18, 6, 4, 6, 0, 16, deformation); + leg(root, "left_hind_leg", 3, 18, 6, 4, 6, 0, 16, deformation); + leg(root, "right_front_leg", -3, 18, -6, 4, 6, 0, 16, deformation); + leg(root, "left_front_leg", 3, 18, -6, 4, 6, 0, 16, deformation); + return LayerDefinition.create(mesh, 64, 64); + } + + public static LayerDefinition babyLayer() { + MeshDefinition mesh = new MeshDefinition(); + PartDefinition root = mesh.getRoot(); + // Blockbench Java coordinates are (-x, 24-y, z). Preserve the baby's authored offset. + root.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 0) + .addBox(-3.5F, -3, -4.5F, 7, 6, 9), PartPose.offset(-0.5F, 19, 0.5F)); + root.addOrReplaceChild("head", CubeListBuilder.create() + .texOffs(0, 15).addBox(-3.5F, -5, -5, 7, 6, 6) + .texOffs(6, 27).addBox(-1.5F, -2, -6, 3, 2, 1) + .texOffs(0, 14).addBox(-0.5F, -9, -5, 0, 4, 3) + .texOffs(0, 17).addBox(-2, -9, -3, 3, 4, 0), PartPose.offset(-0.5F, 19, -2)); + leg(root, "left_hind_leg", 2, 22, 4, 2, 2, 0, 0, CubeDeformation.NONE); + leg(root, "right_hind_leg", -3, 22, 4, 2, 2, 23, 0, CubeDeformation.NONE); + leg(root, "left_front_leg", 2, 22, -3, 2, 2, 0, 4, CubeDeformation.NONE); + leg(root, "right_front_leg", -3, 22, -3, 2, 2, 23, 4, CubeDeformation.NONE); + return LayerDefinition.create(mesh, 32, 32); + } + + private static void leg(PartDefinition root, String name, float x, float y, float z, + float width, float height, int u, int v, CubeDeformation deformation) { + root.addOrReplaceChild(name, CubeListBuilder.create().texOffs(u, v) + .addBox(-width / 2, 0, -width / 2, width, height, width, deformation), PartPose.offset(x, y, z)); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigRenderer.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigRenderer.java new file mode 100644 index 0000000..6d0b189 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigRenderer.java @@ -0,0 +1,63 @@ +package org.polaris2023.wildwind.hfas.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.AdultAndBabyModelPair; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.client.renderer.entity.layers.SimpleEquipmentLayer; +import net.minecraft.client.renderer.entity.state.PigRenderState; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.resources.model.EquipmentClientInfo; +import net.minecraft.resources.Identifier; +import net.minecraft.world.entity.EquipmentSlot; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.entity.MuddyPig; + +public final class MuddyPigRenderer extends MobRenderer { + public static final ModelLayerLocation ADULT = layer("main"); + public static final ModelLayerLocation BABY = layer("baby"); + public static final ModelLayerLocation SADDLE = layer("saddle"); + private static final Identifier ADULT_TEXTURE = texture("pig_muddy"); + private static final Identifier BABY_TEXTURE = texture("pig_muddy_baby"); + private final AdultAndBabyModelPair models; + + public MuddyPigRenderer(EntityRendererProvider.Context context) { + super(context, new MuddyPigModel(context.bakeLayer(ADULT)), 0.7F); + models = new AdultAndBabyModelPair<>(model, new MuddyPigModel(context.bakeLayer(BABY))); + addLayer(new SimpleEquipmentLayer<>(this, context.getEquipmentRenderer(), + EquipmentClientInfo.LayerType.PIG_SADDLE, state -> state.saddle, + new MuddyPigModel(context.bakeLayer(SADDLE)), null)); + } + + @Override + public void submit(PigRenderState state, PoseStack poseStack, SubmitNodeCollector collector, CameraRenderState camera) { + model = models.getModel(state.isBaby); + super.submit(state, poseStack, collector, camera); + } + + @Override + public Identifier getTextureLocation(PigRenderState state) { + return state.isBaby ? BABY_TEXTURE : ADULT_TEXTURE; + } + + @Override + public PigRenderState createRenderState() { + return new PigRenderState(); + } + + @Override + public void extractRenderState(MuddyPig entity, PigRenderState state, float partialTicks) { + super.extractRenderState(entity, state, partialTicks); + state.saddle = entity.getItemBySlot(EquipmentSlot.SADDLE).copy(); + } + + private static ModelLayerLocation layer(String name) { + return new ModelLayerLocation(Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "muddy_pig"), name); + } + + private static Identifier texture(String name) { + return Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "textures/entity/pig/" + name + ".png"); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/MudcrabModel.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/MudcrabModel.java new file mode 100644 index 0000000..df0980d --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/MudcrabModel.java @@ -0,0 +1,32 @@ +package org.polaris2023.wildwind.hfas.client.entity.model; + + +import com.geckolib.model.DefaultedEntityGeoModel; +import com.geckolib.renderer.base.GeoRenderState; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.resources.Identifier; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.client.entity.renderstate.MudcrabRenderState; +import org.polaris2023.wildwind.hfas.entity.animal.Mudcrab; + +/** + * 泥沼蟹实体的几何模型定义喵~ + */ +public class MudcrabModel extends DefaultedEntityGeoModel { + + /** + * 创建泥沼蟹模型实例喵~ + */ + public MudcrabModel() { + super(HFASMod.id("mudcrab")); + } + + /** + * 获取当前泥沼蟹变种对应的材质资源喵~ + *

+ */ + @Override + public Identifier getTextureResource(GeoRenderState state) { + return ((MudcrabRenderState) state).variant.assetInfo().texturePath(); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/PiranhaModel.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/PiranhaModel.java new file mode 100644 index 0000000..00e35fb --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/PiranhaModel.java @@ -0,0 +1,28 @@ +package org.polaris2023.wildwind.hfas.client.entity.model; + +import com.geckolib.model.DefaultedEntityGeoModel; +import com.geckolib.renderer.base.GeoRenderState; +import net.minecraft.resources.Identifier; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.entity.animal.Piranha; + +/** + * 食人鱼实体的几何模型定义喵~ + */ +public class PiranhaModel extends DefaultedEntityGeoModel { + + /** + * 创建食人鱼模型实例喵~ + */ + public PiranhaModel() { + super(HFASMod.id("piranha")); + } + + /** + * 获取当前食人鱼对应的材质资源喵~ + */ + @Override + public Identifier getTextureResource(GeoRenderState state) { + return HFASMod.id("textures/entity/piranha.png"); + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/MudcrabRenderer.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/MudcrabRenderer.java new file mode 100644 index 0000000..9a7d594 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/MudcrabRenderer.java @@ -0,0 +1,83 @@ +package org.polaris2023.wildwind.hfas.client.entity.renderer; + +import com.geckolib.renderer.GeoEntityRenderer; +import com.geckolib.renderer.base.RenderPassInfo; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +import net.minecraft.client.renderer.item.ItemModelResolver; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.LivingEntity; +import org.polaris2023.wildwind.hfas.client.entity.model.MudcrabModel; +import org.polaris2023.wildwind.hfas.client.entity.renderstate.MudcrabRenderState; +import org.polaris2023.wildwind.hfas.entity.animal.Mudcrab; + +import javax.annotation.Nullable; + +/** + * 泥沼蟹实体渲染器喵~ + */ +public class MudcrabRenderer extends GeoEntityRenderer { + /** + * 创建泥沼蟹实体渲染器喵~ + * + * @param renderManager 实体渲染上下文喵~ + */ + public MudcrabRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new MudcrabModel()); + } + + //泛型退化:GeoRenderState由geocklib在运行时注入到EntityRenderState类,不由用户开发者自行实现,但直接使用EntityRenderState子类会编译报错。退化为RenderPassInfo基础形态绕过编译检查 + //含需要验证的内容:ai提到该方法存在注释"excluding when re-rendering the model as part of a GeoRenderLayer or external render call",表示重渲染不会经过这一步,因此不必考虑ReRender情况。 + @Override + public void scaleModelForRender(RenderPassInfo renderPassInfo, float widthScale, float heightScale) { + if (((MudcrabRenderState) renderPassInfo.renderState()).isBaby) { + widthScale *= 0.6f; + heightScale *= 0.6f; + } + + super.scaleModelForRender(renderPassInfo, widthScale, heightScale); + } + + @Override + public void adjustRenderPose(RenderPassInfo renderPassInfo) { + MudcrabRenderState renderState = (MudcrabRenderState) renderPassInfo.renderState(); + PoseStack poseStack = renderPassInfo.poseStack(); + + poseStack.mulPose(Axis.YN.rotationDegrees(renderState.modelYRotOffset)); + float xRot = renderState.modelXRotOffset; + if (xRot != 0.0f) { + float xRotProgress = xRot / 90.0f; + switch (renderState.motionDirection) { + case NORTH -> poseStack.mulPose(Axis.ZN.rotationDegrees(xRot)); + case SOUTH -> poseStack.mulPose(Axis.ZP.rotationDegrees(xRot)); + case WEST -> poseStack.mulPose(Axis.XN.rotationDegrees(xRot)); + case EAST -> poseStack.mulPose(Axis.XP.rotationDegrees(xRot)); + } + float adjustY = -(renderState.boundingBoxHeight / 2.0f) * xRotProgress; + float adjustZ = -(renderState.boundingBoxWidth / 2.0f) * xRotProgress; + poseStack.translate(0.0f, adjustY, adjustZ); + } + + super.adjustRenderPose(renderPassInfo); + } + + //TODO 考虑下面方法覆写的正确性与必要性 疑似存在使用GeoRenderState添加专用ticket实现信息处理的方案 + @Override + public MudcrabRenderState createRenderState(Mudcrab animatable, @Nullable Void relatedObject) { + return new MudcrabRenderState(); + } + + @Override + protected void extractLivingEntityRenderState(LivingEntity entity, LivingEntityRenderState renderState, float partialTick, ItemModelResolver itemModelResolver) { + super.extractLivingEntityRenderState(entity, renderState, partialTick, itemModelResolver); + Mudcrab mudcrab = (Mudcrab)entity; + MudcrabRenderState mudcrabRenderState = (MudcrabRenderState)renderState; + + mudcrabRenderState.variant = mudcrab.getVariant().value(); + mudcrabRenderState.modelYRotOffset = Mth.lerp(partialTick, mudcrab.clientSidePreModelYRotOffset, mudcrab.clientSideModelYRotOffset); + mudcrabRenderState.modelXRotOffset = Mth.lerp(partialTick, mudcrab.clientSidePreModelXRotOffset, mudcrab.clientSideModelXRotOffset); + mudcrabRenderState.motionDirection = mudcrab.getMotionDirection(); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/PiranhaRenderer.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/PiranhaRenderer.java new file mode 100644 index 0000000..46dd5da --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/PiranhaRenderer.java @@ -0,0 +1,24 @@ +package org.polaris2023.wildwind.hfas.client.entity.renderer; + +import com.geckolib.renderer.GeoEntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import org.polaris2023.wildwind.hfas.client.entity.model.PiranhaModel; +import org.polaris2023.wildwind.hfas.client.entity.renderstate.PiranhaRenderState; +import org.polaris2023.wildwind.hfas.entity.animal.Piranha; + +import javax.annotation.Nullable; + +/** + * 食人鱼渲染器 + * @author huimanman + */ +public class PiranhaRenderer extends GeoEntityRenderer { + public PiranhaRenderer(EntityRendererProvider.Context renderManager) { + super(renderManager, new PiranhaModel()); + } + + @Override + public PiranhaRenderState createRenderState(Piranha animatable, @Nullable Void relatedObject) { + return new PiranhaRenderState(); + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/MudcrabRenderState.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/MudcrabRenderState.java new file mode 100644 index 0000000..33c3cc0 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/MudcrabRenderState.java @@ -0,0 +1,12 @@ +package org.polaris2023.wildwind.hfas.client.entity.renderstate; + +import net.minecraft.core.Direction; +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; + +public class MudcrabRenderState extends LivingEntityRenderState { + public MudcrabVariant variant; + public float modelYRotOffset; + public float modelXRotOffset; + public Direction motionDirection = Direction.NORTH; +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/PiranhaRenderState.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/PiranhaRenderState.java new file mode 100644 index 0000000..5c7b419 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/PiranhaRenderState.java @@ -0,0 +1,9 @@ +package org.polaris2023.wildwind.hfas.client.entity.renderstate; + +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; + +/** + * 食人鱼渲染状态喵~ + */ +public class PiranhaRenderState extends LivingEntityRenderState { +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/eventsub/EntitiesClientHandler.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/eventsub/EntitiesClientHandler.java new file mode 100644 index 0000000..6d4d87e --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/eventsub/EntitiesClientHandler.java @@ -0,0 +1,18 @@ +package org.polaris2023.wildwind.hfas.client.eventsub; + +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import org.polaris2023.wildwind.hfas.client.entity.renderer.MudcrabRenderer; +import org.polaris2023.wildwind.hfas.client.entity.renderer.PiranhaRenderer; +import org.polaris2023.wildwind.hfas.registry.ModEntities; + +@EventBusSubscriber(value = Dist.CLIENT) +public class EntitiesClientHandler { + @SubscribeEvent + static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { + event.registerEntityRenderer(ModEntities.PIRANHA.get(), PiranhaRenderer::new); + event.registerEntityRenderer(ModEntities.MUDCRAB.get(), MudcrabRenderer::new); + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/tooltip/ClientOmniClawTooltip.java b/src/hfas/java/org/polaris2023/wildwind/hfas/client/tooltip/ClientOmniClawTooltip.java new file mode 100644 index 0000000..2c86888 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/client/tooltip/ClientOmniClawTooltip.java @@ -0,0 +1,102 @@ +package org.polaris2023.wildwind.hfas.client.tooltip; + +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.ItemStack; +import org.polaris2023.wildwind.hfas.component.OmniClawTools; + +/** + * 全能蟹钳工具列表的客户端提示组件喵~ + *

+ * 26.2 迁移说明:ClientTooltipComponent 的 renderImage 改为 extractImage, + * GuiGraphics 重构为 GuiGraphicsExtractor,原版 bundle/background、bundle/slot + * 与 item/empty_slot_* 精灵图已移除,改用 gui 图集的 bundle/slot_background + * 与 container/slot/* 占位图标。槽位高亮改为 slot_highlight 精灵图。 + */ +public class ClientOmniClawTooltip implements ClientTooltipComponent { + private static final Identifier BACKGROUND_SPRITE = Identifier.withDefaultNamespace("container/bundle/slot_background"); + private static final Identifier SLOT_SPRITE = Identifier.withDefaultNamespace("container/bundle/slot_background"); + private static final Identifier SLOT_HIGHLIGHT_FRONT_SPRITE = Identifier.withDefaultNamespace("container/slot_highlight_front"); + private static final Identifier[] EMPTY_SLOT_TOOLS_TEXTURE = new Identifier[] { + Identifier.withDefaultNamespace("container/slot/pickaxe"), + Identifier.withDefaultNamespace("container/slot/axe"), + Identifier.withDefaultNamespace("container/slot/shovel"), + Identifier.withDefaultNamespace("container/slot/hoe") + }; + private static final int SLOT_WIDTH = 18; + private static final int SLOT_HEIGHT = 20; + private static final int SLOT_COUNT = 4; + private static final int MARGIN = 1; + private final OmniClawTools tools; + + /** + * 创建全能蟹钳客户端提示组件喵~ + * + * @param tools 全能蟹钳内保存的工具列表喵~ + */ + public ClientOmniClawTooltip(OmniClawTools tools) { + this.tools = tools; + } + + /** + * 获取提示组件总高度喵~ + * + * @param font 当前字体渲染器喵~ + * @return 提示组件高度喵~ + */ + @Override + public int getHeight(Font font) { + return getBackgroundHeight() + 4; + } + + /** + * 获取提示组件总宽度喵~ + * + * @param font 当前字体渲染器喵~ + * @return 提示组件宽度喵~ + */ + @Override + public int getWidth(Font font) { + return SLOT_WIDTH * SLOT_COUNT + MARGIN * 2; + } + + private int getBackgroundHeight() { + return SLOT_HEIGHT + MARGIN * 2; + } + + /** + * 渲染全能蟹钳工具提示中的图标网格喵~ + * + * @param font 当前字体渲染器喵~ + * @param x 左上角横坐标喵~ + * @param y 左上角纵坐标喵~ + * @param w 组件宽度喵~ + * @param h 组件高度喵~ + * @param graphics 图形提取上下文喵~ + */ + @Override + public void extractImage(Font font, int x, int y, int w, int h, GuiGraphicsExtractor graphics) { + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, BACKGROUND_SPRITE, x, y, this.getWidth(font), this.getBackgroundHeight()); + y += MARGIN; + x += MARGIN; + for (int i = 0; i < SLOT_COUNT; i++) { + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, SLOT_SPRITE, x, y, SLOT_WIDTH, SLOT_HEIGHT); + + ItemStack stack = this.tools.getTools().get(i); + if (stack.isEmpty()) { + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, EMPTY_SLOT_TOOLS_TEXTURE[i], x + 1, y + 1, 16, 16); + } else { + graphics.item(stack, x + 1, y + 1); + graphics.itemDecorations(font, stack, x + 1, y + 1); + if (i == this.tools.getSelectedToolIndex()) { + graphics.blitSprite(RenderPipelines.GUI_TEXTURED, SLOT_HIGHLIGHT_FRONT_SPRITE, x + 1 - 4, y + 1 - 4, 24, 24); + } + } + + x += SLOT_WIDTH; + } + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/component/ArrowComponent.java b/src/hfas/java/org/polaris2023/wildwind/hfas/component/ArrowComponent.java new file mode 100644 index 0000000..8591db5 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/component/ArrowComponent.java @@ -0,0 +1,124 @@ +package org.polaris2023.wildwind.hfas.component; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.NonNullList; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.ItemStack; +import org.polaris2023.wildwind.hfas.arrow.ArrowFletching; +import org.polaris2023.wildwind.hfas.arrow.ArrowHead; +import org.polaris2023.wildwind.hfas.arrow.ArrowShaft; +import org.polaris2023.wildwind.hfas.registry.ModDataComponents; + +/** + * 箭矢组件数据 + * 存储箭羽、箭杆、箭头类型 + * + * @param fletching 箭羽类型 + * @param shaft 箭杆类型 + * @param head 箭头类型 + * @author baka4n + * @since 2026/04/15 + */ +public record ArrowComponent(ArrowFletching fletching, ArrowShaft shaft, ArrowHead head) { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + instance.group( + Codec.STRING.xmap(ArrowFletching::valueOf, ArrowFletching::getName).fieldOf("fletching").forGetter(ArrowComponent::fletching), + Codec.STRING.xmap(ArrowShaft::valueOf, ArrowShaft::getName).fieldOf("shaft").forGetter(ArrowComponent::shaft), + Codec.STRING.xmap(ArrowHead::valueOf, ArrowHead::getName).fieldOf("head").forGetter(ArrowComponent::head) + ).apply(instance, ArrowComponent::new) + ); + + public static final StreamCodec STREAM_CODEC = StreamCodec.of( + (buf, component) -> { + buf.writeUtf(component.fletching().getName()); + buf.writeUtf(component.shaft().getName()); + buf.writeUtf(component.head().getName()); + }, + buf -> new ArrowComponent( + ArrowFletching.valueOf(buf.readUtf()), + ArrowShaft.valueOf(buf.readUtf()), + ArrowHead.valueOf(buf.readUtf()) + ) + ); + + /** + * 默认组件(普通箭矢) + */ + public static final ArrowComponent DEFAULT = new ArrowComponent( + ArrowFletching.FEATHER, + ArrowShaft.STICK, + ArrowHead.FLINT + ); + + /** + * 创建带组件的箭矢物品 + */ + public ItemStack createArrowStack(int count) { + ItemStack stack = new ItemStack(net.minecraft.world.item.Items.ARROW, count); + stack.set(ModDataComponents.ARROW_COMPONENT.get(), this); + return stack; + } + + /** + * 从物品获取箭矢组件 + */ + public static ArrowComponent fromStack(ItemStack stack) { + return stack.getOrDefault(ModDataComponents.ARROW_COMPONENT.get(), DEFAULT); + } + + /** + * 获取完整描述 + */ + public String getFullDescription() { + StringBuilder sb = new StringBuilder(); + if (fletching != ArrowFletching.FEATHER) { + sb.append("箭羽: ").append(fletching.getDescription()).append("\n"); + } + if (shaft != ArrowShaft.STICK) { + sb.append("箭杆: ").append(shaft.getDescription()).append("\n"); + } + if (head != ArrowHead.FLINT) { + sb.append("箭头: ").append(head.getDescription()); + } + return sb.toString().trim(); + } + + /** + * 是否不可回收 + */ + public boolean isNotRecoverable() { + return shaft.hasFireTrail() || shaft.hasNoGravity() || head.isNotRecoverable(); + } + + /** + * 获取飞行速度倍率 + */ + public float getSpeedMultiplier() { + return fletching.getSpeedMultiplier(); + } + + /** + * 获取重力倍率 + */ + public float getGravityMultiplier() { + return shaft.getGravityMultiplier(); + } + + /** + * 获取伤害加成 + */ + public float getDamageBonus() { + return shaft.getDamageBonus(); + } + + /** + * 获取不精确度 + */ + public float getInaccuracy() { + return shaft.getInaccuracy(); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/component/OmniClawTools.java b/src/hfas/java/org/polaris2023/wildwind/hfas/component/OmniClawTools.java new file mode 100644 index 0000000..f54311f --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/component/OmniClawTools.java @@ -0,0 +1,375 @@ +package org.polaris2023.wildwind.hfas.component; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.item.HoeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ShovelItem; +import net.minecraft.world.item.component.Tool; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.common.ItemAbility; + +import java.util.Collection; +import java.util.List; + +/** + * 万用蟹钳内部存储的工具集合喵~ + *

+ * 26.2 迁移说明:PickaxeItem/DiggerItem 已被移除,原版工具改为 + * {@code Item.Properties.pickaxe(...)} 等工厂方法写入的 {@link Tool} 组件, + * 因此槽位识别改为检查 TOOL 组件规则中的 mineable 标签,并对仍然存在的 + * AxeItem/ShovelItem/HoeItem 保留 instanceof 兜底。 + */ +public class OmniClawTools implements TooltipComponent { + /** + * 空工具集合喵~ + */ + public static final OmniClawTools EMPTY = new OmniClawTools(List.of(), 0); + /** + * 工具集合的数据编解码器喵~ + */ + public static final Codec CODEC = RecordCodecBuilder.create(i -> i.group( + ItemStack.OPTIONAL_CODEC.listOf(0, 4).fieldOf("tools").forGetter(OmniClawTools::getTools), + Codec.intRange(0, 4).fieldOf("selectedTool").forGetter(OmniClawTools::getSelectedToolIndex) + ).apply(i, OmniClawTools::new)); + /** + * 工具集合的网络编解码器喵~ + */ + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ItemStack.OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.list()), OmniClawTools::getTools, + ByteBufCodecs.VAR_INT, OmniClawTools::getSelectedToolIndex, + OmniClawTools::new + ); + + private final List toolList; + private final int selectedTool; + + /** + * 创建一个万用蟹钳工具集合喵~ + * + * @param toolStacks 工具列表喵~ + * @param selectedTool 当前选中的工具下标喵~ + */ + public OmniClawTools(List toolStacks, int selectedTool) { + this.toolList = List.of( + getStackOrEmpty(toolStacks, 0), + getStackOrEmpty(toolStacks, 1), + getStackOrEmpty(toolStacks, 2), + getStackOrEmpty(toolStacks, 3) + ); + this.selectedTool = selectedTool; + } + + /** + * 判断当前是否没有存储任何工具喵~ + * + * @return 若没有工具则返回 true 喵~ + */ + public boolean isEmpty() { + for (ItemStack tool : this.getTools()) { + if (!tool.isEmpty()) return false; + } + + return true; + } + + /** + * 统计非空工具数量喵~ + * + * @return 非空工具数量喵~ + */ + public int getNonEmptyItemCount() { + int count = 0; + for (ItemStack tool : this.getTools()) { + if (!tool.isEmpty()) count++; + } + + return count; + } + + /** + * 获取内部工具列表喵~ + * + * @return 工具列表喵~ + */ + public List getTools() { + return this.toolList; + } + + /** + * 获取当前选中的工具下标喵~ + * + * @return 选中工具下标喵~ + */ + public int getSelectedToolIndex() { + return this.selectedTool; + } + + /** + * 获取当前选中的工具喵~ + * + * @return 当前选中的工具喵~ + */ + public ItemStack getSelectedTool() { + return this.toolList.get(this.selectedTool); + } + + /** + * 查找指定工具在列表中的下标喵~ + * + * @param stack 待查找的工具喵~ + * @return 工具下标,不存在时返回 -1 喵~ + */ + public int indexOf(ItemStack stack) { + if (stack.isEmpty()) return -1; + + return this.toolList.indexOf(stack); + } + + /** + * 按物品能力查找可用工具喵~ + * + * @param ability 目标能力喵~ + * @return 匹配到的工具,若不存在则返回空物品喵~ + */ + public ItemStack getToolByAbility(ItemAbility ability) { + ItemStack tool = ItemStack.EMPTY; + + for (ItemStack stack : this.getTools()) { + if (stack.isEmpty()) continue; + if (stack.canPerformAction(ability)) return stack; + } + + return tool; + } + + /** + * 为指定方块状态选择最合适的工具喵~ + * + * @param state 方块状态喵~ + * @return 匹配到的工具,若不存在则返回空物品喵~ + */ + public ItemStack getToolFor(BlockState state) { + ItemStack tool = ItemStack.EMPTY; + + for (ItemStack stack : this.getTools()) { + if (!tool.isEmpty()) { + if (stack.isCorrectToolForDrops(state) && stack.getDestroySpeed(state) > tool.getDestroySpeed(state)) { + tool = stack; + } + + continue; + } + + if (stack.isCorrectToolForDrops(state)) { + tool = stack; + } + } + + return tool; + } + + /** + * 返回一个修改选中下标后的新实例喵~ + * + * @param index 新的选中下标喵~ + * @return 新的不可变工具集合喵~ + */ + public OmniClawTools withSelectIndex(int index) { + return new OmniClawTools(this.toolList, index); + } + + /** + * 转换为可变操作器喵~ + * + * @return 可变工具集合喵~ + */ + public Mutable toMutable() { + return new Mutable(this.toolList, this.selectedTool); + } + + /** + * 万用蟹钳工具集合的可变操作器喵~ + */ + public static class Mutable { + private final ItemStack[] stacks; + private int selectedTool; + + private Mutable(Collection stacks, int selectedTool) { + this.stacks = stacks.toArray(new ItemStack[4]); + this.selectedTool = selectedTool; + } + + /** + * 获取槽位数量喵~ + * + * @return 槽位数量喵~ + */ + public int size() { + return this.stacks.length; + } + + /** + * 获取当前选中的工具下标喵~ + * + * @return 选中工具下标喵~ + */ + public int getSelectedToolIndex() { + return this.selectedTool; + } + + /** + * 获取指定下标处的工具喵~ + * + * @param index 槽位下标喵~ + * @return 对应槽位中的工具喵~ + */ + public ItemStack get(int index) { + return this.stacks[index]; + } + + /** + * 设置指定下标处的工具喵~ + * + * @param stack 要设置的工具喵~ + * @param index 槽位下标喵~ + * @return 当前操作器喵~ + */ + public Mutable set(ItemStack stack, int index) { + this.stacks[index] = stack; + return this; + } + + /** + * 设置当前选中工具喵~ + * + * @param index 新的选中下标喵~ + * @return 当前操作器喵~ + */ + public Mutable select(int index) { + this.selectedTool = index; + return this; + } + + /** + * 滚动选择到下一个非空工具喵~ + * + * @return 当前操作器喵~ + */ + public Mutable scrollSelectToNoEmptyItem() { + int index = this.selectedTool + 1; + for (int i = 0; i < this.stacks.length; i++) { + index = (index + i) % this.stacks.length; + ItemStack stack = this.stacks[index]; + if (!stack.isEmpty()) return select(index); + } + + return select(0); + } + + /** + * 将工具插入对应类型槽位喵~ + * + * @param stack 待插入的工具喵~ + * @return 被替换出的物品喵~ + */ + public ItemStack insert(ItemStack stack) { + ItemStack output = stack; + if (isToolFor(stack, BlockTags.MINEABLE_WITH_PICKAXE)) { + output = swap(stack, 0); + } else if (stack.getItem() instanceof AxeItem || isToolFor(stack, BlockTags.MINEABLE_WITH_AXE)) { + output = swap(stack, 1); + } else if (stack.getItem() instanceof ShovelItem || isToolFor(stack, BlockTags.MINEABLE_WITH_SHOVEL)) { + output = swap(stack, 2); + } else if (stack.getItem() instanceof HoeItem || isToolFor(stack, BlockTags.MINEABLE_WITH_HOE)) { + output = swap(stack, 3); + } + + return output; + } + + /** + * 移除当前选中的工具喵~ + * + * @return 被移除的工具喵~ + */ + public ItemStack removeSelected() { + return swap(ItemStack.EMPTY, this.selectedTool); + } + + /** + * 转换为不可变工具集合喵~ + * + * @return 不可变工具集合喵~ + */ + public OmniClawTools toImmutable() { + return new OmniClawTools(List.of(this.stacks), this.selectedTool); + } + + private ItemStack swap(ItemStack stack, int index) { + ItemStack result = this.stacks[index]; + this.stacks[index] = stack; + if (!this.stacks[index].isEmpty()) { + this.selectedTool = index; + } else { + for (int i = 0; i < this.stacks.length; i++) { + index = (index + 1) % this.stacks.length; + if (!this.stacks[index].isEmpty()) { + this.selectedTool = index; + break; + } + } + } + + return result; + } + } + + private static ItemStack getStackOrEmpty(List stacks, int index) { + return index < 0 || index >= stacks.size() + ? ItemStack.EMPTY + : stacks.get(index); + } + + /** + * 判断物品是否为可挖掘指定标签方块的工具(26.2 中工具类型由 TOOL 组件规则表达)喵~ + * + * @param stack 待检测的物品喵~ + * @param mineableTag 可挖掘方块的标签喵~ + * @return 匹配时返回 true 喵~ + */ + private static boolean isToolFor(ItemStack stack, TagKey mineableTag) { + Tool tool = stack.get(DataComponents.TOOL); + if (tool == null) return false; + + for (Tool.Rule rule : tool.rules()) { + if (rule.blocks() instanceof HolderSet.Named named && named.key() == mineableTag) return true; + } + + return false; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + + return obj instanceof OmniClawTools other + && ItemStack.listMatches(this.toolList, other.toolList) + && this.selectedTool == other.selectedTool; + } + + @Override + public int hashCode() { + return 31 * ItemStack.hashStackList(this.toolList) + this.selectedTool; + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/config/ModCommonConfig.java b/src/hfas/java/org/polaris2023/wildwind/hfas/config/ModCommonConfig.java new file mode 100644 index 0000000..43aa6df --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/config/ModCommonConfig.java @@ -0,0 +1,59 @@ +package org.polaris2023.wildwind.hfas.config; + +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.event.config.ModConfigEvent; +import net.neoforged.neoforge.common.ModConfigSpec; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** + * 模组配置类 + * 用于控制模组行为的各种配置选项 + * + * @author baka4n + * @since 2026/04/15 + */ +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public class ModCommonConfig { + + private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); + + // ==================== 世界生成配置 ==================== + + /** + * 是否启用原版制箭台替换为模组制箭台 + * 当设置为 false 时,世界生成时不会替换原版制箭台 + */ + private static final ModConfigSpec.BooleanValue REPLACE_VANILLA_FLETCHING_TABLE = BUILDER + .comment("是否启用原版制箭台替换为模组制箭台", + "当设置为 false 时,世界生成时不会替换原版制箭台", + "Enable replacement of vanilla fletching table with mod fletching table", + "When set to false, vanilla fletching tables will not be replaced during world generation") + .define("worldgen.replaceVanillaFletchingTable", true); + + // ==================== 构建配置规范 ==================== + + public static final ModConfigSpec SPEC = BUILDER.build(); + + // ==================== 运行时配置值 ==================== + + private static boolean replaceVanillaFletchingTable = true; + + /** + * 获取是否启用原版制箭台替换 + * @return true 表示启用替换,false 表示不替换 + */ + public static boolean shouldReplaceVanillaFletchingTable() { + return replaceVanillaFletchingTable; + } + + /** + * 配置加载事件处理 + * 当配置文件被加载或重新加载时调用 + */ + @SubscribeEvent + static void onLoad(final ModConfigEvent event) { + // 更新运行时配置值 + replaceVanillaFletchingTable = REPLACE_VANILLA_FLETCHING_TABLE.get(); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/HFASDatagen.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/HFASDatagen.java new file mode 100644 index 0000000..aff49e9 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/HFASDatagen.java @@ -0,0 +1,59 @@ +package org.polaris2023.wildwind.hfas.datagen; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import net.neoforged.neoforge.data.event.GatherDataEvent; +import net.neoforged.neoforge.registries.NeoForgeRegistries; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.datagen.provider.*; +import org.polaris2023.wildwind.hfas.datagen.provider.lang.EnUsLanguageProvider; +import org.polaris2023.wildwind.hfas.datagen.provider.lang.ZhCnLanguageProvider; +import org.polaris2023.wildwind.hfas.datagen.provider.tag.ModBiomeTagsProvider; +import org.polaris2023.wildwind.hfas.datagen.provider.tag.ModBlockTagsProvider; +import org.polaris2023.wildwind.hfas.datagen.provider.tag.ModEntityTypeTagsProvider; +import org.polaris2023.wildwind.hfas.datagen.provider.tag.ModItemTagsProvider; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public class HFASDatagen { + + @SubscribeEvent + private static void gatherClient(GatherDataEvent.Client event) { + event.createProvider(ModModelProvider::new); + // 语言文件 + event.createProvider(EnUsLanguageProvider::new); + event.createProvider(ZhCnLanguageProvider::new); + } + + @SubscribeEvent + private static void gatherServer(GatherDataEvent.Server event) { + // 标签 + gatherTagsGen(event); + // 战利品表 + event.createProvider(ModLootProvider::new); + // 数据包 ====[注册器看这里]==== + event.createProvider(ModDatapackProvider::new); + // 数据映射 + event.createProvider(ModDataMapsProvider::new); + // 配方 + event.createProvider(ModRecipeProvider.Runner::new); + } + + private static void gatherTagsGen(GatherDataEvent.Server event){ + // 方块标签 + event.createProvider(ModBlockTagsProvider::new); + // 物品标签 + event.createProvider(ModItemTagsProvider::new); + // 实体标签 + event.createProvider(ModEntityTypeTagsProvider::new); + // 群系标签 + event.createProvider(ModBiomeTagsProvider::new); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java new file mode 100644 index 0000000..05d0b5b --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java @@ -0,0 +1,34 @@ +package org.polaris2023.wildwind.hfas.datagen.provider; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.DataMapProvider; +import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps; +import net.neoforged.neoforge.registries.datamaps.builtin.Strippable; +import org.polaris2023.wildwind.hfas.block.ModBlocks; + +import java.util.concurrent.CompletableFuture; + +public class ModDataMapsProvider extends DataMapProvider { + /** + * Create a new provider. + * + * @param packOutput the output location + * @param lookupProvider a {@linkplain CompletableFuture} supplying the registries + */ + public ModDataMapsProvider(PackOutput packOutput, CompletableFuture lookupProvider) { + super(packOutput, lookupProvider); + } + + @Override + protected void gather(HolderLookup.Provider provider) { + builder(NeoForgeDataMaps.STRIPPABLES) + .add(ModBlocks.AZALEA_LOG.getKey(), new Strippable(ModBlocks.STRIPPED_AZALEA_LOG.get()), false) + .add(ModBlocks.AZALEA_WOOD.getKey(), new Strippable(ModBlocks.STRIPPED_AZALEA_WOOD.get()), false) + .add(ModBlocks.BLAZE_LOG.getKey(), new Strippable(ModBlocks.STRIPPED_BLAZE_LOG.get()), false) + .add(ModBlocks.BLAZE_WOOD.getKey(), new Strippable(ModBlocks.STRIPPED_BLAZE_WOOD.get()), false) + .add(ModBlocks.SOUL_LOG.getKey(), new Strippable(ModBlocks.STRIPPED_SOUL_LOG.get()), false) + .add(ModBlocks.SOUL_WOOD.getKey(), new Strippable(ModBlocks.STRIPPED_SOUL_WOOD.get()), false) + ; + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java new file mode 100644 index 0000000..0c57964 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java @@ -0,0 +1,28 @@ +package org.polaris2023.wildwind.hfas.datagen.provider; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; +import net.neoforged.neoforge.registries.NeoForgeRegistries; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; +import org.polaris2023.wildwind.hfas.registry.DatadrivenRegistryKey; +import org.polaris2023.wildwind.hfas.worldgen.ModBiomeModifiers; +import org.polaris2023.wildwind.hfas.worldgen.ModConfiguredFeatures; +import org.polaris2023.wildwind.hfas.worldgen.ModPlacedFeatures; + +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +public class ModDatapackProvider extends DatapackBuiltinEntriesProvider { + public ModDatapackProvider(PackOutput output, CompletableFuture registries) { + super(output, registries, new RegistrySetBuilder() + .add(Registries.CONFIGURED_FEATURE, ModConfiguredFeatures::bootstrap) + .add(Registries.PLACED_FEATURE, ModPlacedFeatures::bootstrap) + .add(NeoForgeRegistries.Keys.BIOME_MODIFIERS, ModBiomeModifiers::bootstrap) + .add(DatadrivenRegistryKey.MUDCRAB_VARIANT, MudcrabVariant::bootstrapDatagen), + Set.of(HFASMod.MOD_ID, "minecraft")); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModLootProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModLootProvider.java new file mode 100644 index 0000000..537dc36 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModLootProvider.java @@ -0,0 +1,87 @@ +package org.polaris2023.wildwind.hfas.datagen.provider; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.loot.EntityLootSubProvider; +import net.minecraft.data.loot.LootTableProvider; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.SmeltItemFunction; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.predicates.LootItemRandomChanceCondition; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.neoforged.neoforge.registries.DeferredHolder; +import org.polaris2023.wildwind.hfas.datagen.provider.loot.BlockLoot; +import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.hfas.registry.ModItems; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Stream; + +public class ModLootProvider extends LootTableProvider { + public ModLootProvider(PackOutput output, CompletableFuture lookupProvider) { + super( + output, + Set.of(), + List.of( + new SubProviderEntry(BlockLoot::new, LootContextParamSets.BLOCK), + new SubProviderEntry(ModEntityLootSubProvider::new, LootContextParamSets.ENTITY) + ), + lookupProvider + ); + } + + private static final class ModEntityLootSubProvider extends EntityLootSubProvider { + ModEntityLootSubProvider(HolderLookup.Provider registries) { + super(FeatureFlags.DEFAULT_FLAGS, registries); + } + + @Override + protected Stream> getKnownEntityTypes() { + return ModEntities.ENTITY_TYPES.getEntries() + .stream() + .>map(DeferredHolder::get) + // Checked-in muddy_pig.json delegates to vanilla pig loot at runtime. + .filter(type -> type != ModEntities.MUDDY_PIG.get()); + } + + @Override + public void generate() { + this.emptyLoot(ModEntities.MUDCRAB); + this.add( + ModEntities.PIRANHA.get(), + LootTable.lootTable() + .withPool( + LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(ModItems.PIRANHA.get()) + .apply(SmeltItemFunction.smelted().when(this.shouldSmeltLoot()))) + ) + .withPool( + LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(Items.BONE_MEAL)) + .when(LootItemRandomChanceCondition.randomChance(0.05F)) + ) + .withPool( + LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(LootItem.lootTableItem(ModItems.FANG.get())) + .when(LootItemRandomChanceCondition.randomChance(0.05F)) + ) + ); + } + + private void emptyLoot(DeferredHolder, EntityType> entityType) { + this.add(entityType.get(), LootTable.lootTable()); + } + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java new file mode 100644 index 0000000..b5be436 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java @@ -0,0 +1,217 @@ +package org.polaris2023.wildwind.hfas.datagen.provider; + +import net.minecraft.client.data.models.model.ItemModelUtils; +import net.minecraft.resources.Identifier; +import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.hfas.registry.ModItems; +import net.minecraft.client.data.models.model.ModelTemplates; +import net.minecraft.client.data.models.BlockModelGenerators; +import net.minecraft.client.data.models.ItemModelGenerators; +import net.minecraft.client.data.models.ModelProvider; +import net.minecraft.client.data.models.model.ModelLocationUtils; +import net.minecraft.client.data.models.model.ModelTemplate; +import net.minecraft.client.data.models.model.TexturedModel; +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; + +import java.util.function.Supplier; + +/** + * 模型生成器 + * 用于生成方块和物品的模型文件 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModModelProvider extends ModelProvider { + + public ModModelProvider(PackOutput output) { + super(output, HFASMod.MOD_ID); + } + + @Override + protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { + itemModels.itemModelOutput.accept( + org.polaris2023.wildwind.hfas.registry.ModItems.MUDDY_PIG_SPAWN_EGG.get(), + ItemModelUtils.plainModel( + Identifier.withDefaultNamespace("item/pig_spawn_egg"))); + ModItems.MATERIALS.forEach(item -> itemModels.generateFlatItem(item.get(), ModelTemplates.FLAT_ITEM)); + // ==================== 焚烬木套件 ==================== + registerWoodModels(blockModels, itemModels, + ModBlocks.BLAZE_LOG.get(), + ModBlocks.BLAZE_WOOD.get(), + ModBlocks.STRIPPED_BLAZE_LOG.get(), + ModBlocks.STRIPPED_BLAZE_WOOD.get(), + ModBlocks.BLAZE_PLANKS.get(), + ModBlocks.BLAZE_STAIRS.get(), + ModBlocks.BLAZE_SLAB.get(), + ModBlocks.BLAZE_FENCE.get(), + ModBlocks.BLAZE_FENCE_GATE.get(), + ModBlocks.BLAZE_DOOR.get(), + ModBlocks.BLAZE_TRAPDOOR.get(), + ModBlocks.BLAZE_PRESSURE_PLATE.get(), + ModBlocks.BLAZE_BUTTON.get() + ); + // 焚烬木树叶 - 橙色染色 + blockModels.createTintedLeaves(ModBlocks.BLAZE_LEAVES.get(), TexturedModel.LEAVES, 0xFF8000); + // 焚烬木树苗 + blockModels.createCrossBlock(ModBlocks.BLAZE_SAPLING.get(), BlockModelGenerators.PlantType.NOT_TINTED); + + // ==================== 灵焰木套件 ==================== + registerWoodModels(blockModels, itemModels, + ModBlocks.SOUL_LOG.get(), + ModBlocks.SOUL_WOOD.get(), + ModBlocks.STRIPPED_SOUL_LOG.get(), + ModBlocks.STRIPPED_SOUL_WOOD.get(), + ModBlocks.SOUL_PLANKS.get(), + ModBlocks.SOUL_STAIRS.get(), + ModBlocks.SOUL_SLAB.get(), + ModBlocks.SOUL_FENCE.get(), + ModBlocks.SOUL_FENCE_GATE.get(), + ModBlocks.SOUL_DOOR.get(), + ModBlocks.SOUL_TRAPDOOR.get(), + ModBlocks.SOUL_PRESSURE_PLATE.get(), + ModBlocks.SOUL_BUTTON.get() + ); + // 灵焰木树叶 - 青色染色 + blockModels.createTintedLeaves(ModBlocks.SOUL_LEAVES.get(), TexturedModel.LEAVES, 0x00FFFF); + // 灵焰木树苗 + blockModels.createCrossBlock(ModBlocks.SOUL_SAPLING.get(), BlockModelGenerators.PlantType.NOT_TINTED); + + // ==================== 杜鹃木套件 ==================== + registerWoodModels(blockModels, itemModels, + ModBlocks.AZALEA_LOG.get(), + ModBlocks.AZALEA_WOOD.get(), + ModBlocks.STRIPPED_AZALEA_LOG.get(), + ModBlocks.STRIPPED_AZALEA_WOOD.get(), + ModBlocks.AZALEA_PLANKS.get(), + ModBlocks.AZALEA_STAIRS.get(), + ModBlocks.AZALEA_SLAB.get(), + ModBlocks.AZALEA_FENCE.get(), + ModBlocks.AZALEA_FENCE_GATE.get(), + ModBlocks.AZALEA_DOOR.get(), + ModBlocks.AZALEA_TRAPDOOR.get(), + ModBlocks.AZALEA_PRESSURE_PLATE.get(), + ModBlocks.AZALEA_BUTTON.get() + ); + + blockModels.createShelf(ModBlocks.AZALEA_SHELF.get(), ModBlocks.STRIPPED_AZALEA_LOG.get()); + blockModels.blockStateOutput.accept(BlockModelGenerators.createSign(ModBlocks.AZALEA_SIGN.get(), + signVariant("azalea_sign_rot_0"), signVariant("azalea_sign_rot_1"), signVariant("azalea_sign_rot_2"), signVariant("azalea_sign_rot_3"))); + blockModels.blockStateOutput.accept(BlockModelGenerators.createHangingSign(ModBlocks.AZALEA_HANGING_SIGN.get(), + signVariant("azalea_hanging_sign_rot_0"), signVariant("azalea_hanging_sign_rot_1"), signVariant("azalea_hanging_sign_rot_2"), signVariant("azalea_hanging_sign_rot_3"), + signVariant("azalea_hanging_sign_attached_rot_0"), signVariant("azalea_hanging_sign_attached_rot_1"), signVariant("azalea_hanging_sign_attached_rot_2"), signVariant("azalea_hanging_sign_attached_rot_3"))); + blockModels.blockStateOutput.accept(net.minecraft.client.data.models.blockstates.MultiVariantGenerator.dispatch(ModBlocks.AZALEA_WALL_SIGN.get(), signVariant("azalea_wall_sign")) + .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING_ALT)); + blockModels.blockStateOutput.accept(net.minecraft.client.data.models.blockstates.MultiVariantGenerator.dispatch(ModBlocks.AZALEA_WALL_HANGING_SIGN.get(), signVariant("azalea_wall_hanging_sign")) + .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING_ALT)); + itemModels.generateFlatItem(ModBlocks.AZALEA_SIGN.get().asItem(), ModelTemplates.FLAT_ITEM); + itemModels.generateFlatItem(ModBlocks.AZALEA_HANGING_SIGN.get().asItem(), ModelTemplates.FLAT_ITEM); + itemModels.itemModelOutput.accept(ModItems.TIPPED_ARROW.get(), ItemModelUtils.tintedModel( + Identifier.withDefaultNamespace("item/tipped_arrow"), new net.minecraft.client.color.item.Potion())); + // ==================== 其他方块 ==================== + // 焦灰草方块 - 使用简单的方块模型 + createSimpleBlock(blockModels, ModBlocks.SCORCHED_GRASS_BLOCK.get()); + + // 焦土 - 使用简单的方块模型 + createSimpleBlock(blockModels, ModBlocks.SCORCHED_DIRT.get()); + + // 焦灰草丛 - 使用交叉模型(类似草丛) + createCrossBlock(blockModels, ModBlocks.SCORCHED_GRASS.get()); + + // 焦灰枝条 - 使用交叉模型 + createCrossBlock(blockModels, ModBlocks.SCORCHED_TWIG.get()); + + // 仙人球 - 使用交叉模型 + createCrossBlock(blockModels, ModBlocks.TINY_CACTUS.get()); + + // 制箭台 - 使用简单方块模型 + createSimpleBlock(blockModels, ModBlocks.FLETCHING_TABLE.get()); + blockModels.blockStateOutput.accept(net.minecraft.client.data.models.blockstates.MultiVariantGenerator.dispatch(ModBlocks.KILN.get()) + .with(BlockModelGenerators.createBooleanModelDispatch(net.minecraft.world.level.block.state.properties.BlockStateProperties.LIT, + BlockModelGenerators.plainVariant(Identifier.withDefaultNamespace("block/furnace_on")), + BlockModelGenerators.plainVariant(Identifier.withDefaultNamespace("block/furnace")))) + .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING)); + itemModels.itemModelOutput.accept(ModBlocks.KILN.get().asItem(), + ItemModelUtils.plainModel(Identifier.withDefaultNamespace("block/furnace"))); + + // ==================== 独立物品 ==================== + simpleItem(itemModels, ModItems.CRAB_CLAW); + + // 万用蟹钳 - 使用手写 3D 模型(resources 下的 models/item/omni_claw.json),仅生成物品模型定义 + itemModels.itemModelOutput.accept( + ModItems.OMNI_CLAW.get(), + ItemModelUtils.plainModel(ModelLocationUtils.getModelLocation(ModItems.OMNI_CLAW.get())) + ); + simpleItem(itemModels, ModItems.MUDCRAB_BUCKET); + simpleItem(itemModels, ModItems.MUDCRAB_SPAWN_EGG); + + // ==================== 食人鱼 ==================== + registerPiranhaModels(itemModels); + } + + /** + * 注册木质方块模型 + */ + private void registerWoodModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels, + Block log, Block wood, + Block strippedLog, Block strippedWood, + Block planks, Block stairs, Block slab, + Block fence, Block fenceGate, + Block door, Block trapdoor, + Block pressurePlate, Block button) { + // 原木 - 使用 WoodProvider(自动生成物品模型) + blockModels.woodProvider(log).logWithHorizontal(log).wood(wood); + + // 去皮原木(自动生成物品模型) + blockModels.woodProvider(strippedLog).logWithHorizontal(strippedLog).wood(strippedWood); + + // 使用 family 创建木质方块套件(包括木板,自动生成物品模型) + blockModels.family(planks) + .stairs(stairs) + .slab(slab) + .fence(fence) + .fenceGate(fenceGate) + .pressurePlate(pressurePlate) + .button(button); + + // 门(自动生成物品模型) + blockModels.createDoor(door); + + // 活板门(自动生成物品模型) + blockModels.createTrapdoor(trapdoor); + } + + /** + * 创建简单方块模型(六面相同贴图) + */ + private void createSimpleBlock(BlockModelGenerators blockModels, Block block) { + blockModels.createTrivialCube(block); + } + + /** + * 创建交叉模型(用于植物类方块) + */ + private void createCrossBlock(BlockModelGenerators blockModels, Block block) { + blockModels.createCrossBlock(block, BlockModelGenerators.PlantType.NOT_TINTED); + } + + private static net.minecraft.client.data.models.MultiVariant signVariant(String path) { + return BlockModelGenerators.plainVariant(HFASMod.id("block/" + path)); + } + + private void simpleItem(ItemModelGenerators itemModels, Supplier item){ + itemModels.generateFlatItem(item.get(), ModelTemplates.FLAT_ITEM); + } + + private void registerPiranhaModels(ItemModelGenerators itemModels) { + simpleItem(itemModels, ModItems.PIRANHA); + simpleItem(itemModels, ModItems.COOKED_PIRANHA); + simpleItem(itemModels, ModItems.PIRANHA_BUCKET); + simpleItem(itemModels, ModItems.PIRANHA_SPAWN_EGG); + simpleItem(itemModels, ModItems.FANG); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java new file mode 100644 index 0000000..9b60aba --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java @@ -0,0 +1,94 @@ +package org.polaris2023.wildwind.hfas.datagen.provider; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.data.recipes.ShapedRecipeBuilder; +import net.minecraft.data.recipes.SimpleCookingRecipeBuilder; +import net.minecraft.data.recipes.RecipeProvider; +import net.minecraft.data.recipes.RecipeCategory; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.CookingBookCategory; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.arrow.ArrowFletching; +import org.polaris2023.wildwind.hfas.arrow.ArrowHead; +import org.polaris2023.wildwind.hfas.arrow.ArrowShaft; +import org.polaris2023.wildwind.hfas.component.ArrowComponent; +import org.polaris2023.wildwind.hfas.registry.ModItems; + +import java.util.concurrent.CompletableFuture; + +/** + * 箭矢配方数据生成器 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModRecipeProvider extends RecipeProvider { + + + protected ModRecipeProvider(HolderLookup.Provider registries, RecipeOutput output) { + super(registries, output); + } + + @Override + protected void buildRecipes() { + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.hfas.block.ModBlocks.KILN.get()) + .define('B', Items.BRICK).define('F', Items.FURNACE).define('M', Items.PACKED_MUD) + .pattern(" B ").pattern("BFB").pattern("MMM") + .unlockedBy("has_furnace", this.has(Items.FURNACE)).save(this.output); + var planks = org.polaris2023.wildwind.hfas.block.ModBlocks.AZALEA_PLANKS.get(); + var log = org.polaris2023.wildwind.hfas.block.ModBlocks.STRIPPED_AZALEA_LOG.get(); + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.hfas.block.ModBlocks.AZALEA_SIGN.get(), 3) + .define('P', planks).define('S', Items.STICK).pattern("PPP").pattern("PPP").pattern(" S ") + .unlockedBy("has_azalea_planks", this.has(planks)).save(this.output); + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.hfas.block.ModBlocks.AZALEA_HANGING_SIGN.get(), 6) + .define('L', log).define('C', Items.IRON_CHAIN).pattern("C C").pattern("LLL").pattern("LLL") + .unlockedBy("has_stripped_azalea_log", this.has(log)).save(this.output); + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.hfas.block.ModBlocks.AZALEA_SHELF.get(), 6) + .define('L', log).pattern("LLL").pattern(" ").pattern("LLL") + .unlockedBy("has_stripped_azalea_log", this.has(log)).save(this.output); + // 生成所有箭矢组合配方 + generateArrowRecipes(); + // 生食人鱼 -> 熟食人鱼(熔炉) + SimpleCookingRecipeBuilder.smelting(Ingredient.of(ModItems.PIRANHA.get()), RecipeCategory.FOOD, CookingBookCategory.FOOD, ModItems.COOKED_PIRANHA.get(), 0.35F, 200) + .unlockedBy("has_" + ModItems.PIRANHA.getId().getPath(), this.has(ModItems.PIRANHA.get())) + .save(this.output); + // 万用蟹钳:铜锭x6 + 蟹钳x3 + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.TOOLS, ModItems.OMNI_CLAW.get()) + .define('I', Items.COPPER_INGOT) + .define('C', ModItems.CRAB_CLAW.get()) + .pattern("ICC") + .pattern("IIC") + .pattern("III") + .unlockedBy("has_" + ModItems.CRAB_CLAW.getId().getPath(), this.has(ModItems.OMNI_CLAW.get())) + .save(this.output); + } + + private void generateArrowRecipes() { + + } + + public static class Runner extends RecipeProvider.Runner { + + public Runner(PackOutput packOutput, CompletableFuture registries) { + super(packOutput, registries); + } + + @Override + protected RecipeProvider createRecipeProvider(HolderLookup.Provider provider, RecipeOutput recipeOutput) { + return new ModRecipeProvider(provider, recipeOutput); + } + + @Override + public String getName() { + return "Wild Wind " + HFASMod.MOD_ID + " Recipe Provider"; + } + } + + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java new file mode 100644 index 0000000..9ef5a4d --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java @@ -0,0 +1,126 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.lang; + +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.LanguageProvider; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; + +/** + * 英语语言文件生成器 + * + * @author baka4n + * @since 2026/04/15 + */ +public class EnUsLanguageProvider extends LanguageProvider { + + public EnUsLanguageProvider(PackOutput output) { + super(output, HFASMod.MOD_ID, "en_us"); + } + + @Override + protected void addTranslations() { + add("effect.ww_hfas.sink", "Sink"); + add("effect.ww_hfas.choke", "Choke"); + add("enchantment.ww_hfas.melting", "Melting"); + add("item.ww_hfas.duckweed", "Duckweed"); + add("item.ww_hfas.calamari", "Calamari"); + add("item.ww_hfas.cooked_calamari", "Cooked Calamari"); + add("item.ww_hfas.cooked_egg", "Fried Egg"); + add("item.ww_hfas.baked_seeds", "Baked Seeds"); + add("item.ww_hfas.cooked_frog_legs", "Cooked Frog Legs"); + add("item.ww_hfas.frog_legs", "Raw Frog Legs"); + add("entity.ww_hfas.muddy_pig", "Muddy Pig"); + add("item.ww_hfas.muddy_pig_spawn_egg", "Muddy Pig Spawn Egg"); + // 焚烬木套件 + addBlock(ModBlocks.BLAZE_LOG, "Blaze Log"); + addBlock(ModBlocks.BLAZE_WOOD, "Blaze Wood"); + addBlock(ModBlocks.STRIPPED_BLAZE_LOG, "Stripped Blaze Log"); + addBlock(ModBlocks.STRIPPED_BLAZE_WOOD, "Stripped Blaze Wood"); + addBlock(ModBlocks.BLAZE_PLANKS, "Blaze Planks"); + addBlock(ModBlocks.BLAZE_STAIRS, "Blaze Stairs"); + addBlock(ModBlocks.BLAZE_SLAB, "Blaze Slab"); + addBlock(ModBlocks.BLAZE_FENCE, "Blaze Fence"); + addBlock(ModBlocks.BLAZE_FENCE_GATE, "Blaze Fence Gate"); + addBlock(ModBlocks.BLAZE_DOOR, "Blaze Door"); + addBlock(ModBlocks.BLAZE_TRAPDOOR, "Blaze Trapdoor"); + addBlock(ModBlocks.BLAZE_PRESSURE_PLATE, "Blaze Pressure Plate"); + addBlock(ModBlocks.BLAZE_BUTTON, "Blaze Button"); + addBlock(ModBlocks.BLAZE_LEAVES, "Blaze Leaves"); + addBlock(ModBlocks.BLAZE_SAPLING, "Blaze Sapling"); + + // 灵焰木套件 + addBlock(ModBlocks.SOUL_LOG, "Soul Log"); + addBlock(ModBlocks.SOUL_WOOD, "Soul Wood"); + addBlock(ModBlocks.STRIPPED_SOUL_LOG, "Stripped Soul Log"); + addBlock(ModBlocks.STRIPPED_SOUL_WOOD, "Stripped Soul Wood"); + addBlock(ModBlocks.SOUL_PLANKS, "Soul Planks"); + addBlock(ModBlocks.SOUL_STAIRS, "Soul Stairs"); + addBlock(ModBlocks.SOUL_SLAB, "Soul Slab"); + addBlock(ModBlocks.SOUL_FENCE, "Soul Fence"); + addBlock(ModBlocks.SOUL_FENCE_GATE, "Soul Fence Gate"); + addBlock(ModBlocks.SOUL_DOOR, "Soul Door"); + addBlock(ModBlocks.SOUL_TRAPDOOR, "Soul Trapdoor"); + addBlock(ModBlocks.SOUL_PRESSURE_PLATE, "Soul Pressure Plate"); + addBlock(ModBlocks.SOUL_BUTTON, "Soul Button"); + addBlock(ModBlocks.SOUL_LEAVES, "Soul Leaves"); + addBlock(ModBlocks.SOUL_SAPLING, "Soul Sapling"); + + // 杜鹃木套件 + addBlock(ModBlocks.AZALEA_LOG, "Azalea Log"); + addBlock(ModBlocks.AZALEA_WOOD, "Azalea Wood"); + addBlock(ModBlocks.STRIPPED_AZALEA_LOG, "Stripped Azalea Log"); + addBlock(ModBlocks.STRIPPED_AZALEA_WOOD, "Stripped Azalea Wood"); + addBlock(ModBlocks.AZALEA_PLANKS, "Azalea Planks"); + addBlock(ModBlocks.AZALEA_STAIRS, "Azalea Stairs"); + addBlock(ModBlocks.AZALEA_SLAB, "Azalea Slab"); + addBlock(ModBlocks.AZALEA_FENCE, "Azalea Fence"); + addBlock(ModBlocks.AZALEA_FENCE_GATE, "Azalea Fence Gate"); + addBlock(ModBlocks.AZALEA_DOOR, "Azalea Door"); + addBlock(ModBlocks.AZALEA_TRAPDOOR, "Azalea Trapdoor"); + addBlock(ModBlocks.AZALEA_PRESSURE_PLATE, "Azalea Pressure Plate"); + addBlock(ModBlocks.AZALEA_BUTTON, "Azalea Button"); + + // 其他方块 + addBlock(ModBlocks.SCORCHED_GRASS_BLOCK, "Scorched Grass Block"); + addBlock(ModBlocks.SCORCHED_DIRT, "Scorched Dirt"); + addBlock(ModBlocks.SCORCHED_GRASS, "Scorched Grass"); + addBlock(ModBlocks.SCORCHED_TWIG, "Scorched Twig"); + addBlock(ModBlocks.TINY_CACTUS, "Tiny Cactus"); + addBlock(ModBlocks.FLETCHING_TABLE, "Fletching Table"); + addBlock(ModBlocks.AZALEA_SIGN, "Azalea Sign"); + addBlock(ModBlocks.AZALEA_WALL_SIGN, "Azalea Wall Sign"); + addBlock(ModBlocks.AZALEA_HANGING_SIGN, "Azalea Hanging Sign"); + addBlock(ModBlocks.AZALEA_WALL_HANGING_SIGN, "Azalea Wall Hanging Sign"); + addBlock(ModBlocks.AZALEA_SHELF, "Azalea Shelf"); + add("item.ww_hfas.tipped_arrow", "Arrow of Reach"); + add("item.ww_hfas.tipped_arrow.effect.reach", "Arrow of Reach"); + add("item.ww_hfas.tipped_arrow.effect.long_reach", "Arrow of Reach"); + add("entity.ww_hfas.arrow", "Arrow of Reach"); + addBlock(ModBlocks.KILN, "Kiln"); + + // GUI + add("container.fletching_table", "Fletching Table"); + // 属性 + add("attributes.ww_hfas.extra_item_pickup_range", "Extra Item Pickup Range"); + + // Reach effect & potions + add("effect.ww_hfas.reach", "Reach"); + add("item.minecraft.potion.effect.reach", "Potion of Reach"); + add("item.minecraft.splash_potion.effect.reach", "Splash Potion of Reach"); + add("item.minecraft.lingering_potion.effect.reach", "Lingering Potion of Reach"); + add("item.minecraft.tipped_arrow.effect.reach", "Arrow of Reach"); + add("item.minecraft.potion.effect.long_reach", "Potion of Reach"); + add("item.minecraft.splash_potion.effect.long_reach", "Splash Potion of Reach"); + add("item.minecraft.lingering_potion.effect.long_reach", "Lingering Potion of Reach"); + add("item.minecraft.tipped_arrow.effect.long_reach", "Arrow of Reach"); + + // Direfish sound subtitles + add("subtitles.entity.piranha.attack", "Direfish attacks"); + add("subtitles.entity.piranha.death", "Direfish dies"); + + //创造模式物品栏 + add("mod.wild_wind.name", "Wild Wind"); + + ZhEnCombineLangProvider.addLang(this, "en_us"); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java new file mode 100644 index 0000000..11e8093 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java @@ -0,0 +1,130 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.lang; + +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.LanguageProvider; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.registry.ModItems; + +/** + * 中文语言文件生成器 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ZhCnLanguageProvider extends LanguageProvider { + + public ZhCnLanguageProvider(PackOutput output) { + super(output, HFASMod.MOD_ID, "zh_cn"); + } + + @Override + protected void addTranslations() { + add("effect.ww_hfas.sink", "沉溺"); + add("effect.ww_hfas.choke", "窒息"); + add("enchantment.ww_hfas.melting", "熔炼"); + add("item.ww_hfas.duckweed", "浮萍"); + add("item.ww_hfas.calamari", "鱿鱼须"); + add("item.ww_hfas.cooked_calamari", "熟鱿鱼须"); + add("item.ww_hfas.cooked_egg", "煎蛋"); + add("item.ww_hfas.baked_seeds", "烤种子"); + add("item.ww_hfas.cooked_frog_legs", "熟蛙腿"); + add("item.ww_hfas.frog_legs", "生蛙腿"); + add("entity.ww_hfas.muddy_pig", "泥猪"); + add("item.ww_hfas.muddy_pig_spawn_egg", "泥猪刷怪蛋"); + // 焚烬木套件 + addBlock(ModBlocks.BLAZE_LOG, "焚烬木原木"); + addBlock(ModBlocks.BLAZE_WOOD, "焚烬木"); + addBlock(ModBlocks.STRIPPED_BLAZE_LOG, "去皮焚烬木原木"); + addBlock(ModBlocks.STRIPPED_BLAZE_WOOD, "去皮焚烬木"); + addBlock(ModBlocks.BLAZE_PLANKS, "焚烬木木板"); + addBlock(ModBlocks.BLAZE_STAIRS, "焚烬木楼梯"); + addBlock(ModBlocks.BLAZE_SLAB, "焚烬木台阶"); + addBlock(ModBlocks.BLAZE_FENCE, "焚烬木栅栏"); + addBlock(ModBlocks.BLAZE_FENCE_GATE, "焚烬木栅栏门"); + addBlock(ModBlocks.BLAZE_DOOR, "焚烬木门"); + addBlock(ModBlocks.BLAZE_TRAPDOOR, "焚烬木活板门"); + addBlock(ModBlocks.BLAZE_PRESSURE_PLATE, "焚烬木压力板"); + addBlock(ModBlocks.BLAZE_BUTTON, "焚烬木按钮"); + addBlock(ModBlocks.BLAZE_LEAVES, "焚烬木树叶"); + addBlock(ModBlocks.BLAZE_SAPLING, "焚烬木树苗"); + + // 灵焰木套件 + addBlock(ModBlocks.SOUL_LOG, "灵焰木原木"); + addBlock(ModBlocks.SOUL_WOOD, "灵焰木"); + addBlock(ModBlocks.STRIPPED_SOUL_LOG, "去皮灵焰木原木"); + addBlock(ModBlocks.STRIPPED_SOUL_WOOD, "去皮灵焰木"); + addBlock(ModBlocks.SOUL_PLANKS, "灵焰木木板"); + addBlock(ModBlocks.SOUL_STAIRS, "灵焰木楼梯"); + addBlock(ModBlocks.SOUL_SLAB, "灵焰木台阶"); + addBlock(ModBlocks.SOUL_FENCE, "灵焰木栅栏"); + addBlock(ModBlocks.SOUL_FENCE_GATE, "灵焰木栅栏门"); + addBlock(ModBlocks.SOUL_DOOR, "灵焰木门"); + addBlock(ModBlocks.SOUL_TRAPDOOR, "灵焰木活板门"); + addBlock(ModBlocks.SOUL_PRESSURE_PLATE, "灵焰木压力板"); + addBlock(ModBlocks.SOUL_BUTTON, "灵焰木按钮"); + addBlock(ModBlocks.SOUL_LEAVES, "灵焰木树叶"); + addBlock(ModBlocks.SOUL_SAPLING, "灵焰木树苗"); + + // 杜鹃木套件 + addBlock(ModBlocks.AZALEA_LOG, "杜鹃木原木"); + addBlock(ModBlocks.AZALEA_WOOD, "杜鹃木"); + addBlock(ModBlocks.STRIPPED_AZALEA_LOG, "去皮杜鹃木原木"); + addBlock(ModBlocks.STRIPPED_AZALEA_WOOD, "去皮杜鹃木"); + addBlock(ModBlocks.AZALEA_PLANKS, "杜鹃木木板"); + addBlock(ModBlocks.AZALEA_STAIRS, "杜鹃木楼梯"); + addBlock(ModBlocks.AZALEA_SLAB, "杜鹃木台阶"); + addBlock(ModBlocks.AZALEA_FENCE, "杜鹃木栅栏"); + addBlock(ModBlocks.AZALEA_FENCE_GATE, "杜鹃木栅栏门"); + addBlock(ModBlocks.AZALEA_DOOR, "杜鹃木门"); + addBlock(ModBlocks.AZALEA_TRAPDOOR, "杜鹃木活板门"); + addBlock(ModBlocks.AZALEA_PRESSURE_PLATE, "杜鹃木压力板"); + addBlock(ModBlocks.AZALEA_BUTTON, "杜鹃木按钮"); + + // 其他方块 + addBlock(ModBlocks.SCORCHED_GRASS_BLOCK, "焦灰草方块"); + addBlock(ModBlocks.SCORCHED_DIRT, "焦土"); + addBlock(ModBlocks.SCORCHED_GRASS, "焦灰草丛"); + addBlock(ModBlocks.SCORCHED_TWIG, "焦灰枝条"); + addBlock(ModBlocks.TINY_CACTUS, "仙人球"); + addBlock(ModBlocks.FLETCHING_TABLE, "制箭台"); + addBlock(ModBlocks.AZALEA_SIGN, "杜鹃木告示牌"); + addBlock(ModBlocks.AZALEA_WALL_SIGN, "墙上的杜鹃木告示牌"); + addBlock(ModBlocks.AZALEA_HANGING_SIGN, "悬挂式杜鹃木告示牌"); + addBlock(ModBlocks.AZALEA_WALL_HANGING_SIGN, "墙上的悬挂式杜鹃木告示牌"); + addBlock(ModBlocks.AZALEA_SHELF, "杜鹃木展示架"); + add("item.ww_hfas.tipped_arrow", "延展之箭"); + add("item.ww_hfas.tipped_arrow.effect.reach", "延展之箭"); + add("item.ww_hfas.tipped_arrow.effect.long_reach", "延展之箭"); + add("entity.ww_hfas.arrow", "延展之箭"); + addBlock(ModBlocks.KILN, "窑炉"); + + // GUI + add("container.fletching_table", "制箭台"); + // 属性 + add("attributes.ww_hfas.extra_item_pickup_range", "额外物品拾取距离"); + + // 延展(reach)效果与药水 + add("effect.ww_hfas.reach", "延展"); + add("item.minecraft.potion.effect.reach", "延展药水"); + add("item.minecraft.splash_potion.effect.reach", "喷溅型延展药水"); + add("item.minecraft.lingering_potion.effect.reach", "滞留型延展药水"); + add("item.minecraft.tipped_arrow.effect.reach", "延展之箭"); + add("item.minecraft.potion.effect.long_reach", "延展药水"); + add("item.minecraft.splash_potion.effect.long_reach", "喷溅型延展药水"); + add("item.minecraft.lingering_potion.effect.long_reach", "滞留型延展药水"); + add("item.minecraft.tipped_arrow.effect.long_reach", "延展之箭"); + + // 恐鱼音效字幕 + add("subtitles.entity.piranha.attack", "恐鱼袭击"); + add("subtitles.entity.piranha.death", "恐鱼死亡"); + + //创造模式物品栏 + add("mod.wild_wind.name", "原野之风"); + + ZhEnCombineLangProvider.addLang(this, "zh_cn"); + + } + + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java new file mode 100644 index 0000000..46b9eca --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java @@ -0,0 +1,72 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.lang; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.common.data.LanguageProvider; +import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.hfas.registry.ModItems; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public class ZhEnCombineLangProvider { + private static final Map, String> ITEMS_FOR_ZHCN = new HashMap<>(); + private static final Map, String> ITEMS_FOR_ENUS = new HashMap<>(); + private static final Map, String> BLOCKS_FOR_ZHCN = new HashMap<>(); + private static final Map, String> BLOCKS_FOR_ENUS = new HashMap<>(); + private static final Map>, String> ENTITIES_FOR_ZHCN = new HashMap<>(); + private static final Map>, String> ENTITIES_FOR_ENUS = new HashMap<>(); + private static boolean initFlag = false; + + public static void addLang(LanguageProvider provider, String lang){ + if(!initFlag){ + initFlag = true; + addItems(); + addBlocks(); + addEntities(); + } + + boolean flag = "zh_cn".equals(lang); + (flag ? ITEMS_FOR_ZHCN : ITEMS_FOR_ENUS).forEach(provider::addItem); + (flag ? BLOCKS_FOR_ZHCN : BLOCKS_FOR_ENUS).forEach(provider::addBlock); + (flag ? ENTITIES_FOR_ZHCN : ENTITIES_FOR_ENUS).forEach(provider::addEntityType); + } + + + private static void addItems() { + addItem(ModItems.MUDCRAB_SPAWN_EGG, "Mudcrab Spawn Egg", "泥沼蟹刷怪蛋"); + addItem(ModItems.MUDCRAB_BUCKET, "Bucket of Mudcrab", "泥沼蟹桶"); + addItem(ModItems.CRAB_CLAW, "Crab Claw", "蟹钳"); + addItem(ModItems.OMNI_CLAW, "Omni Craw", "万用蟹钳"); + addItem(ModItems.PIRANHA_SPAWN_EGG, "Direfish Spawn Egg", "恐鱼刷怪蛋"); + addItem(ModItems.PIRANHA, "Raw Direfish", "生恐鱼"); + addItem(ModItems.COOKED_PIRANHA, "Cooked Direfish", "熟恐鱼"); + addItem(ModItems.FANG, "Fang", "尖牙"); + addItem(ModItems.PIRANHA_BUCKET, "Bucket of Direfish", "恐鱼桶"); + } + + private static void addBlocks() { + } + + private static void addEntities() { + addEntity(ModEntities.MUDCRAB, "Mudcrab", "泥沼蟹"); + addEntity(ModEntities.PIRANHA, "Direfish", "恐鱼"); + } + + private static void addItem(Supplier s, String en, String zh){ + ITEMS_FOR_ZHCN.put(s, zh); + ITEMS_FOR_ENUS.put(s, en); + } + + private static void addBlock(Supplier s, String en, String zh){ + BLOCKS_FOR_ZHCN.put(s, zh); + BLOCKS_FOR_ENUS.put(s, en); + } + + private static void addEntity(Supplier> s, String en, String zh){ + ENTITIES_FOR_ZHCN.put(s, zh); + ENTITIES_FOR_ENUS.put(s, en); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java new file mode 100644 index 0000000..d6e2634 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java @@ -0,0 +1,91 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.loot; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.loot.BlockLootSubProvider; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import org.jspecify.annotations.NonNull; +import org.polaris2023.wildwind.hfas.block.ModBlocks; + +import java.util.Set; + +public class BlockLoot extends BlockLootSubProvider { + public BlockLoot(HolderLookup.Provider registries) { + super(Set.of(), FeatureFlags.DEFAULT_FLAGS, registries); + } + + @Override + protected @NonNull Iterable getKnownBlocks() { + return ModBlocks.BLOCKS.getEntries().stream().map(h -> (Block) h.value()).toList(); + } + + @Override + protected void generate() { + // 焚烬木套件 + dropSelf(ModBlocks.BLAZE_LOG.get()); + dropSelf(ModBlocks.BLAZE_WOOD.get()); + dropSelf(ModBlocks.STRIPPED_BLAZE_LOG.get()); + dropSelf(ModBlocks.STRIPPED_BLAZE_WOOD.get()); + dropSelf(ModBlocks.BLAZE_PLANKS.get()); + dropSelf(ModBlocks.BLAZE_STAIRS.get()); + dropSelf(ModBlocks.BLAZE_SLAB.get()); + dropSelf(ModBlocks.BLAZE_FENCE.get()); + dropSelf(ModBlocks.BLAZE_FENCE_GATE.get()); + dropSelf(ModBlocks.BLAZE_PRESSURE_PLATE.get()); + dropSelf(ModBlocks.BLAZE_BUTTON.get()); + // 树叶 - 使用树叶掉落逻辑 + add(ModBlocks.BLAZE_LEAVES.get(), createLeavesDrops(ModBlocks.BLAZE_LEAVES.get(), ModBlocks.BLAZE_SAPLING.get(), 0.05F)); + dropSelf(ModBlocks.BLAZE_SAPLING.get()); + // 门需要特殊处理 + add(ModBlocks.BLAZE_DOOR.get(), createDoorTable(ModBlocks.BLAZE_DOOR.get())); + dropSelf(ModBlocks.BLAZE_TRAPDOOR.get()); + + // 灵焰木套件 + dropSelf(ModBlocks.SOUL_LOG.get()); + dropSelf(ModBlocks.SOUL_WOOD.get()); + dropSelf(ModBlocks.STRIPPED_SOUL_LOG.get()); + dropSelf(ModBlocks.STRIPPED_SOUL_WOOD.get()); + dropSelf(ModBlocks.SOUL_PLANKS.get()); + dropSelf(ModBlocks.SOUL_STAIRS.get()); + dropSelf(ModBlocks.SOUL_SLAB.get()); + dropSelf(ModBlocks.SOUL_FENCE.get()); + dropSelf(ModBlocks.SOUL_FENCE_GATE.get()); + dropSelf(ModBlocks.SOUL_PRESSURE_PLATE.get()); + dropSelf(ModBlocks.SOUL_BUTTON.get()); + // 树叶 - 使用树叶掉落逻辑 + add(ModBlocks.SOUL_LEAVES.get(), createLeavesDrops(ModBlocks.SOUL_LEAVES.get(), ModBlocks.SOUL_SAPLING.get(), 0.05F)); + dropSelf(ModBlocks.SOUL_SAPLING.get()); + // 门需要特殊处理 + add(ModBlocks.SOUL_DOOR.get(), createDoorTable(ModBlocks.SOUL_DOOR.get())); + dropSelf(ModBlocks.SOUL_TRAPDOOR.get()); + + dropSelf(ModBlocks.AZALEA_SIGN.get()); + dropSelf(ModBlocks.AZALEA_HANGING_SIGN.get()); + dropSelf(ModBlocks.AZALEA_SHELF.get()); + // 杜鹃木套件 + dropSelf(ModBlocks.AZALEA_LOG.get()); + dropSelf(ModBlocks.AZALEA_WOOD.get()); + dropSelf(ModBlocks.STRIPPED_AZALEA_LOG.get()); + dropSelf(ModBlocks.STRIPPED_AZALEA_WOOD.get()); + dropSelf(ModBlocks.AZALEA_PLANKS.get()); + dropSelf(ModBlocks.AZALEA_STAIRS.get()); + dropSelf(ModBlocks.AZALEA_SLAB.get()); + dropSelf(ModBlocks.AZALEA_FENCE.get()); + dropSelf(ModBlocks.AZALEA_FENCE_GATE.get()); + dropSelf(ModBlocks.AZALEA_PRESSURE_PLATE.get()); + dropSelf(ModBlocks.AZALEA_BUTTON.get()); + // 门需要特殊处理 + add(ModBlocks.AZALEA_DOOR.get(), createDoorTable(ModBlocks.AZALEA_DOOR.get())); + dropSelf(ModBlocks.AZALEA_TRAPDOOR.get()); + + // 其他方块 + dropSelf(ModBlocks.SCORCHED_GRASS_BLOCK.get()); + dropSelf(ModBlocks.SCORCHED_DIRT.get()); + dropSelf(ModBlocks.SCORCHED_GRASS.get()); + dropSelf(ModBlocks.SCORCHED_TWIG.get()); + dropSelf(ModBlocks.TINY_CACTUS.get()); + dropOther(ModBlocks.FLETCHING_TABLE.get(), Items.FLETCHING_TABLE); + add(ModBlocks.KILN.get(), createNameableBlockEntityTable(ModBlocks.KILN.get())); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java new file mode 100644 index 0000000..8aa647e --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java @@ -0,0 +1,54 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.tag; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.BiomeTagsProvider; +import net.minecraft.tags.BiomeTags; +import net.minecraft.world.level.biome.Biomes; +import net.neoforged.neoforge.common.Tags; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.tag.ModBiomeTags; + +import javax.annotation.Nullable; +import java.util.concurrent.CompletableFuture; + +public class ModBiomeTagsProvider extends BiomeTagsProvider { + /** + * 创建群系标签提供器喵~ + * + * @param output 输出目标喵~ + * @param provider 注册表查询提供器喵~ + */ + public ModBiomeTagsProvider(PackOutput output, CompletableFuture provider) { + super(output, provider, HFASMod.MOD_ID); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(ModBiomeTags.EntityGen.MUDCRABS_WARM) + .add(Biomes.DESERT) + .add(Biomes.WARM_OCEAN) + .addTag(BiomeTags.IS_JUNGLE) + .addTag(BiomeTags.IS_SAVANNA) + .addTag(BiomeTags.IS_NETHER) + .addTag(BiomeTags.IS_BADLANDS) + .add(Biomes.MANGROVE_SWAMP); + tag(ModBiomeTags.EntityGen.MUDCRABS_COLD) + .add(Biomes.SNOWY_PLAINS) + .add(Biomes.ICE_SPIKES) + .add(Biomes.FROZEN_PEAKS) + .add(Biomes.JAGGED_PEAKS) + .add(Biomes.SNOWY_SLOPES) + .add(Biomes.FROZEN_OCEAN) + .add(Biomes.DEEP_FROZEN_OCEAN) + .add(Biomes.GROVE) + .add(Biomes.DEEP_DARK) + .add(Biomes.FROZEN_RIVER) + .add(Biomes.SNOWY_TAIGA) + .add(Biomes.SNOWY_BEACH) + .addTag(BiomeTags.IS_END); + tag(ModBiomeTags.EntityGen.PIRANHA_SPAWNS) + .add(Biomes.JUNGLE) + .addTag(Tags.Biomes.IS_SWAMP); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java new file mode 100644 index 0000000..5f3022e --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java @@ -0,0 +1,216 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.tag; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.TagAppender; +import net.minecraft.tags.BlockItemTags; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.data.BlockTagsProvider; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.tag.ModBlockTags; + +import java.util.Arrays; +import java.util.concurrent.CompletableFuture; + +/** + * 方块标签生成器 + * 为木质方块添加原版和模组标签 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModBlockTagsProvider extends BlockTagsProvider { + + public static ModBlockTagsProvider INSTANCE; + + public ModBlockTagsProvider(PackOutput output, CompletableFuture lookupProvider) { + super(output, lookupProvider, HFASMod.MOD_ID); + INSTANCE = this; + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + addToTag(BlockTags.MINEABLE_WITH_PICKAXE, ModBlocks.KILN.get()); + addToTag(BlockTags.MINEABLE_WITH_AXE, ModBlocks.AZALEA_SIGN.get(), ModBlocks.AZALEA_WALL_SIGN.get(), ModBlocks.AZALEA_HANGING_SIGN.get(), ModBlocks.AZALEA_WALL_HANGING_SIGN.get(), ModBlocks.AZALEA_SHELF.get()); + addToTag(BlockTags.STANDING_SIGNS, ModBlocks.AZALEA_SIGN.get()); + addToTag(BlockTags.WALL_SIGNS, ModBlocks.AZALEA_WALL_SIGN.get()); + addToTag(BlockTags.CEILING_HANGING_SIGNS, ModBlocks.AZALEA_HANGING_SIGN.get()); + addToTag(BlockTags.WALL_HANGING_SIGNS, ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); + addToTag(net.minecraft.tags.TagKey.create(net.minecraft.core.registries.Registries.BLOCK, net.minecraft.resources.Identifier.withDefaultNamespace("wooden_shelves")), ModBlocks.AZALEA_SHELF.get()); + // ==================== 焚烬木标签 ==================== + registerWoodTags( + ModBlocks.BLAZE_LOG.get(), + ModBlocks.BLAZE_WOOD.get(), + ModBlocks.STRIPPED_BLAZE_LOG.get(), + ModBlocks.STRIPPED_BLAZE_WOOD.get(), + ModBlocks.BLAZE_PLANKS.get(), + ModBlocks.BLAZE_STAIRS.get(), + ModBlocks.BLAZE_SLAB.get(), + ModBlocks.BLAZE_FENCE.get(), + ModBlocks.BLAZE_FENCE_GATE.get(), + ModBlocks.BLAZE_DOOR.get(), + ModBlocks.BLAZE_TRAPDOOR.get(), + ModBlocks.BLAZE_PRESSURE_PLATE.get(), + ModBlocks.BLAZE_BUTTON.get(), + ModBlocks.BLAZE_LEAVES.get(), + ModBlocks.BLAZE_SAPLING.get() + ); + + // ==================== 灵焰木标签 ==================== + registerWoodTags( + ModBlocks.SOUL_LOG.get(), + ModBlocks.SOUL_WOOD.get(), + ModBlocks.STRIPPED_SOUL_LOG.get(), + ModBlocks.STRIPPED_SOUL_WOOD.get(), + ModBlocks.SOUL_PLANKS.get(), + ModBlocks.SOUL_STAIRS.get(), + ModBlocks.SOUL_SLAB.get(), + ModBlocks.SOUL_FENCE.get(), + ModBlocks.SOUL_FENCE_GATE.get(), + ModBlocks.SOUL_DOOR.get(), + ModBlocks.SOUL_TRAPDOOR.get(), + ModBlocks.SOUL_PRESSURE_PLATE.get(), + ModBlocks.SOUL_BUTTON.get(), + ModBlocks.SOUL_LEAVES.get(), + ModBlocks.SOUL_SAPLING.get() + ); + + // ==================== 杜鹃木标签 ==================== + registerWoodTags( + ModBlocks.AZALEA_LOG.get(), + ModBlocks.AZALEA_WOOD.get(), + ModBlocks.STRIPPED_AZALEA_LOG.get(), + ModBlocks.STRIPPED_AZALEA_WOOD.get(), + ModBlocks.AZALEA_PLANKS.get(), + ModBlocks.AZALEA_STAIRS.get(), + ModBlocks.AZALEA_SLAB.get(), + ModBlocks.AZALEA_FENCE.get(), + ModBlocks.AZALEA_FENCE_GATE.get(), + ModBlocks.AZALEA_DOOR.get(), + ModBlocks.AZALEA_TRAPDOOR.get(), + ModBlocks.AZALEA_PRESSURE_PLATE.get(), + ModBlocks.AZALEA_BUTTON.get(), + null, // 杜鹃木使用原版树叶 + null // 杜鹃木使用原版树苗 + ); + + // ==================== 其他方块标签 ==================== + // 焦灰草方块 - 泥土类 + addToTag(BlockTags.DIRT, ModBlocks.SCORCHED_GRASS_BLOCK.get(), ModBlocks.SCORCHED_DIRT.get()); + + // 制箭台 - 工作站 + addToTag(BlockTags.MINEABLE_WITH_AXE, ModBlocks.FLETCHING_TABLE.get()); + + + // ==================== 实体生成有关 ==================== + + addToTag(ModBlockTags.EntityAbout.MUDCRAB_SPAWNABLE_ON, Blocks.MUD, Blocks.MUDDY_MANGROVE_ROOTS); + + addToTag(ModBlockTags.EntityAbout.MUDCRAB_SPAWNABLE_IN_WATER_GROUND, Blocks.CLAY, Blocks.MUD, Blocks.DIRT, Blocks.MUDDY_MANGROVE_ROOTS) + .addTag(BlockTags.SAND) + .addTag(Tags.Blocks.GRAVELS); + + addToTag(ModBlockTags.EntityAbout.MUDCRAB_PREFERRED_WANDER_BLOCKS,Blocks.MANGROVE_LOG, Blocks.MANGROVE_ROOTS, Blocks.MUDDY_MANGROVE_ROOTS); + } + + /** + * 注册木质方块标签 + */ + private void registerWoodTags( + Block log, Block wood, + Block strippedLog, Block strippedWood, + Block planks, Block stairs, Block slab, + Block fence, Block fenceGate, + Block door, Block trapdoor, + Block pressurePlate, Block button, + Block leaves, Block sapling) { + + // 原木标签 - 用于原木类方块 + addToTag(BlockTags.LOGS, log, wood, strippedLog, strippedWood); + + // 木板标签 + addToTag(BlockTags.PLANKS, planks); + + // 木质楼梯 + addToTag(BlockTags.WOODEN_STAIRS, stairs); + + // 木质台阶 + addToTag(BlockTags.WOODEN_SLABS, slab); + + // 木质栅栏 + addToTag(Tags.Blocks.FENCES_WOODEN, fence); + + // 栅栏标签(所有栅栏) + // 已默认含有引用"#c:fences/wooden" +// addToTag(Tags.Blocks.FENCES, fence); + + addToTag(Tags.Blocks.FENCE_GATES_WOODEN, fenceGate); + + // 栅栏门标签(所有栅栏门) + // 已默认含有引用"#c:fence_gates/wooden" + // bugjump你真是个尤物物品tag不引用方块又想起来了 +// addToTag(BlockTags.FENCE_GATES) +// .add(fenceGate); + + // 木质门 + addToTag(BlockTags.WOODEN_DOORS, door); + + // 门标签(所有门) + // byd这又不引用了 + addToTag(BlockTags.DOORS, door); + + // 活板门 + addToTag(BlockTags.TRAPDOORS, trapdoor); + + // 木质活板门 + addToTag(BlockTags.WOODEN_TRAPDOORS, trapdoor); + + // 木质压力板 + // 压力板tag已引用 + addToTag(BlockTags.WOODEN_PRESSURE_PLATES, pressurePlate); + + // 木质按钮 + addToTag(BlockTags.WOODEN_BUTTONS, button); + + // 按钮标签(所有按钮) + // 已引用"#minecraft:wooden_buttons" +// addToTag(BlockTags.BUTTONS) +// .add(button); + + // 树叶 + if (leaves != null) { + addToTag(BlockTags.LEAVES, leaves); + } + + // 树苗 + if (sapling != null) { + /* + 由addToTag方法桥接。 + TODO_FINISHED: 该block tag key存在缺失问题,已模仿原版行为进行处理,但无法确定这种缺失是否系系统性删除,无法确保对应功能一定可以正常工作。请求测试阶段重点检查。 + ——landis, 2026/9/1 + */ + addToTag(BlockItemTags.SAPLINGS.block(), sapling); + } + + // 挖掘工具标签 + addToTag(BlockTags.MINEABLE_WITH_AXE, log, wood, strippedLog, strippedWood, planks, stairs, slab, fence, fenceGate, door, trapdoor, pressurePlate, button); + + // 站立信号(原木可以站立) + addToTag(BlockTags.OVERWORLD_NATURAL_LOGS, log); + + // 需要工具 + addToTag(BlockTags.NEEDS_STONE_TOOL, log, wood, strippedLog, strippedWood, planks, stairs, slab, fence, fenceGate, door, trapdoor, pressurePlate, button); + } + + @SuppressWarnings("all") + public TagAppender addToTag(TagKey tag, Block... items) { + if (items.length == 0) return tag(tag); + return tag(tag).addAll(Arrays.stream(items).map(Block::builtInRegistryHolder).map(Holder.Reference::getKey)); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModEntityTypeTagsProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModEntityTypeTagsProvider.java new file mode 100644 index 0000000..4d98bc8 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModEntityTypeTagsProvider.java @@ -0,0 +1,43 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.tag; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.EntityTypeTagsProvider; +import net.minecraft.tags.EntityTypeTags; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.registry.ModEntities; + +import javax.annotation.Nullable; +import java.util.concurrent.CompletableFuture; + +/** + * 生成模组实体类型标签数据喵~ + */ +public class ModEntityTypeTagsProvider extends EntityTypeTagsProvider { + /** + * 创建实体类型标签提供器喵~ + * + * @param output 输出目标喵~ + * @param provider 注册表查询提供器喵~ + */ + public ModEntityTypeTagsProvider(PackOutput output, CompletableFuture provider) { + super(output, provider, HFASMod.MOD_ID); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + tag(EntityTypeTags.AQUATIC) + .add(ModEntities.MUDCRAB.getKey()) + .add(ModEntities.PIRANHA.getKey()); + tag(EntityTypeTags.CAN_BREATHE_UNDER_WATER) + // Supplied by checked-in resources rather than this data generator. + .addOptionalTag(org.polaris2023.wildwind.hfas.entity.ModEntityTypeTags.WATER_BREATHING) + .add(ModEntities.MUDCRAB.getKey()) + .add(ModEntities.PIRANHA.getKey()); + tag(EntityTypeTags.NOT_SCARY_FOR_PUFFERFISH) + .add(ModEntities.MUDCRAB.getKey()) + .add(ModEntities.PIRANHA.getKey()); + tag(EntityTypeTags.AXOLOTL_HUNT_TARGETS) + .add(ModEntities.PIRANHA.getKey()); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModItemTagsProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModItemTagsProvider.java new file mode 100644 index 0000000..c622d4f --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModItemTagsProvider.java @@ -0,0 +1,238 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.tag; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.Identifier; +import net.minecraft.data.tags.TagAppender; +import net.minecraft.data.tags.TagsProvider; +import net.minecraft.tags.BlockItemTagId; +import net.minecraft.tags.BlockItemTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.common.Tags; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.registry.ModItems; +import org.polaris2023.wildwind.hfas.tag.ModItemTags; + +import java.util.Arrays; +import java.util.concurrent.CompletableFuture; + +/** + * 物品标签生成器 + * 为木质物品添加原版和模组标签 + *

+ * 迁移至26.2时旧有的IntrinsicHolderTagsProvider已被移除。改为父类TagsProvider并由addToTag方法桥接。 + * TODO_FINISHED: 部分item tag key存在缺失问题,已模仿原版行为进行处理,但无法确定这种缺失是否系系统性删除,无法确保对应功能一定可以正常工作。请求测试阶段重点检查。 + * 见[Need Check]注释部分。 + * ——landis, 2026/9/1 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModItemTagsProvider extends TagsProvider { + + public ModItemTagsProvider(PackOutput output, CompletableFuture lookupProvider) { +// super(output, Registries.ITEM, lookupProvider, item -> item.builtInRegistryHolder().key(), HFASMod.MOD_ID); + super(output, Registries.ITEM, lookupProvider, HFASMod.MOD_ID); + } + + @Override + protected void addTags(HolderLookup.Provider provider) { + addToTag(ItemTags.ARROWS, ModItems.TIPPED_ARROW.get()); + addToTag(TagKey.create(Registries.ITEM, Identifier.withDefaultNamespace("signs")), ModBlocks.AZALEA_SIGN.get().asItem()); + addToTag(TagKey.create(Registries.ITEM, Identifier.withDefaultNamespace("hanging_signs")), ModBlocks.AZALEA_HANGING_SIGN.get().asItem()); + addToTag(TagKey.create(Registries.ITEM, Identifier.withDefaultNamespace("wooden_shelves")), ModBlocks.AZALEA_SHELF.get().asItem()); + registerWoodLogItemTag("blaze", + ModBlocks.BLAZE_LOG.get(), ModBlocks.BLAZE_WOOD.get(), + ModBlocks.STRIPPED_BLAZE_LOG.get(), ModBlocks.STRIPPED_BLAZE_WOOD.get()); + registerWoodLogItemTag("soul", + ModBlocks.SOUL_LOG.get(), ModBlocks.SOUL_WOOD.get(), + ModBlocks.STRIPPED_SOUL_LOG.get(), ModBlocks.STRIPPED_SOUL_WOOD.get()); + registerWoodLogItemTag("azalea", + ModBlocks.AZALEA_LOG.get(), ModBlocks.AZALEA_WOOD.get(), + ModBlocks.STRIPPED_AZALEA_LOG.get(), ModBlocks.STRIPPED_AZALEA_WOOD.get()); + + // ==================== 焚烬木物品标签 ==================== + registerWoodItemTags( + ModBlocks.BLAZE_LOG.get(), + ModBlocks.BLAZE_WOOD.get(), + ModBlocks.STRIPPED_BLAZE_LOG.get(), + ModBlocks.STRIPPED_BLAZE_WOOD.get(), + ModBlocks.BLAZE_PLANKS.get(), + ModBlocks.BLAZE_STAIRS.get(), + ModBlocks.BLAZE_SLAB.get(), + ModBlocks.BLAZE_FENCE.get(), + ModBlocks.BLAZE_FENCE_GATE.get(), + ModBlocks.BLAZE_DOOR.get(), + ModBlocks.BLAZE_TRAPDOOR.get(), + ModBlocks.BLAZE_PRESSURE_PLATE.get(), + ModBlocks.BLAZE_BUTTON.get(), + ModBlocks.BLAZE_LEAVES.get(), + ModBlocks.BLAZE_SAPLING.get() + ); + + // ==================== 灵焰木物品标签 ==================== + registerWoodItemTags( + ModBlocks.SOUL_LOG.get(), + ModBlocks.SOUL_WOOD.get(), + ModBlocks.STRIPPED_SOUL_LOG.get(), + ModBlocks.STRIPPED_SOUL_WOOD.get(), + ModBlocks.SOUL_PLANKS.get(), + ModBlocks.SOUL_STAIRS.get(), + ModBlocks.SOUL_SLAB.get(), + ModBlocks.SOUL_FENCE.get(), + ModBlocks.SOUL_FENCE_GATE.get(), + ModBlocks.SOUL_DOOR.get(), + ModBlocks.SOUL_TRAPDOOR.get(), + ModBlocks.SOUL_PRESSURE_PLATE.get(), + ModBlocks.SOUL_BUTTON.get(), + ModBlocks.SOUL_LEAVES.get(), + ModBlocks.SOUL_SAPLING.get() + ); + + // ==================== 杜鹃木物品标签 ==================== + registerWoodItemTags( + ModBlocks.AZALEA_LOG.get(), + ModBlocks.AZALEA_WOOD.get(), + ModBlocks.STRIPPED_AZALEA_LOG.get(), + ModBlocks.STRIPPED_AZALEA_WOOD.get(), + ModBlocks.AZALEA_PLANKS.get(), + ModBlocks.AZALEA_STAIRS.get(), + ModBlocks.AZALEA_SLAB.get(), + ModBlocks.AZALEA_FENCE.get(), + ModBlocks.AZALEA_FENCE_GATE.get(), + ModBlocks.AZALEA_DOOR.get(), + ModBlocks.AZALEA_TRAPDOOR.get(), + ModBlocks.AZALEA_PRESSURE_PLATE.get(), + ModBlocks.AZALEA_BUTTON.get(), + null, // 杜鹃木使用原版树叶 + null // 杜鹃木使用原版树苗 + ); + + tag(Tags.Items.ANIMAL_FOODS) + .addTag(ModItemTags.MUDCRAB_FOOD); + addToTag(ModItemTags.MUDCRAB_FOOD, Items.SPIDER_EYE); + + // ==================== 食人鱼相关物品标签 ==================== + // 猫、豹猫以生食人鱼为食 + addToTag(ItemTags.CAT_FOOD, ModItems.PIRANHA.get()); + addToTag(ItemTags.OCELOT_FOOD, ModItems.PIRANHA.get()); + // 狼以生/熟食人鱼为食 + addToTag(ItemTags.WOLF_FOOD, ModItems.PIRANHA.get(), ModItems.COOKED_PIRANHA.get()); + // 原版鱼类标签 + addToTag(ItemTags.FISHES, ModItems.PIRANHA.get(), ModItems.COOKED_PIRANHA.get()); + // 熟鱼食物标签 + addToTag(Tags.Items.FOODS_COOKED_FISH, ModItems.COOKED_PIRANHA.get()); + } + + /** + * 注册木质物品标签 + */ + private void registerWoodItemTags( + Block log, Block wood, + Block strippedLog, Block strippedWood, + Block planks, Block stairs, Block slab, + Block fence, Block fenceGate, + Block door, Block trapdoor, + Block pressurePlate, Block button, + Block leaves, Block sapling) { + + // 原木物品标签 + addToTag(ItemTags.LOGS, log, wood, strippedLog, strippedWood); + addToTag(ItemTags.LOGS_THAT_BURN, log, wood, strippedLog, strippedWood); + addToTag(Tags.Items.STRIPPED_LOGS, strippedLog); + addToTag(Tags.Items.STRIPPED_WOODS, strippedWood); +// tag(ItemTags.LOGS) +// .add(log.asItem()) +// .add(wood.asItem()) +// .add(strippedLog.asItem()) +// .add(strippedWood.asItem()); + + // 木板物品标签 + addToTag(ItemTags.PLANKS, planks); + + // 木质楼梯物品标签 + addToTag(ItemTags.WOODEN_STAIRS,stairs); + + // 木质台阶物品标签 + addToTag(ItemTags.WOODEN_SLABS, slab); + + // 木质栅栏物品标签 + addToTag(ItemTags.WOODEN_FENCES, fence); + addToTag(Tags.Items.FENCES_WOODEN, fence); + + // 栅栏物品标签 + // 栅栏tag默认包含"#c:fences/wooden",弃用 +// tag(Tags.Items.FENCES) +// .add(fence.asItem()); + + // 木质栅栏门物品标签 + addToTag(Tags.Items.FENCE_GATES_WOODEN, fenceGate); + + // 栅栏门物品标签 + addToTag(ItemTags.FENCE_GATES, fenceGate); + + // 木质门物品标签 + addToTag(ItemTags.WOODEN_DOORS,door); + + // 门物品标签 + // bugjump不知道给这玩意更新到哪去了 item没key 难绷 + // [NeedCheck] + addToTag(BlockItemTags.DOORS.item(), door); + + // 活板门物品标签 + // 续上:我要点名某些明明有包含关系但是就是不引用子tag还要把key删掉的tag + // [NeedCheck] + addToTag(BlockItemTags.TRAPDOORS.item(), trapdoor); + + // 木质活板门物品标签 + addToTag(ItemTags.WOODEN_TRAPDOORS, trapdoor); + + // 木质压力板物品标签 + addToTag(ItemTags.WOODEN_PRESSURE_PLATES, pressurePlate); + + // 木质按钮物品标签 + addToTag(ItemTags.WOODEN_BUTTONS, button); + + // 按钮物品标签 + // 不是哥们 你怎么也没了我朝为 + // [NeedCheck] + addToTag(BlockItemTags.BUTTONS.item(), button); + + // 树叶物品标签 + if (leaves != null) { + addToTag(ItemTags.LEAVES, leaves); + } + + // 树苗物品标签 + if (sapling != null) { + addToTag(ItemTags.SAPLINGS, sapling); + } + } + + private void registerWoodLogItemTag(String name, Block log, Block wood, Block strippedLog, Block strippedWood) { + TagKey logsTag = TagKey.create( + Registries.ITEM, + Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, name + "_logs") + ); + addToTag(logsTag, log, wood, strippedLog, strippedWood); + } + + @SuppressWarnings("all") + public void addToTag(TagKey tag, Block... items){ + if(items.length == 0) return; + tag(tag).addAll(Arrays.stream(items).map(Block::asItem).map(Item::builtInRegistryHolder).map(Holder.Reference::getKey)); + } + + @SuppressWarnings("all") + public void addToTag(TagKey tag, Item... items){ + if(items.length == 0) return; + tag(tag).addAll(Arrays.stream(items).map(Item::builtInRegistryHolder).map(Holder.Reference::getKey)); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/effect/FluidEffects.java b/src/hfas/java/org/polaris2023/wildwind/hfas/effect/FluidEffects.java new file mode 100644 index 0000000..bb444e6 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/effect/FluidEffects.java @@ -0,0 +1,80 @@ +package org.polaris2023.wildwind.hfas.effect; + +import net.minecraft.tags.FluidTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.effect.MobEffectUtil; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.living.LivingBreatheEvent; +import net.neoforged.neoforge.event.tick.EntityTickEvent; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.entity.ModEntityTypeTags; + +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public final class FluidEffects { + private FluidEffects() {} + + public static boolean cannotRise(Entity entity) { + return entity instanceof LivingEntity living && living.is(ModEntityTypeTags.SINK_AFFECTED) + && living.hasEffect(ModEffects.SINK) + && entity.getFluidInteraction().isInFluidMatching(entity, (e, type, height) -> !type.isAir()); + } + + public static Vec3 restrictMovement(Entity entity, Vec3 movement) { + if (movement.y > 0 && cannotRise(entity)) return new Vec3(movement.x, 0, movement.z); + return movement; + } + + @SubscribeEvent + public static void beforeTick(EntityTickEvent.Pre event) { + var entity = event.getEntity(); + entity.setDeltaMovement(restrictMovement(entity, entity.getDeltaMovement())); + } + + @SubscribeEvent + public static void afterTick(EntityTickEvent.Post event) { + var entity = event.getEntity(); + entity.setDeltaMovement(restrictMovement(entity, entity.getDeltaMovement())); + } + + @SubscribeEvent + public static void breathe(LivingBreatheEvent event) { + var entity = event.getEntity(); + if (!entity.isEyeInFluid(FluidTags.WATER)) return; + if (entity.is(ModEntityTypeTags.WATER_BREATHING)) { + event.setCanBreathe(true); + event.setConsumeAirAmount(0); + // Refill even an already empty air meter (e.g. after /reload) before the drowning check. + event.setRefillAirAmount(Math.max(event.getRefillAirAmount(), + entity.getMaxAirSupply() - entity.getAirSupply())); + return; + } + var effect = entity.getEffect(ModEffects.CHOKE); + if (effect != null && entity.is(ModEntityTypeTags.CHOKE_AFFECTED) + && !MobEffectUtil.hasWaterBreathing(entity) + && !(entity instanceof Player player && player.getAbilities().invulnerable) + && !entity.level().getBlockState(BlockPos.containing(entity.getEyePosition())).is(Blocks.BUBBLE_COLUMN)) { + // The whitelist also includes innate water-breathers (e.g. frogs and turtles). + event.setCanBreathe(false); + // I consumes twice as much air, II three times, etc. Preserve respiration's zero-consumption ticks. + long amount = (long) event.getConsumeAirAmount() * (effect.getAmplifier() + 2L); + event.setConsumeAirAmount((int) Math.min(Integer.MAX_VALUE, amount)); + } + } + + /** Used before vanilla land drying, which otherwise overwrites changes made by the breathing event. */ + public static int airBeforeDrying(LivingEntity entity, int air) { + if ((entity.getType() != EntityTypes.TADPOLE && entity.getType() != EntityTypes.AXOLOTL) + || entity.isInWater()) return air; + var effect = entity.getEffect(ModEffects.CHOKE); + if (effect == null) return air; + // Vanilla subtracts the final one and performs its usual drying damage/reset afterwards. + return (int) Math.max(Integer.MIN_VALUE + 1L, (long) air - effect.getAmplifier() - 1L); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/effect/ModEffects.java b/src/hfas/java/org/polaris2023/wildwind/hfas/effect/ModEffects.java new file mode 100644 index 0000000..aa90190 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/effect/ModEffects.java @@ -0,0 +1,20 @@ +package org.polaris2023.wildwind.hfas.effect; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; + +public final class ModEffects { + private static final DeferredRegister EFFECTS = DeferredRegister.create(Registries.MOB_EFFECT, HFASMod.MOD_ID); + public static final DeferredHolder SINK = EFFECTS.register("sink", () -> new HarmfulEffect(0x344D78)); + public static final DeferredHolder CHOKE = EFFECTS.register("choke", () -> new HarmfulEffect(0x737C81)); + private ModEffects() {} + public static void register(IEventBus bus) { EFFECTS.register(bus); } + private static final class HarmfulEffect extends MobEffect { + HarmfulEffect(int color) { super(MobEffectCategory.HARMFUL, color); } + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/effect/WildWindMobEffect.java b/src/hfas/java/org/polaris2023/wildwind/hfas/effect/WildWindMobEffect.java new file mode 100644 index 0000000..0b45d30 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/effect/WildWindMobEffect.java @@ -0,0 +1,31 @@ +package org.polaris2023.wildwind.hfas.effect; + +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; + +/** + * 用于拓宽 {@link MobEffect} 构造方法的访问权限 + */ +public class WildWindMobEffect extends MobEffect { + /** + * 创建一个基础生物效果喵~ + * + * @param category 效果分类喵~ + * @param color 效果颜色喵~ + */ + public WildWindMobEffect(MobEffectCategory category, int color) { + super(category, color); + } + + /** + * 创建一个带粒子效果的生物效果喵~ + * + * @param category 效果分类喵~ + * @param color 效果颜色喵~ + * @param particle 粒子效果喵~ + */ + public WildWindMobEffect(MobEffectCategory category, int color, ParticleOptions particle) { + super(category, color, particle); + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/enchantment/MeltingEnchantment.java b/src/hfas/java/org/polaris2023/wildwind/hfas/enchantment/MeltingEnchantment.java new file mode 100644 index 0000000..a10545b --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/enchantment/MeltingEnchantment.java @@ -0,0 +1,92 @@ +package org.polaris2023.wildwind.hfas.enchantment; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.level.BlockDropsEvent; +import org.polaris2023.wildwind.hfas.HFASMod; + +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public final class MeltingEnchantment { + public static final ResourceKey MELTING = ResourceKey.create(Registries.ENCHANTMENT, + Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "melting")); + private MeltingEnchantment() {} + + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void meltDrops(BlockDropsEvent event) { + if (!(event.getBreaker() instanceof ServerPlayer player)) return; + var registry = event.getLevel().registryAccess().lookupOrThrow(Registries.ENCHANTMENT); + if (EnchantmentHelper.getItemEnchantmentLevel(registry.getOrThrow(MELTING), event.getTool()) == 0 + || EnchantmentHelper.getItemEnchantmentLevel(registry.getOrThrow(Enchantments.SILK_TOUCH), event.getTool()) > 0) return; + + // BlockDropsEvent runs after vanilla loot (including Fortune). Plan everything before spending XP. + List conversions = new ArrayList<>(); + long cost = 0; + for (var drop : event.getDrops()) { + var stack = drop.getItem(); + var input = new SingleRecipeInput(stack.copyWithCount(1)); + var recipe = event.getLevel().recipeAccess().getRecipeFor(RecipeType.SMELTING, input, event.getLevel()); + if (recipe.isEmpty()) continue; + var result = recipe.get().value().assemble(input); + if (result.isEmpty() || ItemStack.isSameItemSameComponents(stack, result)) continue; + long outputCount = (long) result.getCount() * stack.getCount(); + if (outputCount > Integer.MAX_VALUE) return; + cost += stack.getCount(); + conversions.add(new Conversion(drop, result, (int) outputCount)); + } + if (cost == 0 || cost > Integer.MAX_VALUE || availableExperience(player) < cost) return; + if (!spendExperience(player, (int) cost)) return; + + for (var conversion : conversions) { + event.getDrops().remove(conversion.original()); + int remaining = conversion.count(); + while (remaining > 0) { + int count = Math.min(remaining, conversion.result().getMaxStackSize()); + var original = conversion.original(); + var drop = new ItemEntity(event.getLevel(), original.getX(), original.getY(), original.getZ(), + conversion.result().copyWithCount(count)); + drop.setDeltaMovement(original.getDeltaMovement()); + drop.setDefaultPickUpDelay(); + event.getDrops().add(drop); + remaining -= count; + } + } + } + + /** totalExperience is lifetime accounting and is stale after enchanting or /experience set. */ + public static long availableExperience(ServerPlayer player) { + long level = player.experienceLevel; + long base = level <= 16 ? level * level + 6 * level + : level <= 31 ? (5 * level * level - 81 * level + 720) / 2 + : (9 * level * level - 325 * level + 4440) / 2; + return base + Math.round(player.experienceProgress * player.getXpNeededForNextLevel()); + } + + private static boolean spendExperience(ServerPlayer player, int cost) { + long before = availableExperience(player); + int level = player.experienceLevel, total = player.totalExperience; + int progress = Math.round(player.experienceProgress * player.getXpNeededForNextLevel()); + player.giveExperiencePoints(-cost); + if (availableExperience(player) == before - cost) return true; + // Respect XP event cancellation/adjustment without providing free smelting or partial charges. + player.setExperienceLevels(level); + player.setExperiencePoints(progress); + player.totalExperience = total; + return false; + } + + private record Conversion(ItemEntity original, ItemStack result, int count) {} +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModEntityTypeTags.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModEntityTypeTags.java new file mode 100644 index 0000000..e006b4f --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModEntityTypeTags.java @@ -0,0 +1,20 @@ +package org.polaris2023.wildwind.hfas.entity; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityType; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** Exact entity-type lists, shared by the server and client through data-pack tags. */ +public final class ModEntityTypeTags { + public static final TagKey> WATER_BREATHING = create("water_breathing"); + public static final TagKey> SINK_AFFECTED = create("sink_affected"); + public static final TagKey> CHOKE_AFFECTED = create("choke_affected"); + + private ModEntityTypeTags() {} + + private static TagKey> create(String name) { + return TagKey.create(Registries.ENTITY_TYPE, Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, name)); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModSpawnPlacementTypes.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModSpawnPlacementTypes.java new file mode 100644 index 0000000..9b6dfbf --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModSpawnPlacementTypes.java @@ -0,0 +1,50 @@ +package org.polaris2023.wildwind.hfas.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.SpawnPlacementType; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluids; + +import javax.annotation.Nullable; + +/** + * 模组自定义的实体生成位置类型常量喵~ + */ +public interface ModSpawnPlacementTypes { + /** + * 允许实体生成在水中地面上的生成类型喵~ + */ + SpawnPlacementType IN_WATER_GROUND = new SpawnPlacementType() { + /** + * 判断指定位置是否适合作为水中地面生成点喵~ + * + * @param level 当前世界读取器喵~ + * @param pos 待检测的位置喵~ + * @param entityType 待生成的实体类型喵~ + * @return 可生成时返回 true 喵~ + */ + @Override + public boolean isSpawnPositionOk(LevelReader level, BlockPos pos, @Nullable EntityType entityType) { + if (entityType == null) return false; + if (!level.getWorldBorder().isWithinBounds(pos)) return false; + BlockPos above = pos.above(); + BlockPos below = pos.below(); + BlockState blockstate = level.getBlockState(below); + + return blockstate.isValidSpawn(level, below, entityType) + && this.isValidEmptySpawnBlock(level, pos, entityType) + && this.isValidEmptySpawnBlock(level, above, entityType); + } + + private boolean isValidEmptySpawnBlock(LevelReader level, BlockPos pos, EntityType entityType) { + BlockState blockState = level.getBlockState(pos); + return !blockState.isSignalSource() + && blockState.getFluidState().is(Fluids.WATER) + && !blockState.is(BlockTags.PREVENT_MOB_SPAWNING_INSIDE) + && !entityType.isBlockDangerous(blockState); + } + }; +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/MuddyPig.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/MuddyPig.java new file mode 100644 index 0000000..0660844 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/MuddyPig.java @@ -0,0 +1,39 @@ +package org.polaris2023.wildwind.hfas.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.TagKey; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.pig.Pig; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import org.jspecify.annotations.Nullable; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.registry.ModEntities; + +/** Vanilla pig AI, food and adult/baby sounds with a distinct entity and offspring type. */ +public class MuddyPig extends Pig { + public static final TagKey SPAWNABLE_ON = TagKey.create(Registries.BLOCK, + Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "muddy_pig_spawnable_on")); + + public MuddyPig(EntityType type, Level level) { + super(type, level); + } + + @Override + public @Nullable MuddyPig getBreedOffspring(ServerLevel level, AgeableMob partner) { + return ModEntities.MUDDY_PIG.get().create(level, EntitySpawnReason.BREEDING); + } + + public static boolean checkSpawnRules(EntityType type, LevelAccessor level, + EntitySpawnReason reason, BlockPos pos, RandomSource random) { + return level.getBlockState(pos.below()).is(SPAWNABLE_ON) + && (EntitySpawnReason.ignoresLightRequirements(reason) || isBrightEnoughToSpawn(level, pos)); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ReachArrow.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ReachArrow.java new file mode 100644 index 0000000..06030d8 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ReachArrow.java @@ -0,0 +1,33 @@ +package org.polaris2023.wildwind.hfas.entity; + +import net.minecraft.core.component.DataComponents; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.arrow.Arrow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; +import org.jspecify.annotations.Nullable; +import org.polaris2023.wildwind.hfas.mixin.AbstractArrowAccessor; +import org.polaris2023.wildwind.hfas.registry.ModEntities; + +/** Native arrow physics, potion application, persistence and 600-tick decay. */ +public class ReachArrow extends Arrow { + public ReachArrow(EntityType type, Level level) { + super(type, level); + setPickupItemStack(new ItemStack(org.polaris2023.wildwind.hfas.registry.ModItems.TIPPED_ARROW.get())); + } + + public ReachArrow(Level level, double x, double y, double z, ItemStack ammo, @Nullable ItemStack weapon) { + this(ModEntities.REACH_ARROW.get(), level); + setPickupItemStack(ammo.copyWithCount(1)); + applyComponentsFromItemStack(ammo); + if (ammo.has(DataComponents.INTANGIBLE_PROJECTILE)) pickup = Pickup.CREATIVE_ONLY; + setPos(x, y, z); + if (weapon != null && level instanceof ServerLevel serverLevel) { + if (weapon.isEmpty()) throw new IllegalArgumentException("Empty arrow weapon"); + ((AbstractArrowAccessor) this).wildwind$setWeapon(weapon.copy()); + ((AbstractArrowAccessor) this).wildwind$setPiercing((byte) EnchantmentHelper.getPiercingCount(serverLevel, weapon, ammo)); + } + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/WindupAttackMob.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/WindupAttackMob.java new file mode 100644 index 0000000..881ea24 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/WindupAttackMob.java @@ -0,0 +1,77 @@ +package org.polaris2023.wildwind.hfas.entity; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; + +public interface WindupAttackMob { + void setTarget(LivingEntity entity); + + /** + * 设置蓄力攻击完成倒计时(t) + * @param tick 完成倒计时(t) + */ + void setPreparingToAttackTick(int tick); + + default boolean isPreparingToAttack() { + return this.getPreparingToAttackTick() > 0; + } + + int getPreparingToAttackTick(); + + /** + * 获取蓄力攻击所需要的总时间(t) + * @return 蓄力攻击完成需要的总时间(t) + */ + int getPreparationToAttackDuration(); + + /** + * 进入攻击蓄力状态并准备对目标发动攻击喵~ + * + * @param entity 攻击目标喵~ + * @return 成功进入蓄力状态时返回 true 喵~ + */ + default boolean prepareAttack(LivingEntity entity) { + this.setTarget(entity); + if (entity == null || !entity.isAlive()) return false; + + this.setPreparingToAttackTick(getPreparationToAttackDuration()); + return true; + } + + default boolean canContinuePreparingAttack() { + return true; + } + + /** + * 处理攻击蓄力 + */ + default void processPreparingAttack(ServerLevel level, Mob mob) { + int preparingToAttackTick = this.getPreparingToAttackTick(); + if (this.isPreparingToAttack()) { + if (!this.canContinuePreparingAttack()) { + this.setPreparingToAttackTick(-1); + return; + } + + LivingEntity target = mob.getTarget(); + if (target != null && target.isAlive()) { + mob.lookAt(target, 15.0f, 15.0f); + } + + preparingToAttackTick -= 1; + this.setPreparingToAttackTick(preparingToAttackTick); + if (preparingToAttackTick <= 0) { + this.setPreparingToAttackTick(-1); + + if (target != null && target.isAlive() && mob.isWithinMeleeAttackRange(target) && mob.getSensing().hasLineOfSight(target)) { + mob.doHurtTarget(level, target); + this.onAttackDone(target); + } + } + } + } + + default void onAttackDone(LivingEntity target) { + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java new file mode 100644 index 0000000..9559a74 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java @@ -0,0 +1,91 @@ +package org.polaris2023.wildwind.hfas.entity.ai.goal; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.TamableAnimal; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.ai.targeting.TargetingConditions; +import net.minecraft.world.phys.AABB; + +import javax.annotation.Nullable; +import java.util.Set; + +/** + * 警告最近可攻击对象的目标 + * @param 实体类型 + * @author huimanman + */ +public class AlertOthersNearestAttackableTargetGoal extends NearestAttackableTargetGoal { + @Nullable + private Set> toIgnoreAlert; + private double overrideFindEntityFollowDistance = -1.0; + + public AlertOthersNearestAttackableTargetGoal(Mob mob, Class targetType, boolean mustSee) { + super(mob, targetType, mustSee); + } + + public AlertOthersNearestAttackableTargetGoal(Mob mob, Class targetType, boolean mustSee, TargetingConditions.Selector targetPredicate) { + super(mob, targetType, mustSee, targetPredicate); + } + + public AlertOthersNearestAttackableTargetGoal(Mob mob, Class targetType, boolean mustSee, boolean mustReach) { + super(mob, targetType, mustSee, mustReach); + } + + public AlertOthersNearestAttackableTargetGoal(Mob mob, Class targetType, int randomInterval, boolean mustSee, boolean mustReach, @Nullable TargetingConditions.Selector targetPredicate) { + super(mob, targetType, randomInterval, mustSee, mustReach, targetPredicate); + } + + /** + * 覆写跟随距离 + * @param followDistance 跟随距离 + * @return 当前目标,用于链式修改 + */ + public AlertOthersNearestAttackableTargetGoal overrideFindEntityFollowDistance(double followDistance) { + this.overrideFindEntityFollowDistance = followDistance; + return this; + } + + @Override + public void start() { + super.start(); + if (this.target != null) this.alertOthers(); + } + + public AlertOthersNearestAttackableTargetGoal ignoreAlertOthers(Class... reinforcementTypes) { + this.toIgnoreAlert = new ObjectOpenHashSet<>(reinforcementTypes); + return this; + } + + protected void alertOthers() { + double followDistance = super.getFollowDistance(); + AABB alertBox = AABB.unitCubeFromLowerCorner(this.mob.position()).inflate(followDistance, 10.0, followDistance); + for (Mob mob : this.mob.level().getEntitiesOfClass(this.mob.getClass(), alertBox, EntitySelector.NO_SPECTATORS)) { + if (this.mob != mob && this.shouldAlert(mob)) { + if (this.toIgnoreAlert != null && this.toIgnoreAlert.contains(mob.getClass())) continue; + } + + this.alertOther(mob, this.target); + } + } + + protected boolean shouldAlert(Mob other) { + LivingEntity target = mob.getTarget(); + return target != null + && (!(this.mob instanceof TamableAnimal selfMob) || (selfMob.getOwner() == ((TamableAnimal) other).getOwner()) + && !this.mob.isAlliedTo(target)); + } + + protected void alertOther(Mob mob, @Nullable LivingEntity target) { + mob.setTarget(target); + } + + @Override + protected double getFollowDistance() { + return this.overrideFindEntityFollowDistance != -1.0 + ? this.overrideFindEntityFollowDistance + : super.getFollowDistance(); + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/ChargingMeleeAttackGoal.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/ChargingMeleeAttackGoal.java new file mode 100644 index 0000000..56d9176 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/ChargingMeleeAttackGoal.java @@ -0,0 +1,42 @@ +package org.polaris2023.wildwind.hfas.entity.ai.goal; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; +import org.polaris2023.wildwind.hfas.entity.WindupAttackMob; + +/** + * 准备近战攻击目标 + * @param 实体类型 + */ +public class ChargingMeleeAttackGoal extends MeleeAttackGoal { + protected final T mob; + + /** + * 准备近战攻击目标构造函数 + * @param mob 生物 + * @param speedModifier 速度变化 + * @param followingTargetEvenIfNotSeen 是否在看不到目标时仍然执行 + */ + public ChargingMeleeAttackGoal(T mob, double speedModifier, boolean followingTargetEvenIfNotSeen) { + super(mob, speedModifier, followingTargetEvenIfNotSeen); + this.mob = mob; + } + + @Override + public boolean canUse() { + return !this.mob.isPreparingToAttack() && super.canUse(); + } + + @Override + public boolean canContinueToUse() { + return !this.mob.isPreparingToAttack() && super.canContinueToUse(); + } + + @Override + protected void checkAndPerformAttack(LivingEntity target) { + if (!canPerformAttack(target)) return; + this.resetAttackCooldown(); + this.mob.prepareAttack(target); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Mudcrab.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Mudcrab.java new file mode 100644 index 0000000..92ec6a6 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Mudcrab.java @@ -0,0 +1,1097 @@ +package org.polaris2023.wildwind.hfas.entity.animal; + +import com.geckolib.animatable.GeoEntity; +import com.geckolib.animatable.instance.AnimatableInstanceCache; +import com.geckolib.animatable.manager.AnimatableManager; +import com.geckolib.animation.AnimationController; +import com.geckolib.animation.RawAnimation; +import com.geckolib.animation.object.PlayState; +import com.geckolib.animation.state.AnimationTest; +import com.geckolib.constant.DefaultAnimations; +import com.geckolib.util.GeckoLibUtil; +import com.mojang.logging.LogUtils; +import net.minecraft.core.*; +import net.minecraft.core.component.DataComponentGetter; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.util.random.WeightedList; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.MoveControl; +import net.minecraft.world.entity.ai.goal.*; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.ai.navigation.GroundPathNavigation; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.ai.util.DefaultRandomPos; +import net.minecraft.world.entity.ai.util.LandRandomPos; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.rabbit.Rabbit; +import net.minecraft.world.entity.monster.Endermite; +import net.minecraft.world.entity.monster.Silverfish; +import net.minecraft.world.entity.monster.spider.CaveSpider; +import net.minecraft.world.entity.monster.spider.Spider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.variant.SpawnContext; +import net.minecraft.world.entity.variant.VariantUtils; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; +import net.minecraft.world.level.*; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gamerules.GameRules; +import net.minecraft.world.level.pathfinder.AmphibiousNodeEvaluator; +import net.minecraft.world.level.pathfinder.Path; +import net.minecraft.world.level.pathfinder.PathFinder; +import net.minecraft.world.level.pathfinder.PathType; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.fluids.FluidType; +import org.polaris2023.wildwind.hfas.entity.ModSpawnPlacementTypes; +import org.polaris2023.wildwind.hfas.entity.WindupAttackMob; +import org.polaris2023.wildwind.hfas.entity.ai.goal.ChargingMeleeAttackGoal; +import org.polaris2023.wildwind.hfas.registry.*; +import org.polaris2023.wildwind.hfas.tag.ModBlockTags; +import org.polaris2023.wildwind.hfas.tag.ModItemTags; +import org.slf4j.Logger; + +import javax.annotation.Nullable; +import java.util.EnumSet; +import java.util.Optional; + +/** + * 泥沼蟹生物实体

+ */ +public class Mudcrab extends Animal implements Bucketable, WindupAttackMob, GeoEntity { + /** + * 泥沼蟹使用的自定义生成位置类型喵~ + */ + public static final SpawnPlacementType SPAWN_PLACEMENT = new SpawnPlacementType() { + + @Override + public boolean isSpawnPositionOk(LevelReader level, BlockPos pos, @Nullable EntityType entityType) { + return ModSpawnPlacementTypes.IN_WATER_GROUND.isSpawnPositionOk(level, pos, entityType) + || SpawnPlacementTypes.ON_GROUND.isSpawnPositionOk(level, pos, entityType); + } + + @Override + public BlockPos adjustSpawnPosition(LevelReader level, BlockPos pos) { + return level.getFluidState(pos).is(Tags.Fluids.WATER) ? pos : SpawnPlacementTypes.ON_GROUND.adjustSpawnPosition(level, pos); + } + }; + + protected static final RawAnimation HURT_ANIM = RawAnimation.begin().thenPlay("misc.hurt"); + protected static final RawAnimation GREETING_ANIM = RawAnimation.begin().thenPlay("misc.greeting"); + protected static final float CLIENT_SIDE_MAX_MODEL_ROT = 90.0f; + protected static final int CLIENT_SIDE_MODEL_ROT_TIME = 5; + protected static final float CLIENT_SIDE_MODEL_ROT_PER_TICK = CLIENT_SIDE_MAX_MODEL_ROT / CLIENT_SIDE_MODEL_ROT_TIME; + private static final EntityDataAccessor> VARIANT_ID = SynchedEntityData.defineId(Mudcrab.class, ModEntityDataSerializers.MUDCRAB_VARIANT.get()); + private static final EntityDataAccessor FROM_BUCKET = SynchedEntityData.defineId(Mudcrab.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor CLIMBING = SynchedEntityData.defineId(Mudcrab.class, EntityDataSerializers.BOOLEAN); + private static final Logger LOGGER = LogUtils.getLogger(); + private static final int TOTAL_AIR_SUPPLY = 7200; + private static final int START_FIND_WATER_AIR_SUPPLY = 2400; + private static final int REHYDRATE_AIR_SUPPLY = 1800; + + private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); + /** + * 客户端渲染时模型的 Y 轴附加旋转偏移喵~ + */ + public float clientSideModelYRotOffset; + /** + * 客户端渲染时上一刻模型的 Y 轴附加旋转偏移喵~ + */ + public float clientSidePreModelYRotOffset = this.clientSideModelYRotOffset; + /** + * 客户端渲染时模型的 X 轴附加旋转偏移喵~ + */ + public float clientSideModelXRotOffset; + /** + * 客户端渲染时上一刻模型的 X 轴附加旋转偏移喵~ + */ + public float clientSidePreModelXRotOffset = this.clientSideModelXRotOffset; + private int preparingToAttack = -1; + private int greetingTicks = -1; + + /** + * 创建泥沼蟹实体喵~ + * + * @param entityType 实体类型喵~ + * @param level 所在世界喵~ + */ + public Mudcrab(EntityType entityType, Level level) { + super(entityType, level); + this.setPathfindingMalus(PathType.WATER, 0.0f); + this.moveControl = new MudcrabMoveControl(this); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new PanicGoal(this, 1.25f)); + this.goalSelector.addGoal(2, new MudcrabFindWaterGoal(this, 1.25f, 12, 80)); + this.goalSelector.addGoal(3, new ChargingMeleeAttackGoal<>(this, 1.2f, true)); + this.goalSelector.addGoal(4, new BreedGoal(this, 1.0f)); + this.goalSelector.addGoal(5, new TemptGoal(this, 1.1f, stack -> stack.is(ModItemTags.MUDCRAB_FOOD), false)); + this.goalSelector.addGoal(6, new FollowParentGoal(this, 1.1f)); + this.goalSelector.addGoal(7, new MudcrabRandomStrollGoal(this, 1.0f)); + this.goalSelector.addGoal(8, new MudcrabFloatGoal(this, 0.04f)); + this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 7.0f)); + this.goalSelector.addGoal(10, new RandomLookAroundGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Spider.class, true)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, CaveSpider.class, true)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Silverfish.class, true)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, true)); + } + + @Override + protected PathNavigation createNavigation(Level level) { + return new MudcrabPathNavigation(this, level); + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); + builder.define(VARIANT_ID, VariantUtils.getDefaultOrAny(this.registryAccess(), MudcrabVariant.TEMPERATE)); + builder.define(FROM_BUCKET, false); + builder.define(CLIMBING, false); + } + + /** + * 计算指定位置对泥沼蟹寻路的吸引值喵~ + * + * @param pos 待评估的位置喵~ + * @param level 当前关卡读取器喵~ + * @return 越高表示越适合作为行走目标喵~ + */ + @Override + public float getWalkTargetValue(BlockPos pos, LevelReader level) { + BlockState state = level.getBlockState(pos.below()); + if (state.is(ModBlockTags.EntityAbout.MUDCRAB_PREFERRED_WANDER_BLOCKS)) return 10.0f; + if (state.is(ModBlockTags.EntityAbout.MUDCRAB_SPAWNABLE_IN_WATER_GROUND)) return 5.0f; + + return level.getPathfindingCostFromLightLevels(pos); + } + + /** + * 判断当前实体在所在位置是否被阻挡喵~ + * + * @param level 当前关卡读取器喵~ + * @return 未被阻挡时返回 true 喵~ + */ + @Override + public boolean checkSpawnObstruction(LevelReader level) { + return level.isUnobstructed(this); + } + + /** + * 判断当前是否处于攻击蓄力阶段喵~ + * + * @return 处于攻击蓄力时返回 true 喵~ + */ + public boolean isPreparingToAttack() { + return this.preparingToAttack != -1; + } + + /** + * 判断当前是否处于打招呼动画阶段喵~ + * + * @return 正在打招呼时返回 true 喵~ + */ + public boolean isGreeting() { + return this.greetingTicks != -1; + } + + @Override + public void setPreparingToAttackTick(int tick) { + this.preparingToAttack = tick; + } + + @Override + public int getPreparingToAttackTick() { + return this.preparingToAttack; + } + + @Override + public int getPreparationToAttackDuration() { + return 12; + } + + @Override + public boolean prepareAttack(LivingEntity entity) { + boolean result = WindupAttackMob.super.prepareAttack(entity); + if (result) this.triggerAnim("Attack", "attack"); + return result; + } + + protected void updateClientSideVisuals() { + this.clientSidePreModelYRotOffset = this.clientSideModelYRotOffset; + this.clientSidePreModelXRotOffset = this.clientSideModelXRotOffset; + + if (this.shouldRotModelY()) { + if (this.clientSideModelYRotOffset < CLIENT_SIDE_MAX_MODEL_ROT) { + this.clientSideModelYRotOffset += CLIENT_SIDE_MODEL_ROT_PER_TICK; + } + } else if (this.clientSideModelYRotOffset > 0.0 && this.clientSideModelXRotOffset <= 0.0f) { + this.clientSideModelYRotOffset -= CLIENT_SIDE_MODEL_ROT_PER_TICK; + } + + if (this.shouldRotModelX()) { + if (this.clientSideModelXRotOffset < CLIENT_SIDE_MAX_MODEL_ROT) { + this.clientSideModelXRotOffset += CLIENT_SIDE_MODEL_ROT_PER_TICK; + } + } else if (this.clientSideModelXRotOffset > 0.0) { + this.clientSideModelXRotOffset -= CLIENT_SIDE_MODEL_ROT_PER_TICK; + } + } + + protected boolean shouldRotModelY() { + Vec3 movement = this.getDeltaMovement(); + return ((this.onGround() && Math.abs(movement.x) + Math.abs(movement.z) / 2 > 0.015f && this.walkAnimation.speed() != 0.0f) + || (!this.onGround() && this.isClimbing() && Math.abs(movement.y) > 0.005f)) + && !this.isVisuallySwimming() + && !this.isImmobile(); + } + + protected boolean shouldRotModelX() { + return !this.onGround() && !this.isVisuallySwimming() && this.isClimbing(); + } + + /** + * 检查泥沼蟹是否可在水中地面生成喵~ + * + * @param mudcrab 泥沼蟹实体类型喵~ + * @param level 世界访问器喵~ + * @param spawnType 生成类型喵~ + * @param pos 生成位置喵~ + * @param random 随机源喵~ + * @return 满足生成条件时返回 true 喵~ + */ + public static boolean checkMudcrabInWaterGroundSpawnRules( + EntityType mudcrab, LevelAccessor level, EntitySpawnReason spawnType, BlockPos pos, RandomSource random + ) { + if (!(EntitySpawnReason.ignoresLightRequirements(spawnType) || isBrightEnoughToSpawn(level, pos))) return false; + + return level.getBlockState(pos.below()).is(ModBlockTags.EntityAbout.MUDCRAB_SPAWNABLE_IN_WATER_GROUND); + } + + /** + * 检查泥沼蟹是否可在陆地生成喵~ + * + * @param mudcrab 泥沼蟹实体类型喵~ + * @param level 世界访问器喵~ + * @param spawnType 生成类型喵~ + * @param pos 生成位置喵~ + * @param random 随机源喵~ + * @return 满足生成条件时返回 true 喵~ + */ + public static boolean checkMudcrabOnGroundSpawnRules(EntityType mudcrab, LevelAccessor level, EntitySpawnReason spawnType, BlockPos pos, RandomSource random) { + if (!(EntitySpawnReason.ignoresLightRequirements(spawnType) || isBrightEnoughToSpawn(level, pos))) return false; + + return level.getBlockState(pos.below()).is(ModBlockTags.EntityAbout.MUDCRAB_SPAWNABLE_ON); + } + + /** + * 创建泥沼蟹实体的基础属性喵~ + * + * @return 属性构建器喵~ + */ + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 10.0d) + .add(Attributes.MOVEMENT_SPEED, 0.22d) + .add(Attributes.ATTACK_DAMAGE, 10.0d) + .add(Attributes.STEP_HEIGHT, 1.0d) + .add(Attributes.TEMPT_RANGE, 16d); + } + + /** + * 执行每刻更新并维持空气值变化喵~ + */ + @Override + public void baseTick() { + int currentAirSupply = this.getAirSupply(); + super.baseTick(); + if (!this.isNoAi()) this.handleAirSupply(currentAirSupply); + } + + /** + * 获取泥沼蟹最大空气值喵~ + * + * @return 最大空气值喵~ + */ + @Override + public int getMaxAirSupply() { + return TOTAL_AIR_SUPPLY; + } + + /** + * 处理离水状态下的空气值变化喵~ + * + * @param currentAirSupply 当前空气值喵~ + */ + public void handleAirSupply(int currentAirSupply) { + //isInWaterRainOrBubble已被删除,使用等效替换 + if (this.isAlive() && (!this.isInWaterOrRain() || this.getInBlockState().is(Blocks.BUBBLE_COLUMN))) { + this.setAirSupply(currentAirSupply - 1); + if (this.getAirSupply() == -20) { + this.setAirSupply(0); + this.hurt(this.damageSources().dryOut(), 1.0F); + } + + return; + } + + this.setAirSupply(this.getMaxAirSupply()); + } + + /** + * 让泥沼蟹在接触到水后恢复部分空气值喵~ + */ + public void rehydrate() { + this.setAirSupply(Math.min(this.getAirSupply() + REHYDRATE_AIR_SUPPLY, this.getMaxAirSupply())); + } + + /** + * 判断当前是否需要主动寻找水源喵~ + * + * @return 需要找水时返回 true 喵~ + */ + public boolean needWater() { + return this.getAirSupply() < START_FIND_WATER_AIR_SUPPLY; + } + + /** + * 获取水中移动减速系数喵~ + * + * @return 水中减速系数喵~ + */ + @Override + protected float getWaterSlowDown() { + return 0.98f; + } + + /** + * 更新游泳状态喵~ + */ + @Override + public void updateSwimming() { + if (!this.level().isClientSide()) { + this.setSwimming(this.isEffectiveAi() && this.isInWater()); + } + } + + /** + * 判断是否在视觉上表现为游泳喵~ + * + * @return 是否视觉游泳喵~ + */ + @Override + public boolean isVisuallySwimming() { + return this.isSwimming(); + } + + /** + * 判断是否会被流体推动喵~ + * + * @param type 流体类型喵~ + * @return 不会被推动喵~ + */ + @Override + public boolean isPushedByFluid(FluidType type) { + return false; + } + + /** + * 判断是否需要自定义持久化喵~ + * + * @return 需要时返回 true 喵~ + */ + @Override + public boolean requiresCustomPersistence() { + return super.requiresCustomPersistence() || this.fromBucket(); + } + + /** + * 判断离玩家较远时是否应被清除喵~ + * + * @param distanceToClosestPlayer 最近玩家距离喵~ + * @return 不应远距离消失时返回 true 喵~ + */ + @Override + public boolean removeWhenFarAway(double distanceToClosestPlayer) { + return !this.fromBucket() && !this.hasCustomName(); + } + + /** + * 处理玩家与泥沼蟹的交互喵~ + * + * @param player 玩家喵~ + * @param hand 使用的手喵~ + * @return 交互结果喵~ + */ + @Override + public InteractionResult mobInteract(Player player, InteractionHand hand) { + return Bucketable.bucketMobPickup(player, hand, this).orElse(super.mobInteract(player, hand)); + } + + /** + * 完成泥沼蟹生成时的初始化喵~ + * + * @param level 服务端世界喵~ + * @param difficulty 生成难度喵~ + * @param spawnType 生成类型喵~ + * @param spawnGroupData 群组生成数据喵~ + * @return 生成后的群组数据喵~ + */ + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnType, @Nullable SpawnGroupData spawnGroupData) { + if (spawnType == EntitySpawnReason.BUCKET) return spawnGroupData; + + getVariantByPos((ServerLevelAccessor) this.level(),this.blockPosition()).ifPresent(this::setVariant); + + return super.finalizeSpawn(level, difficulty, spawnType, spawnGroupData); + } + + /** + * 根据生物群系获取默认泥沼蟹变种喵~ + * + * @return 对应变种喵~ + */ + protected static Optional> getVariantByPos(ServerLevelAccessor level, BlockPos pos) { +// if (biome.is(ModBiomeTags.EntityGen.MUDCRABS_WARM)) return VariantUtils.getDefaultOrAny(access,MudcrabVariant.WARM); +// if (biome.is(ModBiomeTags.EntityGen.MUDCRABS_COLD)) return VariantUtils.getDefaultOrAny(access,MudcrabVariant.COLD); +// +// return VariantUtils.getDefaultOrAny(access,MudcrabVariant.TEMPERATE); + + return VariantUtils.selectVariantToSpawn(SpawnContext.create(level, pos), DatadrivenRegistryKey.MUDCRAB_VARIANT); + } + + /** + * 判断泥沼蟹是否无视默认行动限制喵~ + * + * @return 处于攻击或打招呼时返回 true 喵~ + */ + @Override + protected boolean isImmobile() { + return super.isImmobile() || this.isPreparingToAttack() || this.isGreeting(); + } + + /** + * 判断指定物品是否可作为泥沼蟹食物喵~ + * + * @param stack 待检查物品喵~ + * @return 可食用时返回 true 喵~ + */ + @Override + public boolean isFood(ItemStack stack) { + return stack.is(ModItemTags.MUDCRAB_FOOD); + } + + /** + * 判断该泥沼蟹是否来自桶装释放喵~ + * + * @return 来自桶装时返回 true 喵~ + */ + @Override + public boolean fromBucket() { + return this.entityData.get(FROM_BUCKET); + } + + /** + * 设置该泥沼蟹是否来自桶装释放喵~ + * + * @param fromBucket 是否来自桶装喵~ + */ + @Override + public void setFromBucket(boolean fromBucket) { + this.entityData.set(FROM_BUCKET, fromBucket); + } + + /** + * 将泥沼蟹数据写入桶物品标签喵~ + * + * @param stack 蟹桶物品栈喵~ + */ + @Override + public void saveToBucketTag(ItemStack stack) { + Bucketable.saveDefaultDataToBucketTag(this, stack); + CustomData.update(DataComponents.BUCKET_ENTITY_DATA, stack, tag -> { + tag.put("Variant", MudcrabVariant.CODEC.encodeStart(NbtOps.INSTANCE, this.getVariant()).getOrThrow()); + tag.putInt("Age", this.getAge()); + tag.putBoolean("AgeLocked", this.isAgeLocked()); + }); + } + + /** + * 从桶物品标签中读取泥沼蟹数据喵~ + * + * @param tag 桶数据标签喵~ + */ + @Override + public void loadFromBucketTag(CompoundTag tag) { + this.setAge(tag.getIntOr("Age", 0)); + this.setAgeLocked(tag.getBooleanOr("AgeLocked", false)); + if (tag.contains("Variant")) { + MudcrabVariant.CODEC + .parse(NbtOps.INSTANCE, tag.get("Variant")) + .resultOrPartial(LOGGER::error) + .ifPresent(this::setVariant); + } + } + + /** + * 获取装载该实体所对应的桶物品喵~ + * + * @return 蟹桶物品栈喵~ + */ + @Override + public ItemStack getBucketItemStack() { + return new ItemStack((ItemLike) ModItems.MUDCRAB_BUCKET); + } + + /** + * 获取头部 X 轴旋转上限喵~ + * + * @return 头部 X 轴旋转上限喵~ + */ + @Override + public int getMaxHeadXRot() { + return 0; + } + + /** + * 获取头部 Y 轴旋转上限喵~ + * + * @return 头部 Y 轴旋转上限喵~ + */ + @Override + public int getMaxHeadYRot() { + return 0; + } + + /** + * 获取被装桶时播放的音效喵~ + * + * @return 装桶音效喵~ + */ + @Override + public SoundEvent getPickupSound() { + return SoundEvents.BUCKET_FILL; + } + + @Override @Nullable + protected SoundEvent getAmbientSound() { + return super.getAmbientSound(); + } + + @Override @Nullable + protected SoundEvent getDeathSound() { + return super.getDeathSound(); + } + + @Override @Nullable + protected SoundEvent getHurtSound(DamageSource damageSource) { + return super.getHurtSound(damageSource); + } + + @Override + protected SoundEvent getSwimSplashSound() { + return super.getSwimSplashSound(); + } + + @Override + protected SoundEvent getSwimSound() { + return super.getSwimSound(); + } + + @Override + protected void ageBoundaryReached() { + super.ageBoundaryReached(); + if (!this.isBaby() && ((ServerLevel)this.level()).getServer().getGameRules().get(GameRules.MOB_DROPS)) { + this.spawnAtLocation((ServerLevel)this.level(), ModItems.CRAB_CLAW); + } + } + + /** + * 生成繁殖后的幼年泥沼蟹实体喵~ + * + * @param level 服务端世界喵~ + * @param otherParent 另一只亲代喵~ + * @return 新生成的幼年泥沼蟹,无法生成时返回 null 喵~ + */ + @Override @Nullable + public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob otherParent) { + Mudcrab mudcrab = ModEntities.MUDCRAB.get().create(level, EntitySpawnReason.BREEDING); + if (mudcrab != null) { + var variantList = WeightedList.>builder(); + variantList.add(this.getVariant()); + if (otherParent instanceof Mudcrab otherMudcrab) { + variantList.add(otherMudcrab.getVariant()); + } + getVariantByPos((ServerLevelAccessor) this.level(),this.blockPosition()).ifPresent(variantList::add); + + Holder variant = variantList + .build() + .getRandom(mudcrab.getRandom()) + .orElse(MudcrabVariant.lookup(this.level().registryAccess(),MudcrabVariant.TEMPERATE)); + mudcrab.setVariant(variant); + } + + return mudcrab; + } + + @Override + public @Nullable T get(DataComponentType type) { + return type.equals(ModDataComponents.MUDCRAB_VARIANT.get()) ? (T) getVariant() : super.get(type); + } + + @Override + protected void applyImplicitComponents(DataComponentGetter components) { + this.applyImplicitComponentIfPresent(components, ModDataComponents.MUDCRAB_VARIANT.get()); + super.applyImplicitComponents(components); + } + + @Override + protected boolean applyImplicitComponent(DataComponentType type, T value) { + if (type == ModDataComponents.MUDCRAB_VARIANT.get()) { + this.setVariant((Holder) value); + return true; + } else { + return super.applyImplicitComponent(type, value); + } + } + + @Override + protected void addAdditionalSaveData(ValueOutput output) { + super.addAdditionalSaveData(output); + output.store("MudcarbVariant", MudcrabVariant.CODEC, this.getVariant()); + output.putBoolean("FromBucket", this.fromBucket()); + } + + @Override + protected void readAdditionalSaveData(ValueInput input) { + super.readAdditionalSaveData(input); + this.setVariant(input.read("MudcarbVariant", MudcrabVariant.CODEC).orElse(MudcrabVariant.lookup(this.level().registryAccess(),MudcrabVariant.TEMPERATE))); + this.setFromBucket(input.getBooleanOr("FromBucket", false)); + } + + /** + * 设置泥沼蟹的变种喵~ + * + * @param variant 变种喵~ + */ + public void setVariant(Holder variant) { + this.entityData.set(VARIANT_ID, variant); + } + + /** + * 获取泥沼蟹当前的变种喵~ + * + * @return 当前变种喵~ + */ + public Holder getVariant() { + return this.entityData.get(VARIANT_ID); + } + + /** + * 注册泥沼蟹的动画控制器喵~ + * + * @param controllers 动画控制器注册器喵~ + */ + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + controllers.add(new AnimationController<>("Move", 3, this::moveAnimController)); + controllers.add(new AnimationController<>("Hurt", this::hurtAnimController)); + controllers.add(new AnimationController<>("Attack", state -> PlayState.STOP) + .triggerableAnim("attack", DefaultAnimations.ATTACK_SWING) + ); + controllers.add(new AnimationController<>("Greeting", state -> PlayState.STOP) + .triggerableAnim("greeting", GREETING_ANIM) + ); + } + + protected PlayState moveAnimController(final AnimationTest state) { + return this.isInWater() + ? state.setAndContinue(DefaultAnimations.SWIM) + : state.isMoving() || this.isClimbing() + ? state.setAndContinue(DefaultAnimations.WALK) + : state.setAndContinue(DefaultAnimations.IDLE); + } + + protected PlayState hurtAnimController(final AnimationTest state) { + if (this.isAlive() && this.hurtTime > 0) { + return state.setAndContinue(HURT_ANIM); + } + + //stop语义:Stop the currently playing animation, resetting the animation time to 0,已包含重置,且原方法已删除 +// state.resetCurrentAnimation(); + return PlayState.STOP; + } + + /** + * 设置泥沼蟹当前是否处于攀爬状态喵~ + * + * @param climbing 是否攀爬喵~ + */ + public void setClimbing(boolean climbing) { + this.entityData.set(CLIMBING, climbing); + } + + /** + * 判断泥沼蟹当前是否处于攀爬状态喵~ + * + * @return 攀爬中返回 true 喵~ + */ + public boolean isClimbing() { + return this.entityData.get(CLIMBING); + } + + /** + * 判断当前实体是否可攀附喵~ + * + * @return 攀爬中返回 true 喵~ + */ + @Override + public boolean onClimbable() { + return this.isClimbing(); + } + + /** + * 执行泥沼蟹的 AI 逻辑与客户端视觉更新喵~ + */ + @Override + public void aiStep() { + super.aiStep(); + + if (!this.isAlive()) return; + + if (this.level().isClientSide()) { + this.updateClientSideVisuals(); + return; + } + + if (!this.isEffectiveAi()) return; + + this.setClimbing(this.horizontalCollision); + + processPreparingAttack((ServerLevel)this.level() ,this); + + if (this.greetingTicks > 0) { + if (--this.greetingTicks <= 0) { + this.greetingTicks = -1; + } + } + + if (!this.isInWater() && !this.isGreeting() && this.tickCount % 2 == 0 && this.random.nextFloat() <= 0.001) { + AABB box = this.getBoundingBox().inflate(6.0, 2.0, 6.0); + for (BlockPos pos : BlockPos.betweenClosed(BlockPos.containing(box.minX, box.minY, box.minZ), BlockPos.containing(box.maxX, box.maxY, box.maxZ))) { + if (this.level().getBlockState(pos).is(ModBlockTags.EntityAbout.MUDCRAB_PREFERRED_WANDER_BLOCKS)) { + this.greetingTicks = 27; + this.triggerAnim("Greeting", "greeting"); + } + } + } + } + + /** + * 屏蔽默认跳跃状态设置,避免泥沼蟹出现不符合预期的跳跃表现喵~ + * + * @param jumping 是否正在跳跃喵~ + */ + @Override + public void setJumping(boolean jumping) { + } + + /** + * 获取 GeckoLib 动画缓存喵~ + * + * @return 动画缓存喵~ + */ + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.geoCache; + } + + protected static class MudcrabFloatGoal extends Goal { + private final Mob mob; + private final float strength; + + public MudcrabFloatGoal(Mob mob, float strength) { + this.mob = mob; + this.strength = strength; + this.mob.getNavigation().setCanFloat(true); + } + + @Override + public boolean canUse() { + MoveControl moveControl = this.mob.getMoveControl(); + return this.mob.isInFluidType((entity,fluidType, height) -> height > this.mob.getBbHeight() && this.mob.canSwimInFluidType(fluidType)) + && !this.mob.level().getFluidState(new BlockPos((int) moveControl.getWantedX(), (int) moveControl.getWantedY(), (int) moveControl.getWantedZ())).isEmpty(); + } + + @Override + public boolean requiresUpdateEveryTick() { + return false; + } + + @Override + public void tick() { + if (this.mob.getRandom().nextFloat() < 0.8f) { + this.mob.addDeltaMovement(new Vec3(0.0, this.strength, 0.0)); + } + } + } + + protected static class MudcrabMoveControl extends MoveControl { + private final Mudcrab mudcrab; + + public MudcrabMoveControl(Mudcrab mudcrab) { + super(mudcrab); + this.mudcrab = mudcrab; + } + + @Override + public void tick() { + if (!mudcrab.isInWater()) { + super.tick(); + return; + } + + if (this.operation == Operation.MOVE_TO && this.shouldContinueMoveTo()) { + float modifiedSpeed = (float) (this.speedModifier * this.mudcrab.getAttributeValue(Attributes.MOVEMENT_SPEED)); + this.mudcrab.setSpeed(Mth.lerp(0.125F, this.mudcrab.getSpeed(), modifiedSpeed)); + double relativeX = this.wantedX - this.mudcrab.getX(); + double relativeY = this.wantedY - this.mudcrab.getY(); + double relativeZ = this.wantedZ - this.mudcrab.getZ(); + if (relativeY != 0.0) { + double distance = Math.sqrt(relativeX * relativeX + relativeY * relativeY + relativeZ * relativeZ); + this.mudcrab.setDeltaMovement(this.mudcrab.getDeltaMovement() + .add(0.0, (double) this.mudcrab.getSpeed() * (relativeY / distance) * 0.1, 0.0) + ); + } + + if (relativeX != 0.0 || relativeZ != 0.0) { + float yRot = (float) (Mth.atan2(relativeZ, relativeX) * 180.0F / (float) Math.PI) - CLIENT_SIDE_MAX_MODEL_ROT; + this.mudcrab.setYRot(this.rotlerp(this.mudcrab.getYRot(), yRot, CLIENT_SIDE_MAX_MODEL_ROT)); + this.mudcrab.yBodyRot = this.mudcrab.getYRot(); + } + } + } + + private boolean shouldContinueMoveTo() { + PathNavigation navigation = this.mudcrab.getNavigation(); + return navigation instanceof MudcrabPathNavigation mudcrabPathNavigation + ? !mudcrabPathNavigation.isDone() || (this.mudcrab.isInWater() && mudcrabPathNavigation.fallbackPos != null) + : !navigation.isDone(); + } + } + + protected static class MudcrabFindWaterGoal extends Goal { + private final Mudcrab mudcrab; + private final float speedModifier; + private final int waterSearchRange; + private final int interval; + @Nullable + private BlockPos waterPos; + private int cooldown; + + public MudcrabFindWaterGoal(Mudcrab mudcrab, float speedModifier, int waterSearchRange, int interval) { + this.mudcrab = mudcrab; + this.speedModifier = speedModifier; + this.waterSearchRange = waterSearchRange; + this.interval = interval; + this.setFlags(EnumSet.of(Flag.MOVE)); + } + + @Override + public boolean canUse() { + if (!this.mudcrab.needWater()) return false; + + if (this.cooldown > 0) { + this.cooldown--; + return false; + } + + for (BlockPos pos : BlockPos.betweenClosed( + (int) (this.mudcrab.getX() - waterSearchRange), + (int) this.mudcrab.getY() - waterSearchRange, + (int) this.mudcrab.getZ() - waterSearchRange / 2, + (int) this.mudcrab.getX() + waterSearchRange, + (int) this.mudcrab.getY() + waterSearchRange / 2, + (int) this.mudcrab.getZ() + waterSearchRange + )) { + if (this.mudcrab.level().getFluidState(pos).is(FluidTags.WATER)) { + this.waterPos = pos; + break; + } + } + this.cooldown = this.interval; + + return waterPos != null; + } + + @Override + public void start() { + this.mudcrab.getNavigation().moveTo( + this.waterPos.getX(), + this.waterPos.getY(), + this.waterPos.getZ(), + this.speedModifier + ); + + this.waterPos = null; + } + } + + protected static class MudcrabRandomStrollGoal extends RandomStrollGoal { + public MudcrabRandomStrollGoal(PathfinderMob mob, double speedModifier) { + super(mob, speedModifier); + } + + @Override + protected @Nullable Vec3 getPosition() { + Level level = this.mob.level(); + Vec3 position = null; + + //时间系统重构使得直接判断是否为夜晚不可行 替换为主世界+时间判断 + if ((level.dimension().equals(Level.OVERWORLD) && level.getOverworldClockTime() % 24000L >= 13000L) || level.isRaining()) { + position = LandRandomPos.getPos(this.mob, 20, 4, pos -> + level.getBlockState(pos.above()).is(ModBlockTags.EntityAbout.MUDCRAB_PREFERRED_WANDER_BLOCKS) + ? 10.0 + : 0.0 + ); + } + + if (position == null) { + position = DefaultRandomPos.getPos(this.mob, 10, 7); + } + + return position; + } + } + + protected static class MudcrabPathNavigation extends GroundPathNavigation { + private final Mudcrab mudcrab; + @Nullable + private BlockPos fallbackPos; + + public MudcrabPathNavigation(Mudcrab mudcrab, Level level) { + super(mudcrab, level); + this.mudcrab = mudcrab; + } + + @Override + protected PathFinder createPathFinder(int maxVisitedNodes) { + this.nodeEvaluator = new AmphibiousNodeEvaluator(true); + this.nodeEvaluator.setCanPassDoors(true); + return new PathFinder(this.nodeEvaluator, maxVisitedNodes); + } + + @Override + protected boolean canUpdatePath() { + return true; + } + + @Override + protected Vec3 getTempMobPos() { + return new Vec3(this.mob.getX(), this.mob.getY(0.5), this.mob.getZ()); + } + + @Override + public Path createPath(BlockPos pos, int accuracy) { + this.fallbackPos = pos; + return super.createPath(pos, accuracy); + } + + @Override + public Path createPath(Entity entity, int accuracy) { + this.fallbackPos = entity.blockPosition(); + return super.createPath(entity, accuracy); + } + + @Override + public boolean moveTo(Entity entity, double speed) { + Path path = this.createPath(entity, 0); + if (path != null) { + return this.moveTo(path, speed); + } else { + this.fallbackPos = entity.blockPosition(); + this.speedModifier = speed; + return true; + } + } + + @Override + public void tick() { + if (!this.isDone()) { + super.tick(); + return; + } + + if (forwardToFallbackPos()) { + MoveControl moveControl = this.mob.getMoveControl(); + moveControl.setWantedPosition(this.fallbackPos.getX(), this.fallbackPos.getY(), this.fallbackPos.getZ(), this.speedModifier); + return; + } + + this.fallbackPos = null; + } + + private boolean forwardToFallbackPos() { + if (fallbackPos == null) return false; + if (this.mudcrab.isClimbing()) return !this.mudcrab.verticalCollision; + + double horizontalDistance = fallbackPos.distToCenterSqr(mob.getX(), fallbackPos.getY(), mob.getZ()); + if (horizontalDistance < Mth.square(Math.max(this.mob.getBbWidth(), 1.0))) { + BlockPos pos = this.mob.blockPosition(); + BlockState state = this.level.getBlockState(pos); + if (state.getCollisionShape(level, pos).isEmpty()) { + for (Direction direction : Direction.Plane.HORIZONTAL) { + BlockPos relativePos = pos.relative(direction); + if (!level.getBlockState(relativePos).getCollisionShape(level, relativePos).isEmpty()) { + return true; + } + } + } + + return false; + } + + return true; + } + + @Override + protected double getGroundY(Vec3 vec) { + return vec.y; + } + + @Override + protected boolean canMoveDirectly(Vec3 pos1, Vec3 pos2) { + return this.mob.isInLiquid() && isClearForMovementBetween(this.mob, pos1, pos2, true); + } + + @Override + public boolean isStableDestination(BlockPos pos) { + return !this.level.getBlockState(pos.below()).isAir(); + } + } + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/MudcrabVariant.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/MudcrabVariant.java new file mode 100644 index 0000000..513e989 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/MudcrabVariant.java @@ -0,0 +1,68 @@ +package org.polaris2023.wildwind.hfas.entity.animal; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.ClientAsset; +import net.minecraft.core.Holder; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstrapContext; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.RegistryFixedCodec; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.entity.animal.TemperatureVariants; +import net.minecraft.world.entity.variant.*; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.registry.DatadrivenRegistryKey; +import org.polaris2023.wildwind.hfas.tag.ModBiomeTags; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * 泥沼蟹变种数据喵~ + */ +public record MudcrabVariant(ClientAsset.ResourceTexture assetInfo, + SpawnPrioritySelectors spawnConditions) implements PriorityProvider { + public static final Codec DIRECT_CODEC = RecordCodecBuilder.create( + i -> i.group( + ClientAsset.ResourceTexture.DEFAULT_FIELD_CODEC.forGetter(MudcrabVariant::assetInfo), + SpawnPrioritySelectors.CODEC.fieldOf("spawn_conditions").forGetter(MudcrabVariant::spawnConditions) + ) + .apply(i, MudcrabVariant::new) + ); + public static final Codec NETWORK_CODEC = RecordCodecBuilder.create( + i -> i.group(ClientAsset.ResourceTexture.DEFAULT_FIELD_CODEC.forGetter(MudcrabVariant::assetInfo)).apply(i, info -> new MudcrabVariant(info, SpawnPrioritySelectors.EMPTY)) + ); + public static final Codec> CODEC = RegistryFixedCodec.create(DatadrivenRegistryKey.MUDCRAB_VARIANT); + public static final StreamCodec> STREAM_CODEC = ByteBufCodecs.holderRegistry(DatadrivenRegistryKey.MUDCRAB_VARIANT); + + @Override + public List> selectors() { + return spawnConditions.selectors(); + } + + + public static final ResourceKey TEMPERATE = createKey(TemperatureVariants.TEMPERATE); + public static final ResourceKey WARM = createKey(TemperatureVariants.WARM); + public static final ResourceKey COLD = createKey(TemperatureVariants.COLD); + + private static ResourceKey createKey(Identifier id) { + return ResourceKey.create(DatadrivenRegistryKey.MUDCRAB_VARIANT, id); + } + + public static void bootstrapDatagen(BootstrapContext registry) { + registry.register(TEMPERATE, new MudcrabVariant(new ClientAsset.ResourceTexture(HFASMod.id("entity/mudcrab/temperate")), SpawnPrioritySelectors.fallback(0))); + registry.register(WARM, new MudcrabVariant(new ClientAsset.ResourceTexture(HFASMod.id("entity/mudcrab/warm")), SpawnPrioritySelectors.single(new BiomeCheck(registry.lookup(Registries.BIOME).getOrThrow(ModBiomeTags.EntityGen.MUDCRABS_WARM)), 1))); + registry.register(COLD, new MudcrabVariant(new ClientAsset.ResourceTexture(HFASMod.id("entity/mudcrab/cold")), SpawnPrioritySelectors.single(new BiomeCheck(registry.lookup(Registries.BIOME).getOrThrow(ModBiomeTags.EntityGen.MUDCRABS_COLD)), 1))); + } + + public static Holder lookup(RegistryAccess access, ResourceKey key){ + return access.getOrThrow(key); + } + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Piranha.java b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Piranha.java new file mode 100644 index 0000000..ef9b90f --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Piranha.java @@ -0,0 +1,155 @@ +package org.polaris2023.wildwind.hfas.entity.animal; + +import com.geckolib.animatable.GeoEntity; +import com.geckolib.animatable.instance.AnimatableInstanceCache; +import com.geckolib.animatable.manager.AnimatableManager; +import com.geckolib.animation.AnimationController; +import com.geckolib.animation.object.PlayState; +import com.geckolib.animation.state.AnimationTest; +import com.geckolib.constant.DefaultAnimations; +import com.geckolib.util.GeckoLibUtil; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal; +import net.minecraft.world.entity.animal.fish.AbstractFish; +import net.minecraft.world.entity.animal.fish.AbstractSchoolingFish; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.Level; +import org.polaris2023.wildwind.hfas.entity.WindupAttackMob; +import org.polaris2023.wildwind.hfas.entity.ai.goal.AlertOthersNearestAttackableTargetGoal; +import org.polaris2023.wildwind.hfas.entity.ai.goal.ChargingMeleeAttackGoal; +import org.polaris2023.wildwind.hfas.registry.ModItems; +import org.polaris2023.wildwind.hfas.registry.ModSoundEvents; + +import javax.annotation.Nullable; + +public class Piranha extends AbstractSchoolingFish implements WindupAttackMob, GeoEntity { + private final AnimatableInstanceCache geoCache = GeckoLibUtil.createInstanceCache(this); + private int preparingToAttack; + + public Piranha(EntityType entityType, Level level) { + super(entityType, level); + } + + public static AttributeSupplier.Builder createAttributes() { + return AbstractFish.createAttributes() + .add(Attributes.MOVEMENT_SPEED, 0.95) + .add(Attributes.FOLLOW_RANGE, 35.0) + .add(Attributes.MAX_HEALTH, 6.0) + .add(Attributes.ATTACK_DAMAGE, 3.0); + } + + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new PiranhaAttackGoal(this, 2.0f, false)); + super.registerGoals(); + this.targetSelector.addGoal(0, new HurtByTargetGoal(this).setAlertOthers()); + this.targetSelector.addGoal(1, new AlertOthersNearestAttackableTargetGoal<>(this, Mob.class, true, + (entity, level) -> !(entity instanceof Piranha) && (entity.getHealth() <= entity.getMaxHealth() * 0.25)) + .overrideFindEntityFollowDistance(15.0) + ); + this.targetSelector.addGoal(1, new AlertOthersNearestAttackableTargetGoal<>(this, Player.class, true, + (entity, level) -> entity.getHealth() <= entity.getMaxHealth() * 0.25) + .overrideFindEntityFollowDistance(15.0) + ); + } + + @Override + public int getMaxSchoolSize() { + return 5; + } + + // WIP SOUND + @Override + protected SoundEvent getFlopSound() { + return SoundEvents.SALMON_FLOP; + } + + @Override + protected @Nullable SoundEvent getDeathSound() { + return ModSoundEvents.PIRANHA_DEATH.get(); + } + + protected SoundEvent getAttackSound() { + return ModSoundEvents.PIRANHA_ATTACK.get(); + } + + @Override + public ItemStack getBucketItemStack() { + return new ItemStack((ItemLike) ModItems.PIRANHA_BUCKET); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + controllers.add(new AnimationController<>("Move", 3, this::moveAnimController)); + controllers.add(new AnimationController<>("Attack", state -> PlayState.STOP) + .triggerableAnim("attack", DefaultAnimations.ATTACK_SWING) + ); + } + + protected PlayState moveAnimController(final AnimationTest state) { + return state.setAndContinue(this.isInWater() ? DefaultAnimations.SWIM : DefaultAnimations.IDLE); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.geoCache; + } + + @Override + public void setPreparingToAttackTick(int tick) { + this.preparingToAttack = tick; + } + + @Override + public int getPreparingToAttackTick() { + return this.preparingToAttack; + } + + @Override + public int getPreparationToAttackDuration() { + return 6; + } + + @Override + public boolean prepareAttack(LivingEntity entity) { + boolean result = WindupAttackMob.super.prepareAttack(entity); + if (result) { + this.triggerAnim("Attack", "attack"); + this.makeSound(this.getAttackSound()); + } + return result; + } + + @Override + public boolean canContinuePreparingAttack() { + return this.isInWater(); + } + + @Override + public void aiStep() { + super.aiStep(); + if (!this.level().isClientSide() && this.isAlive()) { + processPreparingAttack((ServerLevel) this.level(), this); + } + } + + protected static class PiranhaAttackGoal extends ChargingMeleeAttackGoal { + public PiranhaAttackGoal(Piranha mob, double speedModifier, boolean followingTargetEvenIfNotSeen) { + super(mob, speedModifier, followingTargetEvenIfNotSeen); + } + + @Override + public boolean canUse() { + return this.mob.isInWater() && super.canUse(); + } + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/AzaleaAndArrowEvents.java b/src/hfas/java/org/polaris2023/wildwind/hfas/event/AzaleaAndArrowEvents.java new file mode 100644 index 0000000..7a7b8fd --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/event/AzaleaAndArrowEvents.java @@ -0,0 +1,40 @@ +package org.polaris2023.wildwind.hfas.event; + +import java.util.ArrayList; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.SetPotionFunction; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.event.LootTableLoadEvent; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.mixin.LootPoolEntriesAccessor; +import org.polaris2023.wildwind.hfas.mixin.LootTablePoolsAccessor; +import org.polaris2023.wildwind.hfas.registry.ModItems; +import org.polaris2023.wildwind.hfas.registry.ModPotions; + +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public final class AzaleaAndArrowEvents { + @SubscribeEvent + public static void setup(FMLCommonSetupEvent event) { + event.enqueueWork(() -> { + DispenserBlock.registerProjectileBehavior(ModItems.TIPPED_ARROW.get()); + }); + } + + @SubscribeEvent + public static void gifts(LootTableLoadEvent event) { + if (!event.getName().equals(Identifier.withDefaultNamespace("gameplay/hero_of_the_village/fletcher_gift"))) return; + var pools = ((LootTablePoolsAccessor) event.getTable()).wildwind$pools(); + if (pools.isEmpty()) return; + // Extend the existing random choice, preserving other mods' entries and the original number of rolls. + var pool = (LootPoolEntriesAccessor) pools.getFirst(); + var entries = new ArrayList<>(pool.wildwind$entries()); + entries.add(LootItem.lootTableItem(ModItems.TIPPED_ARROW.get()) + .apply(SetPotionFunction.setPotion(ModPotions.REACH)).build()); + pool.wildwind$setEntries(java.util.List.copyOf(entries)); + } + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/CobwebBreaking.java b/src/hfas/java/org/polaris2023/wildwind/hfas/event/CobwebBreaking.java new file mode 100644 index 0000000..7ea8495 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/event/CobwebBreaking.java @@ -0,0 +1,86 @@ +package org.polaris2023.wildwind.hfas.event; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.monster.spider.Spider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.Vec3; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.tick.EntityTickEvent; +import org.polaris2023.wildwind.hfas.HFASMod; + +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public final class CobwebBreaking { + private static final double EPSILON = 1.0E-7; + private static final Map STATES = new WeakHashMap<>(); + private CobwebBreaking() {} + + private static boolean exempt(Entity entity) { + return entity instanceof Spider || entity.isSpectator() + || entity instanceof Player player && player.isCreative() && player.getAbilities().flying; + } + + @SubscribeEvent + public static void beforeTick(EntityTickEvent.Pre event) { + Entity entity = event.getEntity(); + if (!(entity.level() instanceof ServerLevel) || exempt(entity)) return; + // Keep a previous position across ticks for players, whose network movement occurs outside tick(). + var state = STATES.get(entity); + if (state == null && !touching(entity).isEmpty()) STATES.put(entity, new ContactState(entity.position())); + } + + @SubscribeEvent + public static void afterTick(EntityTickEvent.Post event) { tick(event.getEntity()); } + + public static void tick(Entity entity) { + if (!(entity.level() instanceof ServerLevel level)) return; + if (exempt(entity) || entity.isRemoved()) { STATES.remove(entity); return; } + Set contacts = touching(entity); + if (contacts.isEmpty()) { STATES.remove(entity); return; } + var state = STATES.get(entity); + if (state == null) { + STATES.put(entity, new ContactState(entity.position())); + return; + } + Vec3 delta = entity.position().subtract(state.previous); + state.previous = entity.position(); + state.progress.keySet().retainAll(contacts); + boolean moving = delta.lengthSqr() > EPSILON * EPSILON; + if (!moving) { state.progress.clear(); return; } + boolean falling = !entity.onGround() && delta.y < -EPSILON; + for (var pos : contacts) { + var progress = state.progress.computeIfAbsent(pos, ignored -> new Progress(falling)); + if (++progress.ticks >= (progress.falling ? 160 : 30)) { + if (level.getBlockState(pos).is(Blocks.COBWEB)) level.destroyBlock(pos, true, entity); + state.progress.remove(pos); + } + } + } + + private static Set touching(Entity entity) { + var result = new HashSet(); + for (var pos : BlockPos.betweenClosed(entity.getBoundingBox().deflate(1.0E-7))) { + if (entity.level().getBlockState(pos).is(Blocks.COBWEB)) result.add(pos.immutable()); + } + return result; + } + + private static final class ContactState { + Vec3 previous; + final Map progress = new HashMap<>(); + ContactState(Vec3 previous) { this.previous = previous; } + } + private static final class Progress { + final boolean falling; + int ticks; + Progress(boolean falling) { this.falling = falling; } + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/EntitiesHandler.java b/src/hfas/java/org/polaris2023/wildwind/hfas/event/EntitiesHandler.java new file mode 100644 index 0000000..d84b36c --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/event/EntitiesHandler.java @@ -0,0 +1,34 @@ +package org.polaris2023.wildwind.hfas.event; + +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.entity.SpawnPlacementTypes; +import net.minecraft.world.entity.animal.fish.WaterAnimal; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; +import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; +import org.polaris2023.wildwind.hfas.entity.animal.Mudcrab; +import org.polaris2023.wildwind.hfas.entity.animal.Piranha; +import org.polaris2023.wildwind.hfas.entity.MuddyPig; +import net.minecraft.world.entity.animal.pig.Pig; +import org.polaris2023.wildwind.hfas.registry.ModEntities; + +@EventBusSubscriber +public class EntitiesHandler { + @SubscribeEvent + static void onAttributeCreate(EntityAttributeCreationEvent event) { + event.put(ModEntities.MUDDY_PIG.get(), Pig.createAttributes().build()); + event.put(ModEntities.PIRANHA.get(), Piranha.createAttributes().build()); + event.put(ModEntities.MUDCRAB.get(), Mudcrab.createAttributes().build()); + } + + @SubscribeEvent + static void registerSpawnPlacements(RegisterSpawnPlacementsEvent event) { + event.register(ModEntities.MUDDY_PIG.get(), SpawnPlacementTypes.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, MuddyPig::checkSpawnRules, + RegisterSpawnPlacementsEvent.Operation.REPLACE); + event.register(ModEntities.MUDCRAB.get(), Mudcrab.SPAWN_PLACEMENT, Heightmap.Types.OCEAN_FLOOR, Mudcrab::checkMudcrabInWaterGroundSpawnRules, RegisterSpawnPlacementsEvent.Operation.REPLACE); + event.register(ModEntities.MUDCRAB.get(), Mudcrab::checkMudcrabOnGroundSpawnRules); + event.register(ModEntities.PIRANHA.get(), SpawnPlacementTypes.IN_WATER, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, WaterAnimal::checkSurfaceWaterAnimalSpawnRules, RegisterSpawnPlacementsEvent.Operation.REPLACE); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/FarmlandProtection.java b/src/hfas/java/org/polaris2023/wildwind/hfas/event/FarmlandProtection.java new file mode 100644 index 0000000..8688c11 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/event/FarmlandProtection.java @@ -0,0 +1,34 @@ +package org.polaris2023.wildwind.hfas.event; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.level.BlockEvent; +import org.polaris2023.wildwind.hfas.HFASMod; + +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public final class FarmlandProtection { + private FarmlandProtection() {} + + @SubscribeEvent + public static void onTrample(BlockEvent.FarmlandTrampleEvent event) { + if (!(event.getEntity() instanceof LivingEntity entity)) return; + if (entity.hasEffect(MobEffects.SLOW_FALLING)) { + event.setCanceled(true); + return; + } + var featherFalling = entity.registryAccess().lookupOrThrow(Registries.ENCHANTMENT) + .getOrThrow(Enchantments.FEATHER_FALLING); + for (var slot : EquipmentSlot.VALUES) { + if (slot.isArmor() && EnchantmentHelper.getItemEnchantmentLevel(featherFalling, entity.getItemBySlot(slot)) > 0) { + event.setCanceled(true); + return; + } + } + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/FletchingTableReplaceHandler.java b/src/hfas/java/org/polaris2023/wildwind/hfas/event/FletchingTableReplaceHandler.java new file mode 100644 index 0000000..b397c17 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/event/FletchingTableReplaceHandler.java @@ -0,0 +1,87 @@ +package org.polaris2023.wildwind.hfas.event; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.phys.AABB; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.level.BlockEvent; +import net.neoforged.neoforge.event.level.ChunkDataEvent; +import net.neoforged.neoforge.event.level.ChunkEvent; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.config.ModCommonConfig; + +/** + * 世界生成事件处理器 + * 用于替换结构内的原版制箭台为模组制箭台 + * + * @author baka4n + * @since 2026/04/15 + */ +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public class FletchingTableReplaceHandler { + + /** + * 方块放置事件 - 处理所有制箭台放置 + * 包括结构生成、玩家放置等 + */ + @SubscribeEvent(priority = EventPriority.HIGHEST) + public static void onBlockPlace(BlockEvent.EntityPlaceEvent event) { + if (!ModCommonConfig.shouldReplaceVanillaFletchingTable()) { + return; + } + + BlockState placedState = event.getPlacedBlock(); + + if (placedState.getBlock() == Blocks.FLETCHING_TABLE) { + LevelAccessor levelAccessor = event.getLevel(); + + if (levelAccessor instanceof Level level && !level.isClientSide()) { + BlockPos pos = event.getPos(); + // 取消原事件并设置模组制箭台 + event.setCanceled(true); + level.setBlock(pos, ModBlocks.FLETCHING_TABLE.get().defaultBlockState(), 3); + } + } + } + + /** + * 区块加载事件 - 替换区块内的原版制箭台 + */ + @SuppressWarnings({"unchecked", "rawtypes"}) + @SubscribeEvent(priority = EventPriority.HIGHEST) + public static void onChunkLoad(ChunkEvent.Load event) { + if (!ModCommonConfig.shouldReplaceVanillaFletchingTable()) { + return; + } + + LevelChunk chunk = event.getChunk(); + LevelAccessor level = event.getLevel(); + + if (!level.isClientSide()) { + BlockPos.betweenClosedStream(new AABB( + chunk.getPos().getMinBlockX(), level.getMinY(), chunk.getPos().getMinBlockZ(), + chunk.getPos().getMaxBlockX(), 200, chunk.getPos().getMaxBlockZ() + )).forEach(pos -> { + BlockState state = chunk.getBlockState(pos); + if (state.is(Blocks.FLETCHING_TABLE)) { + BlockState returnState = ModBlocks.FLETCHING_TABLE.get().defaultBlockState(); + state.getValues().forEach(v -> { + Property property = v.property(); + Comparable value = v.value(); + returnState.setValue(property, value); + }); + chunk.setBlockState(pos, returnState); + } + }); + + } + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/FuelHandler.java b/src/hfas/java/org/polaris2023/wildwind/hfas/event/FuelHandler.java new file mode 100644 index 0000000..38bf6ef --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/event/FuelHandler.java @@ -0,0 +1,86 @@ +package org.polaris2023.wildwind.hfas.event; + +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.neoforge.event.furnace.FurnaceFuelBurnTimeEvent; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; + +/** + * 燃料事件处理器 + * 为木质方块添加燃料功能 + * + * @author baka4n + * @since 2026/04/15 + */ +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public class FuelHandler { + + /** + * 燃料燃烧时间事件 + * 木质方块可作为燃料,燃烧300 tick(与原版木板相同) + */ + @SubscribeEvent + public static void onFuelBurnTime(FurnaceFuelBurnTimeEvent event) { + Item item = event.getItemStack().getItem(); + + // 检查是否是木质方块物品 + int burnTime = getWoodBurnTime(item); + if (burnTime > 0) { + event.setBurnTime(burnTime); + } + } + + /** + * 获取木质方块的燃烧时间 + */ + private static int getWoodBurnTime(Item item) { + if (item == ModBlocks.AZALEA_SIGN.get().asItem()) return 200; + if (item == ModBlocks.AZALEA_HANGING_SIGN.get().asItem()) return 800; + if (item == ModBlocks.AZALEA_SHELF.get().asItem()) return 300; + // 焚烬木 - 300 tick(15秒) + if (isBlazeWoodItem(item)) return 300; + // 灵焰木 - 300 tick + if (isSoulWoodItem(item)) return 300; + // 杜鹃木 - 300 tick + if (isAzaleaWoodItem(item)) return 300; + + return 0; + } + + private static boolean isBlazeWoodItem(Item item) { + return item == ModBlocks.BLAZE_LOG.get().asItem() + || item == ModBlocks.BLAZE_WOOD.get().asItem() + || item == ModBlocks.STRIPPED_BLAZE_LOG.get().asItem() + || item == ModBlocks.STRIPPED_BLAZE_WOOD.get().asItem() + || item == ModBlocks.BLAZE_PLANKS.get().asItem() + || item == ModBlocks.BLAZE_SLAB.get().asItem() + || item == ModBlocks.BLAZE_FENCE.get().asItem() + || item == ModBlocks.BLAZE_FENCE_GATE.get().asItem(); + } + + private static boolean isSoulWoodItem(Item item) { + return item == ModBlocks.SOUL_LOG.get().asItem() + || item == ModBlocks.SOUL_WOOD.get().asItem() + || item == ModBlocks.STRIPPED_SOUL_LOG.get().asItem() + || item == ModBlocks.STRIPPED_SOUL_WOOD.get().asItem() + || item == ModBlocks.SOUL_PLANKS.get().asItem() + || item == ModBlocks.SOUL_SLAB.get().asItem() + || item == ModBlocks.SOUL_FENCE.get().asItem() + || item == ModBlocks.SOUL_FENCE_GATE.get().asItem(); + } + + private static boolean isAzaleaWoodItem(Item item) { + return item == ModBlocks.AZALEA_LOG.get().asItem() + || item == ModBlocks.AZALEA_WOOD.get().asItem() + || item == ModBlocks.STRIPPED_AZALEA_LOG.get().asItem() + || item == ModBlocks.STRIPPED_AZALEA_WOOD.get().asItem() + || item == ModBlocks.AZALEA_PLANKS.get().asItem() + || item == ModBlocks.AZALEA_SLAB.get().asItem() + || item == ModBlocks.AZALEA_FENCE.get().asItem() + || item == ModBlocks.AZALEA_FENCE_GATE.get().asItem(); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/SkeletonBehavior.java b/src/hfas/java/org/polaris2023/wildwind/hfas/event/SkeletonBehavior.java new file mode 100644 index 0000000..c63b30d --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/event/SkeletonBehavior.java @@ -0,0 +1,28 @@ +package org.polaris2023.wildwind.hfas.event; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; + +public final class SkeletonBehavior { + private SkeletonBehavior() {} + + public static boolean canSpawnWithSword(Mob mob) { + var type = mob.getType(); + return type == EntityTypes.SKELETON || type == EntityTypes.STRAY + || type == EntityTypes.BOGGED || type == EntityTypes.PARCHED; + } + + public static void afterMeleeHit(Mob attacker, LivingEntity target) { + var type = attacker.getType(); + if (type == EntityTypes.STRAY) { + target.addEffect(new MobEffectInstance(MobEffects.SLOWNESS, 600, 0), attacker); + } else if (type == EntityTypes.BOGGED) { + target.addEffect(new MobEffectInstance(MobEffects.POISON, 80, 0), attacker); + } else if (type == EntityTypes.PARCHED) { + target.addEffect(new MobEffectInstance(MobEffects.WEAKNESS, 600, 0), attacker); + } + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/item/ModFoods.java b/src/hfas/java/org/polaris2023/wildwind/hfas/item/ModFoods.java new file mode 100644 index 0000000..ac63de6 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/item/ModFoods.java @@ -0,0 +1,31 @@ +package org.polaris2023.wildwind.hfas.item; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.component.Consumable; +import net.minecraft.world.item.consume_effects.ApplyStatusEffectsConsumeEffect; + +public class ModFoods { + public static final FoodProperties PIRANHA = new FoodProperties.Builder() + .nutrition(2) + .saturationModifier(0.1F) + .build(); + + public static final Consumable PIRANHA_CONSUMABLE = Consumable.builder() + .onConsume(new ApplyStatusEffectsConsumeEffect(new MobEffectInstance(MobEffects.HUNGER, 600), 0.8f)) + .onConsume(new ApplyStatusEffectsConsumeEffect(new MobEffectInstance(MobEffects.UNLUCK, 600), 0.5f)) + .build(); + + public static final FoodProperties COOKED_PIRANHA = new FoodProperties.Builder() + .nutrition(6) + .saturationModifier(0.8F) + .build(); + + public static final Consumable COOKED_PIRANHA_CONSUMABLE = Consumable.builder() + .onConsume(new ApplyStatusEffectsConsumeEffect(new MobEffectInstance(MobEffects.UNLUCK, 300), 0.3f)) + .build(); + + private ModFoods() { + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/item/OmniClawItem.java b/src/hfas/java/org/polaris2023/wildwind/hfas/item/OmniClawItem.java new file mode 100644 index 0000000..2c4bd91 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/item/OmniClawItem.java @@ -0,0 +1,407 @@ +package org.polaris2023.wildwind.hfas.item; + +import com.google.common.collect.Lists; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponents; +import net.minecraft.resources.Identifier; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.EquipmentSlotGroup; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.SlotAccess; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemUtils; +import net.minecraft.world.item.component.ItemAttributeModifiers; +import net.minecraft.world.item.component.TooltipDisplay; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.ItemEnchantments; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.neoforged.neoforge.common.ItemAbility; +import net.neoforged.neoforge.common.extensions.IItemExtension; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.component.OmniClawTools; +import org.polaris2023.wildwind.hfas.registry.ModAttributes; +import org.polaris2023.wildwind.hfas.registry.ModDataComponents; + +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * 可收纳多种工具并代理其行为的万用蟹钳物品喵~ + *

+ * 26.2 迁移说明:getDamage/setDamage/getMaxDamage/isDamageable/getAllEnchantments + * 为 {@link IItemExtension} 的默认方法,父类调用需通过 IItemExtension.super; + * isCorrectToolForDrops/getDestroySpeed/mineBlock/getTooltipImage 已并入原版 Item; + * HIDE_TOOLTIP/HIDE_ADDITIONAL_TOOLTIP 组件由 TOOLTIP_DISPLAY 取代。 + */ +public class OmniClawItem extends Item { + /** + * 额外交互方块距离属性修饰符标识喵~ + */ + public static final Identifier BLOCK_INTERACTION_RANGE_ID = HFASMod.id("omni_claw_block_interaction_range"); + /** + * 额外交互实体距离属性修饰符标识喵~ + */ + public static final Identifier ENTITY_INTERACTION_RANGE_ID = HFASMod.id("omni_claw_entity_interaction_range"); + /** + * 额外拾取物品距离属性修饰符标识喵~ + */ + public static final Identifier EXTRA_ITEM_PICKUP_RANGE_ID = HFASMod.id("omni_claw_extra_item_pickup_range"); + + /** + * 创建万用蟹钳物品喵~ + * + * @param properties 物品属性喵~ + */ + public OmniClawItem(Properties properties) { + super(properties); + } + + @Override + public void onDestroyed(ItemEntity itemEntity, DamageSource damageSource) { + ItemStack stack = itemEntity.getItem(); + OmniClawTools tools = stack.get(ModDataComponents.OMNI_CLAW_TOOLS.get()); + if (tools != null) { + stack.set(ModDataComponents.OMNI_CLAW_TOOLS.get(), OmniClawTools.EMPTY); + ItemUtils.onContainerDestroyed(itemEntity, tools.getTools().stream().map(ItemStack::copy)); + } + } + + /** + * 获取内部工具结果,若没有已选工具则返回备用结果喵~ + * + * @param omniStack 万用蟹钳物品栈喵~ + * @param resultFunction 对内部工具执行的计算喵~ + * @param or 没有工具时的备用结果提供器喵~ + * @param 返回值类型喵~ + * @return 计算结果喵~ + */ + public static T toolOr(ItemStack omniStack, Function resultFunction, Supplier or) { + ItemStack tool = getLastSelectedTool(omniStack); + return tool.isEmpty() ? or.get() : resultFunction.apply(tool); + } + + /** + * 获取最近一次选中的内部工具喵~ + * + * @param omniClawStack 万用蟹钳物品栈喵~ + * @return 最近一次选中的工具喵~ + */ + public static ItemStack getLastSelectedTool(ItemStack omniClawStack) { + if (!omniClawStack.has(ModDataComponents.OMNI_CLAW_TOOLS.get())) return ItemStack.EMPTY; + + OmniClawTools tools = omniClawStack.get(ModDataComponents.OMNI_CLAW_TOOLS.get()); + return tools.getTools().get(tools.getSelectedToolIndex()); + } + + /** + * 为指定方块状态选择内部工具喵~ + * + * @param omniClawStack 万用蟹钳物品栈喵~ + * @param state 方块状态喵~ + * @return 适合挖掘该方块的工具喵~ + */ + public static ItemStack chooseToolItemByBlock(ItemStack omniClawStack, BlockState state) { + return findToolAndSelect(omniClawStack, tools -> tools.getToolFor(state)); + } + + /** + * 按能力选择内部工具喵~ + * + * @param omniClawStack 万用蟹钳物品栈喵~ + * @param ability 目标能力喵~ + * @return 具备该能力的工具喵~ + */ + public static ItemStack chooseToolByAbility(ItemStack omniClawStack, ItemAbility ability) { + return findToolAndSelect(omniClawStack, tools -> tools.getToolByAbility(ability)); + } + + /** + * 创建万用蟹钳持有时提供的属性修饰器喵~ + * + * @return 属性修饰器集合喵~ + */ + public static ItemAttributeModifiers createAttributes() { + return ItemAttributeModifiers.builder() + .add(Attributes.BLOCK_INTERACTION_RANGE, new AttributeModifier(BLOCK_INTERACTION_RANGE_ID, 2.0, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND) + .add(Attributes.ENTITY_INTERACTION_RANGE, new AttributeModifier(ENTITY_INTERACTION_RANGE_ID, 2.0, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND) + .add(ModAttributes.EXTRA_ITEM_PICKUP_RANGE, new AttributeModifier(EXTRA_ITEM_PICKUP_RANGE_ID, 2.0, AttributeModifier.Operation.ADD_VALUE), EquipmentSlotGroup.MAINHAND) + .build(); + } + + @Override + public void setDamage(ItemStack stack, int damage) { + ItemStack tool = getLastSelectedTool(stack); + if (tool.isEmpty()) { + super.setDamage(stack, damage); + return; + } + + ItemStack copiedTool = tool.copy(); + copiedTool.setDamageValue(damage); + OmniClawTools tools = stack.get(ModDataComponents.OMNI_CLAW_TOOLS.get()); + stack.set(ModDataComponents.OMNI_CLAW_TOOLS.get(), tools + .toMutable() + .set(copiedTool, tools.indexOf(tool)) + .toImmutable() + ); + } + + /** + * 获取当前选中内部工具的耐久损耗值喵~ + * + * @param omniStack 万用蟹钳物品栈喵~ + * @return 当前耐久损耗值喵~ + */ + @Override + public int getDamage(ItemStack omniStack) { + return toolOr(omniStack, stack -> stack.getItem().getDamage(stack), () -> super.getDamage(omniStack)); + } + + /** + * 获取当前选中内部工具的最大耐久喵~ + * + * @param omniStack 万用蟹钳物品栈喵~ + * @return 最大耐久值喵~ + */ + @Override + public int getMaxDamage(ItemStack omniStack) { + return toolOr(omniStack, stack -> stack.getItem().getMaxDamage(stack), () -> super.getMaxDamage(omniStack)); + } + + /** + * 判断当前选中内部工具是否可损坏喵~ + * + * @param omniStack 万用蟹钳物品栈喵~ + * @return 可损坏时返回 true 喵~ + */ + @Override + public boolean isDamageable(ItemStack omniStack) { + return toolOr(omniStack, stack -> stack.getItem().isDamageable(stack), () -> super.isDamageable(omniStack)); + } + + /** + * 使用当前匹配的内部工具执行方块挖掘耐久消耗喵~ + * + * @param stack 万用蟹钳物品栈喵~ + * @param level 当前世界喵~ + * @param state 被挖掘的方块状态喵~ + * @param pos 方块位置喵~ + * @param miningEntity 挖掘实体喵~ + * @return 成功代理内部工具时返回 true 喵~ + */ + @Override + public boolean mineBlock(ItemStack stack, Level level, BlockState state, BlockPos pos, LivingEntity miningEntity) { + if (!level.isClientSide() && !chooseToolItemByBlock(stack, state).isEmpty()) { + stack.hurtAndBreak(1, miningEntity, EquipmentSlot.MAINHAND); + return true; + } + + return super.mineBlock(stack, level, state, pos, miningEntity); + } + + /** + * 判断当前选中内部工具是否能正确采集该方块掉落物喵~ + * + * @param omniStack 万用蟹钳物品栈喵~ + * @param state 方块状态喵~ + * @return 能正确采集时返回 true 喵~ + */ + @Override + public boolean isCorrectToolForDrops(ItemStack omniStack, BlockState state) { + return toolOr(omniStack, stack -> stack.isCorrectToolForDrops(state), () -> super.isCorrectToolForDrops(omniStack, state)); + } + + /** + * 获取当前选中内部工具上的全部附魔喵~ + * + * @param omniStack 万用蟹钳物品栈喵~ + * @param lookup 附魔注册表查询器喵~ + * @return 附魔集合喵~ + */ + @Override + public ItemEnchantments getAllEnchantments(ItemStack omniStack, HolderLookup.RegistryLookup lookup) { + return toolOr(omniStack, stack -> stack.getAllEnchantments(lookup), () -> super.getAllEnchantments(omniStack, lookup)); + } + + /** + * 获取当前选中内部工具对方块的挖掘速度喵~ + * + * @param omniStack 万用蟹钳物品栈喵~ + * @param state 方块状态喵~ + * @return 挖掘速度喵~ + */ + @Override + public float getDestroySpeed(ItemStack omniStack, BlockState state) { + return toolOr(omniStack, stack -> stack.getDestroySpeed(state), () -> super.getDestroySpeed(omniStack, state)); + } + + /** + * 代理内部工具执行对方块的右键交互喵~ + * + * @param context 交互上下文喵~ + * @return 交互结果喵~ + */ + @Override + public InteractionResult useOn(UseOnContext context) { + ItemStack stack = context.getItemInHand(); + if (!stack.has(ModDataComponents.OMNI_CLAW_TOOLS.get())) return super.useOn(context); + + OmniClawTools tools = stack.get(ModDataComponents.OMNI_CLAW_TOOLS.get()); + + ItemStack selectedTool = tools.getSelectedTool(); + if (!selectedTool.isEmpty()) { + InteractionResult result = handleToolUseOn(stack, context, selectedTool, tools); + if (result.consumesAction()) return result; + } + + for (ItemStack toolStack : tools.getTools()) { + if (toolStack.isEmpty()) continue; + + InteractionResult result = handleToolUseOn(stack, context, toolStack, tools); + if (result.consumesAction()) return result; + } + + return super.useOn(context); + } + + /** + * 获取万用蟹钳的自定义提示图像组件喵~ + * + * @param stack 万用蟹钳物品栈喵~ + * @return 提示图像组件喵~ + */ + @Override + public Optional getTooltipImage(ItemStack stack) { + TooltipDisplay display = stack.getOrDefault(DataComponents.TOOLTIP_DISPLAY, TooltipDisplay.DEFAULT); + return !display.shows(ModDataComponents.OMNI_CLAW_TOOLS.get()) + ? Optional.empty() + : Optional.ofNullable(stack.get(ModDataComponents.OMNI_CLAW_TOOLS.get())); + } + + /** + * 处理万用蟹钳堆叠到其他槽位物品上的右键交换逻辑喵~ + * + * @param stack 万用蟹钳物品栈喵~ + * @param slot 目标槽位喵~ + * @param action 点击动作喵~ + * @param player 玩家喵~ + * @return 处理成功时返回 true 喵~ + */ + @Override + public boolean overrideStackedOnOther(ItemStack stack, Slot slot, ClickAction action, Player player) { + if (stack.getCount() != 1 || action != ClickAction.SECONDARY) { + return false; + } + + return swapItem(stack, slot.getItem(), player, SlotAccess.of(slot::getItem, slot::set)); + } + + /** + * 处理其他物品右键堆叠到万用蟹钳上的交换逻辑喵~ + * + * @param stack 万用蟹钳物品栈喵~ + * @param other 另一物品栈喵~ + * @param slot 槽位喵~ + * @param action 点击动作喵~ + * @param player 玩家喵~ + * @param access 槽位访问器喵~ + * @return 处理成功时返回 true 喵~ + */ + @Override + public boolean overrideOtherStackedOnMe( + ItemStack stack, ItemStack other, Slot slot, ClickAction action, Player player, SlotAccess access + ) { + if (stack.getCount() != 1) return false; + if (action != ClickAction.SECONDARY || !slot.allowModification(player)) { + return false; + } + + return swapItem(stack, other, player, access); + } + + private static ItemStack findToolAndSelect(ItemStack omniClawStack, Function selectRule) { + if (!omniClawStack.has(ModDataComponents.OMNI_CLAW_TOOLS.get())) return ItemStack.EMPTY; + + OmniClawTools tools = omniClawStack.get(ModDataComponents.OMNI_CLAW_TOOLS.get()); + ItemStack result = selectRule.apply(tools); + int lastSelected = tools.indexOf(result); + if (lastSelected != -1) omniClawStack.update(ModDataComponents.OMNI_CLAW_TOOLS.get(), tools, operator -> operator.withSelectIndex(lastSelected)); + + return result; + } + + private static InteractionResult handleToolUseOn(ItemStack omniClawStack, UseOnContext context, ItemStack toolStack, OmniClawTools tools) { + ItemStack copiedToolStack = toolStack.copy(); + UseOnContext toolContext = new UseOnContext( + context.getLevel(), + context.getPlayer(), + context.getHand(), + copiedToolStack, + context.hitResult + ); + + InteractionResult result = copiedToolStack.useOn(toolContext); + if (result.consumesAction()) { + if (!ItemStack.isSameItemSameComponents(toolStack, copiedToolStack)) { + int toolIndex = tools.indexOf(toolStack); + omniClawStack.set(ModDataComponents.OMNI_CLAW_TOOLS.get(), tools + .toMutable() + .set(copiedToolStack, toolIndex) + .select(toolIndex) + .toImmutable() + ); + } + } + + return result; + } + + private boolean swapItem(ItemStack omniClaw, ItemStack other, Player player, SlotAccess access) { + OmniClawTools tools = omniClaw.get(ModDataComponents.OMNI_CLAW_TOOLS.get()); + if (tools == null) { + return false; + } + + OmniClawTools.Mutable mutable = tools.toMutable(); + if (other.isEmpty()) { + ItemStack output = mutable.removeSelected(); + if (!output.isEmpty()) { + this.playRemoveOneSound(player); + access.set(output); + } + } else { + ItemStack output = mutable.insert(other); + if (!ItemStack.isSameItemSameComponents(other, output)) { + this.playInsertSound(player); + access.set(output); + } + } + + omniClaw.set(ModDataComponents.OMNI_CLAW_TOOLS.get(), mutable.toImmutable()); + return true; + } + + private void playRemoveOneSound(Entity entity) { + entity.playSound(SoundEvents.BUNDLE_REMOVE_ONE, 0.8F, 0.8F + entity.level().getRandom().nextFloat() * 0.4F); + } + + private void playInsertSound(Entity entity) { + entity.playSound(SoundEvents.BUNDLE_INSERT, 0.8F, 0.8F + entity.level().getRandom().nextFloat() * 0.4F); + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/item/ReachArrowItem.java b/src/hfas/java/org/polaris2023/wildwind/hfas/item/ReachArrowItem.java new file mode 100644 index 0000000..a1527d2 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/item/ReachArrowItem.java @@ -0,0 +1,41 @@ +package org.polaris2023.wildwind.hfas.item; + +import net.minecraft.core.Direction; +import net.minecraft.core.Position; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TippedArrowItem; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.world.level.Level; +import org.jspecify.annotations.Nullable; +import org.polaris2023.wildwind.hfas.entity.ReachArrow; +import org.polaris2023.wildwind.hfas.registry.ModPotions; + +public class ReachArrowItem extends TippedArrowItem { + public ReachArrowItem(Properties properties) { + super(properties.component(DataComponents.POTION_CONTENTS, new PotionContents(ModPotions.REACH)) + .component(DataComponents.POTION_DURATION_SCALE, 0.125F)); + } + + @Override + public ItemStack getDefaultInstance() { + return new ItemStack(this); + } + + @Override + public AbstractArrow createArrow(Level level, ItemStack stack, LivingEntity owner, @Nullable ItemStack weapon) { + var arrow = new ReachArrow(level, owner.getX(), owner.getEyeY() - 0.1F, owner.getZ(), stack, weapon); + arrow.setOwner(owner); + return arrow; + } + + @Override + public Projectile asProjectile(Level level, Position position, ItemStack stack, Direction direction) { + var arrow = new ReachArrow(level, position.x(), position.y(), position.z(), stack, null); + arrow.pickup = AbstractArrow.Pickup.ALLOWED; + return arrow; + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/menu/FletchingTableMenu.java b/src/hfas/java/org/polaris2023/wildwind/hfas/menu/FletchingTableMenu.java new file mode 100644 index 0000000..29f4e81 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/menu/FletchingTableMenu.java @@ -0,0 +1,128 @@ +package org.polaris2023.wildwind.hfas.menu; + +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.block.entity.FletchingTableBlockEntity; + +import javax.annotation.Nullable; +import java.util.Optional; + +/** + * 制箭台菜单 + * + * @author baka4n + * @since 2026/04/15 + */ +public class FletchingTableMenu extends AbstractContainerMenu { + private final Container container; + private final ContainerLevelAccess access; + + public FletchingTableMenu(int containerId, Inventory playerInventory) { + this(containerId, playerInventory, new SimpleContainer(4), ContainerLevelAccess.NULL); + } + + public FletchingTableMenu(int containerId, Inventory playerInventory, Container container, ContainerLevelAccess access) { + super(ModMenus.FLETCHING_TABLE.get(), containerId); + this.container = container; + this.access = access; + + // 箭羽槽 (slot 0) + this.addSlot(FletchingTableBlockEntity.Slots.SLOT_FLETCHING.toSlot(container, 26, 18)); + // 箭杆槽 (slot 1) + this.addSlot(FletchingTableBlockEntity.Slots.SLOT_SHAFT.toSlot(container, 62, 18)); + // 箭头槽 (slot 2) + this.addSlot( FletchingTableBlockEntity.Slots.SLOT_HEAD.toSlot(container, 98, 18)); + // 燃料槽口(slot 3) + this.addSlot(FletchingTableBlockEntity.Slots.SLOT_FUEL.toSlot(container, 62, 68)); + // 输出槽 (slot 4) + this.addSlot(this.addSlot(FletchingTableBlockEntity.Slots.SLOT_RESULT.toSlot(container, 134, 18))); + + // 添加玩家物品栏 + for (int row = 0; row < 3; ++row) { + for (int col = 0; col < 9; ++col) { + this.addSlot(new Slot(playerInventory, col + row * 9 + 9, 8 + col * 18, 50 + row * 18)); + } + } + + // 添加玩家快捷栏 + for (int col = 0; col < 9; ++col) { + this.addSlot(new Slot(playerInventory, col, 8 + col * 18, 108)); + } + } + + /** + * 输出槽 - 不能放入物品,取出时消耗材料 + */ + private class ResultSlot extends Slot { + public ResultSlot(Container container, int slot, int x, int y) { + super(container, slot, x, y); + } + + @Override + public boolean mayPlace(ItemStack stack) { + return false; + } + + @Override + public void onTake(Player player, ItemStack stack) { + // 消耗输入材料 +// container.removeItem(FletchingTableBlockEntity.SLOT_FLETCHING, 1); +// container.removeItem(FletchingTableBlockEntity.SLOT_SHAFT, 1); +// container.removeItem(FletchingTableBlockEntity.SLOT_HEAD, 1); + super.onTake(player, stack); + } + } + + @Override + public ItemStack quickMoveStack(Player player, int index) { + ItemStack itemStack = ItemStack.EMPTY; + Slot slot = this.slots.get(index); + + if (slot != null && slot.hasItem()) { + ItemStack slotItem = slot.getItem(); + itemStack = slotItem.copy(); + + // 输出槽 (index 3) + if (index == 3) { + if (!this.moveItemStackTo(slotItem, 4, this.slots.size(), true)) { + return ItemStack.EMPTY; + } + slot.onTake(player, slotItem); + } + // 输入槽 (index 0-2) + else if (index >= 0 && index < 3) { + if (!this.moveItemStackTo(slotItem, 4, this.slots.size(), true)) { + return ItemStack.EMPTY; + } + } + // 玩家物品栏 + else { + // 尝试放入输入槽 + if (!this.moveItemStackTo(slotItem, 0, 3, false)) { + return ItemStack.EMPTY; + } + } + + if (slotItem.isEmpty()) { + slot.set(ItemStack.EMPTY); + } else { + slot.setChanged(); + } + } + + return itemStack; + } + + @Override + public boolean stillValid(Player player) { + return stillValid(this.access, player, ModBlocks.FLETCHING_TABLE.get()); + } + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/menu/KilnMenu.java b/src/hfas/java/org/polaris2023/wildwind/hfas/menu/KilnMenu.java new file mode 100644 index 0000000..31c5c8c --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/menu/KilnMenu.java @@ -0,0 +1,85 @@ +package org.polaris2023.wildwind.hfas.menu; + +import net.minecraft.util.Mth; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ContainerData; +import net.minecraft.world.inventory.FurnaceResultSlot; +import net.minecraft.world.inventory.SimpleContainerData; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import org.polaris2023.wildwind.hfas.recipe.KilnRecipes; + +public class KilnMenu extends AbstractContainerMenu { + private final Container container; + private final ContainerData data; + private final Level level; + + public KilnMenu(int id, Inventory inventory) { + this(id, inventory, new SimpleContainer(3), new SimpleContainerData(4)); + } + + public KilnMenu(int id, Inventory inventory, Container container, ContainerData data) { + super(ModMenus.KILN.get(), id); + checkContainerSize(container, 3); + checkContainerDataCount(data, 4); + this.container = container; + this.data = data; + this.level = inventory.player.level(); + addSlot(new Slot(container, 0, 56, 17) { + @Override + public boolean mayPlace(ItemStack stack) { + // Recipe lookup is server-authoritative; clients don't receive the full recipe manager. + return level.isClientSide() || KilnRecipes.find(level, stack).isPresent(); + } + }); + addSlot(new Slot(container, 1, 56, 53) { + @Override + public boolean mayPlace(ItemStack stack) { return isFuel(stack) || stack.is(Items.BUCKET); } + @Override + public int getMaxStackSize(ItemStack stack) { return stack.is(Items.BUCKET) ? 1 : super.getMaxStackSize(stack); } + }); + addSlot(new FurnaceResultSlot(inventory.player, container, 2, 116, 35)); + addStandardInventorySlots(inventory, 8, 84); + addDataSlots(data); + } + + private boolean isFuel(ItemStack stack) { return stack.getBurnTime(RecipeType.SMELTING, level.fuelValues()) > 0; } + + @Override + public boolean stillValid(Player player) { return container.stillValid(player); } + + @Override + public ItemStack quickMoveStack(Player player, int index) { + Slot slot = slots.get(index); + if (!slot.hasItem()) return ItemStack.EMPTY; + ItemStack stack = slot.getItem(), original = stack.copy(); + if (index == 2) { + if (!moveItemStackTo(stack, 3, 39, true)) return ItemStack.EMPTY; + slot.onQuickCraft(stack, original); + } else if (index < 3) { + if (!moveItemStackTo(stack, 3, 39, false)) return ItemStack.EMPTY; + } else if (!level.isClientSide() && KilnRecipes.find(level, stack).isPresent()) { + if (!moveItemStackTo(stack, 0, 1, false)) return ItemStack.EMPTY; + } else if (isFuel(stack)) { + if (!moveItemStackTo(stack, 1, 2, false)) return ItemStack.EMPTY; + } else if (index < 30) { + if (!moveItemStackTo(stack, 30, 39, false)) return ItemStack.EMPTY; + } else if (!moveItemStackTo(stack, 3, 30, false)) return ItemStack.EMPTY; + if (stack.isEmpty()) slot.setByPlayer(ItemStack.EMPTY); + else slot.setChanged(); + if (stack.getCount() == original.getCount()) return ItemStack.EMPTY; + slot.onTake(player, stack); + return original; + } + + public boolean isLit() { return data.get(0) > 0; } + public float getLitProgress() { return Mth.clamp((float) data.get(0) / Math.max(1, data.get(1)), 0, 1); } + public float getBurnProgress() { return Mth.clamp((float) data.get(2) / Math.max(1, data.get(3)), 0, 1); } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/menu/ModMenus.java b/src/hfas/java/org/polaris2023/wildwind/hfas/menu/ModMenus.java new file mode 100644 index 0000000..56c5bed --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/menu/ModMenus.java @@ -0,0 +1,34 @@ +package org.polaris2023.wildwind.hfas.menu; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.inventory.MenuType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** + * 菜单类型注册类 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModMenus { + public static final DeferredRegister> MENUS = + DeferredRegister.create(BuiltInRegistries.MENU, HFASMod.MOD_ID); + + // 制箭台菜单 + public static final DeferredHolder, MenuType> FLETCHING_TABLE = + MENUS.register( + "fletching_table", + () -> new MenuType<>(FletchingTableMenu::new, FeatureFlags.DEFAULT_FLAGS) + ); + + public static void register(IEventBus bus) { + MENUS.register(bus); + } + + public static final DeferredHolder, MenuType> KILN = + MENUS.register("kiln", () -> new MenuType<>(KilnMenu::new, FeatureFlags.DEFAULT_FLAGS)); +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractArrowAccessor.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractArrowAccessor.java new file mode 100644 index 0000000..0519f28 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractArrowAccessor.java @@ -0,0 +1,15 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.world.entity.projectile.arrow.AbstractArrow; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(AbstractArrow.class) +public interface AbstractArrowAccessor { + @org.spongepowered.asm.mixin.gen.Invoker("setPierceLevel") + void wildwind$setPiercing(byte level); + + @Accessor("firedFromWeapon") + void wildwind$setWeapon(ItemStack weapon); +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractSkeletonMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractSkeletonMixin.java new file mode 100644 index 0000000..832e9a2 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractSkeletonMixin.java @@ -0,0 +1,25 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.monster.skeleton.AbstractSkeleton; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import org.polaris2023.wildwind.hfas.event.SkeletonBehavior; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(AbstractSkeleton.class) +public abstract class AbstractSkeletonMixin { + @Inject(method = "populateDefaultEquipmentSlots", at = @At("TAIL")) + private void wildWind$spawnWithSword(RandomSource random, DifficultyInstance difficulty, CallbackInfo ci) { + var self = (AbstractSkeleton) (Object) this; + // Spawn initialization only: loading a saved entity must never reroll its weapon. + if (SkeletonBehavior.canSpawnWithSword(self) && random.nextFloat() < 0.1F) { + self.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.STONE_SWORD)); + } + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaBlockMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaBlockMixin.java new file mode 100644 index 0000000..da8943e --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaBlockMixin.java @@ -0,0 +1,38 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.AzaleaBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.polaris2023.wildwind.hfas.worldgen.ModTreeGrowers; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * Mixin 注入 AzaleaBlock 以替换杜鹃树生成 + * 使用杜鹃木原木替代橡木原木 + * + * @author baka4n + * @since 2026/04/15 + */ +@Mixin(AzaleaBlock.class) +public class AzaleaBlockMixin { + + /** + * 拦截 performBonemeal 方法 + * 使用我们的 TreeGrower 替代原版 + */ + @Inject( + method = "performBonemeal", + at = @At("HEAD"), + cancellable = true + ) + private void onPerformBonemeal(ServerLevel level, RandomSource random, BlockPos pos, BlockState state, CallbackInfo ci) { + // 使用我们的杜鹃树生长器(使用杜鹃木原木) + ModTreeGrowers.AZALEA.growTree(level, level.getChunkSource().getGenerator(), pos, state, random); + ci.cancel(); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaSignRendererMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaSignRendererMixin.java new file mode 100644 index 0000000..4b65b63 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaSignRendererMixin.java @@ -0,0 +1,76 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.Font; +import net.minecraft.client.renderer.SubmitNodeCollector; +import net.minecraft.client.renderer.blockentity.AbstractSignRenderer; +import net.minecraft.client.renderer.blockentity.state.SignRenderState; +import net.minecraft.client.renderer.feature.ModelFeatureRenderer; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.level.block.entity.SignBlockEntity; +import net.minecraft.world.level.block.entity.SignText; +import net.minecraft.world.phys.Vec3; +import org.jspecify.annotations.Nullable; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.client.AzaleaSignState; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(AbstractSignRenderer.class) +public abstract class AzaleaSignRendererMixin { + @Shadow @Final private Font font; + + @Inject(method = "extractRenderState(Lnet/minecraft/world/level/block/entity/SignBlockEntity;Lnet/minecraft/client/renderer/blockentity/state/SignRenderState;FLnet/minecraft/world/phys/Vec3;Lnet/minecraft/client/renderer/feature/ModelFeatureRenderer$CrumblingOverlay;)V", at = @At("RETURN")) + private void wildwind$mark(SignBlockEntity entity, SignRenderState state, float partialTick, Vec3 camera, + ModelFeatureRenderer.@Nullable CrumblingOverlay overlay, CallbackInfo ci) { + var block = entity.getBlockState().getBlock(); + ((AzaleaSignState) state).wildwind$setAzalea(block == ModBlocks.AZALEA_SIGN.get() + || block == ModBlocks.AZALEA_WALL_SIGN.get() || block == ModBlocks.AZALEA_HANGING_SIGN.get() + || block == ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); + } + + @Inject(method = "submitSignText", at = @At("HEAD"), cancellable = true) + private void wildwind$text(SignRenderState state, PoseStack pose, SubmitNodeCollector collector, SignText text, CallbackInfo ci) { + if (!((AzaleaSignState) state).wildwind$isAzalea()) return; + int color = wildwind$color(text.getColor()); + int dark = ((color >> 16 & 255) * 2 / 5 << 16) | ((color >> 8 & 255) * 2 / 5 << 8) | (color & 255) * 2 / 5; + int outline = text.hasGlowingText() ? 0xFF000000 | (color == 0 ? 0xF0EBCC : dark) : 0; + var lines = text.getRenderMessages(state.isTextFilteringEnabled, input -> { + var split = font.split(input, state.maxTextLineWidth); + return split.isEmpty() ? FormattedCharSequence.EMPTY : split.getFirst(); + }); + for (int i = 0; i < 4; i++) { + collector.submitText(pose, -font.width(lines[i]) / 2.0F, i * state.textLineHeight - 2 * state.textLineHeight, + lines[i], false, Font.DisplayMode.POLYGON_OFFSET, 15728880, + 0xFF000000 | (text.hasGlowingText() ? color : dark), 0, outline); + } + ci.cancel(); + } + + @Unique private static int wildwind$color(DyeColor color) { + return switch (color) { + case BLACK -> 0x000000; + case RED -> 0xFF0000; + case GREEN -> 0x00FF00; + case BROWN -> 0x8B4513; + case BLUE -> 0x0000FF; + case PURPLE -> 0xA020F0; + case CYAN -> 0x00FFFF; + case LIGHT_GRAY -> 0xD3D3D3; + case GRAY -> 0x808080; + case PINK -> 0xFF69B4; + case LIME -> 0xBFFF00; + case YELLOW -> 0xFFFF00; + case LIGHT_BLUE -> 0x9AC0CD; + case MAGENTA -> 0xFF00FF; + case ORANGE -> 0xFF681F; + case WHITE -> 0xFFFFFF; + }; + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/CrafterBlockMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/CrafterBlockMixin.java new file mode 100644 index 0000000..827feee --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/CrafterBlockMixin.java @@ -0,0 +1,25 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CraftingRecipe; +import net.minecraft.world.level.block.CrafterBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.polaris2023.wildwind.hfas.recipe.WoolToStringRecipe; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(CrafterBlock.class) +abstract class CrafterBlockMixin { + @WrapOperation(method = "dispenseFrom", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/item/crafting/CraftingRecipe;getRemainingItems(Lnet/minecraft/world/item/crafting/CraftingInput;)Lnet/minecraft/core/NonNullList;")) + private NonNullList wildwind$damageShears(CraftingRecipe recipe, CraftingInput input, + Operation> original, BlockState state, ServerLevel level, BlockPos pos) { + return recipe instanceof WoolToStringRecipe wool ? wool.remainingItems(input, level) : original.call(recipe, input); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EnchantmentHelperMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EnchantmentHelperMixin.java new file mode 100644 index 0000000..1ed9566 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EnchantmentHelperMixin.java @@ -0,0 +1,25 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.ItemEnchantments; +import org.polaris2023.wildwind.hfas.item.OmniClawItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +/** + * 为附魔辅助逻辑补充万用蟹钳工具上下文的混入类喵~ + */ +@Mixin(EnchantmentHelper.class) +public abstract class EnchantmentHelperMixin { + + @ModifyVariable(method = "getRandomItemWith", at = @At(value = "STORE", ordinal = 0)) + private static ItemEnchantments getRandomItemWithUnwarpOmniClaw(ItemEnchantments enchantments, @Local(ordinal = 0) ItemStack stack) { + ItemStack tool = OmniClawItem.getLastSelectedTool(stack); + if (!tool.isEmpty()) enchantments = tool.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY); + return enchantments; + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EntityFluidMovementMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EntityFluidMovementMixin.java new file mode 100644 index 0000000..3e89925 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EntityFluidMovementMixin.java @@ -0,0 +1,17 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import org.polaris2023.wildwind.hfas.effect.FluidEffects; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(Entity.class) +abstract class EntityFluidMovementMixin { + // Intercept the actual displacement, including swimming AI and bubble-column upward motion. + @ModifyVariable(method = "move", at = @At("HEAD"), argsOnly = true) + private Vec3 wildwind$preventRising(Vec3 movement) { + return FluidEffects.restrictMovement((Entity) (Object) this, movement); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/FurnaceFuelAccessor.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/FurnaceFuelAccessor.java new file mode 100644 index 0000000..6983340 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/FurnaceFuelAccessor.java @@ -0,0 +1,12 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(AbstractFurnaceBlockEntity.class) +public interface FurnaceFuelAccessor { + // ContainerData deliberately scales long burn times to fit network shorts; ticking needs the raw value. + @Accessor("litTimeRemaining") + int wildwind$remainingFuel(); +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/IronGolemAirSupplyMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/IronGolemAirSupplyMixin.java new file mode 100644 index 0000000..7a702a3 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/IronGolemAirSupplyMixin.java @@ -0,0 +1,27 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.animal.golem.IronGolem; +import net.minecraft.world.level.Level; +import org.polaris2023.wildwind.hfas.effect.ModEffects; +import org.polaris2023.wildwind.hfas.entity.ModEntityTypeTags; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(IronGolem.class) +abstract class IronGolemAirSupplyMixin extends LivingEntity { + protected IronGolemAirSupplyMixin(EntityType type, Level level) { + super(type, level); + } + + @Inject(method = "decreaseAirSupply", at = @At("HEAD"), cancellable = true) + private void wildwind$chokeAirConsumption(int currentSupply, CallbackInfoReturnable cir) { + if (is(ModEntityTypeTags.CHOKE_AFFECTED) && hasEffect(ModEffects.CHOKE)) { + // Iron golems otherwise always return unchanged air, bypassing even Respiration's normal rule. + cir.setReturnValue(super.decreaseAirSupply(currentSupply)); + } + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ItemStackMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ItemStackMixin.java new file mode 100644 index 0000000..ffc746f --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ItemStackMixin.java @@ -0,0 +1,52 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import org.polaris2023.wildwind.hfas.component.OmniClawTools; +import org.polaris2023.wildwind.hfas.item.OmniClawItem; +import org.polaris2023.wildwind.hfas.registry.ModDataComponents; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +/** + * 为物品栈中的万用蟹钳代理工具行为提供支持的混入类喵~ + *

+ * 26.2 迁移说明:hurtAndBreak 内的 shrink 调用点已下沉到私有方法 applyDamage, + * 因此第二个注入目标改为 applyDamage。 + */ +@Mixin(ItemStack.class) +public abstract class ItemStackMixin { + + /** + * 让万用蟹钳沿用当前选中工具的耐久判定喵~ + * + * @param original 原始方法调用喵~ + * @return 是否可损坏喵~ + */ + @WrapMethod(method = "isDamageableItem") + public boolean omniClawIsDamageableItem(Operation original) { + ItemStack tool = OmniClawItem.getLastSelectedTool((ItemStack) (Object) this); + if (!tool.isEmpty()) return tool.isDamageableItem(); + + return original.call(); + } + + @WrapOperation(method = "applyDamage(ILnet/minecraft/world/entity/LivingEntity;Ljava/util/function/Consumer;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;shrink(I)V")) + private void omniClawShrinkTool(ItemStack instance, int decrement, Operation original, @Local LocalRef item) { + ItemStack tool = OmniClawItem.getLastSelectedTool(instance); + if (tool.isEmpty()) { + original.call(instance, decrement); + return; + } + + item.set(tool.getItem()); + tool.shrink(decrement); + OmniClawTools tools = instance.get(ModDataComponents.OMNI_CLAW_TOOLS.get()); + instance.set(ModDataComponents.OMNI_CLAW_TOOLS.get(), tools.toMutable().scrollSelectToNoEmptyItem().toImmutable()); + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/LootPoolEntriesAccessor.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/LootPoolEntriesAccessor.java new file mode 100644 index 0000000..8f11adb --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/LootPoolEntriesAccessor.java @@ -0,0 +1,14 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import java.util.List; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(LootPool.class) +public interface LootPoolEntriesAccessor { + @Accessor("entries") List wildwind$entries(); + @Mutable @Accessor("entries") void wildwind$setEntries(List entries); +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/LootTablePoolsAccessor.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/LootTablePoolsAccessor.java new file mode 100644 index 0000000..9fd6661 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/LootTablePoolsAccessor.java @@ -0,0 +1,12 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import java.util.List; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(LootTable.class) +public interface LootTablePoolsAccessor { + @Accessor("pools") List wildwind$pools(); +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/MobMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/MobMixin.java new file mode 100644 index 0000000..7ec2746 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/MobMixin.java @@ -0,0 +1,45 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.core.Vec3i; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.server.level.ServerLevel; +import org.polaris2023.wildwind.hfas.event.SkeletonBehavior; +import net.minecraft.world.entity.ai.attributes.AttributeMap; +import org.polaris2023.wildwind.hfas.registry.ModAttributes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * 让生物的物品拾取范围受额外拾取距离属性加成的混入类喵~ + */ +@Mixin(Mob.class) +public abstract class MobMixin { + + @Inject(method = "doHurtTarget", at = @At("RETURN")) + private void wildWind$meleeEffects(ServerLevel level, Entity target, CallbackInfoReturnable cir) { + if (cir.getReturnValueZ() && target instanceof LivingEntity living) { + SkeletonBehavior.afterMeleeHit((Mob) (Object) this, living); + } + } + + @ModifyVariable(method = "aiStep", at = @At(value = "STORE", ordinal = 0)) + private Vec3i reachMobEffectPickupRange(Vec3i vec3i) { + Mob self = (Mob) (Object) this; + + AttributeMap attributes = self.getAttributes(); + if (attributes.hasAttribute(ModAttributes.EXTRA_ITEM_PICKUP_RANGE)) { + double extraItemPickupRange = attributes.getValue(ModAttributes.EXTRA_ITEM_PICKUP_RANGE); + if (extraItemPickupRange != 0.0) { + vec3i = vec3i.offset((int) extraItemPickupRange, (int) extraItemPickupRange, (int) extraItemPickupRange); + } + } + + return vec3i; + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/PlayerMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/PlayerMixin.java new file mode 100644 index 0000000..b689dd8 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/PlayerMixin.java @@ -0,0 +1,36 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.ai.attributes.AttributeMap; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; +import org.polaris2023.wildwind.hfas.registry.ModAttributes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * 让玩家的物品拾取判定范围受额外拾取距离属性加成的混入类喵~ + */ +@Mixin(Player.class) +public abstract class PlayerMixin { + + @Inject(method = "aiStep", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/Lists;newArrayList()Ljava/util/ArrayList;")) + private void reachMobEffectTouchItem(CallbackInfo ci, @Local(ordinal = 0) AABB aabb) { + Player self = (Player) (Object) this; + + AttributeMap attributes = self.getAttributes(); + if (attributes.hasAttribute(ModAttributes.EXTRA_ITEM_PICKUP_RANGE)) { + double extraItemPickupRange = attributes.getValue(ModAttributes.EXTRA_ITEM_PICKUP_RANGE); + if (extraItemPickupRange != 0.0) { + AABB itemPickupAABB = aabb.inflate(extraItemPickupRange); + for (Entity itemEntity : self.level().getEntitiesOfClass(ItemEntity.class, itemPickupAABB)) { + itemEntity.playerTouch(self); + } + } + } + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowCraftingMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowCraftingMixin.java new file mode 100644 index 0000000..9d04a12 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowCraftingMixin.java @@ -0,0 +1,17 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.ImbueRecipe; +import org.polaris2023.wildwind.hfas.arrow.ReachArrows; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ImbueRecipe.class) +public abstract class ReachArrowCraftingMixin { + @Inject(method = "assemble(Lnet/minecraft/world/item/crafting/CraftingInput;)Lnet/minecraft/world/item/ItemStack;", at = @At("RETURN"), cancellable = true) + private void wildwind$reachArrow(CallbackInfoReturnable cir) { + cir.setReturnValue(ReachArrows.convert(cir.getReturnValue())); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowLootMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowLootMixin.java new file mode 100644 index 0000000..e02e4d3 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowLootMixin.java @@ -0,0 +1,18 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.functions.SetRandomPotionFunction; +import net.minecraft.world.level.storage.loot.functions.SetPotionFunction; +import org.polaris2023.wildwind.hfas.arrow.ReachArrows; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin({SetRandomPotionFunction.class, SetPotionFunction.class}) +public abstract class ReachArrowLootMixin { + @Inject(method = "run", at = @At("RETURN"), cancellable = true) + private void wildwind$reachArrow(CallbackInfoReturnable cir) { + cir.setReturnValue(ReachArrows.convert(cir.getReturnValue())); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ServerPlayerGameModeMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ServerPlayerGameModeMixin.java new file mode 100644 index 0000000..7a9292e --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ServerPlayerGameModeMixin.java @@ -0,0 +1,50 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerPlayerGameMode; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import org.polaris2023.wildwind.hfas.item.OmniClawItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +/** + * 让方块破坏流程识别万用蟹钳当前选中工具的混入类喵~ + *

+ * 26.2 迁移说明:destroyBlock 中 getMainHandItem 的调用点增至两处 + * (preventsBlockDrops 分支与主路径),本注入同时包裹两处; + * BlockState 局部变量 ordinal 1 对应 playerWillDestroy 返回的 adjustedState。 + */ +@Mixin(ServerPlayerGameMode.class) +public abstract class ServerPlayerGameModeMixin { + + @WrapOperation(method = "destroyBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/Block;playerDestroy(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/block/entity/BlockEntity;Lnet/minecraft/world/item/ItemStack;)V")) + private void destroyBlockUnwarpOmniClawForLootContext(Block instance, Level level, Player player, BlockPos pos, BlockState state, BlockEntity blockEntity, ItemStack tool, Operation original) { + ItemStack clawTool = OmniClawItem.getLastSelectedTool(tool); + if (!clawTool.isEmpty()) tool = clawTool; + + original.call(instance, level, player, pos, state, blockEntity, tool); + } + + @WrapOperation(method = "destroyBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;getMainHandItem()Lnet/minecraft/world/item/ItemStack;")) + private ItemStack destroyBlockOmniClawSelectTool(ServerPlayer instance, Operation original, @Local(ordinal = 1) BlockState state) { + ItemStack stack = original.call(instance); + OmniClawItem.chooseToolItemByBlock(stack, state); + return stack; + } + + @WrapOperation(method = "handleBlockBreakAction", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;getMainHandItem()Lnet/minecraft/world/item/ItemStack;")) + private ItemStack handleBlockBreakOmniClawSelectTool(ServerPlayer instance, Operation original, @Local BlockState state) { + ItemStack stack = original.call(instance); + OmniClawItem.chooseToolItemByBlock(stack, state); + return stack; + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SignRenderStateMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SignRenderStateMixin.java new file mode 100644 index 0000000..f5e5c7e --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SignRenderStateMixin.java @@ -0,0 +1,13 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.client.renderer.blockentity.state.SignRenderState; +import org.polaris2023.wildwind.hfas.client.AzaleaSignState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(SignRenderState.class) +public abstract class SignRenderStateMixin implements AzaleaSignState { + @Unique private boolean wildwind$azalea; + public boolean wildwind$isAzalea() { return wildwind$azalea; } + public void wildwind$setAzalea(boolean azalea) { wildwind$azalea = azalea; } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SinglePoolElementMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SinglePoolElementMixin.java new file mode 100644 index 0000000..568ee50 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SinglePoolElementMixin.java @@ -0,0 +1,31 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import com.mojang.datafixers.util.Either; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pools.SinglePoolElement; +import net.minecraft.world.level.levelgen.structure.templatesystem.LiquidSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import org.polaris2023.wildwind.hfas.worldgen.MasonKilnProcessor; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(SinglePoolElement.class) +abstract class SinglePoolElementMixin { + @Shadow @Final protected Either template; + + @Inject(method = "getSettings", at = @At("RETURN")) + private void wildwind$addMasonKiln(Rotation rotation, BoundingBox box, LiquidSettings liquids, boolean keepJigsaws, + CallbackInfoReturnable cir) { + template.left().ifPresent(id -> { + var processor = MasonKilnProcessor.HOUSES.get(id); + if (processor != null) cir.getReturnValue().addProcessor(processor); + }); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/WaterAnimalAirSupplyMixin.java b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/WaterAnimalAirSupplyMixin.java new file mode 100644 index 0000000..ffd4bec --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/WaterAnimalAirSupplyMixin.java @@ -0,0 +1,17 @@ +package org.polaris2023.wildwind.hfas.mixin; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.animal.axolotl.Axolotl; +import net.minecraft.world.entity.animal.fish.WaterAnimal; +import org.polaris2023.wildwind.hfas.effect.FluidEffects; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin({Axolotl.class, WaterAnimal.class}) +abstract class WaterAnimalAirSupplyMixin { + @ModifyVariable(method = "handleAirSupply", at = @At("HEAD"), argsOnly = true) + private int wildwind$accelerateLandDrying(int preTickAirSupply) { + return FluidEffects.airBeforeDrying((LivingEntity) (Object) this, preTickAirSupply); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/network/HFASNetwork.java b/src/hfas/java/org/polaris2023/wildwind/hfas/network/HFASNetwork.java new file mode 100644 index 0000000..2b23805 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/network/HFASNetwork.java @@ -0,0 +1,28 @@ +package org.polaris2023.wildwind.hfas.network; + +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.network.payload.ServerBoundSelectOmniClawItemPayload; + +/** + * 模组网络负载注册入口喵~ + */ +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public class HFASNetwork { + + @SubscribeEvent + static void register(RegisterPayloadHandlersEvent event) { + PayloadRegistrar registrar = event.registrar("1"); + registrar.commonToServer( + ServerBoundSelectOmniClawItemPayload.TYPE, + ServerBoundSelectOmniClawItemPayload.STREAM_CODEC, + ServerBoundSelectOmniClawItemPayload::handle + ); + } + + private HFASNetwork() { + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/network/payload/ServerBoundSelectOmniClawItemPayload.java b/src/hfas/java/org/polaris2023/wildwind/hfas/network/payload/ServerBoundSelectOmniClawItemPayload.java new file mode 100644 index 0000000..1c672b6 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/network/payload/ServerBoundSelectOmniClawItemPayload.java @@ -0,0 +1,73 @@ +package org.polaris2023.wildwind.hfas.network.payload; + +import io.netty.buffer.ByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.handling.IPayloadContext; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.component.OmniClawTools; +import org.polaris2023.wildwind.hfas.registry.ModDataComponents; + +/** + * 客户端通知服务端切换全能蟹钳选中工具的网络负载喵~ + * + * @param slot 目标槽位索引喵~ + * @param index 目标工具索引喵~ + */ +public record ServerBoundSelectOmniClawItemPayload(int slot, int index) implements CustomPacketPayload { + /** + * 当前负载的类型标识喵~ + */ + public static final Type TYPE = new Type<>(HFASMod.id("select_omni_claw_item")); + /** + * 当前负载的流编解码器喵~ + */ + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, ServerBoundSelectOmniClawItemPayload::slot, + ByteBufCodecs.VAR_INT, ServerBoundSelectOmniClawItemPayload::index, + ServerBoundSelectOmniClawItemPayload::new + ); + + /** + * 获取当前网络负载的类型标识喵~ + * + * @return 负载类型喵~ + */ + @Override + public Type type() { + return TYPE; + } + + /** + * 在服务端处理全能蟹钳选中工具切换请求喵~ + * + * @param context 负载处理上下文喵~ + */ + public void handle(IPayloadContext context) { + Player player = context.player(); + ItemStack stack = player.containerMenu.getSlot(slot).getItem(); + + if (!stack.has(ModDataComponents.OMNI_CLAW_TOOLS.get())) { + return; + } + OmniClawTools tools = stack.get(ModDataComponents.OMNI_CLAW_TOOLS.get()); + + if (tools.isEmpty()) { + return; + } + OmniClawTools.Mutable mutableTools = tools.toMutable(); + if (this.index >= mutableTools.size() || this.index < 0 || this.index == mutableTools.getSelectedToolIndex()) { + return; + } + + if (mutableTools.get(this.index).isEmpty()) { + return; + } + mutableTools.select(this.index); + + stack.set(ModDataComponents.OMNI_CLAW_TOOLS.get(), mutableTools.toImmutable()); + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/KilnRecipes.java b/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/KilnRecipes.java new file mode 100644 index 0000000..09c9d1c --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/KilnRecipes.java @@ -0,0 +1,36 @@ +package org.polaris2023.wildwind.hfas.recipe; + +import java.util.Optional; +import net.minecraft.core.registries.Registries; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.item.crafting.SmeltingRecipe; +import net.minecraft.world.level.Level; +import net.minecraft.server.level.ServerLevel; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** Reuses the current world's smelting recipes, including data-pack recipes and their experience. */ +public final class KilnRecipes { + public static final int COOK_TIME = 100; + public static final TagKey EXCLUDED = TagKey.create(Registries.ITEM, HFASMod.id("kiln_excluded")); + private static final TagKey METAL_OUTPUTS = TagKey.create(Registries.ITEM, HFASMod.id("kiln_metal_outputs")); + + private KilnRecipes() {} + + public static Optional> find(Level level, ItemStack stack) { + if (!(level instanceof ServerLevel server) || stack.isEmpty() || stack.is(EXCLUDED)) return Optional.empty(); + var input = new SingleRecipeInput(stack); + // Blasting covers metal equipment recycling as well as ore/raw-metal processing. + if (server.recipeAccess().getRecipeFor(RecipeType.BLASTING, input, server).isPresent()) return Optional.empty(); + var recipe = server.recipeAccess().getRecipeFor(RecipeType.SMELTING, input, server); + if (recipe.isPresent() && stack.isDamageableItem() + && recipe.get().value().assemble(input).is(METAL_OUTPUTS)) { + return Optional.empty(); + } + return recipe; + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/ModRecipes.java b/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/ModRecipes.java new file mode 100644 index 0000000..2915b79 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/ModRecipes.java @@ -0,0 +1,20 @@ +package org.polaris2023.wildwind.hfas.recipe; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; + +public final class ModRecipes { + private static final DeferredRegister> SERIALIZERS = DeferredRegister.create(Registries.RECIPE_SERIALIZER, HFASMod.MOD_ID); + public static final DeferredHolder, RecipeSerializer> WOOL_TO_STRING = + SERIALIZERS.register("wool_to_string", () -> new RecipeSerializer<>( + MapCodec.unit(WoolToStringRecipe.INSTANCE), StreamCodec.unit(WoolToStringRecipe.INSTANCE))); + + private ModRecipes() {} + public static void register(IEventBus bus) { SERIALIZERS.register(bus); } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/WoolToStringRecipe.java b/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/WoolToStringRecipe.java new file mode 100644 index 0000000..a7dc6eb --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/WoolToStringRecipe.java @@ -0,0 +1,70 @@ +package org.polaris2023.wildwind.hfas.recipe; + +import java.util.List; +import net.minecraft.core.NonNullList; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemStackTemplate; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.CraftingInput; +import net.minecraft.world.item.crafting.CustomRecipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.display.RecipeDisplay; +import net.minecraft.world.item.crafting.display.ShapelessCraftingRecipeDisplay; +import net.minecraft.world.item.crafting.display.SlotDisplay; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.common.CommonHooks; +import org.jspecify.annotations.Nullable; + +public final class WoolToStringRecipe extends CustomRecipe { + public static final WoolToStringRecipe INSTANCE = new WoolToStringRecipe(); + private WoolToStringRecipe() {} + + @Override + public boolean matches(CraftingInput input, Level level) { + if (input.ingredientCount() != 2) return false; + boolean wool = false, shears = false; + for (var stack : input.items()) { + if (stack.isEmpty()) continue; + if (!wool && stack.is(ItemTags.WOOL)) wool = true; + else if (!shears && stack.is(Items.SHEARS) && !stack.isBroken()) shears = true; + else return false; + } + return wool && shears; + } + + @Override + public ItemStack assemble(CraftingInput input) { return new ItemStack(Items.STRING, 2); } + + @Override + public RecipeSerializer getSerializer() { return ModRecipes.WOOL_TO_STRING.get(); } + + @Override + public NonNullList getRemainingItems(CraftingInput input) { + var player = CommonHooks.getCraftingPlayer(); + return remainingItems(input, player != null && player.level() instanceof ServerLevel level ? level : null); + } + + /** CrafterBlock also supplies its server level; recipe previews never roll durability RNG. */ + public NonNullList remainingItems(CraftingInput input, @Nullable ServerLevel level) { + var remaining = NonNullList.withSize(input.size(), ItemStack.EMPTY); + for (int slot = 0; slot < input.size(); slot++) { + if (input.getItem(slot).is(Items.SHEARS)) { + var shears = input.getItem(slot).copyWithCount(1); + if (level != null) shears.hurtAndBreak(1, level, (LivingEntity) null, item -> {}); + remaining.set(slot, shears.isEmpty() ? ItemStack.EMPTY : shears); + } + } + return remaining; + } + + @Override + public List display() { + return List.of(new ShapelessCraftingRecipeDisplay(List.of(new SlotDisplay.TagSlotDisplay(ItemTags.WOOL), + new SlotDisplay.WithRemainder(new SlotDisplay.ItemSlotDisplay(Items.SHEARS), new SlotDisplay.ItemSlotDisplay(Items.SHEARS))), + new SlotDisplay.ItemStackSlotDisplay(new ItemStackTemplate(Items.STRING, 2)), + new SlotDisplay.ItemSlotDisplay(Items.CRAFTING_TABLE))); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/DatadrivenRegistryKey.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/DatadrivenRegistryKey.java new file mode 100644 index 0000000..250ae7f --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/DatadrivenRegistryKey.java @@ -0,0 +1,19 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; + +//内容请注册到mod主类的Datapack注册事件中 +public class DatadrivenRegistryKey { + //---[实体类]--- + //--=[实体变种]=-- + public static final ResourceKey> MUDCRAB_VARIANT = createRegistryKey("entity_variant/mudcrab"); + + + + private static ResourceKey> createRegistryKey(String name) { + return ResourceKey.createRegistryKey(HFASMod.id(name)); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModAttributes.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModAttributes.java new file mode 100644 index 0000000..c802b34 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModAttributes.java @@ -0,0 +1,59 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.RangedAttribute; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.EntityAttributeModificationEvent; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** + * 注册模组属性喵~ + *

+ * 26.2 迁移说明:旧仓库通过 LivingEntityMixin 向全体生物基础属性表追加属性, + * 现改用 NeoForge 的 EntityAttributeModificationEvent 实现同等效果(涵盖玩家)。 + */ +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public class ModAttributes { + /** + * 模组属性延迟注册器喵~ + */ + public static final DeferredRegister ATTRIBUTES = DeferredRegister.create(BuiltInRegistries.ATTRIBUTE, HFASMod.MOD_ID); + + /** + * 额外物品拾取距离属性喵~ + */ + public static final DeferredHolder EXTRA_ITEM_PICKUP_RANGE = + ATTRIBUTES.register("extra_item_pickup_range", () -> new RangedAttribute( + "attributes.ww_hfas.extra_item_pickup_range", + 0.0, + 0.0, + 10.0 + )); + + private ModAttributes() { + } + + /** + * 向模组事件总线注册属性喵~ + * + * @param modBus 模组事件总线喵~ + */ + public static void register(IEventBus modBus) { + ATTRIBUTES.register(modBus); + } + + /** + * 向所有生物实体类型追加拾取距离属性(对齐旧 LivingEntityMixin 行为)喵~ + * + * @param event 实体属性修改事件喵~ + */ + @SubscribeEvent + static void addAttributesToLivingEntities(EntityAttributeModificationEvent event) { + event.getTypes().forEach(type -> event.add(type, EXTRA_ITEM_PICKUP_RANGE)); + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModCreativeTabs.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModCreativeTabs.java new file mode 100644 index 0000000..87b4f2d --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModCreativeTabs.java @@ -0,0 +1,75 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.EnchantmentInstance; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import org.polaris2023.wildwind.hfas.enchantment.MeltingEnchantment; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; + +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public class ModCreativeTabs { + public static final DeferredRegister CREATIVE_TABS = + DeferredRegister.create(Registries.CREATIVE_MODE_TAB, HFASMod.MOD_ID); + /** + * 模组专用创造模式物品栏喵~ + */ + public static final DeferredHolder WILD_WIND = + CREATIVE_TABS.register("wild_wind", () -> CreativeModeTab.builder() + .title(Component.translatable("mod.wild_wind.name")) + .icon(() -> ModItems.MUDCRAB_BUCKET.get().getDefaultInstance()) + .displayItems((params, output) -> { + addStacks(output); + output.accept(EnchantmentHelper.createBook(new EnchantmentInstance( + params.holders().lookupOrThrow(Registries.ENCHANTMENT).getOrThrow(MeltingEnchantment.MELTING), 1))); + }) + .build() + ); + + /** + * 向模组事件总线注册创造模式物品栏 + * + * @param modBus 模组事件总线喵~ + */ + public static void register(IEventBus modBus) { + CREATIVE_TABS.register(modBus); + } + + @SubscribeEvent + public static void keepModContentsInOwnTab(BuildCreativeModeTabContentsEvent event) { + if (event.getTab().getType() != CreativeModeTab.Type.CATEGORY + || !event.getTabKey().identifier().getNamespace().equals("minecraft")) return; + // Vanilla generators also discover mod potions and enchanted books automatically. + event.removeIf(stack -> { + if (BuiltInRegistries.ITEM.getKey(stack.getItem()).getNamespace().equals(HFASMod.MOD_ID)) return true; + var potion = stack.get(DataComponents.POTION_CONTENTS); + if (potion != null && potion.potion().isPresent() + && potion.potion().get().unwrapKey().orElseThrow().identifier().getNamespace().equals(HFASMod.MOD_ID)) return true; + var enchantments = stack.get(DataComponents.STORED_ENCHANTMENTS); + return enchantments != null && enchantments.keySet().stream().anyMatch(holder -> holder.is(MeltingEnchantment.MELTING)); + }, CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); + } + + private static void addStacks(CreativeModeTab.Output output){ + ModBlocks.ITEMS.getEntries().forEach(item -> output.accept(item.get())); + ModItems.ITEMS.getEntries().stream().filter(item -> item != ModItems.TIPPED_ARROW).forEach(item -> output.accept(item.get())); + ModPotions.POTIONS.getEntries().forEach(potion -> { + output.accept(PotionContents.createItemStack(Items.POTION, potion)); + output.accept(PotionContents.createItemStack(Items.SPLASH_POTION, potion)); + output.accept(PotionContents.createItemStack(Items.LINGERING_POTION, potion)); + output.accept(org.polaris2023.wildwind.hfas.arrow.ReachArrows.convert(PotionContents.createItemStack(Items.TIPPED_ARROW, potion))); + }); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModDataComponents.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModDataComponents.java new file mode 100644 index 0000000..f36f99f --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModDataComponents.java @@ -0,0 +1,42 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponentType; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.component.ArrowComponent; +import org.polaris2023.wildwind.hfas.component.OmniClawTools; +import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; + +public class ModDataComponents { + public static final DeferredRegister.DataComponents REGISTER = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, HFASMod.MOD_ID); + + public static final DeferredHolder, DataComponentType>> MUDCRAB_VARIANT = + REGISTER.registerComponentType("mubcrab_variant", builder -> + builder.persistent(MudcrabVariant.CODEC).networkSynchronized(MudcrabVariant.STREAM_CODEC) + ); + + /** + * 箭矢组件 - 存储箭羽、箭杆、箭头类型 + */ + public static final DeferredHolder, DataComponentType> ARROW_COMPONENT = + REGISTER.registerComponentType("arrow_component", builder -> + builder.persistent(ArrowComponent.CODEC).networkSynchronized(ArrowComponent.STREAM_CODEC) + ); + + /** + * 万用蟹钳工具集合数据组件喵~ + */ + public static final DeferredHolder, DataComponentType> OMNI_CLAW_TOOLS = + REGISTER.registerComponentType("omni_claw_tools", builder -> + builder.persistent(OmniClawTools.CODEC).networkSynchronized(OmniClawTools.STREAM_CODEC) + ); + + public static void register(IEventBus modBus) { + REGISTER.register(modBus); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntities.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntities.java new file mode 100644 index 0000000..9790e5e --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntities.java @@ -0,0 +1,54 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.client.eventsub.EntitiesClientHandler; +import org.polaris2023.wildwind.hfas.entity.animal.Mudcrab; +import org.polaris2023.wildwind.hfas.entity.animal.Piranha; +import org.polaris2023.wildwind.hfas.entity.MuddyPig; + + +public class ModEntities { + public static final DeferredRegister.Entities ENTITY_TYPES = + DeferredRegister.createEntities(HFASMod.MOD_ID); + + public static final DeferredHolder, EntityType> REACH_ARROW = + ENTITY_TYPES.registerEntityType("arrow", org.polaris2023.wildwind.hfas.entity.ReachArrow::new, MobCategory.MISC, + builder -> builder.noLootTable().sized(0.5F, 0.5F).eyeHeight(0.13F).clientTrackingRange(4).updateInterval(20)); + + private ModEntities() { + } + + public static final DeferredHolder, EntityType> MUDDY_PIG = + ENTITY_TYPES.registerEntityType("muddy_pig", MuddyPig::new, MobCategory.CREATURE, + builder -> builder.sized(0.9F, 0.9F).passengerAttachments(0.86875F).clientTrackingRange(10)); + + //泥沼蟹实体类型 + public static final DeferredHolder, EntityType> MUDCRAB = + ENTITY_TYPES.registerEntityType("mudcrab", Mudcrab::new, MobCategory.WATER_CREATURE, + builder -> builder.sized(0.5F, 0.55F).clientTrackingRange(8) + ); + + //食人鱼实体类型 + public static final DeferredHolder, EntityType> PIRANHA = + ENTITY_TYPES.registerEntityType("piranha", Piranha::new, MobCategory.WATER_AMBIENT, + builder -> builder.sized(0.7F, 0.4F).eyeHeight(0.26F) + ); + + /** + * 向模组事件总线注册实体类型喵~ + * + * @see EntitiesClientHandler EntitiesClientEvent 实体客户端渲染绑定 + * @see org.polaris2023.wildwind.hfas.event.EntitiesHandler EntitiesHandler 实体服务端信息(attribute等绑定) + * + * @param modBus 模组事件总线喵~ + */ + public static void register(IEventBus modBus) { + ENTITY_TYPES.register(modBus); + } + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntityDataSerializers.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntityDataSerializers.java new file mode 100644 index 0000000..f8f98ca --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntityDataSerializers.java @@ -0,0 +1,39 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.core.Holder; +import net.minecraft.network.syncher.EntityDataSerializer; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; + +import java.util.function.Supplier; + +/** + * 注册模组实体数据序列化器喵~ + */ +public class ModEntityDataSerializers { + /** + * 实体数据序列化器延迟注册器喵~ + */ + public static final DeferredRegister> ENTITY_DATA_SERIALIZERS = DeferredRegister.create(NeoForgeRegistries.ENTITY_DATA_SERIALIZERS, HFASMod.MOD_ID); + + /** + * 泥沼蟹变种实体数据序列化器喵~ + */ + public static final Supplier>> MUDCRAB_VARIANT = + ENTITY_DATA_SERIALIZERS.register("mudcrab_variant", () -> EntityDataSerializer.forValueType(MudcrabVariant.STREAM_CODEC)); + + /** + * 向模组事件总线注册实体数据序列化器喵~ + * + * @param modBus 模组事件总线喵~ + */ + public static void register(IEventBus modBus) { + ENTITY_DATA_SERIALIZERS.register(modBus); + } + + private ModEntityDataSerializers() { + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModItems.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModItems.java new file mode 100644 index 0000000..838d231 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModItems.java @@ -0,0 +1,89 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.core.Holder; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.MobBucketItem; +import net.minecraft.world.item.SpawnEggItem; +import net.minecraft.world.level.material.Fluids; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.component.OmniClawTools; +import org.polaris2023.wildwind.hfas.item.ModFoods; +import org.polaris2023.wildwind.hfas.item.OmniClawItem; + +import java.util.function.Function; +import java.util.List; + +public class ModItems { + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(HFASMod.MOD_ID); + + public static final DeferredItem TIPPED_ARROW = + register("tipped_arrow", org.polaris2023.wildwind.hfas.item.ReachArrowItem::new); + + public static final DeferredItem MUDDY_PIG_SPAWN_EGG = registerMobEgg("muddy_pig_spawn_egg", ModEntities.MUDDY_PIG); + + // User-supplied materials remain ordinary items, without food components. + public static final DeferredItem DUCKWEED = register("duckweed"); + public static final DeferredItem CALAMARI = register("calamari"); + public static final DeferredItem COOKED_CALAMARI = register("cooked_calamari"); + public static final DeferredItem COOKED_EGG = register("cooked_egg"); + public static final DeferredItem BAKED_SEEDS = register("baked_seeds"); + public static final DeferredItem COOKED_FROG_LEGS = register("cooked_frog_legs"); + public static final DeferredItem FROG_LEGS = register("frog_legs"); + public static final List> MATERIALS = List.of( + DUCKWEED, CALAMARI, COOKED_CALAMARI, COOKED_EGG, BAKED_SEEDS, COOKED_FROG_LEGS, FROG_LEGS); + + //泥沼蟹刷怪蛋 + public static final DeferredItem MUDCRAB_SPAWN_EGG = registerMobEgg("mudcrab_spawn_egg",ModEntities.MUDCRAB); + + //泥沼蟹桶 + public static final DeferredItem MUDCRAB_BUCKET = register("mudcrab_bucket",p -> new MobBucketItem(ModEntities.MUDCRAB.get(),Fluids.WATER,SoundEvents.BUCKET_EMPTY,p)); + + //蟹钳 + public static final DeferredItem CRAB_CLAW = register("crab_claw"); + + //食人鱼 + public static final DeferredItem PIRANHA = register("piranha", p -> new Item(p.food(ModFoods.PIRANHA, ModFoods.PIRANHA_CONSUMABLE))); + public static final DeferredItem COOKED_PIRANHA = register("cooked_piranha", p -> new Item(p.food(ModFoods.COOKED_PIRANHA, ModFoods.COOKED_PIRANHA_CONSUMABLE))); + public static final DeferredItem PIRANHA_SPAWN_EGG = registerMobEgg("piranha_spawn_egg", ModEntities.PIRANHA); + + //食人鱼桶 + public static final DeferredItem PIRANHA_BUCKET = register("piranha_bucket", p -> new MobBucketItem(ModEntities.PIRANHA.get(), Fluids.WATER, SoundEvents.BUCKET_EMPTY_FISH, p)); + + //尖牙(食人鱼掉落物) + public static final DeferredItem FANG = register("fang"); + + + //万用蟹钳 + public static final DeferredItem OMNI_CLAW = + register("omni_claw", p -> new OmniClawItem( + p.stacksTo(1) + .attributes(OmniClawItem.createAttributes()) + .component(ModDataComponents.OMNI_CLAW_TOOLS.get(), OmniClawTools.EMPTY) + )); + + public static void register(IEventBus modBus) { + ITEMS.register(modBus); + } + + + public static DeferredItem registerMobEgg(String id, Holder> type){ + return ITEMS.registerItem(id, p -> new SpawnEggItem(p.spawnEgg(type.value()))); + } + + public static DeferredItem register(String id){ + return ITEMS.registerItem(id, Item::new); + } + + public static DeferredItem register(String id, Function builder){ + return ITEMS.registerItem(id, builder); + } + + public static DeferredItem register(String id, Function builder, Function property){ + return ITEMS.registerItem(id, p -> builder.apply(property.apply(p))); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModMobEffects.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModMobEffects.java new file mode 100644 index 0000000..7cf7b3d --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModMobEffects.java @@ -0,0 +1,62 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.registry.ModAttributes; +import org.polaris2023.wildwind.hfas.effect.WildWindMobEffect; + +/** + * 注册模组状态效果喵~ + */ +public class ModMobEffects { + /** + * 状态效果延迟注册器喵~ + */ + public static final DeferredRegister MOB_EFFECTS = + DeferredRegister.create(BuiltInRegistries.MOB_EFFECT, HFASMod.MOD_ID); + + /** + * 延展状态效果喵~ + */ + public static final DeferredHolder REACH = + MOB_EFFECTS.register("reach", + () -> new WildWindMobEffect(MobEffectCategory.BENEFICIAL, 0xFF3F7E8E) + .addAttributeModifier( + Attributes.BLOCK_INTERACTION_RANGE, + HFASMod.id("effect.reach"), + 2.0, + AttributeModifier.Operation.ADD_VALUE + ) + .addAttributeModifier( + Attributes.ENTITY_INTERACTION_RANGE, + HFASMod.id("effect.reach"), + 2.0, + AttributeModifier.Operation.ADD_VALUE + ) + .addAttributeModifier( + ModAttributes.EXTRA_ITEM_PICKUP_RANGE, + HFASMod.id("effect.reach"), + 2.0, + AttributeModifier.Operation.ADD_VALUE + ) + ); + + /** + * 向模组事件总线注册状态效果喵~ + * + * @param modBus 模组事件总线喵~ + */ + public static void register(IEventBus modBus) { + MOB_EFFECTS.register(modBus); + } + + private ModMobEffects() { + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModPotions.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModPotions.java new file mode 100644 index 0000000..0d27a65 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModPotions.java @@ -0,0 +1,72 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.Potion; +import net.minecraft.world.item.alchemy.PotionBrewing; +import net.minecraft.world.item.alchemy.Potions; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** + * 注册模组药水并处理酿造配方喵~ + */ +@EventBusSubscriber(modid = HFASMod.MOD_ID) +public class ModPotions { + /** + * 药水延迟注册器喵~ + */ + public static final DeferredRegister POTIONS = + DeferredRegister.create(BuiltInRegistries.POTION, HFASMod.MOD_ID); + + /** + * 延展药水喵~ + */ + public static final DeferredHolder REACH = + POTIONS.register("reach", () -> new Potion("reach", new MobEffectInstance(ModMobEffects.REACH, 3600))); + /** + * 长效延展药水喵~ + */ + public static final DeferredHolder LONG_REACH = + POTIONS.register("long_reach", () -> new Potion("long_reach", new MobEffectInstance(ModMobEffects.REACH, 9600))); + + /** + * 向模组事件总线注册药水喵~ + * + * @param modBus 模组事件总线喵~ + */ + public static void register(IEventBus modBus) { + POTIONS.register(modBus); + } + + /** + * 注册药水酿造配方喵~ + * + * @param event 酿造配方注册事件喵~ + */ + @SubscribeEvent + static void registerBrewingRecipes(RegisterBrewingRecipesEvent event) { + PotionBrewing.Builder builder = event.getBuilder(); + + builder.addMix( + Potions.AWKWARD, + ModItems.CRAB_CLAW.get(), + ModPotions.REACH + ); + + builder.addMix( + ModPotions.REACH, + Items.REDSTONE, + ModPotions.LONG_REACH + ); + } + + private ModPotions() { + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModSoundEvents.java b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModSoundEvents.java new file mode 100644 index 0000000..8b5eedd --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModSoundEvents.java @@ -0,0 +1,30 @@ +package org.polaris2023.wildwind.hfas.registry; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.sounds.SoundEvent; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.hfas.HFASMod; + +public class ModSoundEvents { + public static final DeferredRegister SOUND_EVENTS = + DeferredRegister.create(BuiltInRegistries.SOUND_EVENT, HFASMod.MOD_ID); + + public static final DeferredHolder PIRANHA_ATTACK = SOUND_EVENTS.register( + "entity.piranha.attack", + SoundEvent::createVariableRangeEvent + ); + + public static final DeferredHolder PIRANHA_DEATH = SOUND_EVENTS.register( + "entity.piranha.death", + SoundEvent::createVariableRangeEvent + ); + + public static void register(IEventBus modEventBus) { + SOUND_EVENTS.register(modEventBus); + } + + private ModSoundEvents() { + } +} \ No newline at end of file diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBiomeTags.java b/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBiomeTags.java new file mode 100644 index 0000000..26259d8 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBiomeTags.java @@ -0,0 +1,37 @@ +package org.polaris2023.wildwind.hfas.tag; + +import net.minecraft.core.registries.Registries; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.biome.Biome; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** + * 定义模组群系标签喵~ + */ +public interface ModBiomeTags { + + interface EntityGen{ + /** + * 会生成暖色变种泥沼蟹的群系标签喵~ + */ + TagKey MUDCRABS_WARM = create("entity_spawn/mudcrab/warm"); + /** + * 会生成冷色变种泥沼蟹的群系标签喵~ + */ + TagKey MUDCRABS_COLD = create("entity_spawn/mudcrab/cold"); + /** + * 会生成食人鱼的群系标签喵~ + */ + TagKey PIRANHA_SPAWNS = create("entity_spawn/piranha"); + } + + /** + * 创建群系标签键喵~ + * + * @param path 标签路径喵~ + * @return 群系标签键喵~ + */ + static TagKey create(String path) { + return TagKey.create(Registries.BIOME, HFASMod.id(path)); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBlockTags.java b/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBlockTags.java new file mode 100644 index 0000000..7ef4a96 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBlockTags.java @@ -0,0 +1,25 @@ +package org.polaris2023.wildwind.hfas.tag; + +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** + * 定义模组方块标签喵~ + */ +public interface ModBlockTags { + + interface EntityAbout { + //泥沼蟹可在其上生成的方块标签喵~ + TagKey MUDCRAB_SPAWNABLE_ON = BlockTags.create(HFASMod.id("entity/mudcrab/spawnable_on")); + //泥沼蟹可在水下地面生成的方块标签喵~ + TagKey MUDCRAB_SPAWNABLE_IN_WATER_GROUND = BlockTags.create(HFASMod.id("entity/mudcrab/spawnable_in_water_ground")); + //泥沼蟹偏好游荡的方块标签喵~ + TagKey MUDCRAB_PREFERRED_WANDER_BLOCKS = BlockTags.create(HFASMod.id("entity/mudcrab/preferred_wander_blocks")); + + //蜘蛛卵 + TagKey SPIDER_COCOONS = BlockTags.create(HFASMod.id("spider_cocoons")); + } + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModItemTags.java b/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModItemTags.java new file mode 100644 index 0000000..29cea11 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModItemTags.java @@ -0,0 +1,16 @@ +package org.polaris2023.wildwind.hfas.tag; + +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** + * 定义模组物品标签喵~ + */ +public interface ModItemTags { + /** + * 泥沼蟹食物的物品标签喵~ + */ + TagKey MUDCRAB_FOOD = ItemTags.create(HFASMod.id("mudcrab_food")); +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/MasonKilnProcessor.java b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/MasonKilnProcessor.java new file mode 100644 index 0000000..80249af --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/MasonKilnProcessor.java @@ -0,0 +1,57 @@ +package org.polaris2023.wildwind.hfas.worldgen; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import java.util.Map; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.jspecify.annotations.Nullable; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.hfas.block.KilnBlock; + +/** Inserts a kiln beside the workstation in each of the six vanilla mason-house templates. */ +public record MasonKilnProcessor(BlockPos target, Direction facing, Block replacedBlock) implements StructureProcessor { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + BlockPos.CODEC.fieldOf("pos").forGetter(MasonKilnProcessor::target), + Direction.CODEC.fieldOf("facing").forGetter(MasonKilnProcessor::facing), + BuiltInRegistries.BLOCK.byNameCodec().fieldOf("replace").forGetter(MasonKilnProcessor::replacedBlock) + ).apply(instance, MasonKilnProcessor::new)); + public static final DeferredRegister> PROCESSORS = + DeferredRegister.create(Registries.STRUCTURE_PROCESSOR, HFASMod.MOD_ID); + static { PROCESSORS.register("mason_kiln", () -> CODEC); } + + public static final Map HOUSES = Map.of( + id("desert/houses/desert_mason_1"), new MasonKilnProcessor(new BlockPos(5, 1, 6), Direction.NORTH, Blocks.AIR), + id("plains/houses/plains_masons_house_1"), new MasonKilnProcessor(new BlockPos(5, 1, 6), Direction.NORTH, Blocks.AIR), + id("savanna/houses/savanna_mason_1"), new MasonKilnProcessor(new BlockPos(5, 1, 2), Direction.SOUTH, Blocks.AIR), + id("snowy/houses/snowy_masons_house_1"), new MasonKilnProcessor(new BlockPos(6, 2, 5), Direction.WEST, Blocks.SPRUCE_PLANKS), + id("snowy/houses/snowy_masons_house_2"), new MasonKilnProcessor(new BlockPos(5, 1, 2), Direction.SOUTH, Blocks.DIORITE_STAIRS), + id("taiga/houses/taiga_masons_house_1"), new MasonKilnProcessor(new BlockPos(5, 2, 5), Direction.WEST, Blocks.AIR)); + + private static Identifier id(String path) { return Identifier.withDefaultNamespace("village/" + path); } + + @Override + public MapCodec codec() { return CODEC; } + + @Override + public StructureTemplate.@Nullable StructureBlockInfo process(LevelReader level, BlockPos origin, BlockPos reference, + StructureTemplate.StructureBlockInfo original, StructureTemplate.StructureBlockInfo processed, + StructurePlaceSettings settings, @Nullable StructureTemplate template) { + // Do not overwrite a chest/workstation if a data pack redesigns this template. + if (!original.pos().equals(target) || !original.state().is(replacedBlock) || !processed.state().is(replacedBlock)) return processed; + // StructureTemplate applies mirror/rotation to the state after processing; position is already transformed. + return new StructureTemplate.StructureBlockInfo(processed.pos(), + ModBlocks.KILN.get().defaultBlockState().setValue(KilnBlock.FACING, facing), null); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java new file mode 100644 index 0000000..afd0051 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java @@ -0,0 +1,104 @@ +package org.polaris2023.wildwind.hfas.worldgen; + +import java.util.Set; + +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstrapContext; +import net.minecraft.data.worldgen.placement.CavePlacements; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.random.WeightedList; +import net.minecraft.world.level.biome.Biomes; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.world.BiomeModifier; +import net.neoforged.neoforge.common.world.BiomeModifiers; +import net.neoforged.neoforge.registries.NeoForgeRegistries; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.hfas.tag.ModBiomeTags; + +/** + * 生物群系修改器 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModBiomeModifiers { + + public static final ResourceKey ADD_BLAZE_TREE = createKey("add_blaze_tree"); + + public static final ResourceKey ADD_SOUL_TREE = createKey("add_soul_tree"); + + // 杜鹃树生成 + public static final ResourceKey ADD_AZALEA_TREE = createKey("add_azalea_tree"); + + // 移除原版杜鹃树 + public static final ResourceKey REMOVE_VANILLA_AZALEA_TREE = createKey("remove_vanilla_azalea_tree"); + + //那啥蟹生成 + public static final ResourceKey ADD_MUDCRAB_SPAWNS = createKey("add_mudcrab_spawns"); + + //食人鱼生成 + public static final ResourceKey ADD_PIRANHA_SPAWNS = createKey("add_piranha_spawns"); + + public static void bootstrap(BootstrapContext context) { + var placedFeatures = context.lookup(Registries.PLACED_FEATURE); + var biomes = context.lookup(Registries.BIOME); + + // 焚烬木树生成 - 在下界废土群系 + context.register(ADD_BLAZE_TREE, new BiomeModifiers.AddFeaturesBiomeModifier( + HolderSet.direct(biomes.getOrThrow(Biomes.NETHER_WASTES)), + HolderSet.direct(placedFeatures.getOrThrow(ModPlacedFeatures.BLAZE_TREE_PLACED_KEY)), + GenerationStep.Decoration.VEGETAL_DECORATION + )); + + // 灵焰木树生成 - 在灵魂沙峡谷群系 + context.register(ADD_SOUL_TREE, new BiomeModifiers.AddFeaturesBiomeModifier( + HolderSet.direct(biomes.getOrThrow(Biomes.SOUL_SAND_VALLEY)), + HolderSet.direct(placedFeatures.getOrThrow(ModPlacedFeatures.SOUL_TREE_PLACED_KEY)), + GenerationStep.Decoration.VEGETAL_DECORATION + )); + + // 移除原版杜鹃树 - 在繁茂洞穴群系 + context.register(REMOVE_VANILLA_AZALEA_TREE, new BiomeModifiers.RemoveFeaturesBiomeModifier( + HolderSet.direct(biomes.getOrThrow(Biomes.LUSH_CAVES)), + HolderSet.direct(placedFeatures.getOrThrow(CavePlacements.ROOTED_AZALEA_TREE)), + Set.of(GenerationStep.Decoration.VEGETAL_DECORATION) + )); + + // 杜鹃树生成 - 在繁茂洞穴群系 + context.register(ADD_AZALEA_TREE, new BiomeModifiers.AddFeaturesBiomeModifier( + HolderSet.direct(biomes.getOrThrow(Biomes.LUSH_CAVES)), + HolderSet.direct(placedFeatures.getOrThrow(ModPlacedFeatures.AZALEA_TREE_PLACED_KEY)), + GenerationStep.Decoration.VEGETAL_DECORATION + )); + + context.register(ADD_MUDCRAB_SPAWNS, new BiomeModifiers.AddSpawnsBiomeModifier( + biomes.getOrThrow(Tags.Biomes.IS_SWAMP), + WeightedList.of( + new MobSpawnSettings.SpawnerData(ModEntities.MUDCRAB.get(), 1, 2) + ) + ) + ); + + // 食人鱼生成 - 丛林与沼泽群系 + context.register(ADD_PIRANHA_SPAWNS, new BiomeModifiers.AddSpawnsBiomeModifier( + biomes.getOrThrow(ModBiomeTags.EntityGen.PIRANHA_SPAWNS), + WeightedList.builder() + .add(new MobSpawnSettings.SpawnerData(ModEntities.PIRANHA.get(), 1, 5), 8) + .build() + ) + ); + } + + private static ResourceKey createKey(String name) { + return ResourceKey.create( + NeoForgeRegistries.Keys.BIOME_MODIFIERS, + HFASMod.id(name) + ); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java new file mode 100644 index 0000000..f79b37e --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java @@ -0,0 +1,105 @@ +package org.polaris2023.wildwind.hfas.worldgen; + +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstrapContext; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.random.WeightedList; +import net.minecraft.util.valueproviders.ConstantInt; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; +import net.minecraft.world.level.levelgen.feature.featuresize.TwoLayersFeatureSize; +import net.minecraft.world.level.levelgen.feature.foliageplacers.BlobFoliagePlacer; +import net.minecraft.world.level.levelgen.feature.foliageplacers.RandomSpreadFoliagePlacer; +import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider; +import net.minecraft.world.level.levelgen.feature.stateproviders.SimpleStateProvider; +import net.minecraft.world.level.levelgen.feature.stateproviders.WeightedStateProvider; +import net.minecraft.world.level.levelgen.feature.trunkplacers.BendingTrunkPlacer; +import net.minecraft.world.level.levelgen.feature.trunkplacers.StraightTrunkPlacer; +import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.hfas.block.ModBlocks; + +import java.util.Optional; + +/** + * 配置特征注册 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModConfiguredFeatures { + + public static final ResourceKey> BLAZE_TREE_KEY = ResourceKey.create( + Registries.CONFIGURED_FEATURE, + Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "blaze_tree") + ); + + public static final ResourceKey> SOUL_TREE_KEY = ResourceKey.create( + Registries.CONFIGURED_FEATURE, + Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "soul_tree") + ); + + // 杜鹃树 - 使用杜鹃木原木 + public static final ResourceKey> AZALEA_TREE_KEY = ResourceKey.create( + Registries.CONFIGURED_FEATURE, + Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "azalea_tree") + ); + + public static void bootstrap(BootstrapContext> context) { + HolderGetter blocks = context.lookup(Registries.BLOCK); + + HolderGetter biomes = context.lookup(Registries.BIOME); + BlockStateProvider belowTrunkProvider = TreeConfiguration.defaultPlaceBelowTreeTrunkProvider(biomes); + + // 焚烬木树 + register(context, BLAZE_TREE_KEY, Feature.TREE, new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(ModBlocks.BLAZE_LOG.get()), + new StraightTrunkPlacer(4, 2, 0), + BlockStateProvider.simple(ModBlocks.BLAZE_LEAVES.get()), + new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), + new TwoLayersFeatureSize(1, 0, 1), + belowTrunkProvider + ).build()); + + // 灵焰木树 + register(context, SOUL_TREE_KEY, Feature.TREE, new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(ModBlocks.SOUL_LOG.get()), + new StraightTrunkPlacer(4, 2, 0), + BlockStateProvider.simple(ModBlocks.SOUL_LEAVES.get()), + new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), + new TwoLayersFeatureSize(1, 0, 1), + belowTrunkProvider + ).build()); + + // 杜鹃树 - 使用杜鹃木原木和原版杜鹃树叶 + register(context, AZALEA_TREE_KEY, Feature.TREE, new TreeConfiguration.TreeConfigurationBuilder( + BlockStateProvider.simple(ModBlocks.AZALEA_LOG.get()), + new BendingTrunkPlacer(4, 2, 0, 3, UniformInt.of(1, 2)), + new WeightedStateProvider( + WeightedList.builder() + .add(Blocks.AZALEA_LEAVES.defaultBlockState(), 3) + .add(Blocks.FLOWERING_AZALEA_LEAVES.defaultBlockState(), 1) + ), + new RandomSpreadFoliagePlacer(ConstantInt.of(3), ConstantInt.of(0), ConstantInt.of(2), 50), + Optional.empty(), + new TwoLayersFeatureSize(1, 0, 1), + SimpleStateProvider.simple(Blocks.ROOTED_DIRT) + + ).build()); + } + + private static > void register( + BootstrapContext> context, + ResourceKey> key, + F feature, + FC config + ) { + context.register(key, new ConfiguredFeature<>(feature, config)); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java new file mode 100644 index 0000000..b20b8ea --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java @@ -0,0 +1,77 @@ +package org.polaris2023.wildwind.hfas.worldgen; + +import net.minecraft.core.Direction; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstrapContext; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.valueproviders.ConstantInt; +import net.minecraft.util.valueproviders.IntProvider; +import net.minecraft.util.valueproviders.IntProviders; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.minecraft.world.level.levelgen.blockpredicates.BlockPredicate; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.placement.*; +import org.polaris2023.wildwind.hfas.HFASMod; + +import java.util.List; + +/** + * 放置特征注册 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModPlacedFeatures { + + public static final ResourceKey BLAZE_TREE_PLACED_KEY = ResourceKey.create( + Registries.PLACED_FEATURE, + Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "blaze_tree_placed") + ); + + public static final ResourceKey SOUL_TREE_PLACED_KEY = ResourceKey.create( + Registries.PLACED_FEATURE, + Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "soul_tree_placed") + ); + + // 杜鹃树放置 + public static final ResourceKey AZALEA_TREE_PLACED_KEY = ResourceKey.create( + Registries.PLACED_FEATURE, + Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "azalea_tree_placed") + ); + + public static void bootstrap(BootstrapContext context) { + HolderGetter> configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE); + + // 焚烬木树放置 + context.register(BLAZE_TREE_PLACED_KEY, new PlacedFeature( + configuredFeatures.getOrThrow(ModConfiguredFeatures.BLAZE_TREE_KEY), + List.of() + )); + + // 灵焰木树放置 + context.register(SOUL_TREE_PLACED_KEY, new PlacedFeature( + configuredFeatures.getOrThrow(ModConfiguredFeatures.SOUL_TREE_KEY), + List.of() + )); + + + + // 杜鹃树放置 + context.register(AZALEA_TREE_PLACED_KEY, new PlacedFeature( + configuredFeatures.getOrThrow(ModConfiguredFeatures.AZALEA_TREE_KEY), + List.of( + CountPlacement.of(UniformInt.of(1, 2)), + InSquarePlacement.spread(), + HeightRangePlacement.uniform(VerticalAnchor.aboveBottom(0), VerticalAnchor.absolute(256)), + EnvironmentScanPlacement.scanningFor(Direction.UP, BlockPredicate.solid(), BlockPredicate.matchesTag(BlockTags.AIR), 12), + RandomOffsetPlacement.of(ConstantInt.of(0), ConstantInt.of(-1)), + BiomeFilter.biome() + ) + )); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModTreeGrowers.java b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModTreeGrowers.java new file mode 100644 index 0000000..034c406 --- /dev/null +++ b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModTreeGrowers.java @@ -0,0 +1,41 @@ +package org.polaris2023.wildwind.hfas.worldgen; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.block.grower.TreeGrower; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import org.polaris2023.wildwind.hfas.HFASMod; + +import java.util.Optional; + +/** + * 树木生长器注册 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ModTreeGrowers { + + // 焚烬木树苗生长器 + public static final TreeGrower BLAZE = new TreeGrower( + "blaze", + Optional.empty(), + Optional.of(ModConfiguredFeatures.BLAZE_TREE_KEY), + Optional.empty() + ); + + // 灵焰木树苗生长器 + public static final TreeGrower SOUL = new TreeGrower( + "soul", + Optional.empty(), + Optional.of(ModConfiguredFeatures.SOUL_TREE_KEY), + Optional.empty() + ); + + // 杜鹃木树苗生长器 + public static final TreeGrower AZALEA = new TreeGrower( + "azalea", + Optional.empty(), + Optional.of(ModConfiguredFeatures.AZALEA_TREE_KEY), + Optional.empty() + ); +} diff --git a/src/hfas/resources/META-INF/accesstransformer.cfg b/src/hfas/resources/META-INF/accesstransformer.cfg new file mode 100644 index 0000000..bcd9eb5 --- /dev/null +++ b/src/hfas/resources/META-INF/accesstransformer.cfg @@ -0,0 +1 @@ +public net.minecraft.world.item.context.UseOnContext hitResult diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_button.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_button.json new file mode 100644 index 0000000..3ab9b3b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_button.json @@ -0,0 +1,118 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": { + "model": "ww_hfas:block/azalea_button", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false": { + "model": "ww_hfas:block/azalea_button", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false": { + "model": "ww_hfas:block/azalea_button", + "x": 180 + }, + "face=ceiling,facing=south,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "x": 180 + }, + "face=ceiling,facing=west,powered=false": { + "model": "ww_hfas:block/azalea_button", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "x": 180, + "y": 90 + }, + "face=floor,facing=east,powered=false": { + "model": "ww_hfas:block/azalea_button", + "y": 90 + }, + "face=floor,facing=east,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "y": 90 + }, + "face=floor,facing=north,powered=false": { + "model": "ww_hfas:block/azalea_button" + }, + "face=floor,facing=north,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed" + }, + "face=floor,facing=south,powered=false": { + "model": "ww_hfas:block/azalea_button", + "y": 180 + }, + "face=floor,facing=south,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "y": 180 + }, + "face=floor,facing=west,powered=false": { + "model": "ww_hfas:block/azalea_button", + "y": 270 + }, + "face=floor,facing=west,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "y": 270 + }, + "face=wall,facing=east,powered=false": { + "model": "ww_hfas:block/azalea_button", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false": { + "model": "ww_hfas:block/azalea_button", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=north,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=south,powered=false": { + "model": "ww_hfas:block/azalea_button", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false": { + "model": "ww_hfas:block/azalea_button", + "uvlock": true, + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true": { + "model": "ww_hfas:block/azalea_button_pressed", + "uvlock": true, + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_door.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_door.json new file mode 100644 index 0000000..4450267 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/azalea_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/azalea_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/azalea_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/azalea_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/azalea_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/azalea_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/azalea_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/azalea_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/azalea_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/azalea_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/azalea_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/azalea_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/azalea_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/azalea_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/azalea_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/azalea_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/azalea_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/azalea_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/azalea_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/azalea_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/azalea_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/azalea_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/azalea_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/azalea_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/azalea_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/azalea_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/azalea_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/azalea_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/azalea_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/azalea_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/azalea_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/azalea_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence.json new file mode 100644 index 0000000..bc802fe --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence.json @@ -0,0 +1,48 @@ +{ + "multipart": [ + { + "apply": { + "model": "ww_hfas:block/azalea_fence_post" + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_fence_side", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_fence_side", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_fence_side", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_fence_side", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence_gate.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence_gate.json new file mode 100644 index 0000000..b834ead --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence_gate.json @@ -0,0 +1,80 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": { + "model": "ww_hfas:block/azalea_fence_gate", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=false,open=true": { + "model": "ww_hfas:block/azalea_fence_gate_open", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=true,open=false": { + "model": "ww_hfas:block/azalea_fence_gate_wall", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=true,open=true": { + "model": "ww_hfas:block/azalea_fence_gate_wall_open", + "uvlock": true, + "y": 270 + }, + "facing=north,in_wall=false,open=false": { + "model": "ww_hfas:block/azalea_fence_gate", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=false,open=true": { + "model": "ww_hfas:block/azalea_fence_gate_open", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=true,open=false": { + "model": "ww_hfas:block/azalea_fence_gate_wall", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=true,open=true": { + "model": "ww_hfas:block/azalea_fence_gate_wall_open", + "uvlock": true, + "y": 180 + }, + "facing=south,in_wall=false,open=false": { + "model": "ww_hfas:block/azalea_fence_gate", + "uvlock": true + }, + "facing=south,in_wall=false,open=true": { + "model": "ww_hfas:block/azalea_fence_gate_open", + "uvlock": true + }, + "facing=south,in_wall=true,open=false": { + "model": "ww_hfas:block/azalea_fence_gate_wall", + "uvlock": true + }, + "facing=south,in_wall=true,open=true": { + "model": "ww_hfas:block/azalea_fence_gate_wall_open", + "uvlock": true + }, + "facing=west,in_wall=false,open=false": { + "model": "ww_hfas:block/azalea_fence_gate", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=false,open=true": { + "model": "ww_hfas:block/azalea_fence_gate_open", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=true,open=false": { + "model": "ww_hfas:block/azalea_fence_gate_wall", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=true,open=true": { + "model": "ww_hfas:block/azalea_fence_gate_wall_open", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_hanging_sign.json new file mode 100644 index 0000000..0f047ad --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_hanging_sign.json @@ -0,0 +1,124 @@ +{ + "variants": { + "attached=false,rotation=0": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_0" + }, + "attached=false,rotation=1": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_1" + }, + "attached=false,rotation=10": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_2", + "y": 180 + }, + "attached=false,rotation=11": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_3", + "y": 180 + }, + "attached=false,rotation=12": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_0", + "y": 270 + }, + "attached=false,rotation=13": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_1", + "y": 270 + }, + "attached=false,rotation=14": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_2", + "y": 270 + }, + "attached=false,rotation=15": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_3", + "y": 270 + }, + "attached=false,rotation=2": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_2" + }, + "attached=false,rotation=3": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_3" + }, + "attached=false,rotation=4": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_0", + "y": 90 + }, + "attached=false,rotation=5": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_1", + "y": 90 + }, + "attached=false,rotation=6": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_2", + "y": 90 + }, + "attached=false,rotation=7": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_3", + "y": 90 + }, + "attached=false,rotation=8": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_0", + "y": 180 + }, + "attached=false,rotation=9": { + "model": "ww_hfas:block/azalea_hanging_sign_rot_1", + "y": 180 + }, + "attached=true,rotation=0": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_0" + }, + "attached=true,rotation=1": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_1" + }, + "attached=true,rotation=10": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_2", + "y": 180 + }, + "attached=true,rotation=11": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_3", + "y": 180 + }, + "attached=true,rotation=12": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_0", + "y": 270 + }, + "attached=true,rotation=13": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_1", + "y": 270 + }, + "attached=true,rotation=14": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_2", + "y": 270 + }, + "attached=true,rotation=15": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_3", + "y": 270 + }, + "attached=true,rotation=2": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_2" + }, + "attached=true,rotation=3": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_3" + }, + "attached=true,rotation=4": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_0", + "y": 90 + }, + "attached=true,rotation=5": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_1", + "y": 90 + }, + "attached=true,rotation=6": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_2", + "y": 90 + }, + "attached=true,rotation=7": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_3", + "y": 90 + }, + "attached=true,rotation=8": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_0", + "y": 180 + }, + "attached=true,rotation=9": { + "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_1", + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_log.json new file mode 100644 index 0000000..b5fcbcc --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/azalea_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/azalea_log" + }, + "axis=z": { + "model": "ww_hfas:block/azalea_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_planks.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_planks.json new file mode 100644 index 0000000..7faecf5 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_planks.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/azalea_planks" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_pressure_plate.json new file mode 100644 index 0000000..145f530 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_pressure_plate.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "ww_hfas:block/azalea_pressure_plate" + }, + "powered=true": { + "model": "ww_hfas:block/azalea_pressure_plate_down" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_shelf.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_shelf.json new file mode 100644 index 0000000..7af1f23 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_shelf.json @@ -0,0 +1,402 @@ +{ + "multipart": [ + { + "apply": { + "model": "ww_hfas:block/azalea_shelf" + }, + "when": { + "facing": "north" + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf", + "y": 90 + }, + "when": { + "facing": "east" + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf", + "y": 180 + }, + "when": { + "facing": "south" + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf", + "y": 270 + }, + "when": { + "facing": "west" + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_unpowered" + }, + "when": { + "AND": [ + { + "facing": "north" + }, + { + "powered": "false" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_unpowered", + "y": 90 + }, + "when": { + "AND": [ + { + "facing": "east" + }, + { + "powered": "false" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_unpowered", + "y": 180 + }, + "when": { + "AND": [ + { + "facing": "south" + }, + { + "powered": "false" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_unpowered", + "y": 270 + }, + "when": { + "AND": [ + { + "facing": "west" + }, + { + "powered": "false" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_unconnected" + }, + "when": { + "AND": [ + { + "facing": "north" + }, + { + "powered": "true" + }, + { + "side_chain": "unconnected" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_unconnected", + "y": 90 + }, + "when": { + "AND": [ + { + "facing": "east" + }, + { + "powered": "true" + }, + { + "side_chain": "unconnected" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_unconnected", + "y": 180 + }, + "when": { + "AND": [ + { + "facing": "south" + }, + { + "powered": "true" + }, + { + "side_chain": "unconnected" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_unconnected", + "y": 270 + }, + "when": { + "AND": [ + { + "facing": "west" + }, + { + "powered": "true" + }, + { + "side_chain": "unconnected" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_left" + }, + "when": { + "AND": [ + { + "facing": "north" + }, + { + "powered": "true" + }, + { + "side_chain": "left" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_left", + "y": 90 + }, + "when": { + "AND": [ + { + "facing": "east" + }, + { + "powered": "true" + }, + { + "side_chain": "left" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_left", + "y": 180 + }, + "when": { + "AND": [ + { + "facing": "south" + }, + { + "powered": "true" + }, + { + "side_chain": "left" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_left", + "y": 270 + }, + "when": { + "AND": [ + { + "facing": "west" + }, + { + "powered": "true" + }, + { + "side_chain": "left" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_center" + }, + "when": { + "AND": [ + { + "facing": "north" + }, + { + "powered": "true" + }, + { + "side_chain": "center" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_center", + "y": 90 + }, + "when": { + "AND": [ + { + "facing": "east" + }, + { + "powered": "true" + }, + { + "side_chain": "center" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_center", + "y": 180 + }, + "when": { + "AND": [ + { + "facing": "south" + }, + { + "powered": "true" + }, + { + "side_chain": "center" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_center", + "y": 270 + }, + "when": { + "AND": [ + { + "facing": "west" + }, + { + "powered": "true" + }, + { + "side_chain": "center" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_right" + }, + "when": { + "AND": [ + { + "facing": "north" + }, + { + "powered": "true" + }, + { + "side_chain": "right" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_right", + "y": 90 + }, + "when": { + "AND": [ + { + "facing": "east" + }, + { + "powered": "true" + }, + { + "side_chain": "right" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_right", + "y": 180 + }, + "when": { + "AND": [ + { + "facing": "south" + }, + { + "powered": "true" + }, + { + "side_chain": "right" + } + ] + } + }, + { + "apply": { + "model": "ww_hfas:block/azalea_shelf_right", + "y": 270 + }, + "when": { + "AND": [ + { + "facing": "west" + }, + { + "powered": "true" + }, + { + "side_chain": "right" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_sign.json new file mode 100644 index 0000000..cae3261 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_sign.json @@ -0,0 +1,64 @@ +{ + "variants": { + "rotation=0": { + "model": "ww_hfas:block/azalea_sign_rot_0" + }, + "rotation=1": { + "model": "ww_hfas:block/azalea_sign_rot_1" + }, + "rotation=10": { + "model": "ww_hfas:block/azalea_sign_rot_2", + "y": 180 + }, + "rotation=11": { + "model": "ww_hfas:block/azalea_sign_rot_3", + "y": 180 + }, + "rotation=12": { + "model": "ww_hfas:block/azalea_sign_rot_0", + "y": 270 + }, + "rotation=13": { + "model": "ww_hfas:block/azalea_sign_rot_1", + "y": 270 + }, + "rotation=14": { + "model": "ww_hfas:block/azalea_sign_rot_2", + "y": 270 + }, + "rotation=15": { + "model": "ww_hfas:block/azalea_sign_rot_3", + "y": 270 + }, + "rotation=2": { + "model": "ww_hfas:block/azalea_sign_rot_2" + }, + "rotation=3": { + "model": "ww_hfas:block/azalea_sign_rot_3" + }, + "rotation=4": { + "model": "ww_hfas:block/azalea_sign_rot_0", + "y": 90 + }, + "rotation=5": { + "model": "ww_hfas:block/azalea_sign_rot_1", + "y": 90 + }, + "rotation=6": { + "model": "ww_hfas:block/azalea_sign_rot_2", + "y": 90 + }, + "rotation=7": { + "model": "ww_hfas:block/azalea_sign_rot_3", + "y": 90 + }, + "rotation=8": { + "model": "ww_hfas:block/azalea_sign_rot_0", + "y": 180 + }, + "rotation=9": { + "model": "ww_hfas:block/azalea_sign_rot_1", + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_slab.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_slab.json new file mode 100644 index 0000000..0a70f39 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "ww_hfas:block/azalea_slab" + }, + "type=double": { + "model": "ww_hfas:block/azalea_planks" + }, + "type=top": { + "model": "ww_hfas:block/azalea_slab_top" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_stairs.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_stairs.json new file mode 100644 index 0000000..47d615b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/azalea_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/azalea_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "ww_hfas:block/azalea_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "ww_hfas:block/azalea_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "ww_hfas:block/azalea_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "ww_hfas:block/azalea_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/azalea_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/azalea_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "ww_hfas:block/azalea_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "ww_hfas:block/azalea_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "ww_hfas:block/azalea_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "ww_hfas:block/azalea_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "ww_hfas:block/azalea_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "ww_hfas:block/azalea_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_trapdoor.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_trapdoor.json new file mode 100644 index 0000000..77e04b6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "ww_hfas:block/azalea_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "ww_hfas:block/azalea_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "ww_hfas:block/azalea_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "ww_hfas:block/azalea_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "ww_hfas:block/azalea_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "ww_hfas:block/azalea_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "ww_hfas:block/azalea_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "ww_hfas:block/azalea_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "ww_hfas:block/azalea_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "ww_hfas:block/azalea_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "ww_hfas:block/azalea_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "ww_hfas:block/azalea_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "ww_hfas:block/azalea_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "ww_hfas:block/azalea_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "ww_hfas:block/azalea_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "ww_hfas:block/azalea_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_hanging_sign.json new file mode 100644 index 0000000..096969a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "ww_hfas:block/azalea_wall_hanging_sign", + "y": 270 + }, + "facing=north": { + "model": "ww_hfas:block/azalea_wall_hanging_sign", + "y": 180 + }, + "facing=south": { + "model": "ww_hfas:block/azalea_wall_hanging_sign" + }, + "facing=west": { + "model": "ww_hfas:block/azalea_wall_hanging_sign", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_sign.json new file mode 100644 index 0000000..0a82a3e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "ww_hfas:block/azalea_wall_sign", + "y": 270 + }, + "facing=north": { + "model": "ww_hfas:block/azalea_wall_sign", + "y": 180 + }, + "facing=south": { + "model": "ww_hfas:block/azalea_wall_sign" + }, + "facing=west": { + "model": "ww_hfas:block/azalea_wall_sign", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wood.json new file mode 100644 index 0000000..9afc39e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/azalea_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/azalea_wood" + }, + "axis=z": { + "model": "ww_hfas:block/azalea_wood", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_button.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_button.json new file mode 100644 index 0000000..296fbc8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_button.json @@ -0,0 +1,118 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": { + "model": "ww_hfas:block/blaze_button", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false": { + "model": "ww_hfas:block/blaze_button", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false": { + "model": "ww_hfas:block/blaze_button", + "x": 180 + }, + "face=ceiling,facing=south,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "x": 180 + }, + "face=ceiling,facing=west,powered=false": { + "model": "ww_hfas:block/blaze_button", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "x": 180, + "y": 90 + }, + "face=floor,facing=east,powered=false": { + "model": "ww_hfas:block/blaze_button", + "y": 90 + }, + "face=floor,facing=east,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "y": 90 + }, + "face=floor,facing=north,powered=false": { + "model": "ww_hfas:block/blaze_button" + }, + "face=floor,facing=north,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed" + }, + "face=floor,facing=south,powered=false": { + "model": "ww_hfas:block/blaze_button", + "y": 180 + }, + "face=floor,facing=south,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "y": 180 + }, + "face=floor,facing=west,powered=false": { + "model": "ww_hfas:block/blaze_button", + "y": 270 + }, + "face=floor,facing=west,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "y": 270 + }, + "face=wall,facing=east,powered=false": { + "model": "ww_hfas:block/blaze_button", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false": { + "model": "ww_hfas:block/blaze_button", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=north,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=south,powered=false": { + "model": "ww_hfas:block/blaze_button", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false": { + "model": "ww_hfas:block/blaze_button", + "uvlock": true, + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true": { + "model": "ww_hfas:block/blaze_button_pressed", + "uvlock": true, + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_door.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_door.json new file mode 100644 index 0000000..9092f32 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/blaze_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/blaze_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/blaze_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/blaze_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/blaze_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/blaze_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/blaze_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/blaze_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/blaze_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/blaze_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/blaze_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/blaze_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/blaze_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/blaze_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/blaze_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/blaze_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/blaze_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/blaze_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/blaze_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/blaze_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/blaze_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/blaze_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/blaze_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/blaze_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/blaze_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/blaze_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/blaze_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/blaze_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/blaze_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/blaze_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/blaze_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/blaze_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence.json new file mode 100644 index 0000000..ab441f0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence.json @@ -0,0 +1,48 @@ +{ + "multipart": [ + { + "apply": { + "model": "ww_hfas:block/blaze_fence_post" + } + }, + { + "apply": { + "model": "ww_hfas:block/blaze_fence_side", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "ww_hfas:block/blaze_fence_side", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "ww_hfas:block/blaze_fence_side", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "ww_hfas:block/blaze_fence_side", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence_gate.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence_gate.json new file mode 100644 index 0000000..efe2183 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence_gate.json @@ -0,0 +1,80 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": { + "model": "ww_hfas:block/blaze_fence_gate", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=false,open=true": { + "model": "ww_hfas:block/blaze_fence_gate_open", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=true,open=false": { + "model": "ww_hfas:block/blaze_fence_gate_wall", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=true,open=true": { + "model": "ww_hfas:block/blaze_fence_gate_wall_open", + "uvlock": true, + "y": 270 + }, + "facing=north,in_wall=false,open=false": { + "model": "ww_hfas:block/blaze_fence_gate", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=false,open=true": { + "model": "ww_hfas:block/blaze_fence_gate_open", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=true,open=false": { + "model": "ww_hfas:block/blaze_fence_gate_wall", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=true,open=true": { + "model": "ww_hfas:block/blaze_fence_gate_wall_open", + "uvlock": true, + "y": 180 + }, + "facing=south,in_wall=false,open=false": { + "model": "ww_hfas:block/blaze_fence_gate", + "uvlock": true + }, + "facing=south,in_wall=false,open=true": { + "model": "ww_hfas:block/blaze_fence_gate_open", + "uvlock": true + }, + "facing=south,in_wall=true,open=false": { + "model": "ww_hfas:block/blaze_fence_gate_wall", + "uvlock": true + }, + "facing=south,in_wall=true,open=true": { + "model": "ww_hfas:block/blaze_fence_gate_wall_open", + "uvlock": true + }, + "facing=west,in_wall=false,open=false": { + "model": "ww_hfas:block/blaze_fence_gate", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=false,open=true": { + "model": "ww_hfas:block/blaze_fence_gate_open", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=true,open=false": { + "model": "ww_hfas:block/blaze_fence_gate_wall", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=true,open=true": { + "model": "ww_hfas:block/blaze_fence_gate_wall_open", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_hanging_sign.json new file mode 100644 index 0000000..7838ce6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_hanging_sign.json @@ -0,0 +1,124 @@ +{ + "variants": { + "attached=false,rotation=0": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_0" + }, + "attached=false,rotation=1": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_1" + }, + "attached=false,rotation=10": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_2", + "y": 180 + }, + "attached=false,rotation=11": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_3", + "y": 180 + }, + "attached=false,rotation=12": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_0", + "y": 270 + }, + "attached=false,rotation=13": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_1", + "y": 270 + }, + "attached=false,rotation=14": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_2", + "y": 270 + }, + "attached=false,rotation=15": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_3", + "y": 270 + }, + "attached=false,rotation=2": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_2" + }, + "attached=false,rotation=3": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_3" + }, + "attached=false,rotation=4": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_0", + "y": 90 + }, + "attached=false,rotation=5": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_1", + "y": 90 + }, + "attached=false,rotation=6": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_2", + "y": 90 + }, + "attached=false,rotation=7": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_3", + "y": 90 + }, + "attached=false,rotation=8": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_0", + "y": 180 + }, + "attached=false,rotation=9": { + "model": "ww_hfas:block/blaze_hanging_sign_rot_1", + "y": 180 + }, + "attached=true,rotation=0": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_0" + }, + "attached=true,rotation=1": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_1" + }, + "attached=true,rotation=10": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_2", + "y": 180 + }, + "attached=true,rotation=11": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_3", + "y": 180 + }, + "attached=true,rotation=12": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_0", + "y": 270 + }, + "attached=true,rotation=13": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_1", + "y": 270 + }, + "attached=true,rotation=14": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_2", + "y": 270 + }, + "attached=true,rotation=15": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_3", + "y": 270 + }, + "attached=true,rotation=2": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_2" + }, + "attached=true,rotation=3": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_3" + }, + "attached=true,rotation=4": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_0", + "y": 90 + }, + "attached=true,rotation=5": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_1", + "y": 90 + }, + "attached=true,rotation=6": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_2", + "y": 90 + }, + "attached=true,rotation=7": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_3", + "y": 90 + }, + "attached=true,rotation=8": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_0", + "y": 180 + }, + "attached=true,rotation=9": { + "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_1", + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_leaves.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_leaves.json new file mode 100644 index 0000000..c08f648 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/blaze_leaves" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_log.json new file mode 100644 index 0000000..f098e76 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/blaze_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/blaze_log" + }, + "axis=z": { + "model": "ww_hfas:block/blaze_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_planks.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_planks.json new file mode 100644 index 0000000..d4467a3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_planks.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/blaze_planks" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_pressure_plate.json new file mode 100644 index 0000000..16d2853 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_pressure_plate.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "ww_hfas:block/blaze_pressure_plate" + }, + "powered=true": { + "model": "ww_hfas:block/blaze_pressure_plate_down" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sapling.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sapling.json new file mode 100644 index 0000000..fc98d7d --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/blaze_sapling" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sign.json new file mode 100644 index 0000000..1810e9a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sign.json @@ -0,0 +1,64 @@ +{ + "variants": { + "rotation=0": { + "model": "ww_hfas:block/blaze_sign_rot_0" + }, + "rotation=1": { + "model": "ww_hfas:block/blaze_sign_rot_1" + }, + "rotation=10": { + "model": "ww_hfas:block/blaze_sign_rot_2", + "y": 180 + }, + "rotation=11": { + "model": "ww_hfas:block/blaze_sign_rot_3", + "y": 180 + }, + "rotation=12": { + "model": "ww_hfas:block/blaze_sign_rot_0", + "y": 270 + }, + "rotation=13": { + "model": "ww_hfas:block/blaze_sign_rot_1", + "y": 270 + }, + "rotation=14": { + "model": "ww_hfas:block/blaze_sign_rot_2", + "y": 270 + }, + "rotation=15": { + "model": "ww_hfas:block/blaze_sign_rot_3", + "y": 270 + }, + "rotation=2": { + "model": "ww_hfas:block/blaze_sign_rot_2" + }, + "rotation=3": { + "model": "ww_hfas:block/blaze_sign_rot_3" + }, + "rotation=4": { + "model": "ww_hfas:block/blaze_sign_rot_0", + "y": 90 + }, + "rotation=5": { + "model": "ww_hfas:block/blaze_sign_rot_1", + "y": 90 + }, + "rotation=6": { + "model": "ww_hfas:block/blaze_sign_rot_2", + "y": 90 + }, + "rotation=7": { + "model": "ww_hfas:block/blaze_sign_rot_3", + "y": 90 + }, + "rotation=8": { + "model": "ww_hfas:block/blaze_sign_rot_0", + "y": 180 + }, + "rotation=9": { + "model": "ww_hfas:block/blaze_sign_rot_1", + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_slab.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_slab.json new file mode 100644 index 0000000..3f9f5a7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "ww_hfas:block/blaze_slab" + }, + "type=double": { + "model": "ww_hfas:block/blaze_planks" + }, + "type=top": { + "model": "ww_hfas:block/blaze_slab_top" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_stairs.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_stairs.json new file mode 100644 index 0000000..3874ab4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/blaze_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/blaze_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "ww_hfas:block/blaze_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "ww_hfas:block/blaze_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "ww_hfas:block/blaze_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "ww_hfas:block/blaze_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/blaze_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/blaze_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "ww_hfas:block/blaze_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "ww_hfas:block/blaze_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "ww_hfas:block/blaze_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "ww_hfas:block/blaze_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "ww_hfas:block/blaze_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "ww_hfas:block/blaze_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_trapdoor.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_trapdoor.json new file mode 100644 index 0000000..f7fa982 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "ww_hfas:block/blaze_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "ww_hfas:block/blaze_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "ww_hfas:block/blaze_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "ww_hfas:block/blaze_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "ww_hfas:block/blaze_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "ww_hfas:block/blaze_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "ww_hfas:block/blaze_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "ww_hfas:block/blaze_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "ww_hfas:block/blaze_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "ww_hfas:block/blaze_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "ww_hfas:block/blaze_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "ww_hfas:block/blaze_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "ww_hfas:block/blaze_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "ww_hfas:block/blaze_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "ww_hfas:block/blaze_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "ww_hfas:block/blaze_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_hanging_sign.json new file mode 100644 index 0000000..2c625f8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "ww_hfas:block/blaze_wall_hanging_sign", + "y": 270 + }, + "facing=north": { + "model": "ww_hfas:block/blaze_wall_hanging_sign", + "y": 180 + }, + "facing=south": { + "model": "ww_hfas:block/blaze_wall_hanging_sign" + }, + "facing=west": { + "model": "ww_hfas:block/blaze_wall_hanging_sign", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_sign.json new file mode 100644 index 0000000..575e827 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "ww_hfas:block/blaze_wall_sign", + "y": 270 + }, + "facing=north": { + "model": "ww_hfas:block/blaze_wall_sign", + "y": 180 + }, + "facing=south": { + "model": "ww_hfas:block/blaze_wall_sign" + }, + "facing=west": { + "model": "ww_hfas:block/blaze_wall_sign", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wood.json new file mode 100644 index 0000000..426d363 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/blaze_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/blaze_wood" + }, + "axis=z": { + "model": "ww_hfas:block/blaze_wood", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/fletching_table.json b/src/hfas/resources/assets/ww_hfas/blockstates/fletching_table.json new file mode 100644 index 0000000..57bec1b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/fletching_table.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/fletching_table" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/kiln.json b/src/hfas/resources/assets/ww_hfas/blockstates/kiln.json new file mode 100644 index 0000000..9c31d91 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/kiln.json @@ -0,0 +1,34 @@ +{ + "variants": { + "facing=east,lit=false": { + "model": "minecraft:block/furnace", + "y": 90 + }, + "facing=east,lit=true": { + "model": "minecraft:block/furnace_on", + "y": 90 + }, + "facing=north,lit=false": { + "model": "minecraft:block/furnace" + }, + "facing=north,lit=true": { + "model": "minecraft:block/furnace_on" + }, + "facing=south,lit=false": { + "model": "minecraft:block/furnace", + "y": 180 + }, + "facing=south,lit=true": { + "model": "minecraft:block/furnace_on", + "y": 180 + }, + "facing=west,lit=false": { + "model": "minecraft:block/furnace", + "y": 270 + }, + "facing=west,lit=true": { + "model": "minecraft:block/furnace_on", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/potted_blaze_sapling.json b/src/hfas/resources/assets/ww_hfas/blockstates/potted_blaze_sapling.json new file mode 100644 index 0000000..93cd762 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/potted_blaze_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/potted_blaze_sapling" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/potted_soul_sapling.json b/src/hfas/resources/assets/ww_hfas/blockstates/potted_soul_sapling.json new file mode 100644 index 0000000..9758a01 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/potted_soul_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/potted_soul_sapling" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_dirt.json b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_dirt.json new file mode 100644 index 0000000..ebc4431 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_dirt.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/scorched_dirt" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass.json b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass.json new file mode 100644 index 0000000..b8d0ce6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/scorched_grass" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass_block.json b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass_block.json new file mode 100644 index 0000000..88f605f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/scorched_grass_block" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_twig.json b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_twig.json new file mode 100644 index 0000000..8aa3f44 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_twig.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/scorched_twig" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_button.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_button.json new file mode 100644 index 0000000..00586c3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_button.json @@ -0,0 +1,118 @@ +{ + "variants": { + "face=ceiling,facing=east,powered=false": { + "model": "ww_hfas:block/soul_button", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=east,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "x": 180, + "y": 270 + }, + "face=ceiling,facing=north,powered=false": { + "model": "ww_hfas:block/soul_button", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=north,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "x": 180, + "y": 180 + }, + "face=ceiling,facing=south,powered=false": { + "model": "ww_hfas:block/soul_button", + "x": 180 + }, + "face=ceiling,facing=south,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "x": 180 + }, + "face=ceiling,facing=west,powered=false": { + "model": "ww_hfas:block/soul_button", + "x": 180, + "y": 90 + }, + "face=ceiling,facing=west,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "x": 180, + "y": 90 + }, + "face=floor,facing=east,powered=false": { + "model": "ww_hfas:block/soul_button", + "y": 90 + }, + "face=floor,facing=east,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "y": 90 + }, + "face=floor,facing=north,powered=false": { + "model": "ww_hfas:block/soul_button" + }, + "face=floor,facing=north,powered=true": { + "model": "ww_hfas:block/soul_button_pressed" + }, + "face=floor,facing=south,powered=false": { + "model": "ww_hfas:block/soul_button", + "y": 180 + }, + "face=floor,facing=south,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "y": 180 + }, + "face=floor,facing=west,powered=false": { + "model": "ww_hfas:block/soul_button", + "y": 270 + }, + "face=floor,facing=west,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "y": 270 + }, + "face=wall,facing=east,powered=false": { + "model": "ww_hfas:block/soul_button", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=east,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "uvlock": true, + "x": 90, + "y": 90 + }, + "face=wall,facing=north,powered=false": { + "model": "ww_hfas:block/soul_button", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=north,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "uvlock": true, + "x": 90 + }, + "face=wall,facing=south,powered=false": { + "model": "ww_hfas:block/soul_button", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=south,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "uvlock": true, + "x": 90, + "y": 180 + }, + "face=wall,facing=west,powered=false": { + "model": "ww_hfas:block/soul_button", + "uvlock": true, + "x": 90, + "y": 270 + }, + "face=wall,facing=west,powered=true": { + "model": "ww_hfas:block/soul_button_pressed", + "uvlock": true, + "x": 90, + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_door.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_door.json new file mode 100644 index 0000000..ad6f45f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_door.json @@ -0,0 +1,124 @@ +{ + "variants": { + "facing=east,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/soul_door_bottom_left" + }, + "facing=east,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/soul_door_bottom_left_open", + "y": 90 + }, + "facing=east,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/soul_door_bottom_right" + }, + "facing=east,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/soul_door_bottom_right_open", + "y": 270 + }, + "facing=east,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/soul_door_top_left" + }, + "facing=east,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/soul_door_top_left_open", + "y": 90 + }, + "facing=east,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/soul_door_top_right" + }, + "facing=east,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/soul_door_top_right_open", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/soul_door_bottom_left", + "y": 270 + }, + "facing=north,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/soul_door_bottom_left_open" + }, + "facing=north,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/soul_door_bottom_right", + "y": 270 + }, + "facing=north,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/soul_door_bottom_right_open", + "y": 180 + }, + "facing=north,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/soul_door_top_left", + "y": 270 + }, + "facing=north,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/soul_door_top_left_open" + }, + "facing=north,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/soul_door_top_right", + "y": 270 + }, + "facing=north,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/soul_door_top_right_open", + "y": 180 + }, + "facing=south,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/soul_door_bottom_left", + "y": 90 + }, + "facing=south,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/soul_door_bottom_left_open", + "y": 180 + }, + "facing=south,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/soul_door_bottom_right", + "y": 90 + }, + "facing=south,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/soul_door_bottom_right_open" + }, + "facing=south,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/soul_door_top_left", + "y": 90 + }, + "facing=south,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/soul_door_top_left_open", + "y": 180 + }, + "facing=south,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/soul_door_top_right", + "y": 90 + }, + "facing=south,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/soul_door_top_right_open" + }, + "facing=west,half=lower,hinge=left,open=false": { + "model": "ww_hfas:block/soul_door_bottom_left", + "y": 180 + }, + "facing=west,half=lower,hinge=left,open=true": { + "model": "ww_hfas:block/soul_door_bottom_left_open", + "y": 270 + }, + "facing=west,half=lower,hinge=right,open=false": { + "model": "ww_hfas:block/soul_door_bottom_right", + "y": 180 + }, + "facing=west,half=lower,hinge=right,open=true": { + "model": "ww_hfas:block/soul_door_bottom_right_open", + "y": 90 + }, + "facing=west,half=upper,hinge=left,open=false": { + "model": "ww_hfas:block/soul_door_top_left", + "y": 180 + }, + "facing=west,half=upper,hinge=left,open=true": { + "model": "ww_hfas:block/soul_door_top_left_open", + "y": 270 + }, + "facing=west,half=upper,hinge=right,open=false": { + "model": "ww_hfas:block/soul_door_top_right", + "y": 180 + }, + "facing=west,half=upper,hinge=right,open=true": { + "model": "ww_hfas:block/soul_door_top_right_open", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence.json new file mode 100644 index 0000000..45c2027 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence.json @@ -0,0 +1,48 @@ +{ + "multipart": [ + { + "apply": { + "model": "ww_hfas:block/soul_fence_post" + } + }, + { + "apply": { + "model": "ww_hfas:block/soul_fence_side", + "uvlock": true + }, + "when": { + "north": "true" + } + }, + { + "apply": { + "model": "ww_hfas:block/soul_fence_side", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true" + } + }, + { + "apply": { + "model": "ww_hfas:block/soul_fence_side", + "uvlock": true, + "y": 180 + }, + "when": { + "south": "true" + } + }, + { + "apply": { + "model": "ww_hfas:block/soul_fence_side", + "uvlock": true, + "y": 270 + }, + "when": { + "west": "true" + } + } + ] +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence_gate.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence_gate.json new file mode 100644 index 0000000..6eee7d9 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence_gate.json @@ -0,0 +1,80 @@ +{ + "variants": { + "facing=east,in_wall=false,open=false": { + "model": "ww_hfas:block/soul_fence_gate", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=false,open=true": { + "model": "ww_hfas:block/soul_fence_gate_open", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=true,open=false": { + "model": "ww_hfas:block/soul_fence_gate_wall", + "uvlock": true, + "y": 270 + }, + "facing=east,in_wall=true,open=true": { + "model": "ww_hfas:block/soul_fence_gate_wall_open", + "uvlock": true, + "y": 270 + }, + "facing=north,in_wall=false,open=false": { + "model": "ww_hfas:block/soul_fence_gate", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=false,open=true": { + "model": "ww_hfas:block/soul_fence_gate_open", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=true,open=false": { + "model": "ww_hfas:block/soul_fence_gate_wall", + "uvlock": true, + "y": 180 + }, + "facing=north,in_wall=true,open=true": { + "model": "ww_hfas:block/soul_fence_gate_wall_open", + "uvlock": true, + "y": 180 + }, + "facing=south,in_wall=false,open=false": { + "model": "ww_hfas:block/soul_fence_gate", + "uvlock": true + }, + "facing=south,in_wall=false,open=true": { + "model": "ww_hfas:block/soul_fence_gate_open", + "uvlock": true + }, + "facing=south,in_wall=true,open=false": { + "model": "ww_hfas:block/soul_fence_gate_wall", + "uvlock": true + }, + "facing=south,in_wall=true,open=true": { + "model": "ww_hfas:block/soul_fence_gate_wall_open", + "uvlock": true + }, + "facing=west,in_wall=false,open=false": { + "model": "ww_hfas:block/soul_fence_gate", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=false,open=true": { + "model": "ww_hfas:block/soul_fence_gate_open", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=true,open=false": { + "model": "ww_hfas:block/soul_fence_gate_wall", + "uvlock": true, + "y": 90 + }, + "facing=west,in_wall=true,open=true": { + "model": "ww_hfas:block/soul_fence_gate_wall_open", + "uvlock": true, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_hanging_sign.json new file mode 100644 index 0000000..df51ca3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_hanging_sign.json @@ -0,0 +1,124 @@ +{ + "variants": { + "attached=false,rotation=0": { + "model": "ww_hfas:block/soul_hanging_sign_rot_0" + }, + "attached=false,rotation=1": { + "model": "ww_hfas:block/soul_hanging_sign_rot_1" + }, + "attached=false,rotation=10": { + "model": "ww_hfas:block/soul_hanging_sign_rot_2", + "y": 180 + }, + "attached=false,rotation=11": { + "model": "ww_hfas:block/soul_hanging_sign_rot_3", + "y": 180 + }, + "attached=false,rotation=12": { + "model": "ww_hfas:block/soul_hanging_sign_rot_0", + "y": 270 + }, + "attached=false,rotation=13": { + "model": "ww_hfas:block/soul_hanging_sign_rot_1", + "y": 270 + }, + "attached=false,rotation=14": { + "model": "ww_hfas:block/soul_hanging_sign_rot_2", + "y": 270 + }, + "attached=false,rotation=15": { + "model": "ww_hfas:block/soul_hanging_sign_rot_3", + "y": 270 + }, + "attached=false,rotation=2": { + "model": "ww_hfas:block/soul_hanging_sign_rot_2" + }, + "attached=false,rotation=3": { + "model": "ww_hfas:block/soul_hanging_sign_rot_3" + }, + "attached=false,rotation=4": { + "model": "ww_hfas:block/soul_hanging_sign_rot_0", + "y": 90 + }, + "attached=false,rotation=5": { + "model": "ww_hfas:block/soul_hanging_sign_rot_1", + "y": 90 + }, + "attached=false,rotation=6": { + "model": "ww_hfas:block/soul_hanging_sign_rot_2", + "y": 90 + }, + "attached=false,rotation=7": { + "model": "ww_hfas:block/soul_hanging_sign_rot_3", + "y": 90 + }, + "attached=false,rotation=8": { + "model": "ww_hfas:block/soul_hanging_sign_rot_0", + "y": 180 + }, + "attached=false,rotation=9": { + "model": "ww_hfas:block/soul_hanging_sign_rot_1", + "y": 180 + }, + "attached=true,rotation=0": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_0" + }, + "attached=true,rotation=1": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_1" + }, + "attached=true,rotation=10": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_2", + "y": 180 + }, + "attached=true,rotation=11": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_3", + "y": 180 + }, + "attached=true,rotation=12": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_0", + "y": 270 + }, + "attached=true,rotation=13": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_1", + "y": 270 + }, + "attached=true,rotation=14": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_2", + "y": 270 + }, + "attached=true,rotation=15": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_3", + "y": 270 + }, + "attached=true,rotation=2": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_2" + }, + "attached=true,rotation=3": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_3" + }, + "attached=true,rotation=4": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_0", + "y": 90 + }, + "attached=true,rotation=5": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_1", + "y": 90 + }, + "attached=true,rotation=6": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_2", + "y": 90 + }, + "attached=true,rotation=7": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_3", + "y": 90 + }, + "attached=true,rotation=8": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_0", + "y": 180 + }, + "attached=true,rotation=9": { + "model": "ww_hfas:block/soul_hanging_sign_attached_rot_1", + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_leaves.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_leaves.json new file mode 100644 index 0000000..81dba78 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/soul_leaves" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_log.json new file mode 100644 index 0000000..7af97ce --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/soul_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/soul_log" + }, + "axis=z": { + "model": "ww_hfas:block/soul_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_planks.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_planks.json new file mode 100644 index 0000000..231d2f8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_planks.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/soul_planks" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_pressure_plate.json new file mode 100644 index 0000000..77a7e47 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_pressure_plate.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "ww_hfas:block/soul_pressure_plate" + }, + "powered=true": { + "model": "ww_hfas:block/soul_pressure_plate_down" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_sapling.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_sapling.json new file mode 100644 index 0000000..e8f258e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/soul_sapling" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_sign.json new file mode 100644 index 0000000..9493438 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_sign.json @@ -0,0 +1,64 @@ +{ + "variants": { + "rotation=0": { + "model": "ww_hfas:block/soul_sign_rot_0" + }, + "rotation=1": { + "model": "ww_hfas:block/soul_sign_rot_1" + }, + "rotation=10": { + "model": "ww_hfas:block/soul_sign_rot_2", + "y": 180 + }, + "rotation=11": { + "model": "ww_hfas:block/soul_sign_rot_3", + "y": 180 + }, + "rotation=12": { + "model": "ww_hfas:block/soul_sign_rot_0", + "y": 270 + }, + "rotation=13": { + "model": "ww_hfas:block/soul_sign_rot_1", + "y": 270 + }, + "rotation=14": { + "model": "ww_hfas:block/soul_sign_rot_2", + "y": 270 + }, + "rotation=15": { + "model": "ww_hfas:block/soul_sign_rot_3", + "y": 270 + }, + "rotation=2": { + "model": "ww_hfas:block/soul_sign_rot_2" + }, + "rotation=3": { + "model": "ww_hfas:block/soul_sign_rot_3" + }, + "rotation=4": { + "model": "ww_hfas:block/soul_sign_rot_0", + "y": 90 + }, + "rotation=5": { + "model": "ww_hfas:block/soul_sign_rot_1", + "y": 90 + }, + "rotation=6": { + "model": "ww_hfas:block/soul_sign_rot_2", + "y": 90 + }, + "rotation=7": { + "model": "ww_hfas:block/soul_sign_rot_3", + "y": 90 + }, + "rotation=8": { + "model": "ww_hfas:block/soul_sign_rot_0", + "y": 180 + }, + "rotation=9": { + "model": "ww_hfas:block/soul_sign_rot_1", + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_slab.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_slab.json new file mode 100644 index 0000000..0b76191 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "ww_hfas:block/soul_slab" + }, + "type=double": { + "model": "ww_hfas:block/soul_planks" + }, + "type=top": { + "model": "ww_hfas:block/soul_slab_top" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_stairs.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_stairs.json new file mode 100644 index 0000000..9a32c7a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/soul_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/soul_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "ww_hfas:block/soul_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "ww_hfas:block/soul_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "ww_hfas:block/soul_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "ww_hfas:block/soul_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/soul_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/soul_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "ww_hfas:block/soul_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "ww_hfas:block/soul_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "ww_hfas:block/soul_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "ww_hfas:block/soul_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "ww_hfas:block/soul_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "ww_hfas:block/soul_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_trapdoor.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_trapdoor.json new file mode 100644 index 0000000..57124ba --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_trapdoor.json @@ -0,0 +1,68 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "ww_hfas:block/soul_trapdoor_bottom", + "y": 90 + }, + "facing=east,half=bottom,open=true": { + "model": "ww_hfas:block/soul_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "ww_hfas:block/soul_trapdoor_top", + "y": 90 + }, + "facing=east,half=top,open=true": { + "model": "ww_hfas:block/soul_trapdoor_open", + "x": 180, + "y": 270 + }, + "facing=north,half=bottom,open=false": { + "model": "ww_hfas:block/soul_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "ww_hfas:block/soul_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "ww_hfas:block/soul_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "ww_hfas:block/soul_trapdoor_open", + "x": 180, + "y": 180 + }, + "facing=south,half=bottom,open=false": { + "model": "ww_hfas:block/soul_trapdoor_bottom", + "y": 180 + }, + "facing=south,half=bottom,open=true": { + "model": "ww_hfas:block/soul_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "ww_hfas:block/soul_trapdoor_top", + "y": 180 + }, + "facing=south,half=top,open=true": { + "model": "ww_hfas:block/soul_trapdoor_open", + "x": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "ww_hfas:block/soul_trapdoor_bottom", + "y": 270 + }, + "facing=west,half=bottom,open=true": { + "model": "ww_hfas:block/soul_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "ww_hfas:block/soul_trapdoor_top", + "y": 270 + }, + "facing=west,half=top,open=true": { + "model": "ww_hfas:block/soul_trapdoor_open", + "x": 180, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_hanging_sign.json new file mode 100644 index 0000000..a46cddd --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "ww_hfas:block/soul_wall_hanging_sign", + "y": 270 + }, + "facing=north": { + "model": "ww_hfas:block/soul_wall_hanging_sign", + "y": 180 + }, + "facing=south": { + "model": "ww_hfas:block/soul_wall_hanging_sign" + }, + "facing=west": { + "model": "ww_hfas:block/soul_wall_hanging_sign", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_sign.json new file mode 100644 index 0000000..01329b6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "ww_hfas:block/soul_wall_sign", + "y": 270 + }, + "facing=north": { + "model": "ww_hfas:block/soul_wall_sign", + "y": 180 + }, + "facing=south": { + "model": "ww_hfas:block/soul_wall_sign" + }, + "facing=west": { + "model": "ww_hfas:block/soul_wall_sign", + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_wood.json new file mode 100644 index 0000000..9738065 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/soul_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/soul_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/soul_wood" + }, + "axis=z": { + "model": "ww_hfas:block/soul_wood", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_log.json new file mode 100644 index 0000000..2a0c472 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/stripped_azalea_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/stripped_azalea_log" + }, + "axis=z": { + "model": "ww_hfas:block/stripped_azalea_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_wood.json new file mode 100644 index 0000000..b62010e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/stripped_azalea_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/stripped_azalea_wood" + }, + "axis=z": { + "model": "ww_hfas:block/stripped_azalea_wood", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_log.json new file mode 100644 index 0000000..04f0e8b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/stripped_blaze_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/stripped_blaze_log" + }, + "axis=z": { + "model": "ww_hfas:block/stripped_blaze_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_wood.json new file mode 100644 index 0000000..e9182fb --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/stripped_blaze_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/stripped_blaze_wood" + }, + "axis=z": { + "model": "ww_hfas:block/stripped_blaze_wood", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_log.json new file mode 100644 index 0000000..a640e5d --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/stripped_soul_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/stripped_soul_log" + }, + "axis=z": { + "model": "ww_hfas:block/stripped_soul_log_horizontal", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_wood.json new file mode 100644 index 0000000..8af4e7d --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "ww_hfas:block/stripped_soul_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "ww_hfas:block/stripped_soul_wood" + }, + "axis=z": { + "model": "ww_hfas:block/stripped_soul_wood", + "x": 90 + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/tiny_cactus.json b/src/hfas/resources/assets/ww_hfas/blockstates/tiny_cactus.json new file mode 100644 index 0000000..e2e7ed9 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/blockstates/tiny_cactus.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "ww_hfas:block/tiny_cactus" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/mudcrab.animation.json b/src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/mudcrab.animation.json new file mode 100644 index 0000000..92f5c1c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/mudcrab.animation.json @@ -0,0 +1,2470 @@ +{ + "format_version": "1.8.0", + "animations": { + "attack.swing": { + "animation_length": 0.9722, + "bones": { + "root": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-3.0947, 22.2971, -5.11] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-3.0947, 22.2971, -6.11] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [-3.0947, 22.2971, -5.11] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [0, 0.35, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0.35, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [0.9, 1.3, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0.9, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [1, 1.3, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left_1": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-20, 0, 12.5] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [-20, 0, 13.5] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 0, 4] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left_2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [10, 0, 12.5] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [10, 0, 13.5] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 9] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left_3": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [30, 0, 12.5] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [30, 0, 16.5] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 9] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right_1": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 32.5, 13.5] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 32.5, 11.5] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 6] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right_2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 50, 12.5] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [0, 50, 13.5] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 0, 10] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right_3": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 65, 14.5] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 65, 10.5] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [0, 0, 10] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "group2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-15, 0, 2] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [-15, 0, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 0, -0.2] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_claw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [-22.5, -45, 3] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [-55, -45, 11] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [-5, -45, 9] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [-55, -45, 21] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [-5, -45, 27] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [-2, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [1, 1.5, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [1, 1, 1.1] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [1, 1.5, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "group": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [32.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [1, 1, 0.8] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [1, 1, 0.9] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [1, 1, 0.8] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_claw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 80, -17] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 80, -9] + }, + "lerp_mode": "catmullrom" + }, + "0.9167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [-1, 0, 2] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [-1, 0, 2] + }, + "lerp_mode": "catmullrom" + }, + "0.9583": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "move.walk": { + "loop": true, + "animation_length": 0.8333, + "bones": { + "root": { + "rotation": { + "0.0": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0.95, 1.15, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0.95, 1.1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0.95, 1.15, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0.95, 1.1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left_1": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, -22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 45, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 1, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 1, -1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left_2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 1, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left_3": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, -22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 1, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 1, -1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right_1": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 1, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right_2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, -45, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, -45, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 1, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 1, -1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right_3": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, -22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 1, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.7083": { + "post": { + "vector": [0, 0, -1] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "body": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_claw": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [-1, 0, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "group": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_claw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.125": { + "post": { + "vector": [12, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5417": { + "post": { + "vector": [12, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [-1, 0, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [1, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [-1, 0, 1] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "move.swim": { + "loop": true, + "animation_length": 1.25, + "bones": { + "root": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 1.5] + }, + "lerp_mode": "catmullrom" + }, + "0.3646": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, -1.5] + }, + "lerp_mode": "catmullrom" + }, + "0.9896": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 1.5] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3646": { + "post": { + "vector": [0, 0, -0.25] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.3646": { + "post": { + "vector": [1, 1, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "0.4688": { + "post": { + "vector": [1, 1, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.9896": { + "post": { + "vector": [1, 1, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "1.0938": { + "post": { + "vector": [1, 1, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left_1": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, -32.5] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, -22.5] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, -32.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left_2": { + "rotation": { + "0.0": { + "post": { + "vector": [22.5, 0, -22.5] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [30.7897, 4.5055, -34.6787] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [22.5, 0, -22.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left_3": { + "rotation": { + "0.0": { + "post": { + "vector": [90, 67.5, -90] + }, + "lerp_mode": "catmullrom" + }, + "0.3646": { + "post": { + "vector": [90, 22.5, -90] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, -22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9896": { + "post": { + "vector": [90, 22.5, -90] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [90, 67.5, -90] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9896": { + "post": { + "vector": [0, 0, -0.25] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.3646": { + "post": { + "vector": [1, 1, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "0.4688": { + "post": { + "vector": [1, 1, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.9896": { + "post": { + "vector": [1, 1, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "1.0938": { + "post": { + "vector": [1, 1, 1.2] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right_1": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 22.5] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, 32.5] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 22.5] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right_2": { + "rotation": { + "0.0": { + "post": { + "vector": [30.7897, -4.5055, 34.6787] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [22.5, 0, 22.5] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [30.7897, -4.5055, 34.6787] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right_3": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3646": { + "post": { + "vector": [90, -22.5, 90] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [90, -67.5, 90] + }, + "lerp_mode": "catmullrom" + }, + "0.9896": { + "post": { + "vector": [90, -22.5, 90] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 22.5, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "group2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4688": { + "post": { + "vector": [-7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7292": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5208": { + "post": { + "vector": [0, 0, -0.2] + }, + "lerp_mode": "catmullrom" + }, + "0.7292": { + "post": { + "vector": [0, 0, -0.2] + }, + "lerp_mode": "catmullrom" + }, + "0.8854": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_claw": { + "position": { + "0.0": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3646": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9896": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "group": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5729": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7292": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9375": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0938": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.1979": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_claw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3125": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4688": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5729": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6771": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8854": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0417": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.1458": { + "post": { + "vector": [2.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3646": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.9896": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.25": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "misc.idle": { + "loop": true, + "animation_length": 2, + "bones": { + "root": { + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "body": { + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [1, 1.1, 1] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_claw": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_claw": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.5": { + "post": { + "vector": [0, -0.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "2.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "misc.greeting": { + "animation_length": 1.148, + "bones": { + "root": { + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.0833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 0.35, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 0.35, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0.95, 1.15, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0.95, 1.1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_left": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, 15] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 0, 15] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0.75, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 0.75, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "leg_right": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, 2.5] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 0, 2.5] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0.25, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0.25, -0.25, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "body": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 0, -7.5] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 0, -7.5] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2083": { + "post": { + "vector": [0, 1, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 1, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "left_claw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-122.1367, 30.2266, 24.1624] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [-46.5367, 30.2266, 24.1624] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-138.0367, 30.2266, 24.1624] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [-24.5367, 30.2266, 24.1624] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [-0.5, 2, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4583": { + "post": { + "vector": [-1.5, 2, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.625": { + "post": { + "vector": [-0.5, 2, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [-1.5, 2, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "right_claw": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [0, 70, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [0, 70, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [-1, -1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [-1, -1, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.25": { + "post": { + "vector": [1, 1.1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.375": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.75": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.875": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "misc.hurt": { + "animation_length": 0.2917, + "bones": { + "root": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [-6.9348, -2.8631, -22.3264] + }, + "0.2917": { + "vector": [0, 0, 0] + } + } + }, + "body": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0417": { + "vector": [-2.06102, 0, -1.28814] + }, + "0.0833": { + "vector": [-17.93898, 0, -11.21186] + }, + "0.125": { + "vector": [-20, 0, -12.5] + }, + "0.1667": { + "vector": [-18.37805, 0, -11.48628] + }, + "0.25": { + "vector": [-1.62226, 0, -1.01391] + }, + "0.2917": { + "vector": [0, 0, 0] + } + } + }, + "left_claw": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [-26.7547, -39.7725, 3.2975] + }, + "0.2917": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [0, 1, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + } + } + }, + "right_claw": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [-36.0906, 55.8905, -27.8742] + }, + "0.2917": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [-0.25, 1, 0] + }, + "0.2917": { + "vector": [0, 0, 0] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/piranha.animation.json b/src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/piranha.animation.json new file mode 100644 index 0000000..dd49dc8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/piranha.animation.json @@ -0,0 +1,415 @@ +{ + "format_version": "1.8.0", + "animations": { + "move.swim": { + "loop": true, + "animation_length": 1, + "bones": { + "mouth": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.4167": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [7.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5833": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "tail": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 32.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -32.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 32.5, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "bone2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 12.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, -9, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -12.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.8333": { + "post": { + "vector": [0, 9, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, 12.5, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "root": { + "rotation": { + "0.0": { + "post": { + "vector": [0, -5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 5, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [0, -5, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [-0.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0.5, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [-0.5, 0, 0] + }, + "lerp_mode": "catmullrom" + } + }, + "scale": { + "0.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.2917": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + }, + "0.7917": { + "post": { + "vector": [1, 0.9, 1] + }, + "lerp_mode": "catmullrom" + }, + "1.0": { + "post": { + "vector": [1, 1, 1] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "misc.idle": { + "loop": true, + "animation_length": 0.6667, + "bones": { + "root": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 90] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, 10, 90] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, -50, 90] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, 12.5, 90] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, 90] + }, + "lerp_mode": "catmullrom" + } + }, + "position": { + "0.0": { + "post": { + "vector": [0, -2, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, -2, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 3, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -2, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, -2, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "tail": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, -15, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 37.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -35, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + }, + "bone2": { + "rotation": { + "0.0": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.1667": { + "post": { + "vector": [0, -5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.3333": { + "post": { + "vector": [0, 35, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.5": { + "post": { + "vector": [0, -22.5, 0] + }, + "lerp_mode": "catmullrom" + }, + "0.6667": { + "post": { + "vector": [0, 0, 0] + }, + "lerp_mode": "catmullrom" + } + } + } + } + }, + "attack.swing": { + "animation_length": 0.375, + "bones": { + "root": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [-15, 0, 0] + }, + "0.25": { + "vector": [0, 0, 0] + }, + "0.375": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [0, 0, 1] + }, + "0.25": { + "vector": [0, 0, -2] + }, + "0.375": { + "vector": [0, 0, 0] + } + } + }, + "mouth": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [25, 0, 0] + }, + "0.25": { + "vector": [-10, 0, 0] + }, + "0.375": { + "vector": [0, 0, 0] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.125": { + "vector": [0, -1, 0.75] + }, + "0.25": { + "vector": [0, 0, 0] + } + } + }, + "bone2": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [0, 15, 0] + }, + "0.1667": { + "vector": [0, -15, 0] + }, + "0.25": { + "vector": [0, 15, 0] + }, + "0.375": { + "vector": [0, 0, 0] + } + } + }, + "tail": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.0833": { + "vector": [0, 15, 0] + }, + "0.1667": { + "vector": [0, -15, 0] + }, + "0.25": { + "vector": [0, 15, 0] + }, + "0.375": { + "vector": [0, 0, 0] + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/geckolib/models/entity/mudcrab.geo.json b/src/hfas/resources/assets/ww_hfas/geckolib/models/entity/mudcrab.geo.json new file mode 100644 index 0000000..a399fe8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/geckolib/models/entity/mudcrab.geo.json @@ -0,0 +1,128 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 64, + "texture_height": 64, + "visible_bounds_width": 3, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "root", + "pivot": [0, 0, 0] + }, + { + "name": "leg_left", + "parent": "root", + "pivot": [4.53553, 3.48959, 1.5] + }, + { + "name": "leg_left_1", + "parent": "leg_left", + "pivot": [4.53553, 3.48959, -0.5], + "cubes": [ + {"origin": [4.51041, 3.48959, -1], "size": [5, 0, 1], "pivot": [4.53553, 3.48959, -0.5], "rotation": [0, 0, 45], "uv": [12, 25]} + ] + }, + { + "name": "leg_left_2", + "parent": "leg_left", + "pivot": [4.53553, 3.48959, 1.5], + "rotation": [0, -45, 0], + "cubes": [ + {"origin": [4.51041, 3.48959, 1], "size": [5, 0, 1], "pivot": [4.53553, 3.48959, 1.5], "rotation": [0, 0, 45], "uv": [12, 26]} + ] + }, + { + "name": "leg_left_3", + "parent": "leg_left", + "pivot": [4.53553, 3.48959, 3.5], + "rotation": [0, -67.5, 0], + "cubes": [ + {"origin": [4.51041, 3.48959, 3], "size": [5, 0, 1], "pivot": [4.53553, 3.48959, 3.5], "rotation": [0, 0, 45], "uv": [12, 27]} + ] + }, + { + "name": "leg_right", + "parent": "root", + "pivot": [-4.53553, 3.48959, 1.5] + }, + { + "name": "leg_right_1", + "parent": "leg_right", + "pivot": [-4.53553, 3.48959, -0.5], + "cubes": [ + {"origin": [-9.51041, 3.48959, -1], "size": [5, 0, 1], "pivot": [-4.53553, 3.48959, -0.5], "rotation": [0, 0, -45], "uv": [12, 28]} + ] + }, + { + "name": "leg_right_2", + "parent": "leg_right", + "pivot": [-4.53553, 3.48959, 1.5], + "rotation": [0, 45, 0], + "cubes": [ + {"origin": [-9.51041, 3.48959, 1], "size": [5, 0, 1], "pivot": [-4.53553, 3.48959, 1.5], "rotation": [0, 0, -45], "uv": [12, 29]} + ] + }, + { + "name": "leg_right_3", + "parent": "leg_right", + "pivot": [-4.53553, 3.48959, 3.5], + "rotation": [0, 67.5, 0], + "cubes": [ + {"origin": [-9.51041, 3.48959, 3], "size": [5, 0, 1], "pivot": [-4.53553, 3.48959, 3.5], "rotation": [0, 0, -45], "uv": [24, 29]} + ] + }, + { + "name": "body", + "parent": "root", + "pivot": [0, 4.2698, -0.25], + "rotation": [-5, 0, 0], + "cubes": [ + {"origin": [-4.5, 2.4, -4], "size": [9, 4, 8], "uv": [0, 0]}, + {"origin": [-3.5, 6.4, -4], "size": [1, 1, 0], "uv": [12, 30]}, + {"origin": [2.5, 6.4, -4], "size": [1, 1, 0], "uv": [14, 30]} + ] + }, + { + "name": "group2", + "parent": "body", + "pivot": [0, 4.2698, -0.25], + "cubes": [ + {"origin": [-1.5, 1.34913, -4.53173], "size": [3, 4, 3], "pivot": [0, 4.2698, -0.25], "rotation": [-22.5, 0, 0], "uv": [0, 25]} + ] + }, + { + "name": "left_claw", + "parent": "body", + "pivot": [7.25, 4.15, -3.25], + "rotation": [16.16654, 29.51927, 8.25435], + "cubes": [ + {"origin": [5.02812, 2.65, -10.50907], "size": [4, 5, 8], "uv": [0, 12]} + ] + }, + { + "name": "group", + "parent": "left_claw", + "pivot": [7.25, 3.15, -3.25], + "cubes": [ + {"origin": [5.01812, 1.66, -10.49907], "size": [4, 2, 8], "uv": [24, 12]} + ] + }, + { + "name": "right_claw", + "parent": "body", + "pivot": [-5.5, 2.9, -3.5], + "rotation": [0, -40, 0], + "cubes": [ + {"origin": [-7, 1.4, -6.58579], "size": [3, 3, 4], "uv": [24, 22]} + ] + } + ] + } + ] +} diff --git a/src/hfas/resources/assets/ww_hfas/geckolib/models/entity/piranha.geo.json b/src/hfas/resources/assets/ww_hfas/geckolib/models/entity/piranha.geo.json new file mode 100644 index 0000000..a562bad --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/geckolib/models/entity/piranha.geo.json @@ -0,0 +1,175 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 32, + "texture_height": 32, + "visible_bounds_width": 2, + "visible_bounds_height": 1.5, + "visible_bounds_offset": [0, 0.25, 0] + }, + "bones": [ + { + "name": "root", + "pivot": [0, 3, 0] + }, + { + "name": "bone", + "parent": "root", + "pivot": [-0.25, 3, -1], + "cubes": [ + { + "origin": [-1, 2, -4], + "size": [2, 4, 3], + "uv": { + "north": {"uv": [6, 18], "uv_size": [2, 4]}, + "east": {"uv": [4, 0], "uv_size": [3, 4]}, + "south": {"uv": [18, 6], "uv_size": [2, 4]}, + "west": {"uv": [0, 5], "uv_size": [3, 4]}, + "up": {"uv": [0, 14], "uv_size": [2, 3]}, + "down": {"uv": [3, 17], "uv_size": [2, -3]} + } + }, + { + "origin": [-1, 0, -2], + "size": [2, 2, 1], + "uv": { + "north": {"uv": [12, 18], "uv_size": [2, 2]}, + "east": {"uv": [20, 14], "uv_size": [1, 2]}, + "south": {"uv": [20, 0], "uv_size": [2, 2]}, + "west": {"uv": [16, 17], "uv_size": [1, 2]}, + "up": {"uv": [0, 22], "uv_size": [2, 1]}, + "down": {"uv": [3, 23], "uv_size": [2, -1]} + } + }, + { + "origin": [-0.75, 1, -3.5], + "size": [0, 1, 1], + "uv": { + "east": {"uv": [0, 24], "uv_size": [1, 1]} + } + }, + { + "origin": [0.75, 1, -3.5], + "size": [0, 1, 1], + "uv": { + "west": {"uv": [1, 24], "uv_size": [-1, 1]} + } + } + ] + }, + { + "name": "mouth", + "parent": "bone", + "pivot": [0, 1.5, -2], + "cubes": [ + { + "origin": [-0.5, 0, -4], + "size": [1, 2, 2], + "uv": { + "north": {"uv": [6, 10], "uv_size": [1, 2]}, + "east": {"uv": [9, 18], "uv_size": [2, 2]}, + "south": {"uv": [20, 3], "uv_size": [1, 2]}, + "west": {"uv": [18, 11], "uv_size": [2, 2]}, + "up": {"uv": [15, 20], "uv_size": [1, 2]}, + "down": {"uv": [17, 22], "uv_size": [1, -2]} + } + } + ] + }, + { + "name": "bone2", + "parent": "root", + "pivot": [0, 3, -1], + "cubes": [ + { + "origin": [0, 6, -2], + "size": [0, 2, 6], + "uv": { + "north": {"uv": [10, 21], "uv_size": [0, 2]}, + "east": {"uv": [13, 0], "uv_size": [6, 2]}, + "south": {"uv": [11, 21], "uv_size": [0, 2]}, + "west": {"uv": [13, 3], "uv_size": [6, 2]}, + "up": {"uv": [12, 21], "uv_size": [0, 6]}, + "down": {"uv": [13, 27], "uv_size": [0, -6]} + } + }, + { + "origin": [-1, 2, -1], + "size": [2, 4, 4], + "uv": { + "north": {"uv": [6, 18], "uv_size": [2, 4]}, + "east": {"uv": [0, 0], "uv_size": [4, 4]}, + "south": {"uv": [18, 6], "uv_size": [2, 4]}, + "west": {"uv": [3, 5], "uv_size": [4, 4]}, + "up": {"uv": [0, 10], "uv_size": [2, 4]}, + "down": {"uv": [3, 14], "uv_size": [2, -4]} + } + }, + { + "origin": [-1, 0, -1], + "size": [0, 3, 4], + "pivot": [-1, 2, -1], + "rotation": [0, -15, 0], + "uv": { + "north": {"uv": [22, 13], "uv_size": [0, 3]}, + "east": {"uv": [6, 14], "uv_size": [4, 3]}, + "south": {"uv": [22, 17], "uv_size": [0, 3]}, + "west": {"uv": [11, 14], "uv_size": [4, 3]}, + "up": {"uv": [22, 21], "uv_size": [0, 4]}, + "down": {"uv": [23, 4], "uv_size": [0, -4]} + } + }, + { + "origin": [-1, 0, -1], + "size": [2, 2, 4], + "uv": { + "north": {"uv": [12, 18], "uv_size": [2, 2]}, + "east": {"uv": [16, 14], "uv_size": [4, 2]}, + "south": {"uv": [20, 0], "uv_size": [2, 2]}, + "west": {"uv": [17, 17], "uv_size": [4, 2]}, + "up": {"uv": [0, 18], "uv_size": [2, 4]}, + "down": {"uv": [3, 22], "uv_size": [2, -4]} + } + }, + { + "origin": [1, 0, -1], + "size": [0, 3, 4], + "pivot": [1, 2, -1], + "rotation": [0, 15, 0], + "uv": { + "north": {"uv": [14, 21], "uv_size": [0, 3]}, + "east": {"uv": [13, 6], "uv_size": [4, 3]}, + "south": {"uv": [21, 20], "uv_size": [0, 3]}, + "west": {"uv": [13, 10], "uv_size": [4, 3]}, + "up": {"uv": [22, 3], "uv_size": [0, 4]}, + "down": {"uv": [22, 12], "uv_size": [0, -4]} + } + } + ] + }, + { + "name": "tail", + "parent": "bone2", + "pivot": [0, 3, 3], + "cubes": [ + { + "origin": [0, 0, 3], + "size": [0, 6, 4], + "uv": { + "north": {"uv": [19, 20], "uv_size": [0, 6]}, + "east": {"uv": [8, 0], "uv_size": [4, 6]}, + "south": {"uv": [20, 20], "uv_size": [0, 6]}, + "west": {"uv": [8, 7], "uv_size": [4, 6]}, + "up": {"uv": [21, 6], "uv_size": [0, 4]}, + "down": {"uv": [9, 25], "uv_size": [0, -4]} + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_boat.json b/src/hfas/resources/assets/ww_hfas/items/azalea_boat.json new file mode 100644 index 0000000..5f09a27 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/azalea_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_button.json b/src/hfas/resources/assets/ww_hfas/items/azalea_button.json new file mode 100644 index 0000000..f3f2a60 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_button_inventory" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_chest_boat.json b/src/hfas/resources/assets/ww_hfas/items/azalea_chest_boat.json new file mode 100644 index 0000000..6a78e74 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/azalea_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_door.json b/src/hfas/resources/assets/ww_hfas/items/azalea_door.json new file mode 100644 index 0000000..55b63a4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/azalea_door" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_fence.json b/src/hfas/resources/assets/ww_hfas/items/azalea_fence.json new file mode 100644 index 0000000..1dce673 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_fence_inventory" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_fence_gate.json b/src/hfas/resources/assets/ww_hfas/items/azalea_fence_gate.json new file mode 100644 index 0000000..7e5582c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_fence_gate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/items/azalea_hanging_sign.json new file mode 100644 index 0000000..d09691e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/azalea_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_log.json b/src/hfas/resources/assets/ww_hfas/items/azalea_log.json new file mode 100644 index 0000000..4ca420c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_planks.json b/src/hfas/resources/assets/ww_hfas/items/azalea_planks.json new file mode 100644 index 0000000..233fb23 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/items/azalea_pressure_plate.json new file mode 100644 index 0000000..5f9d223 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_pressure_plate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_shelf.json b/src/hfas/resources/assets/ww_hfas/items/azalea_shelf.json new file mode 100644 index 0000000..452fca8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_shelf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_shelf_inventory" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_sign.json b/src/hfas/resources/assets/ww_hfas/items/azalea_sign.json new file mode 100644 index 0000000..a8316e2 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/azalea_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_slab.json b/src/hfas/resources/assets/ww_hfas/items/azalea_slab.json new file mode 100644 index 0000000..c48b3fb --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_slab" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_stairs.json b/src/hfas/resources/assets/ww_hfas/items/azalea_stairs.json new file mode 100644 index 0000000..f767c58 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_stairs" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_trapdoor.json b/src/hfas/resources/assets/ww_hfas/items/azalea_trapdoor.json new file mode 100644 index 0000000..88e2060 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_wood.json b/src/hfas/resources/assets/ww_hfas/items/azalea_wood.json new file mode 100644 index 0000000..856a2ec --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/azalea_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/azalea_wood" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/baked_seeds.json b/src/hfas/resources/assets/ww_hfas/items/baked_seeds.json new file mode 100644 index 0000000..c5e75b4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/baked_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/baked_seeds" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_boat.json b/src/hfas/resources/assets/ww_hfas/items/blaze_boat.json new file mode 100644 index 0000000..086a9ee --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/blaze_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_button.json b/src/hfas/resources/assets/ww_hfas/items/blaze_button.json new file mode 100644 index 0000000..4e4313b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_button_inventory" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_chest_boat.json b/src/hfas/resources/assets/ww_hfas/items/blaze_chest_boat.json new file mode 100644 index 0000000..c4c31a8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/blaze_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_door.json b/src/hfas/resources/assets/ww_hfas/items/blaze_door.json new file mode 100644 index 0000000..4c6a902 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/blaze_door" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_fence.json b/src/hfas/resources/assets/ww_hfas/items/blaze_fence.json new file mode 100644 index 0000000..21effa9 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_fence_inventory" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_fence_gate.json b/src/hfas/resources/assets/ww_hfas/items/blaze_fence_gate.json new file mode 100644 index 0000000..8dc0347 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_fence_gate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/items/blaze_hanging_sign.json new file mode 100644 index 0000000..bff07a8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/blaze_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_leaves.json b/src/hfas/resources/assets/ww_hfas/items/blaze_leaves.json new file mode 100644 index 0000000..60d5e95 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -32768 + } + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_log.json b/src/hfas/resources/assets/ww_hfas/items/blaze_log.json new file mode 100644 index 0000000..34e4433 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_planks.json b/src/hfas/resources/assets/ww_hfas/items/blaze_planks.json new file mode 100644 index 0000000..4309700 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/items/blaze_pressure_plate.json new file mode 100644 index 0000000..18debc5 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_pressure_plate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_sapling.json b/src/hfas/resources/assets/ww_hfas/items/blaze_sapling.json new file mode 100644 index 0000000..3bf4eb0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/blaze_sapling" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_sign.json b/src/hfas/resources/assets/ww_hfas/items/blaze_sign.json new file mode 100644 index 0000000..2b44f32 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/blaze_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_slab.json b/src/hfas/resources/assets/ww_hfas/items/blaze_slab.json new file mode 100644 index 0000000..1d050b3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_slab" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_stairs.json b/src/hfas/resources/assets/ww_hfas/items/blaze_stairs.json new file mode 100644 index 0000000..32fe30d --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_stairs" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_trapdoor.json b/src/hfas/resources/assets/ww_hfas/items/blaze_trapdoor.json new file mode 100644 index 0000000..792dedd --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_wood.json b/src/hfas/resources/assets/ww_hfas/items/blaze_wood.json new file mode 100644 index 0000000..1b9afe2 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/blaze_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/blaze_wood" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/calamari.json b/src/hfas/resources/assets/ww_hfas/items/calamari.json new file mode 100644 index 0000000..7e204b9 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/calamari.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/calamari" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/cooked_calamari.json b/src/hfas/resources/assets/ww_hfas/items/cooked_calamari.json new file mode 100644 index 0000000..e88c204 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/cooked_calamari.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/cooked_calamari" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/cooked_egg.json b/src/hfas/resources/assets/ww_hfas/items/cooked_egg.json new file mode 100644 index 0000000..c09c695 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/cooked_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/cooked_egg" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/cooked_frog_legs.json b/src/hfas/resources/assets/ww_hfas/items/cooked_frog_legs.json new file mode 100644 index 0000000..a24db76 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/cooked_frog_legs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/cooked_frog_legs" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/duckweed.json b/src/hfas/resources/assets/ww_hfas/items/duckweed.json new file mode 100644 index 0000000..9f57dcf --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/duckweed.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/duckweed" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/frog_legs.json b/src/hfas/resources/assets/ww_hfas/items/frog_legs.json new file mode 100644 index 0000000..6953e72 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/frog_legs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/frog_legs" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/kiln.json b/src/hfas/resources/assets/ww_hfas/items/kiln.json new file mode 100644 index 0000000..6449afc --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/kiln.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/furnace" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/muddy_pig_spawn_egg.json b/src/hfas/resources/assets/ww_hfas/items/muddy_pig_spawn_egg.json new file mode 100644 index 0000000..b7869a9 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/muddy_pig_spawn_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pig_spawn_egg" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/scorched_dirt.json b/src/hfas/resources/assets/ww_hfas/items/scorched_dirt.json new file mode 100644 index 0000000..a5fd716 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/scorched_dirt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/scorched_dirt" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/scorched_grass.json b/src/hfas/resources/assets/ww_hfas/items/scorched_grass.json new file mode 100644 index 0000000..8785b18 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/scorched_grass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/scorched_grass" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/scorched_grass_block.json b/src/hfas/resources/assets/ww_hfas/items/scorched_grass_block.json new file mode 100644 index 0000000..2405871 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/scorched_grass_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/scorched_grass_block" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/scorched_twig.json b/src/hfas/resources/assets/ww_hfas/items/scorched_twig.json new file mode 100644 index 0000000..5e75abd --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/scorched_twig.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/scorched_twig" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_boat.json b/src/hfas/resources/assets/ww_hfas/items/soul_boat.json new file mode 100644 index 0000000..e77347e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/soul_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_button.json b/src/hfas/resources/assets/ww_hfas/items/soul_button.json new file mode 100644 index 0000000..89e68d0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_button_inventory" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_chest_boat.json b/src/hfas/resources/assets/ww_hfas/items/soul_chest_boat.json new file mode 100644 index 0000000..1b6d6e9 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/soul_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_door.json b/src/hfas/resources/assets/ww_hfas/items/soul_door.json new file mode 100644 index 0000000..61bd3cb --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/soul_door" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_fence.json b/src/hfas/resources/assets/ww_hfas/items/soul_fence.json new file mode 100644 index 0000000..75148db --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_fence_inventory" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_fence_gate.json b/src/hfas/resources/assets/ww_hfas/items/soul_fence_gate.json new file mode 100644 index 0000000..a14f107 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_fence_gate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/items/soul_hanging_sign.json new file mode 100644 index 0000000..13e32c0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/soul_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_leaves.json b/src/hfas/resources/assets/ww_hfas/items/soul_leaves.json new file mode 100644 index 0000000..888d0d3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -16711681 + } + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_log.json b/src/hfas/resources/assets/ww_hfas/items/soul_log.json new file mode 100644 index 0000000..be6fff1 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_planks.json b/src/hfas/resources/assets/ww_hfas/items/soul_planks.json new file mode 100644 index 0000000..3bfa2e4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/items/soul_pressure_plate.json new file mode 100644 index 0000000..97daf71 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_pressure_plate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_sapling.json b/src/hfas/resources/assets/ww_hfas/items/soul_sapling.json new file mode 100644 index 0000000..10abb9c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/soul_sapling" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_sign.json b/src/hfas/resources/assets/ww_hfas/items/soul_sign.json new file mode 100644 index 0000000..abbbc4f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:item/soul_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_slab.json b/src/hfas/resources/assets/ww_hfas/items/soul_slab.json new file mode 100644 index 0000000..818017e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_slab" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_stairs.json b/src/hfas/resources/assets/ww_hfas/items/soul_stairs.json new file mode 100644 index 0000000..687331a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_stairs" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_trapdoor.json b/src/hfas/resources/assets/ww_hfas/items/soul_trapdoor.json new file mode 100644 index 0000000..f1d57f0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_wood.json b/src/hfas/resources/assets/ww_hfas/items/soul_wood.json new file mode 100644 index 0000000..5466a33 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/soul_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/soul_wood" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_log.json b/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_log.json new file mode 100644 index 0000000..72fa897 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_wood.json b/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_wood.json new file mode 100644 index 0000000..3c3f37e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/stripped_azalea_wood" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_log.json b/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_log.json new file mode 100644 index 0000000..c925415 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_wood.json b/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_wood.json new file mode 100644 index 0000000..98bb532 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/stripped_blaze_wood" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_soul_log.json b/src/hfas/resources/assets/ww_hfas/items/stripped_soul_log.json new file mode 100644 index 0000000..5a503de --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/stripped_soul_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_soul_wood.json b/src/hfas/resources/assets/ww_hfas/items/stripped_soul_wood.json new file mode 100644 index 0000000..937b493 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/stripped_soul_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/stripped_soul_wood" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/tiny_cactus.json b/src/hfas/resources/assets/ww_hfas/items/tiny_cactus.json new file mode 100644 index 0000000..be42856 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/tiny_cactus.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "ww_hfas:block/tiny_cactus" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/tipped_arrow.json b/src/hfas/resources/assets/ww_hfas/items/tipped_arrow.json new file mode 100644 index 0000000..77ba8aa --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/items/tipped_arrow.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tipped_arrow", + "tints": [ + { + "type": "minecraft:potion", + "default": -13083194 + } + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/lang/en_us.json b/src/hfas/resources/assets/ww_hfas/lang/en_us.json new file mode 100644 index 0000000..30f7265 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/lang/en_us.json @@ -0,0 +1,97 @@ +{ + "block.ww_hfas.azalea_button": "Azalea Button", + "block.ww_hfas.azalea_door": "Azalea Door", + "block.ww_hfas.azalea_fence": "Azalea Fence", + "block.ww_hfas.azalea_fence_gate": "Azalea Fence Gate", + "block.ww_hfas.azalea_hanging_sign": "Azalea Hanging Sign", + "block.ww_hfas.azalea_log": "Azalea Log", + "block.ww_hfas.azalea_planks": "Azalea Planks", + "block.ww_hfas.azalea_pressure_plate": "Azalea Pressure Plate", + "block.ww_hfas.azalea_sign": "Azalea Sign", + "block.ww_hfas.azalea_slab": "Azalea Slab", + "block.ww_hfas.azalea_stairs": "Azalea Stairs", + "block.ww_hfas.azalea_trapdoor": "Azalea Trapdoor", + "block.ww_hfas.azalea_wall_hanging_sign": "Azalea Hanging Sign", + "block.ww_hfas.azalea_wall_sign": "Azalea Sign", + "block.ww_hfas.azalea_wood": "Azalea Wood", + "block.ww_hfas.blaze_button": "Blaze Button", + "block.ww_hfas.blaze_door": "Blaze Door", + "block.ww_hfas.blaze_fence": "Blaze Fence", + "block.ww_hfas.blaze_fence_gate": "Blaze Fence Gate", + "block.ww_hfas.blaze_hanging_sign": "Blaze Hanging Sign", + "block.ww_hfas.blaze_leaves": "Blaze Leaves", + "block.ww_hfas.blaze_log": "Blaze Log", + "block.ww_hfas.blaze_planks": "Blaze Planks", + "block.ww_hfas.blaze_pressure_plate": "Blaze Pressure Plate", + "block.ww_hfas.blaze_sapling": "Blaze Sapling", + "block.ww_hfas.blaze_sign": "Blaze Sign", + "block.ww_hfas.blaze_slab": "Blaze Slab", + "block.ww_hfas.blaze_stairs": "Blaze Stairs", + "block.ww_hfas.blaze_trapdoor": "Blaze Trapdoor", + "block.ww_hfas.blaze_wall_hanging_sign": "Blaze Hanging Sign", + "block.ww_hfas.blaze_wall_sign": "Blaze Sign", + "block.ww_hfas.blaze_wood": "Blaze Wood", + "block.ww_hfas.fletching_table": "Fletching Table", + "block.ww_hfas.scorched_dirt": "Scorched Dirt", + "block.ww_hfas.scorched_grass": "Scorched Grass", + "block.ww_hfas.scorched_grass_block": "Scorched Grass Block", + "block.ww_hfas.scorched_twig": "Scorched Twig", + "block.ww_hfas.soul_button": "Soul Button", + "block.ww_hfas.soul_door": "Soul Door", + "block.ww_hfas.soul_fence": "Soul Fence", + "block.ww_hfas.soul_fence_gate": "Soul Fence Gate", + "block.ww_hfas.soul_hanging_sign": "Soul Hanging Sign", + "block.ww_hfas.soul_leaves": "Soul Leaves", + "block.ww_hfas.soul_log": "Soul Log", + "block.ww_hfas.soul_planks": "Soul Planks", + "block.ww_hfas.soul_pressure_plate": "Soul Pressure Plate", + "block.ww_hfas.soul_sapling": "Soul Sapling", + "block.ww_hfas.soul_sign": "Soul Sign", + "block.ww_hfas.soul_slab": "Soul Slab", + "block.ww_hfas.soul_stairs": "Soul Stairs", + "block.ww_hfas.soul_trapdoor": "Soul Trapdoor", + "block.ww_hfas.soul_wall_hanging_sign": "Soul Hanging Sign", + "block.ww_hfas.soul_wall_sign": "Soul Sign", + "block.ww_hfas.soul_wood": "Soul Wood", + "block.ww_hfas.stripped_azalea_log": "Stripped Azalea Log", + "block.ww_hfas.stripped_azalea_wood": "Stripped Azalea Wood", + "block.ww_hfas.stripped_blaze_log": "Stripped Blaze Log", + "block.ww_hfas.stripped_blaze_wood": "Stripped Blaze Wood", + "block.ww_hfas.stripped_soul_log": "Stripped Soul Log", + "block.ww_hfas.stripped_soul_wood": "Stripped Soul Wood", + "block.ww_hfas.tiny_cactus": "Tiny Cactus", + "container.fletching_table": "Fletching Table", + "item.ww_hfas.azalea_boat": "Azalea Boat", + "item.ww_hfas.azalea_chest_boat": "Azalea Chest Boat", + "item.ww_hfas.blaze_boat": "Blaze Boat", + "item.ww_hfas.blaze_chest_boat": "Blaze Chest Boat", + "item.ww_hfas.soul_boat": "Soul Boat", + "item.ww_hfas.soul_chest_boat": "Soul Chest Boat", + "entity.ww_hfas.muddy_pig": "Muddy Pig", + "item.ww_hfas.muddy_pig_spawn_egg": "Muddy Pig Spawn Egg", + "item.ww_hfas.duckweed": "Duckweed", + "item.ww_hfas.calamari": "Calamari", + "item.ww_hfas.cooked_calamari": "Cooked Calamari", + "item.ww_hfas.cooked_egg": "Fried Egg", + "item.ww_hfas.baked_seeds": "Baked Seeds", + "item.ww_hfas.cooked_frog_legs": "Cooked Frog Legs", + "item.ww_hfas.frog_legs": "Raw Frog Legs", + "effect.ww_hfas.sink": "Sink", + "effect.ww_hfas.choke": "Choke", + "enchantment.ww_hfas.melting": "Melting", + "block.ww_hfas.kiln": "Kiln", + "entity.ww_hfas.piranha": "Direfish", + "item.ww_hfas.cooked_piranha": "Cooked Direfish", + "item.ww_hfas.piranha": "Raw Direfish", + "item.ww_hfas.piranha_bucket": "Bucket of Direfish", + "item.ww_hfas.piranha_spawn_egg": "Direfish Spawn Egg", + "subtitles.entity.piranha.attack": "Direfish attacks", + "subtitles.entity.piranha.death": "Direfish dies", + "block.ww_hfas.azalea_shelf": "Azalea Shelf", + "entity.ww_hfas.arrow": "Arrow of Reach", + "item.minecraft.tipped_arrow.effect.long_reach": "Arrow of Reach", + "item.minecraft.tipped_arrow.effect.reach": "Arrow of Reach", + "item.ww_hfas.tipped_arrow": "Arrow of Reach", + "item.ww_hfas.tipped_arrow.effect.long_reach": "Arrow of Reach", + "item.ww_hfas.tipped_arrow.effect.reach": "Arrow of Reach" +} diff --git a/src/hfas/resources/assets/ww_hfas/lang/zh_cn.json b/src/hfas/resources/assets/ww_hfas/lang/zh_cn.json new file mode 100644 index 0000000..1f32a42 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/lang/zh_cn.json @@ -0,0 +1,97 @@ +{ + "block.ww_hfas.azalea_button": "杜鹃木按钮", + "block.ww_hfas.azalea_door": "杜鹃木门", + "block.ww_hfas.azalea_fence": "杜鹃木栅栏", + "block.ww_hfas.azalea_fence_gate": "杜鹃木栅栏门", + "block.ww_hfas.azalea_hanging_sign": "悬挂式杜鹃木告示牌", + "block.ww_hfas.azalea_log": "杜鹃木原木", + "block.ww_hfas.azalea_planks": "杜鹃木木板", + "block.ww_hfas.azalea_pressure_plate": "杜鹃木压力板", + "block.ww_hfas.azalea_sign": "杜鹃木告示牌", + "block.ww_hfas.azalea_slab": "杜鹃木台阶", + "block.ww_hfas.azalea_stairs": "杜鹃木楼梯", + "block.ww_hfas.azalea_trapdoor": "杜鹃木活板门", + "block.ww_hfas.azalea_wall_hanging_sign": "杜鹃木悬挂告示牌", + "block.ww_hfas.azalea_wall_sign": "杜鹃木告示牌", + "block.ww_hfas.azalea_wood": "杜鹃木", + "block.ww_hfas.blaze_button": "焚烬木按钮", + "block.ww_hfas.blaze_door": "焚烬木门", + "block.ww_hfas.blaze_fence": "焚烬木栅栏", + "block.ww_hfas.blaze_fence_gate": "焚烬木栅栏门", + "block.ww_hfas.blaze_hanging_sign": "焚烬木悬挂告示牌", + "block.ww_hfas.blaze_leaves": "焚烬木树叶", + "block.ww_hfas.blaze_log": "焚烬木原木", + "block.ww_hfas.blaze_planks": "焚烬木木板", + "block.ww_hfas.blaze_pressure_plate": "焚烬木压力板", + "block.ww_hfas.blaze_sapling": "焚烬木树苗", + "block.ww_hfas.blaze_sign": "焚烬木告示牌", + "block.ww_hfas.blaze_slab": "焚烬木台阶", + "block.ww_hfas.blaze_stairs": "焚烬木楼梯", + "block.ww_hfas.blaze_trapdoor": "焚烬木活板门", + "block.ww_hfas.blaze_wall_hanging_sign": "焚烬木悬挂告示牌", + "block.ww_hfas.blaze_wall_sign": "焚烬木告示牌", + "block.ww_hfas.blaze_wood": "焚烬木", + "block.ww_hfas.fletching_table": "制箭台", + "block.ww_hfas.scorched_dirt": "焦土", + "block.ww_hfas.scorched_grass": "焦灰草丛", + "block.ww_hfas.scorched_grass_block": "焦灰草方块", + "block.ww_hfas.scorched_twig": "焦灰枝条", + "block.ww_hfas.soul_button": "灵焰木按钮", + "block.ww_hfas.soul_door": "灵焰木门", + "block.ww_hfas.soul_fence": "灵焰木栅栏", + "block.ww_hfas.soul_fence_gate": "灵焰木栅栏门", + "block.ww_hfas.soul_hanging_sign": "灵焰木悬挂告示牌", + "block.ww_hfas.soul_leaves": "灵焰木树叶", + "block.ww_hfas.soul_log": "灵焰木原木", + "block.ww_hfas.soul_planks": "灵焰木木板", + "block.ww_hfas.soul_pressure_plate": "灵焰木压力板", + "block.ww_hfas.soul_sapling": "灵焰木树苗", + "block.ww_hfas.soul_sign": "灵焰木告示牌", + "block.ww_hfas.soul_slab": "灵焰木台阶", + "block.ww_hfas.soul_stairs": "灵焰木楼梯", + "block.ww_hfas.soul_trapdoor": "灵焰木活板门", + "block.ww_hfas.soul_wall_hanging_sign": "灵焰木悬挂告示牌", + "block.ww_hfas.soul_wall_sign": "灵焰木告示牌", + "block.ww_hfas.soul_wood": "灵焰木", + "block.ww_hfas.stripped_azalea_log": "去皮杜鹃木原木", + "block.ww_hfas.stripped_azalea_wood": "去皮杜鹃木", + "block.ww_hfas.stripped_blaze_log": "去皮焚烬木原木", + "block.ww_hfas.stripped_blaze_wood": "去皮焚烬木", + "block.ww_hfas.stripped_soul_log": "去皮灵焰木原木", + "block.ww_hfas.stripped_soul_wood": "去皮灵焰木", + "block.ww_hfas.tiny_cactus": "仙人球", + "container.fletching_table": "制箭台", + "item.ww_hfas.azalea_boat": "杜鹃木船", + "item.ww_hfas.azalea_chest_boat": "杜鹃木运输船", + "item.ww_hfas.blaze_boat": "焚烬木船", + "item.ww_hfas.blaze_chest_boat": "焚烬木运输船", + "item.ww_hfas.soul_boat": "灵焰木船", + "item.ww_hfas.soul_chest_boat": "灵焰木运输船", + "entity.ww_hfas.muddy_pig": "泥猪", + "item.ww_hfas.muddy_pig_spawn_egg": "泥猪刷怪蛋", + "item.ww_hfas.duckweed": "浮萍", + "item.ww_hfas.calamari": "鱿鱼须", + "item.ww_hfas.cooked_calamari": "熟鱿鱼须", + "item.ww_hfas.cooked_egg": "煎蛋", + "item.ww_hfas.baked_seeds": "烤种子", + "item.ww_hfas.cooked_frog_legs": "熟蛙腿", + "item.ww_hfas.frog_legs": "生蛙腿", + "effect.ww_hfas.sink": "沉溺", + "effect.ww_hfas.choke": "窒息", + "enchantment.ww_hfas.melting": "熔炼", + "block.ww_hfas.kiln": "窑炉", + "entity.ww_hfas.piranha": "恐鱼", + "item.ww_hfas.cooked_piranha": "熟恐鱼", + "item.ww_hfas.piranha": "生恐鱼", + "item.ww_hfas.piranha_bucket": "恐鱼桶", + "item.ww_hfas.piranha_spawn_egg": "恐鱼刷怪蛋", + "subtitles.entity.piranha.attack": "恐鱼袭击", + "subtitles.entity.piranha.death": "恐鱼死亡", + "block.ww_hfas.azalea_shelf": "杜鹃木展示架", + "entity.ww_hfas.arrow": "延展之箭", + "item.minecraft.tipped_arrow.effect.long_reach": "延展之箭", + "item.minecraft.tipped_arrow.effect.reach": "延展之箭", + "item.ww_hfas.tipped_arrow": "延展之箭", + "item.ww_hfas.tipped_arrow.effect.long_reach": "延展之箭", + "item.ww_hfas.tipped_arrow.effect.reach": "延展之箭" +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_button.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_button.json new file mode 100644 index 0000000..fe81559 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_inventory.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_inventory.json new file mode 100644 index 0000000..7c19fd1 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_pressed.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_pressed.json new file mode 100644 index 0000000..87e701c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left.json new file mode 100644 index 0000000..9a363b3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "ww_hfas:block/azalea_door_bottom", + "top": "ww_hfas:block/azalea_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left_open.json new file mode 100644 index 0000000..fd2834c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "ww_hfas:block/azalea_door_bottom", + "top": "ww_hfas:block/azalea_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right.json new file mode 100644 index 0000000..1b3a7fd --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "ww_hfas:block/azalea_door_bottom", + "top": "ww_hfas:block/azalea_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right_open.json new file mode 100644 index 0000000..58905e2 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "ww_hfas:block/azalea_door_bottom", + "top": "ww_hfas:block/azalea_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left.json new file mode 100644 index 0000000..c41a92d --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "ww_hfas:block/azalea_door_bottom", + "top": "ww_hfas:block/azalea_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left_open.json new file mode 100644 index 0000000..54791c1 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "ww_hfas:block/azalea_door_bottom", + "top": "ww_hfas:block/azalea_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right.json new file mode 100644 index 0000000..a3f958c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "ww_hfas:block/azalea_door_bottom", + "top": "ww_hfas:block/azalea_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right_open.json new file mode 100644 index 0000000..c2e47a7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "ww_hfas:block/azalea_door_bottom", + "top": "ww_hfas:block/azalea_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate.json new file mode 100644 index 0000000..009cc3f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_open.json new file mode 100644 index 0000000..7c4347f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall.json new file mode 100644 index 0000000..8bb6743 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall_open.json new file mode 100644 index 0000000..aa7f1ce --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_inventory.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_inventory.json new file mode 100644 index 0000000..0840399 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_post.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_post.json new file mode 100644 index 0000000..fbb34a0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_side.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_side.json new file mode 100644 index 0000000..1c4fcbe --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_0.json new file mode 100644 index 0000000..17656b4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_0", + "textures": { + "all": "ww_hfas:block/azalea_hanging_sign", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_1.json new file mode 100644 index 0000000..e61f747 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_1", + "textures": { + "all": "ww_hfas:block/azalea_hanging_sign", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_2.json new file mode 100644 index 0000000..a957d88 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_2", + "textures": { + "all": "ww_hfas:block/azalea_hanging_sign", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_3.json new file mode 100644 index 0000000..f5aa45c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_3", + "textures": { + "all": "ww_hfas:block/azalea_hanging_sign", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_0.json new file mode 100644 index 0000000..67f91b6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_0", + "textures": { + "all": "ww_hfas:block/azalea_hanging_sign", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_1.json new file mode 100644 index 0000000..5acf0e1 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_1", + "textures": { + "all": "ww_hfas:block/azalea_hanging_sign", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_2.json new file mode 100644 index 0000000..349e892 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_2", + "textures": { + "all": "ww_hfas:block/azalea_hanging_sign", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_3.json new file mode 100644 index 0000000..91fd4f1 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_3", + "textures": { + "all": "ww_hfas:block/azalea_hanging_sign", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_log.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_log.json new file mode 100644 index 0000000..b407e48 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/azalea_log_top", + "side": "ww_hfas:block/azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_log_horizontal.json new file mode 100644 index 0000000..945028f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "ww_hfas:block/azalea_log_top", + "side": "ww_hfas:block/azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_planks.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_planks.json new file mode 100644 index 0000000..1637503 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate.json new file mode 100644 index 0000000..8fc98fd --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate_down.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate_down.json new file mode 100644 index 0000000..b8664e4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf.json new file mode 100644 index 0000000..9fb24d8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_body", + "textures": { + "all": "ww_hfas:block/azalea_shelf", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_center.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_center.json new file mode 100644 index 0000000..b7ba4a7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_center.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_center", + "textures": { + "all": "ww_hfas:block/azalea_shelf", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_inventory.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_inventory.json new file mode 100644 index 0000000..8a76fed --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_inventory.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_inventory", + "textures": { + "all": "ww_hfas:block/azalea_shelf", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_left.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_left.json new file mode 100644 index 0000000..ba2e868 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_left", + "textures": { + "all": "ww_hfas:block/azalea_shelf", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_right.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_right.json new file mode 100644 index 0000000..7e1696e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_right", + "textures": { + "all": "ww_hfas:block/azalea_shelf", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unconnected.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unconnected.json new file mode 100644 index 0000000..d3a2e0f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unconnected.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_unconnected", + "textures": { + "all": "ww_hfas:block/azalea_shelf", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unpowered.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unpowered.json new file mode 100644 index 0000000..b56de0a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unpowered.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_unpowered", + "textures": { + "all": "ww_hfas:block/azalea_shelf", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_0.json new file mode 100644 index 0000000..57ab485 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_0", + "textures": { + "all": "ww_hfas:block/azalea_sign", + "particle": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_1.json new file mode 100644 index 0000000..badcc3f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_1", + "textures": { + "all": "ww_hfas:block/azalea_sign", + "particle": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_2.json new file mode 100644 index 0000000..4aadca6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_2", + "textures": { + "all": "ww_hfas:block/azalea_sign", + "particle": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_3.json new file mode 100644 index 0000000..ca1f9cc --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_3", + "textures": { + "all": "ww_hfas:block/azalea_sign", + "particle": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab.json new file mode 100644 index 0000000..aa827b3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "ww_hfas:block/azalea_planks", + "side": "ww_hfas:block/azalea_planks", + "top": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab_top.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab_top.json new file mode 100644 index 0000000..8d49d8a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "ww_hfas:block/azalea_planks", + "side": "ww_hfas:block/azalea_planks", + "top": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs.json new file mode 100644 index 0000000..c3a479e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "ww_hfas:block/azalea_planks", + "side": "ww_hfas:block/azalea_planks", + "top": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_inner.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_inner.json new file mode 100644 index 0000000..10226f2 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "ww_hfas:block/azalea_planks", + "side": "ww_hfas:block/azalea_planks", + "top": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_outer.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_outer.json new file mode 100644 index 0000000..aef79e1 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "ww_hfas:block/azalea_planks", + "side": "ww_hfas:block/azalea_planks", + "top": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_bottom.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_bottom.json new file mode 100644 index 0000000..e5b03d7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "textures": { + "texture": "ww_hfas:block/azalea_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_open.json new file mode 100644 index 0000000..6ca6f0d --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "textures": { + "texture": "ww_hfas:block/azalea_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_top.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_top.json new file mode 100644 index 0000000..66b24c4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "textures": { + "texture": "ww_hfas:block/azalea_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_hanging_sign.json new file mode 100644 index 0000000..2355131 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_hanging_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_hanging_sign", + "textures": { + "all": "ww_hfas:block/azalea_hanging_sign", + "particle": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_sign.json new file mode 100644 index 0000000..1f275af --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_sign", + "textures": { + "all": "ww_hfas:block/azalea_sign", + "particle": "ww_hfas:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_wood.json new file mode 100644 index 0000000..82d72d0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/azalea_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/azalea_log", + "side": "ww_hfas:block/azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_button.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_button.json new file mode 100644 index 0000000..a2727b0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_inventory.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_inventory.json new file mode 100644 index 0000000..1d4dfbd --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_pressed.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_pressed.json new file mode 100644 index 0000000..555f0ac --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left.json new file mode 100644 index 0000000..ffa1e5a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "ww_hfas:block/blaze_door_bottom", + "top": "ww_hfas:block/blaze_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left_open.json new file mode 100644 index 0000000..1dba029 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "ww_hfas:block/blaze_door_bottom", + "top": "ww_hfas:block/blaze_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right.json new file mode 100644 index 0000000..0d1f7c3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "ww_hfas:block/blaze_door_bottom", + "top": "ww_hfas:block/blaze_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right_open.json new file mode 100644 index 0000000..7406287 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "ww_hfas:block/blaze_door_bottom", + "top": "ww_hfas:block/blaze_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left.json new file mode 100644 index 0000000..1b03e3c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "ww_hfas:block/blaze_door_bottom", + "top": "ww_hfas:block/blaze_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left_open.json new file mode 100644 index 0000000..5a57be6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "ww_hfas:block/blaze_door_bottom", + "top": "ww_hfas:block/blaze_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right.json new file mode 100644 index 0000000..9889caa --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "ww_hfas:block/blaze_door_bottom", + "top": "ww_hfas:block/blaze_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right_open.json new file mode 100644 index 0000000..67b8807 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "ww_hfas:block/blaze_door_bottom", + "top": "ww_hfas:block/blaze_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate.json new file mode 100644 index 0000000..323ffd7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_open.json new file mode 100644 index 0000000..a680709 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall.json new file mode 100644 index 0000000..5be0081 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall_open.json new file mode 100644 index 0000000..7dc5d11 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_inventory.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_inventory.json new file mode 100644 index 0000000..91194e7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_post.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_post.json new file mode 100644 index 0000000..34c91e4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_side.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_side.json new file mode 100644 index 0000000..5304bbb --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_0.json new file mode 100644 index 0000000..d3b6fcd --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_0", + "textures": { + "all": "ww_hfas:block/blaze_hanging_sign", + "particle": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_1.json new file mode 100644 index 0000000..fcf12c6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_1", + "textures": { + "all": "ww_hfas:block/blaze_hanging_sign", + "particle": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_2.json new file mode 100644 index 0000000..01be23c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_2", + "textures": { + "all": "ww_hfas:block/blaze_hanging_sign", + "particle": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_3.json new file mode 100644 index 0000000..9b45ba8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_3", + "textures": { + "all": "ww_hfas:block/blaze_hanging_sign", + "particle": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_0.json new file mode 100644 index 0000000..254fac6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_0", + "textures": { + "all": "ww_hfas:block/blaze_hanging_sign", + "particle": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_1.json new file mode 100644 index 0000000..d9b2040 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_1", + "textures": { + "all": "ww_hfas:block/blaze_hanging_sign", + "particle": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_2.json new file mode 100644 index 0000000..29bc176 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_2", + "textures": { + "all": "ww_hfas:block/blaze_hanging_sign", + "particle": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_3.json new file mode 100644 index 0000000..214de88 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_3", + "textures": { + "all": "ww_hfas:block/blaze_hanging_sign", + "particle": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_leaves.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_leaves.json new file mode 100644 index 0000000..051fbe3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "ww_hfas:block/blaze_leaves" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_log.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_log.json new file mode 100644 index 0000000..80c570a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/blaze_log_top", + "side": "ww_hfas:block/blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_log_horizontal.json new file mode 100644 index 0000000..db339ed --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "ww_hfas:block/blaze_log_top", + "side": "ww_hfas:block/blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_planks.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_planks.json new file mode 100644 index 0000000..6a3d68c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate.json new file mode 100644 index 0000000..758120b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate_down.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate_down.json new file mode 100644 index 0000000..db8b114 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sapling.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sapling.json new file mode 100644 index 0000000..8bf0462 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "ww_hfas:block/blaze_sapling" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_0.json new file mode 100644 index 0000000..188c6cb --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_0", + "textures": { + "all": "ww_hfas:block/blaze_sign", + "particle": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_1.json new file mode 100644 index 0000000..e50ada1 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_1", + "textures": { + "all": "ww_hfas:block/blaze_sign", + "particle": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_2.json new file mode 100644 index 0000000..7004435 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_2", + "textures": { + "all": "ww_hfas:block/blaze_sign", + "particle": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_3.json new file mode 100644 index 0000000..416e90e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_3", + "textures": { + "all": "ww_hfas:block/blaze_sign", + "particle": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab.json new file mode 100644 index 0000000..50e6078 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "ww_hfas:block/blaze_planks", + "side": "ww_hfas:block/blaze_planks", + "top": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab_top.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab_top.json new file mode 100644 index 0000000..1007ee4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "ww_hfas:block/blaze_planks", + "side": "ww_hfas:block/blaze_planks", + "top": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs.json new file mode 100644 index 0000000..8d2a639 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "ww_hfas:block/blaze_planks", + "side": "ww_hfas:block/blaze_planks", + "top": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_inner.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_inner.json new file mode 100644 index 0000000..15e7cd4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "ww_hfas:block/blaze_planks", + "side": "ww_hfas:block/blaze_planks", + "top": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_outer.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_outer.json new file mode 100644 index 0000000..4564aa9 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "ww_hfas:block/blaze_planks", + "side": "ww_hfas:block/blaze_planks", + "top": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_bottom.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_bottom.json new file mode 100644 index 0000000..61f8c27 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "textures": { + "texture": "ww_hfas:block/blaze_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_open.json new file mode 100644 index 0000000..cf64f11 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "textures": { + "texture": "ww_hfas:block/blaze_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_top.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_top.json new file mode 100644 index 0000000..48c82ef --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "textures": { + "texture": "ww_hfas:block/blaze_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_hanging_sign.json new file mode 100644 index 0000000..a5183c7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_hanging_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_hanging_sign", + "textures": { + "all": "ww_hfas:block/blaze_hanging_sign", + "particle": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_sign.json new file mode 100644 index 0000000..a401e69 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_sign", + "textures": { + "all": "ww_hfas:block/blaze_sign", + "particle": "ww_hfas:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_wood.json new file mode 100644 index 0000000..2e60081 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/blaze_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/blaze_log", + "side": "ww_hfas:block/blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/fletching_table.json b/src/hfas/resources/assets/ww_hfas/models/block/fletching_table.json new file mode 100644 index 0000000..9e38b5b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/fletching_table.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "ww_hfas:block/fletching_table" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/potted_blaze_sapling.json b/src/hfas/resources/assets/ww_hfas/models/block/potted_blaze_sapling.json new file mode 100644 index 0000000..ff356e8 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/potted_blaze_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "textures": { + "plant": "ww_hfas:block/blaze_sapling" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/potted_soul_sapling.json b/src/hfas/resources/assets/ww_hfas/models/block/potted_soul_sapling.json new file mode 100644 index 0000000..5833a7c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/potted_soul_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/flower_pot_cross", + "textures": { + "plant": "ww_hfas:block/soul_sapling" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/scorched_dirt.json b/src/hfas/resources/assets/ww_hfas/models/block/scorched_dirt.json new file mode 100644 index 0000000..4889d7a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/scorched_dirt.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "ww_hfas:block/scorched_dirt" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass.json b/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass.json new file mode 100644 index 0000000..4319fc6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "ww_hfas:block/scorched_grass" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass_block.json b/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass_block.json new file mode 100644 index 0000000..7b7d66a --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "ww_hfas:block/scorched_grass_block" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/scorched_twig.json b/src/hfas/resources/assets/ww_hfas/models/block/scorched_twig.json new file mode 100644 index 0000000..0da4df4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/scorched_twig.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "ww_hfas:block/scorched_twig" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_button.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_button.json new file mode 100644 index 0000000..ccd3e41 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_button.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_button_inventory.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_button_inventory.json new file mode 100644 index 0000000..1280d9b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_button_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_inventory", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_button_pressed.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_button_pressed.json new file mode 100644 index 0000000..67bf9e5 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_button_pressed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/button_pressed", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left.json new file mode 100644 index 0000000..9f3a416 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "ww_hfas:block/soul_door_bottom", + "top": "ww_hfas:block/soul_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left_open.json new file mode 100644 index 0000000..f1ade50 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "ww_hfas:block/soul_door_bottom", + "top": "ww_hfas:block/soul_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right.json new file mode 100644 index 0000000..552a6d2 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "ww_hfas:block/soul_door_bottom", + "top": "ww_hfas:block/soul_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right_open.json new file mode 100644 index 0000000..007e77e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "ww_hfas:block/soul_door_bottom", + "top": "ww_hfas:block/soul_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left.json new file mode 100644 index 0000000..9ae8f7b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "ww_hfas:block/soul_door_bottom", + "top": "ww_hfas:block/soul_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left_open.json new file mode 100644 index 0000000..5df9000 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "ww_hfas:block/soul_door_bottom", + "top": "ww_hfas:block/soul_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right.json new file mode 100644 index 0000000..2cc36d7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "ww_hfas:block/soul_door_bottom", + "top": "ww_hfas:block/soul_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right_open.json new file mode 100644 index 0000000..4ba8da3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "ww_hfas:block/soul_door_bottom", + "top": "ww_hfas:block/soul_door_top" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate.json new file mode 100644 index 0000000..c860132 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_open.json new file mode 100644 index 0000000..154328c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_open", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall.json new file mode 100644 index 0000000..937e20e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall_open.json new file mode 100644 index 0000000..97933ed --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_fence_gate_wall_open", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_inventory.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_inventory.json new file mode 100644 index 0000000..fb5de9b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_inventory.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_inventory", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_post.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_post.json new file mode 100644 index 0000000..e363dfe --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_post.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_post", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_side.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_side.json new file mode 100644 index 0000000..269d2dd --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_side.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/fence_side", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_0.json new file mode 100644 index 0000000..03904e6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_0", + "textures": { + "all": "ww_hfas:block/soul_hanging_sign", + "particle": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_1.json new file mode 100644 index 0000000..47a2e65 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_1", + "textures": { + "all": "ww_hfas:block/soul_hanging_sign", + "particle": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_2.json new file mode 100644 index 0000000..1e3e47b --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_2", + "textures": { + "all": "ww_hfas:block/soul_hanging_sign", + "particle": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_3.json new file mode 100644 index 0000000..643e627 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_3", + "textures": { + "all": "ww_hfas:block/soul_hanging_sign", + "particle": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_0.json new file mode 100644 index 0000000..6986bca --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_0", + "textures": { + "all": "ww_hfas:block/soul_hanging_sign", + "particle": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_1.json new file mode 100644 index 0000000..acb72a6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_1", + "textures": { + "all": "ww_hfas:block/soul_hanging_sign", + "particle": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_2.json new file mode 100644 index 0000000..40fb18c --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_2", + "textures": { + "all": "ww_hfas:block/soul_hanging_sign", + "particle": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_3.json new file mode 100644 index 0000000..34efb63 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_3", + "textures": { + "all": "ww_hfas:block/soul_hanging_sign", + "particle": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_leaves.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_leaves.json new file mode 100644 index 0000000..e1f2d52 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_leaves.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/leaves", + "textures": { + "all": "ww_hfas:block/soul_leaves" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_log.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_log.json new file mode 100644 index 0000000..95fe4d6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/soul_log_top", + "side": "ww_hfas:block/soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_log_horizontal.json new file mode 100644 index 0000000..ac124e5 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "ww_hfas:block/soul_log_top", + "side": "ww_hfas:block/soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_planks.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_planks.json new file mode 100644 index 0000000..705cc94 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_planks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate.json new file mode 100644 index 0000000..33947f4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_up", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate_down.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate_down.json new file mode 100644 index 0000000..0bbf325 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate_down.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/pressure_plate_down", + "textures": { + "texture": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sapling.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_sapling.json new file mode 100644 index 0000000..0ad7535 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "ww_hfas:block/soul_sapling" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_0.json new file mode 100644 index 0000000..66be653 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_0", + "textures": { + "all": "ww_hfas:block/soul_sign", + "particle": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_1.json new file mode 100644 index 0000000..c0f54d0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_1", + "textures": { + "all": "ww_hfas:block/soul_sign", + "particle": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_2.json new file mode 100644 index 0000000..bdbc310 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_2", + "textures": { + "all": "ww_hfas:block/soul_sign", + "particle": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_3.json new file mode 100644 index 0000000..9f40093 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_3", + "textures": { + "all": "ww_hfas:block/soul_sign", + "particle": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_slab.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_slab.json new file mode 100644 index 0000000..1c2ebba --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "ww_hfas:block/soul_planks", + "side": "ww_hfas:block/soul_planks", + "top": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_slab_top.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_slab_top.json new file mode 100644 index 0000000..6aadbad --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "ww_hfas:block/soul_planks", + "side": "ww_hfas:block/soul_planks", + "top": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs.json new file mode 100644 index 0000000..8de2751 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "ww_hfas:block/soul_planks", + "side": "ww_hfas:block/soul_planks", + "top": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_inner.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_inner.json new file mode 100644 index 0000000..08895e7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "ww_hfas:block/soul_planks", + "side": "ww_hfas:block/soul_planks", + "top": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_outer.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_outer.json new file mode 100644 index 0000000..d5a4636 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "ww_hfas:block/soul_planks", + "side": "ww_hfas:block/soul_planks", + "top": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_bottom.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_bottom.json new file mode 100644 index 0000000..35dbb38 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_bottom", + "textures": { + "texture": "ww_hfas:block/soul_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_open.json new file mode 100644 index 0000000..a4a481d --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_open", + "textures": { + "texture": "ww_hfas:block/soul_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_top.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_top.json new file mode 100644 index 0000000..2cb1c29 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_orientable_trapdoor_top", + "textures": { + "texture": "ww_hfas:block/soul_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_hanging_sign.json new file mode 100644 index 0000000..07f2385 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_hanging_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_hanging_sign", + "textures": { + "all": "ww_hfas:block/soul_hanging_sign", + "particle": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_sign.json new file mode 100644 index 0000000..3070323 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_sign", + "textures": { + "all": "ww_hfas:block/soul_sign", + "particle": "ww_hfas:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_wood.json new file mode 100644 index 0000000..00a3492 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/soul_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/soul_log", + "side": "ww_hfas:block/soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log.json new file mode 100644 index 0000000..b90fc17 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/stripped_azalea_log_top", + "side": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log_horizontal.json new file mode 100644 index 0000000..1534da3 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "ww_hfas:block/stripped_azalea_log_top", + "side": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_wood.json new file mode 100644 index 0000000..9efa944 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/stripped_azalea_log", + "side": "ww_hfas:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log.json new file mode 100644 index 0000000..a108025 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/stripped_blaze_log_top", + "side": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log_horizontal.json new file mode 100644 index 0000000..3e3f046 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "ww_hfas:block/stripped_blaze_log_top", + "side": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_wood.json new file mode 100644 index 0000000..a29dcda --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/stripped_blaze_log", + "side": "ww_hfas:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log.json new file mode 100644 index 0000000..045c65f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/stripped_soul_log_top", + "side": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log_horizontal.json new file mode 100644 index 0000000..cfdec37 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "ww_hfas:block/stripped_soul_log_top", + "side": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_wood.json new file mode 100644 index 0000000..b58988e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "ww_hfas:block/stripped_soul_log", + "side": "ww_hfas:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/tiny_cactus.json b/src/hfas/resources/assets/ww_hfas/models/block/tiny_cactus.json new file mode 100644 index 0000000..f9c70b5 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/block/tiny_cactus.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cross", + "textures": { + "cross": "ww_hfas:block/tiny_cactus" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy.bbmodel b/src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy.bbmodel new file mode 100644 index 0000000..9b3c306 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"pig_muddy","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":64,"height":64},"elements":[{"name":"body","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-5,18,10],"to":[5,34,18],"autouv":0,"color":5,"rotation":[-90,0,0],"origin":[0,11,15],"uv_offset":[28,8],"faces":{"north":{"uv":[36,16,46,32],"texture":0},"east":{"uv":[28,16,36,32],"texture":0},"south":{"uv":[54,16,64,32],"texture":0},"west":{"uv":[46,16,54,32],"texture":0},"up":{"uv":[46,16,36,8],"texture":0},"down":{"uv":[56,8,46,16],"texture":0}},"type":"cube","uuid":"bf06d62a-bc20-e9e6-67f6-1f12ac271a15"},{"name":"head","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-4,10,-15],"to":[4,18,-7],"autouv":0,"color":0,"origin":[0,2,-1],"faces":{"north":{"uv":[8,8,16,16],"texture":0},"east":{"uv":[0,8,8,16],"texture":0},"south":{"uv":[24,8,32,16],"texture":0},"west":{"uv":[16,8,24,16],"texture":0},"up":{"uv":[16,8,8,0],"texture":0},"down":{"uv":[24,0,16,8],"texture":0}},"type":"cube","uuid":"104bcae4-e56b-5454-d491-ad60a837caff"},{"name":"head","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-2,11,-16],"to":[2,14,-15],"autouv":0,"color":6,"origin":[0,2,-1],"uv_offset":[16,16],"faces":{"north":{"uv":[17,17,21,20],"texture":0},"east":{"uv":[16,17,17,20],"texture":0},"south":{"uv":[22,17,26,20],"texture":0},"west":{"uv":[21,17,22,20],"texture":0},"up":{"uv":[21,17,17,16],"texture":0},"down":{"uv":[25,16,21,17],"texture":0}},"type":"cube","uuid":"5598eebe-0524-bee6-41e9-9d6a06944398"},{"name":"leg1","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1,0,4],"to":[5,6,8],"autouv":0,"color":7,"origin":[0,0,-1],"uv_offset":[0,16],"faces":{"north":{"uv":[4,20,8,26],"texture":0},"east":{"uv":[0,20,4,26],"texture":0},"south":{"uv":[12,20,16,26],"texture":0},"west":{"uv":[8,20,12,26],"texture":0},"up":{"uv":[8,20,4,16],"texture":0},"down":{"uv":[12,16,8,20],"texture":0}},"type":"cube","uuid":"4a928788-a75a-920b-75d6-7cfce294e760"},{"name":"leg2","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-5,0,4],"to":[-1,6,8],"autouv":0,"color":8,"origin":[0,0,-1],"uv_offset":[0,16],"faces":{"north":{"uv":[4,20,8,26],"texture":0},"east":{"uv":[0,20,4,26],"texture":0},"south":{"uv":[12,20,16,26],"texture":0},"west":{"uv":[8,20,12,26],"texture":0},"up":{"uv":[8,20,4,16],"texture":0},"down":{"uv":[12,16,8,20],"texture":0}},"type":"cube","uuid":"a60ed14f-f7cb-b9c6-4cdf-162149716218"},{"name":"leg3","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1,0,-8],"to":[5,6,-4],"autouv":0,"color":7,"origin":[0,0,-1],"uv_offset":[0,16],"faces":{"north":{"uv":[4,20,8,26],"texture":0},"east":{"uv":[0,20,4,26],"texture":0},"south":{"uv":[12,20,16,26],"texture":0},"west":{"uv":[8,20,12,26],"texture":0},"up":{"uv":[8,20,4,16],"texture":0},"down":{"uv":[12,16,8,20],"texture":0}},"type":"cube","uuid":"99988f96-0a9e-7a17-7ef5-4c60895252e5"},{"name":"leg4","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-5,0,-8],"to":[-1,6,-4],"autouv":0,"color":5,"origin":[0,0,-1],"uv_offset":[0,16],"faces":{"north":{"uv":[4,20,8,26],"texture":0},"east":{"uv":[0,20,4,26],"texture":0},"south":{"uv":[12,20,16,26],"texture":0},"west":{"uv":[8,20,12,26],"texture":0},"up":{"uv":[8,20,4,16],"texture":0},"down":{"uv":[12,16,8,20],"texture":0}},"type":"cube","uuid":"6558fe05-2fa6-c177-4217-2ea245c35cf0"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[0,18,-16],"to":[0,24,-10],"autouv":0,"color":9,"origin":[0,18,-16],"uv_offset":[24,-4],"faces":{"north":{"uv":[30,2,30,8],"texture":0},"east":{"uv":[24,2,30,8],"texture":0},"south":{"uv":[36,2,36,8],"texture":0},"west":{"uv":[30,2,36,8],"texture":0},"up":{"uv":[30,2,30,-4],"texture":0},"down":{"uv":[30,-4,30,2],"texture":0}},"type":"cube","uuid":"f2f49590-f333-6170-0f0e-b2f7bb0880e2"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-3,18,-13],"to":[3,24,-13],"autouv":1,"color":5,"origin":[3,18,-13],"uv_offset":[24,2],"faces":{"north":{"uv":[24,2,30,8],"texture":0},"east":{"uv":[24,2,24,8],"texture":0},"south":{"uv":[30,2,36,8],"texture":0},"west":{"uv":[30,2,30,8],"texture":0},"up":{"uv":[30,2,24,2],"texture":0},"down":{"uv":[36,2,30,2],"texture":0}},"type":"cube","uuid":"dd45f095-2a2b-639e-0e43-41ed79b7122b"}],"groups":[],"outliner":["bf06d62a-bc20-e9e6-67f6-1f12ac271a15","104bcae4-e56b-5454-d491-ad60a837caff","5598eebe-0524-bee6-41e9-9d6a06944398","4a928788-a75a-920b-75d6-7cfce294e760","a60ed14f-f7cb-b9c6-4cdf-162149716218","99988f96-0a9e-7a17-7ef5-4c60895252e5","6558fe05-2fa6-c177-4217-2ea245c35cf0","f2f49590-f333-6170-0f0e-b2f7bb0880e2","dd45f095-2a2b-639e-0e43-41ed79b7122b"],"textures":[{"name":"pig_muddy.png","relative_path":"pig_muddy.png","folder":"","namespace":"","id":"1","group":"","scope":0,"width":64,"height":64,"uv_width":64,"uv_height":64,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"cda7bb44-a55d-8fa7-6bae-96ec4cb7826f","source":"data:image/png;base64,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"}]} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy_baby.bbmodel b/src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy_baby.bbmodel new file mode 100644 index 0000000..8ec8ecd --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy_baby.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"5.0","model_format":"modded_entity","box_uv":true},"name":"pig_muddy_baby","model_identifier":"","modded_entity_entity_class":"","modded_entity_version":"1.17","modded_entity_flip_y":true,"visible_box":[1,1,0],"variable_placeholders":"","multi_file_ruleset":"","variable_placeholder_buttons":[],"timeline_setups":[],"unhandled_root_fields":{},"resolution":{"width":32,"height":32},"elements":[{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-3,4,-7],"to":[4,10,-1],"autouv":0,"color":8,"origin":[-6,4,-6],"uv_offset":[0,15],"faces":{"north":{"uv":[6,21,13,27],"texture":0},"east":{"uv":[0,21,6,27],"texture":0},"south":{"uv":[19,21,26,27],"texture":0},"west":{"uv":[13,21,19,27],"texture":0},"up":{"uv":[13,21,6,15],"texture":0},"down":{"uv":[20,15,13,21],"texture":0}},"type":"cube","uuid":"3203416e-91fd-5855-0f49-fb1a643c8509"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-1,5,-8],"to":[2,7,-7],"autouv":0,"color":5,"origin":[0,5,-7],"uv_offset":[6,27],"faces":{"north":{"uv":[7,28,10,30],"texture":0},"east":{"uv":[6,28,7,30],"texture":0},"south":{"uv":[11,28,14,30],"texture":0},"west":{"uv":[10,28,11,30],"texture":0},"up":{"uv":[10,28,7,27],"texture":0},"down":{"uv":[13,27,10,28],"texture":0}},"type":"cube","uuid":"12f570c1-e40a-37d3-764e-2caaebd271be"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-3,2,-4],"to":[4,8,5],"autouv":0,"color":7,"origin":[-2,2,-3],"faces":{"north":{"uv":[9,9,16,15],"texture":0},"east":{"uv":[0,9,9,15],"texture":0},"south":{"uv":[25,9,32,15],"texture":0},"west":{"uv":[16,9,25,15],"texture":0},"up":{"uv":[16,9,9,0],"texture":0},"down":{"uv":[23,0,16,9],"texture":0}},"type":"cube","uuid":"43168b76-dff2-f3e3-4b9d-73f150b67955"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-3,0,3],"to":[-1,2,5],"autouv":1,"color":8,"origin":[-2,0,4],"faces":{"north":{"uv":[2,2,4,4],"texture":0},"east":{"uv":[0,2,2,4],"texture":0},"south":{"uv":[6,2,8,4],"texture":0},"west":{"uv":[4,2,6,4],"texture":0},"up":{"uv":[4,2,2,0],"texture":0},"down":{"uv":[6,0,4,2],"texture":0}},"type":"cube","uuid":"ef17ef72-dc6f-8353-890f-7ebd5b7d8a1c"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[2,0,3],"to":[4,2,5],"autouv":0,"color":7,"origin":[3,0,4],"uv_offset":[23,0],"faces":{"north":{"uv":[25,2,27,4],"texture":0},"east":{"uv":[23,2,25,4],"texture":0},"south":{"uv":[29,2,31,4],"texture":0},"west":{"uv":[27,2,29,4],"texture":0},"up":{"uv":[27,2,25,0],"texture":0},"down":{"uv":[29,0,27,2],"texture":0}},"type":"cube","uuid":"dfd1d3d4-d7f5-b90a-f896-746147985048"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-3,0,-4],"to":[-1,2,-2],"autouv":0,"color":7,"origin":[-2,0,-3],"uv_offset":[0,4],"faces":{"north":{"uv":[2,6,4,8],"texture":0},"east":{"uv":[0,6,2,8],"texture":0},"south":{"uv":[6,6,8,8],"texture":0},"west":{"uv":[4,6,6,8],"texture":0},"up":{"uv":[4,6,2,4],"texture":0},"down":{"uv":[6,4,4,6],"texture":0}},"type":"cube","uuid":"e1e83bbd-5cf9-eeab-b415-28e003d26369"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[2,0,-4],"to":[4,2,-2],"autouv":0,"color":0,"origin":[3,0,-3],"uv_offset":[23,4],"faces":{"north":{"uv":[25,6,27,8],"texture":0},"east":{"uv":[23,6,25,8],"texture":0},"south":{"uv":[29,6,31,8],"texture":0},"west":{"uv":[27,6,29,8],"texture":0},"up":{"uv":[27,6,25,4],"texture":0},"down":{"uv":[29,4,27,6],"texture":0}},"type":"cube","uuid":"ddc8596c-5406-1c98-fa08-ca091cb600a2"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[1,10,-7],"to":[1,14,-4],"autouv":0,"color":9,"origin":[1,9,-7],"uv_offset":[0,14],"faces":{"north":{"uv":[3,17,3,21],"texture":0},"east":{"uv":[0,17,3,21],"texture":0},"south":{"uv":[6,17,6,21],"texture":0},"west":{"uv":[3,17,6,21],"texture":0},"up":{"uv":[3,17,3,14],"texture":0},"down":{"uv":[3,14,3,17],"texture":0}},"type":"cube","uuid":"440dd7b3-629b-e562-3a47-9e7348760aeb"},{"name":"cube","box_uv":true,"render_order":"default","locked":false,"export":true,"scope":0,"allow_mirror_modeling":true,"from":[-0.5,10,-5],"to":[2.5,14,-5],"autouv":0,"color":5,"origin":[2.5,9,-5],"uv_offset":[0,17],"faces":{"north":{"uv":[0,17,3,21],"texture":0},"east":{"uv":[0,17,0,21],"texture":0},"south":{"uv":[3,17,6,21],"texture":0},"west":{"uv":[3,17,3,21],"texture":0},"up":{"uv":[3,17,0,17],"texture":0},"down":{"uv":[6,17,3,17],"texture":0}},"type":"cube","uuid":"4070e32c-d428-1ea6-5e11-1c95798208d7"}],"groups":[],"outliner":["3203416e-91fd-5855-0f49-fb1a643c8509","12f570c1-e40a-37d3-764e-2caaebd271be","43168b76-dff2-f3e3-4b9d-73f150b67955","ef17ef72-dc6f-8353-890f-7ebd5b7d8a1c","dfd1d3d4-d7f5-b90a-f896-746147985048","e1e83bbd-5cf9-eeab-b415-28e003d26369","ddc8596c-5406-1c98-fa08-ca091cb600a2","440dd7b3-629b-e562-3a47-9e7348760aeb","4070e32c-d428-1ea6-5e11-1c95798208d7"],"textures":[{"name":"pig_muddy_baby.png","relative_path":"pig_muddy_baby.png","folder":"","namespace":"","id":"0","group":"","scope":0,"width":32,"height":32,"uv_width":16,"uv_height":16,"particle":false,"use_as_default":false,"layers_enabled":false,"sync_to_project":"","file_format":"png","render_mode":"default","render_sides":"auto","wrap_mode":"limited","pbr_channel":"color","fps":7,"frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"internal":true,"saved":true,"uuid":"28bb92f6-574c-6bf5-1456-af96835e15ca","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAEtklEQVR4AayWf2hVZRjHn/tuA02TjbhSfxhT6I+QhJCSRkWwimAjhVhCUGh0/wqM6I/CggZBmBBDAmsszSD8J8Utt6TsFpQsBmkwWFERGw5tuGzhb3Dz+Hyee5/Dueeec/3Bxvm+z/N+n1/v7vu87zlBqn/bn34wAk/ed3e0cV17VKVNXO3rjaKD++qxb3eEPyDGwRxYsA7kBdiTvJokXgCTPDS3rRRpvavWzPzOO4xbtnSJSR/Sc+ezZHil4/4InLlwRUB7sU2Ky5cKHLCgaiHTKWxKZfBiFy9fEQcWeOIBeQF5yQ8H8Atriq0CpmbnZOXyJaYzR4fDKRfVxVCYgu7HHJ08wHOhA/LC4RO2D/1cAA+vvoe5fP/bpIxN/iPvf/tr4bu/ZgpG+lAt6NOk9KJJjrwAjvxjmpf85CU//E31AI7y/1mJAeFz9ASSv0SCzlVvrgdywyuGZFF+CZ+zz4D9B4vfA5X6NlLUYYQO7Ddgv9l3dIAOpy4S94DvC3sG2CM4nBqB/zjLDk8e4LnQAXnhiAvxJVM+HEWO1KWDYx6O7tghg30fyeC7vRWgK45+MiB2eellZTU8d0LCB7tkNPvI8KCOqadB16c866Z1+Wha9Zo8cliA28P83BmlRboefcykDVp45NhPla5XwnSVPJ8PDyMMMa/JTdc4M+jg+cj/zclpZfRRvx/P/qdKpR582PnDESH47f5dYqtSJ+ToxImYHxwbldKHHwjF/zz1tyVAh7c4Xaz5D+uvWI13nvz44Q9H/OpHOiwXfJj895wQzDFB4oSBKkj42QuXBRz7Y0ImZuYEn0PHfzEOO37uj4088EjyeyxcOj5gxEACl84hAR2N3XWSMIeHA8Qi4dFdwiX90JPxYWh8qvDp6O8xOB5wA2+8WeluOnr/gYq+5wuh67/s7hHwdc+LJtF3P9FtOvHbiiuukRNJLo4dEqT1/KuYhlrRJnV/8CmyZf1aael8XJAcvQe2vRM40iYP6neEHsVUSDwN4xs3LDBDAteRSdCYyXmdrs1n3wytie8GOHXkJKjIfMLpmauya83aBSRw3b29cNcLW53Kll6Yoo5szxo2PDN2oqn8VKsceqlNkjpeI/s/Ezq89FpJ0OXcHLShUFwmDjl/yTgbWIhD+fmTU0bnDXEP9L9abnIn1ynuL42BctnNVpgJtyiwn3haLxv/z1WfHz8uxqtjNHtRx+wn0DRDz79lTUPjuC6pBix1dopzzevWC5BVqwSYnvxsU7353nZxtGiTZpeX2o9SW7Wu3Jz15960ocO+E5l3dW9CxIuo8a1YbmsMyf2bPnW6JsmzfXuF+4CF8DXU9JC+L3Rh7lTj32C/G/VB/DKiAInZU9N1PxfKX0HFLyqbK4/d/LAyV+n7reotPYE3kh81XhKi+8fLCVCIbKajaDF0gJ/5K088eVSV9H+bnuOTROCFQbeX9G3HiwRJxwN0kNZ97v7Ek8cTU9ThXJ4M3N3c28B17mww8N5OAXzxfNyzWbjvD2zdItiS/q63vN5byEPuAvIMHM+9/XtE9EwjOVIcJyS2vLhb5eOLKCvw5c169LQnTGY5LAKXu4DCc1sKjbAItS1F7gLMugjDjVJcBwAA//9Zy29CAAAABklEQVQDAG1bs256JTTFAAAAAElFTkSuQmCC"}]} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_boat.json b/src/hfas/resources/assets/ww_hfas/models/item/azalea_boat.json new file mode 100644 index 0000000..64aca35 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/azalea_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/azalea_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_chest_boat.json b/src/hfas/resources/assets/ww_hfas/models/item/azalea_chest_boat.json new file mode 100644 index 0000000..05ec872 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/azalea_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/azalea_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_door.json b/src/hfas/resources/assets/ww_hfas/models/item/azalea_door.json new file mode 100644 index 0000000..25d13f4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/azalea_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/azalea_door" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/item/azalea_hanging_sign.json new file mode 100644 index 0000000..2f7231f --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/azalea_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/azalea_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_sign.json b/src/hfas/resources/assets/ww_hfas/models/item/azalea_sign.json new file mode 100644 index 0000000..e177fb0 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/azalea_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/azalea_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/baked_seeds.json b/src/hfas/resources/assets/ww_hfas/models/item/baked_seeds.json new file mode 100644 index 0000000..992e1c7 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/baked_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/baked_seeds" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_boat.json b/src/hfas/resources/assets/ww_hfas/models/item/blaze_boat.json new file mode 100644 index 0000000..e89f7d5 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/blaze_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/blaze_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_chest_boat.json b/src/hfas/resources/assets/ww_hfas/models/item/blaze_chest_boat.json new file mode 100644 index 0000000..7be8a68 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/blaze_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/blaze_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_door.json b/src/hfas/resources/assets/ww_hfas/models/item/blaze_door.json new file mode 100644 index 0000000..f18f481 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/blaze_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/blaze_door" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/item/blaze_hanging_sign.json new file mode 100644 index 0000000..893cef4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/blaze_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/blaze_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_sapling.json b/src/hfas/resources/assets/ww_hfas/models/item/blaze_sapling.json new file mode 100644 index 0000000..4485e6e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/blaze_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:block/blaze_sapling" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_sign.json b/src/hfas/resources/assets/ww_hfas/models/item/blaze_sign.json new file mode 100644 index 0000000..cb92a0e --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/blaze_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/blaze_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/calamari.json b/src/hfas/resources/assets/ww_hfas/models/item/calamari.json new file mode 100644 index 0000000..1612bf4 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/calamari.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/calamari" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/cooked_calamari.json b/src/hfas/resources/assets/ww_hfas/models/item/cooked_calamari.json new file mode 100644 index 0000000..5283aa1 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/cooked_calamari.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/cooked_calamari" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/cooked_egg.json b/src/hfas/resources/assets/ww_hfas/models/item/cooked_egg.json new file mode 100644 index 0000000..08419b6 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/cooked_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/cooked_egg" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/cooked_frog_legs.json b/src/hfas/resources/assets/ww_hfas/models/item/cooked_frog_legs.json new file mode 100644 index 0000000..60745ac --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/cooked_frog_legs.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/cooked_frog_legs" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/duckweed.json b/src/hfas/resources/assets/ww_hfas/models/item/duckweed.json new file mode 100644 index 0000000..8a1bd01 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/duckweed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/duckweed" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/frog_legs.json b/src/hfas/resources/assets/ww_hfas/models/item/frog_legs.json new file mode 100644 index 0000000..79d5eab --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/frog_legs.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/frog_legs" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/omni_claw.json b/src/hfas/resources/assets/ww_hfas/models/item/omni_claw.json new file mode 100644 index 0000000..6c2cb5d --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/omni_claw.json @@ -0,0 +1,101 @@ +{ + "texture_size": [32, 32], + "textures": { + "2": "ww_hfas:item/omni_claw", + "particle": "ww_hfas:item/omni_claw" + }, + "elements": [ + { + "from": [5.4, -1.35, 6.4], + "to": [10.6, 4.85, 16.6], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 0, 16]}, + "faces": { + "north": {"uv": [8, 3, 5.5, 6], "texture": "#2", "tintindex": 1}, + "east": {"uv": [0, 3, 5, 6], "texture": "#2", "tintindex": 1}, + "south": {"uv": [11, 3, 8.5, 6], "texture": "#2", "tintindex": 1}, + "west": {"uv": [5, 3, 0, 6], "texture": "#2", "tintindex": 1}, + "up": {"uv": [5, 0, 0, 2.5], "rotation": 90, "texture": "#2", "tintindex": 1} + } + }, + { + "from": [5.4, -1.35, 12.525], + "to": [10.6, 4.85, 12.725], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 0, 16]}, + "faces": { + "north": {"uv": [11, 0, 8.5, 3], "texture": "#2", "tintindex": 1} + } + }, + { + "from": [5.5, -2, 6], + "to": [10.5, 0, 16], + "faces": { + "north": {"uv": [5.5, 6.5, 8, 7.5], "texture": "#2", "tintindex": 1}, + "east": {"uv": [0, 9.5, 5, 10.5], "texture": "#2", "tintindex": 1}, + "south": {"uv": [5.5, 8, 8, 9], "texture": "#2", "tintindex": 1}, + "west": {"uv": [5, 9.5, 0, 10.5], "texture": "#2", "tintindex": 1}, + "up": {"uv": [5, 6.5, 0, 9], "rotation": 90, "texture": "#2", "tintindex": 1}, + "down": {"uv": [0, 9, 5, 6.5], "rotation": 90, "texture": "#2", "tintindex": 1} + } + }, + { + "from": [10.6, 4.85, 16.6], + "to": [5.4, -1.35, 6.4], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 0, 16]}, + "faces": { + "north": {"uv": [11, 3, 8.5, 0], "texture": "#2", "tintindex": 1}, + "east": {"uv": [16, 6, 11, 3], "texture": "#2", "tintindex": 1}, + "south": {"uv": [8, 3, 5.5, 0], "texture": "#2", "tintindex": 1}, + "west": {"uv": [11, 6, 16, 3], "texture": "#2", "tintindex": 1}, + "down": {"uv": [16, 2.5, 11, 0], "rotation": 90, "texture": "#2", "tintindex": 1} + } + }, + { + "from": [6, 6, 12], + "to": [10, 10, 12], + "rotation": {"angle": 22.5, "axis": "x", "origin": [1.5, 1.5, 0]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#2"} + } + }, + { + "from": [6, 6, 12], + "to": [10, 10, 12], + "rotation": {"angle": 22.5, "axis": "x", "origin": [1.5, 1.5, 0]}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#2", "tintindex": 1} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [-12, 0, 0], + "translation": [0, 3, -7.5] + }, + "thirdperson_lefthand": { + "rotation": [-12, 0, 0], + "translation": [0, 3, -7.5] + }, + "firstperson_righthand": { + "rotation": [0, 1, -10], + "translation": [11.5, 3.75, -6.25] + }, + "firstperson_lefthand": { + "rotation": [0, 1, -10], + "translation": [11.5, 3.75, -6.25] + }, + "ground": { + "translation": [0, 4, -2], + "scale": [0.6, 0.6, 0.6] + }, + "gui": { + "rotation": [54, -117, 30], + "translation": [4.25, 2.5, 0], + "scale": [0.9, 0.9, 0.9] + }, + "head": { + "translation": [0, -0.5, -10.25], + "scale": [0.6, 0.6, 0.6] + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_boat.json b/src/hfas/resources/assets/ww_hfas/models/item/soul_boat.json new file mode 100644 index 0000000..85ef9eb --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/soul_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/soul_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_chest_boat.json b/src/hfas/resources/assets/ww_hfas/models/item/soul_chest_boat.json new file mode 100644 index 0000000..97dd976 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/soul_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/soul_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_door.json b/src/hfas/resources/assets/ww_hfas/models/item/soul_door.json new file mode 100644 index 0000000..6fce687 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/soul_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/soul_door" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/item/soul_hanging_sign.json new file mode 100644 index 0000000..ad56140 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/soul_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/soul_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_sapling.json b/src/hfas/resources/assets/ww_hfas/models/item/soul_sapling.json new file mode 100644 index 0000000..e7a9b11 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/soul_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:block/soul_sapling" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_sign.json b/src/hfas/resources/assets/ww_hfas/models/item/soul_sign.json new file mode 100644 index 0000000..92bdce9 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/models/item/soul_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "ww_hfas:item/soul_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/sounds.json b/src/hfas/resources/assets/ww_hfas/sounds.json new file mode 100644 index 0000000..dc531b1 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/sounds.json @@ -0,0 +1,16 @@ +{ + "entity.piranha.attack": { + "subtitle": "subtitles.entity.piranha.attack", + "sounds": [ + "ww_hfas:entity_piranha_attack_1", + "ww_hfas:entity_piranha_attack_2", + "ww_hfas:entity_piranha_attack_3" + ] + }, + "entity.piranha.death": { + "subtitle": "subtitles.entity.piranha.death", + "sounds": [ + "ww_hfas:entity_piranha_death" + ] + } +} diff --git a/src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_1.ogg b/src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..697e693f763ac2e8b7eb6782c2a4115bbaec4350 GIT binary patch literal 7717 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 V{cTZSOA)df*Ux?~{rm|K`#*KiX0!kR literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_2.ogg b/src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3140acb9a0d363703a991b21f494f10abd5c4e49 GIT binary patch literal 8026 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 R(}mgegLiPA1e!YF&H&OMtX%*A literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_door_bottom.png b/src/hfas/resources/assets/ww_hfas/textures/block/azalea_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..fa962905440886bc29b6004d6c4276caba337adb GIT binary patch literal 450 zcmV;z0X_bSP)hG3?N0N#onNMg?Xrw5l}u79;ZQI7pi0o7 z^{qX6xW6Lfhn1ld1RH(PRnn{7E8Lt3PGqSENW?9#) zRauXX3E->&W;9IeZ!S;CZ0-|!BK4zR1A-rCKqeq$Ai*o(2!I3=(=ZqdFdnR(Aj@=6 z4v+Nr)dpEKG?6#!Y7@&Kl0O5*ND~*lLDR;gG%0NQ&IHJ$gSD*5bfD-BI{P0`uOS5P-+Eq@}GCEDcf-526R}K7i1ZkKo(&Q9OJ0rci~77+R=pLRu8};|(yuJRGwPcHxG}{sCAHipmE&GXdsMYsCbdxL&uZ-gKPHe6 zkPPwdW2w%As4j7*y$Rg<=E=qFAwkzqnf9 zWGmGmWC1$sbroQf2VtXLb$l`P`P^;6+hDZY*F-wD;mTn`~X^e&?D?z4!QsU002ov JPDHLkV1h!>Vq>Y@Hp5*2^Ng*TXq6a4P-hKD`&bv3>!>ebj;ZjK^Hijh8 zlah1gPm<{JMWeW0sjtbG*_@J~XSZB?^vaVqxNzxa)#_L)*!}AlPn!4*j03|*M(sPl zvMRITce{oGJpBg(OUFY#@O;iLw6iT|&R?!RdwSo4@o%|BYy9Z3aqAG_LuozIwSx5Z zChJk-VKxr;@3;Fohp(M+WC{iuHL_95#CUaj@{OgL(UF5zc_F`Gy@WwLh#C(vKxY8* z0dA?ZaT=u|0NEf7JXm}8GNM!GW|)Pc{rT zZbGdLK8#mn(+YrDilNE7dG%uFQO+*@nBXmYPLg*&u!cDb4)1~o2NCjOom`K~mu%>a>p(wsq zfbpp7*l1Alf57A7&Z)5~B1LV}LARV78`X@`eO_*-RS_={ai` zRY&xSxbmiH)~{FoND-Bi#t8M`i6d_)%+ALHeGRqOy2gk)uDszwLkqfep6NLdN8V5v z1IZmOI?b$~rfK7y%KLh(LK*JnK<{4p8ZKEH&(Zm|8^N8(dt6*UG14@(TD4kN$%BvC uzcUL`${;_esDH*7K&}2C>|h7d0e%DNE6pJDcbZKA0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf0YOPbK~y+TeUr;d zLs1Mx(}T8J>l4uq1aamc`2WA*P#jnheAQ~JP`iTb67Ik~IXB5pvXgKJH`iC|%jrqH zE>`imT*dBa7>DCw+PuKn^mq~v&-3J5obAQ^<43g7#@L^1ClQzg&QG`U#Ya*f_?rPq zbR*G1wKz~A-HA1v@AK~r0)mUL!JidL6eKVT;LQUx?C4;UMVd1bR2C$@9c}jX(pa4-4Y>j0iM$PTrB8kc-<^th#OZ*Qib4;5=MEn9Y WiP~huIG>^b00002k$n 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 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_door_bottom.png b/src/hfas/resources/assets/ww_hfas/textures/block/blaze_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..161d8041433cb69dcc4a5add36d5b13d7cdd0012 GIT binary patch literal 456 zcmV;(0XP1MP)Px$f=NU{R5*==lg~@sP!PvI4Vz^1-ogeU3vRVSDT)VAo;(zK>&d^`Lr>mBD0mPl zYu%J34|ZaHfcCIEFUeZ!oZftAzLW3#$cJy=FJH54#`TXY_V*6}czpcDr!OaD*$jX@ zU-EGGa}Ynj_)4BH8L_n_F{JZ3;v7k0Xhq0b0?>+(B!~u;|tUNwyMIeLh;~@Zc zI;9mMozDRMY;kiN9CC)CbZTUE1Q};UlLl2iDIup zIRgbIihWQAXrh>-^D~cY&Nv!x6r}0iK%xfBUOMo1->{iU5L)X4y9r*=x*p)6wcQM~ zr#=YqvaSGFt(|Xi_aow5Hv_e*sdgb>>|Yl2SJx+3O-0#s(p9161d}nX$VP!WWm9`n z+0=fO+Qw?_D4TkC2Yp8g|HJxPx$o=HSOR5*>Dlh01uKoG`%>loXLO$<>GfsnSjAcQ!;E5L*B9=u;Km1sFcQB_qc z${#gpqDUsTWgErIVOhsYtXArrX1MzhRC!@a9wwDVM%yp) zhUWk%zwKjca50_nJm>>()ae2+pNuNwPnTCTJ)d|u!_>Dt5Bl6(oC<*P3OS#Qiul|2 zkv!^jH}Rk^Teo+_(*R=`29;y$;%y(`;Gnsor}=15GFbxzq|S*hG9(oL2i7ybp@P&mmP- zJHM6yAAx)tu;;p%g*>Gfshh2TJPCcU6{ajI8W(?|ZrM1Nl5;VgsYdTN>Vr*hv!ggu aD!c(lSi?=mafZtP0000Px$=}AOER5*=ole=phK@f+(6(Z=t`fzj)P$3r!cc@9FLMh$4@jsa|jT^TvlfqyK z2C+hCPFDz`hd~HEunn6+%(8}TbziAr(~RA2izrH-PBQ?i zYK8*18Vnr3ysnkWjVq_6lGy%m0ARgdE0Y^9ve~T8EnE!-ZeG`FG#a~5ZC=+3z~sh# zoZblqLYjv3QdKjwj!4ozA=UPE>nWs7nS<65jd@+Gq8K_U0?=xA2~V$=kfeS3CP(Xt za1I{b+KERNJlQqC_06pVSd>%3cvGhtI?Xs8_n&%`B%yn_zf%Bl96M>T)$Y>VE&qCS zA+UC$Mx(Jy(!K*&Ef;oZY_(i?UkF(^i+@P@Md8Fjt91YX002ovPDHLkV1n`m{~`bY literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_log.png b/src/hfas/resources/assets/ww_hfas/textures/block/blaze_log.png new file mode 100644 index 0000000000000000000000000000000000000000..7058673c90926b4e2c334facbe337ad0ec9e46e4 GIT binary patch literal 2846 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 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_log_top.png.mcmeta b/src/hfas/resources/assets/ww_hfas/textures/block/blaze_log_top.png.mcmeta new file mode 100644 index 0000000..67b3e83 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/textures/block/blaze_log_top.png.mcmeta @@ -0,0 +1,24 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_planks.png b/src/hfas/resources/assets/ww_hfas/textures/block/blaze_planks.png new file mode 100644 index 0000000000000000000000000000000000000000..bad9e57d7e6a5b529569edc74156bc82a4efb715 GIT binary patch literal 484 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 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_log.png b/src/hfas/resources/assets/ww_hfas/textures/block/cinder_log.png new file mode 100644 index 0000000000000000000000000000000000000000..7058673c90926b4e2c334facbe337ad0ec9e46e4 GIT binary patch literal 2846 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 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_log_top.png.mcmeta b/src/hfas/resources/assets/ww_hfas/textures/block/cinder_log_top.png.mcmeta new file mode 100644 index 0000000..67b3e83 --- /dev/null +++ b/src/hfas/resources/assets/ww_hfas/textures/block/cinder_log_top.png.mcmeta @@ -0,0 +1,24 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15 + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_planks.png b/src/hfas/resources/assets/ww_hfas/textures/block/cinder_planks.png new file mode 100644 index 0000000000000000000000000000000000000000..bad9e57d7e6a5b529569edc74156bc82a4efb715 GIT binary patch literal 484 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 D5|!%2 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_trapdoor.png b/src/hfas/resources/assets/ww_hfas/textures/block/ember_trapdoor.png new file mode 100644 index 0000000000000000000000000000000000000000..3c983165d5ca5af426dd2ae4c440c6e047cf2809 GIT binary patch literal 491 zcmVPx$rAb6VR5*>5lTT0EKoG@$4#qYzWCVp+NKSi5T5c&)&N*@53-B@f4SM8UsrW|Y zT(G5J_fR=fltSHj?7eWPvj9S}JM zAWNUYUO-uLKUKt&@sK2rF+Ja>$_qpU=e%nGoVaIA7(CEQ`}p~ar|Bc!pl>+mU6NVU z0C>KS31A<e>d~mxO>f=o_o8hBuhkE=9GVlf>UUL7uScid%+lx0CvRc%Mc$xq1kpmTJNp{`2by3sywD!J#m`1`p3I^~ z_Pt(VJ h(s#ahnigP)Px$#7RU!R5*=glg*BsKoEpK&|ughAn|8nD^cW&6)Dob|6}Bm%U+NbOB)+(Bx5GV zww4_5%)+Km!%*E_UDabfe_!|2z63yqA<}bEmu~p>TmaOiL!C|rlP3{6tYsYaG7L>Z z;7b5fIVAu3{m1-Mmu`aD9ct`!o{=Zfq$)sB)>Nt^Pa@Rmgk~9wo`rqI=~|@cVyjDM zx&^*ucc|GN>PfM5o}pQ8&sScWJL!`{EP90WT#B+bw4~<}i=OSdGxG!d`1+Yjbu_Ia z@FhRXp^3f92I@}NvaqkjqUU(G`0{CH#LJV2O1&3sS_MF!M2Jdt0}wdgEn+c%s)y?7 zJbTxr*f18{xS)Z0jHXqF`q+VS=sTf1=;SeA(Bf+77R3gD)#{tU30-;IU7xpy+SuE) zigcb$m;}DW*0U7FhN9T~M|~XQCWe8gM-s7nbku-Y^c)}OvCY-Kq+(cWTUT1xSET3S zbS=Py$vO}?UCZuJ59>T~!dk{rzh0&Qq)!en&7D;inWb3=g6i*$?fE)+2ihrHh9Sqh z#m)73eVbA3OY?vLUf*WiTp#JV=%pJov_A@^E&3=ZV75_fl_wGZ00Y$V07)$gp8x;= M07*qoM6N<$f`i-m0RR91 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass.png b/src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass.png new file mode 100644 index 0000000000000000000000000000000000000000..19f98b26e79f65f4dd8da7e40356e94f56d4da8d GIT binary patch literal 232 zcmVP)Px$)k#D_R5*=gl2LP-Koo^P85CH82?&}pb{z9y|NoEaOCQQObtW-jtifF%SnUJu zmRMf6d-mLO4)-!xe4SrpRpWauv-<#mvONKyRK@H*plna32Kf1s<9jYbc-TUC0O&VB zFtphoN`&xCv#e^$E9dDkp=?hCLz_Vy#}}=pU3J|T3Wl~xr>X|wIjE|^dU{NdRgF@W zanfYnobUE*-(_b|HAtn%cY6S=?Ykt6BLMU)bnJUykni?9-1$hQj0j*bO9Qg1&87Z~ zgH(*pfB1cr_(F6%rAXt*VAec|P<6w@olhD^M(B_iv{DjJ6TU6xNTmRbkWM{FqwoR{ zPZI*ayDX(b)s0CcT<6odkJ<4w=_Y<{?h_*W!shq^z-$tdWorPI%Z1_DTDkA8>&(RIw@1|tVmvltgER^+t2726_J;f@Pb`y=LN%09u?lR8 zs%3NR3~o1NiSd}X(}33Tc|MOQUURPx$2T4RhR5*=wQ_*U}FbuqzgvK@*lv4KA{r{(p5CRL4GZNSyjJ&hz`X!EhI-gGR z+vnr)3jo1i001Hhyh890N!Zek=!Ys6f`<$Kf{*tI02uqO0CXv#CTmPFPSOv)zBi10 zhxIrs02A?^iJb=41vT!lljbPz?#*12Ox3s!_}zZ}q`sG1oJQ00000NkvXXu0mjf=Gl|Y literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig.png b/src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4f9f6a43b8b97e06d5cf37edd134d568c34c2a GIT binary patch literal 347 zcmV-h0i^zkP)6d)Tmqg_M{p|(@XU9pw%~s1NU<52hzPfP{{L_=Z>vguh;aKw_xVS(ZFnp3v z{IsehFYfDH^3E@YnzC$(W=GdIek03d|6sQ!Kt=^vIWBzoNY{8WLizsT9$#LC&X-ps zou7_d>uUn}_O6unPNy!OC|Hc)ATvKUFCXeff|*)uQow@K*~~F#xPn6bw^(c&ASc`F zwpAh{gwC2vSL7odMRBo)0+amq^{opFY%K!0czTvFe}hc*h5`U~z$HGbxn!#=g5}xl tc0L8ePjUqU{i8z%;WwGsV#&DregM6Zi=&fUad`j$002ovPDHLkV1iZJpk)96 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig_wall.png b/src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb48a53021a683d21a60cf36398a60bf377b896 GIT binary patch literal 323 zcmV-J0lfZ+P)3gZ7)LZL+{d>2lFqd0|?w=#RT=Ng?&E;l>x&6_u~M1OVq zt)}SIZ1IaJBTUXDlcHQK$n<=>`@+L~LdU4C)m&C{0(bbn1ULbaAPG*Q3Xl`86XCcly>tiEpvZ*?c0oXtMM0i%Xf^{GLM9c~2wL6pe=``@KE^oWB VcbO#oAddh5002ovPDHLkV1f+1iVXk& literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_door_bottom.png b/src/hfas/resources/assets/ww_hfas/textures/block/soul_door_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..55cbba274dfeadecb64fed0f805a0595b545f24b GIT binary patch literal 441 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 D5|!%2 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_trapdoor.png b/src/hfas/resources/assets/ww_hfas/textures/block/soul_trapdoor.png new file mode 100644 index 0000000000000000000000000000000000000000..3c983165d5ca5af426dd2ae4c440c6e047cf2809 GIT binary patch literal 491 zcmVPx$rAb6VR5*>5lTT0EKoG@$4#qYzWCVp+NKSi5T5c&)&N*@53-B@f4SM8UsrW|Y zT(G5J_fR=fltSHj?7eWPvj9S}JM zAWNUYUO-uLKUKt&@sK2rF+Ja>$_qpU=e%nGoVaIA7(CEQ`}p~ar|Bc!pl>+mU6NVU z0C>KS31A<e>d~mxO>f=o_o8hBuhkE=9GVlf>UUL7uScid%+lx0CvRc%Mc$xq1kpmTJNp{`2by3sywD!J#m`1`p3I^~ z_Pt(VJ h(s#ahn6!zD2Wv%f612K|7VF77K&g{-jH1Kt(?uUu+_c$_~y*anQS!Z z{~ub7T<($&iVD4Zt4fKHUiL(f|-W zq_sW7dW4M=1o^C(g2+;U8qxwJATX9MaP~6n=l)R&@F1e9Mk?wVK(dMAD^5h#>-h7c z#UTX>m=;aZBsm4}kGh~h5qz&x(|A+qegMdc-Z*qb0KU}?j3$%C8pw(2LfUIRz_zlq z4|d@L?|r#YMHN7bzJLGzQ;`4VFkMvNrB40#Zj3d!HjQ4kcccc1$&GDPmD$v60MI1* e2}Ger{|H~hV$%PN^+x~z002ovPDHLkV1fW78%joB6W66Tt?RrfEvL1>J9wlQzYHWqx)h=gjQn;_db2 z*P>jGQ`A6q`_TL6_qt2CNYb`=KFPdbl8^gBjJn#JV%XnxW7Al(+18dQb6I@ZGCKZ| z!Yt2HtD4~2bILZ87;8scvsmqY{eU|j2g z?p$ho20R5nMw(={h|h&+7G16@A>s&-TA#ro1jFI)@}aKHeUdd~YzeuNKc-LNvF`s6 Q?EnA(07*qoM6N<$f}Y5}p#T5? literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_blaze_log.png b/src/hfas/resources/assets/ww_hfas/textures/block/stripped_blaze_log.png new file mode 100644 index 0000000000000000000000000000000000000000..0700787322aed152f6f85ca265da329b4d4e48fb GIT binary patch literal 337 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 D-n+=j literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/boat/azalea.png b/src/hfas/resources/assets/ww_hfas/textures/entity/boat/azalea.png new file mode 100644 index 0000000000000000000000000000000000000000..c43d768dd177097db5f11de997141e7925c35c24 GIT binary patch literal 3440 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 XY0m!K7XWT^00000NkvXXu0mjfJuYI! literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/boat/cinder_boat.png b/src/hfas/resources/assets/ww_hfas/textures/entity/boat/cinder_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..33686f8516f9c055b01429c05cab762182d5356b GIT binary patch literal 2873 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 XY0m!K7XWT^00000NkvXXu0mjfJuYI! literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember.png b/src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0fe0885ea852727be87b0c3b59af5dcbcd2b87 GIT binary patch literal 2866 zcmV-23(fS2P)Px<>`6pHRCt{2T+eUY$QAw!OC!(oa8?L{PnE?0Q~F^FUOW& zE*1tkU5CjSa=MQ7m*1SIjrRo!@r#zr0RYrg21-gpCD{f5)cP4<`xQz{H~Bd_-?MCV ztv0VC!B>aMQ#tdkG1c~fFHY1cYdeYYg#i5K$uIHz^M6Cjq+v1!Et5V`z4r;yFBLo0 z--!UwvuxCm;nyq4HfoR!L1jfF_e29Hfm+`=KkfETgTw41fX$I*o<92&4_59207})$ zsqX*2Ao1kU!-1B|K}}`&N%O4%lYetMSj*+mwc6-fj-mY5{peb4?op^7)lpNkygl=+ z0oye3HDdtaxo}klV+YVI1prX*_1xM`Xo_>rrgPn{_cW#n+jLs0t17R9ZWm7;JsdE% zoxgmwF)>%2O{dZ7bdXI))C1gE&`|4pvnqGJAh}+^b;|&E!2q}syH=YULsJxKFwu3f zJV8lmSjrz`-8Gm#KhNt2Jwt)dc7mG9IBmP%N4BkB)nxML=@E|YVI*=NC4it%h&;Q{Tcvy{mor34DIBwwVUeG z>;t^c7vZ&0hdw_qwL#vY)*o)*v$Q=5>l>rj{>y{}V+`1S#ZS;6pmlqgOC@Yuv+j8> z$P#BK)e)Bg#twjP7i@pmZPTG|{}-)HCnu%$TW0a=d=CX+g4S~wcg+b3IH4$*QhrDAm9N2@Br^|i1DKi9t4WU z&=iHQm71amoiENN!*jI&bX=2e+_P+~?>1dG>@o0BrNex7Ypz18Xwuw&qP zssPhELa|ijo0r#>R9_P2E_AUht+-}ZF7fNM^qV+5rJAh+F|g_4pVNXzAryIwfAwlziJ18uc>giXVtZWIJc&*B$3ICi6prh`}d+kM+jv0@U2})RC1W=C!Py4_}Aa=066_VJ_$#D)sQf$ z`)xIhsbm)MMpkZpIM6a_R0KCxRFhapI@D{gf6TS+qMAgb+lOf#aqeulo#UM!E>Gma zp8ff6=h^}EdjXH;5sjnYNy?shO}t(+nyBy8oHBxDFp2w3YXI;ifF7Qs3)ifWQ?toRc!OzQ~rTz_Bta_Sv= z<#GbWnY_{IU@M)*@?0642GD@x>X%i|_~HP8yJBn_NfdA2;7bD;pUMKjN4Go`jkaR< z`p0Mp#-{;OGnyC1tq-${{Fz7LQse~ECJ5lI<954)MqMuG{|*38UyI+qmCFOz8d<&% z;1&E3>-d+K_Z5-O30%l~QTwQz`jh18Pm*3;Bwn;^+&e*5Fd@>LK_A?{3jkpIyU^#$ zlHdaPxVEZtVP#mEVfP@=_N_nZRD{&#R~u*kk*CGh>s{c3^7w)-BE1>J*nuR!GIjvb z+iQv~ar zX1<3$a|E;JX#f)c7eyEsCpF^JKmKW|(LUt_0>GwP#@3+~ND2|P0)JM}rO64T51~3h z7I>UD09ZU~2f{S~k^lQ+1u-@lb?qXssg|*^<81qCnKTz-0B;~@nKWuf6E&lWUo0(R zZD%|~hzj0G2M{%YF#g}4`JS(bTZa~MbI#6R823-lyf^)hKyWK&t zR0QC-`OB0U{LVUn$LUA&|8d;kuN6!apEZ}|p|Adp^ zk>(LSM|M%j4R8hn8DH8y%{m7$fg~)#k4oOaI7B@saK^6#td_EYnJv;cz?sqhcjc&z z|JkP}q z!k|>GpuST>salz;jxh<$JXpCuAo}-{+c&roMCEUJQ{eJ-?-e+8HLfG?$K6eZNKtjyhri}0AS5^mz;o!>Z05Kd~ zSsfsTgIEW+;)r#C7%^hRh!G=3j2JOu#E20iMvNFSV#J6MBSwrEF)l0q4=DGgTyq}~ QQ~&?~07*qoM6N<$g461HrT_o{ literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember_boat.png b/src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0fe0885ea852727be87b0c3b59af5dcbcd2b87 GIT binary patch literal 2866 zcmV-23(fS2P)Px<>`6pHRCt{2T+eUY$QAw!OC!(oa8?L{PnE?0Q~F^FUOW& zE*1tkU5CjSa=MQ7m*1SIjrRo!@r#zr0RYrg21-gpCD{f5)cP4<`xQz{H~Bd_-?MCV ztv0VC!B>aMQ#tdkG1c~fFHY1cYdeYYg#i5K$uIHz^M6Cjq+v1!Et5V`z4r;yFBLo0 z--!UwvuxCm;nyq4HfoR!L1jfF_e29Hfm+`=KkfETgTw41fX$I*o<92&4_59207})$ zsqX*2Ao1kU!-1B|K}}`&N%O4%lYetMSj*+mwc6-fj-mY5{peb4?op^7)lpNkygl=+ z0oye3HDdtaxo}klV+YVI1prX*_1xM`Xo_>rrgPn{_cW#n+jLs0t17R9ZWm7;JsdE% zoxgmwF)>%2O{dZ7bdXI))C1gE&`|4pvnqGJAh}+^b;|&E!2q}syH=YULsJxKFwu3f zJV8lmSjrz`-8Gm#KhNt2Jwt)dc7mG9IBmP%N4BkB)nxML=@E|YVI*=NC4it%h&;Q{Tcvy{mor34DIBwwVUeG z>;t^c7vZ&0hdw_qwL#vY)*o)*v$Q=5>l>rj{>y{}V+`1S#ZS;6pmlqgOC@Yuv+j8> z$P#BK)e)Bg#twjP7i@pmZPTG|{}-)HCnu%$TW0a=d=CX+g4S~wcg+b3IH4$*QhrDAm9N2@Br^|i1DKi9t4WU z&=iHQm71amoiENN!*jI&bX=2e+_P+~?>1dG>@o0BrNex7Ypz18Xwuw&qP zssPhELa|ijo0r#>R9_P2E_AUht+-}ZF7fNM^qV+5rJAh+F|g_4pVNXzAryIwfAwlziJ18uc>giXVtZWIJc&*B$3ICi6prh`}d+kM+jv0@U2})RC1W=C!Py4_}Aa=066_VJ_$#D)sQf$ z`)xIhsbm)MMpkZpIM6a_R0KCxRFhapI@D{gf6TS+qMAgb+lOf#aqeulo#UM!E>Gma zp8ff6=h^}EdjXH;5sjnYNy?shO}t(+nyBy8oHBxDFp2w3YXI;ifF7Qs3)ifWQ?toRc!OzQ~rTz_Bta_Sv= z<#GbWnY_{IU@M)*@?0642GD@x>X%i|_~HP8yJBn_NfdA2;7bD;pUMKjN4Go`jkaR< z`p0Mp#-{;OGnyC1tq-${{Fz7LQse~ECJ5lI<954)MqMuG{|*38UyI+qmCFOz8d<&% z;1&E3>-d+K_Z5-O30%l~QTwQz`jh18Pm*3;Bwn;^+&e*5Fd@>LK_A?{3jkpIyU^#$ zlHdaPxVEZtVP#mEVfP@=_N_nZRD{&#R~u*kk*CGh>s{c3^7w)-BE1>J*nuR!GIjvb z+iQv~ar zX1<3$a|E;JX#f)c7eyEsCpF^JKmKW|(LUt_0>GwP#@3+~ND2|P0)JM}rO64T51~3h z7I>UD09ZU~2f{S~k^lQ+1u-@lb?qXssg|*^<81qCnKTz-0B;~@nKWuf6E&lWUo0(R zZD%|~hzj0G2M{%YF#g}4`JS(bTZa~MbI#6R823-lyf^)hKyWK&t zR0QC-`OB0U{LVUn$LUA&|8d;kuN6!apEZ}|p|Adp^ zk>(LSM|M%j4R8hn8DH8y%{m7$fg~)#k4oOaI7B@saK^6#td_EYnJv;cz?sqhcjc&z z|JkP}q z!k|>GpuST>salz;jxh<$JXpCuAo}-{+c&roMCEUJQ{eJ-?-e+8HLfG?$K6eZNKtjyhri}0AS5^mz;o!>Z05Kd~ zSsfsTgIEW+;)r#C7%^hRh!G=3j2JOu#E20iMvNFSV#J6MBSwrEF)l0q4=DGgTyq}~ QQ~&?~07*qoM6N<$g461HrT_o{ literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/azalea.png b/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/azalea.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd1c8dd835d607af531724cfee98e47a255a231 GIT binary patch literal 5527 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 Q|BL`rBMZYC1E=W!0hk_q@c;k- literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/cinder_chest_boat.png b/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/cinder_chest_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..35918dbfa2e1860ec4d32e197c40386bac024168 GIT binary patch literal 5262 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 Q|BL`rBMZYC1E=W!0hk_q@c;k- literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember.png b/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember.png new file mode 100644 index 0000000000000000000000000000000000000000..c247185aedf380a940f2ab49f0ff6e627e0dc99c GIT binary patch literal 5396 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 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember_chest_boat.png b/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember_chest_boat.png new file mode 100644 index 0000000000000000000000000000000000000000..c247185aedf380a940f2ab49f0ff6e627e0dc99c GIT binary patch literal 5396 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 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/cold.png b/src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/cold.png new file mode 100644 index 0000000000000000000000000000000000000000..b84bf3e63f0c5a0a68189b642a2f57f459db25da GIT binary patch literal 1297 zcmV+s1@8KZP)bX&V{QE5VH z7v0o~iX_Sy2>wAAtv{4PMH8q*!UXbT$RZ9&ONrC>-TTga_r1LMCUs^qk#peX+rB)FnwcitE z>s2hs2xLJ0ntyfiv!p0?8_XJD$&e9{7b}GVU^d)R2OHsff_~?<{Y!FBh{6dFoW+Aag2uyi;{EUG*!C{&DvmznOgskT*%scR z@62IsACs`1K>Xf(SEzQ0s^+#M*xTqk=l!I1<4mV6aPek$@1wBAn~6@Hvvh1dXme1^ zwFOu14>mdWfK`@+mz@2u+?f~w5!KJT(sCgSI^xcBy63(IMT3+YaP2x1SPeagmY6y% z_f4(BwL|ya!;?2Msi|4zQM@`vEnl~Wj(HXL`#P>=o{a0_x^7J=?fPL)Ugrxv1sbcK zIq{fnN4U%zp#T&*K4ck_*=AX;c_;v}#C3urcw)PL%k}($_K^B`3PD-j1fA3$%>R`Z zbET&A&u(YlJR%VeKvOlvnt0`_^XQ5;tuk)Q=%D z_k{H-<**l81ISE!vzP^BGmKFFa8w7}(akX~F=xxJe3(Xw>@Lj-Mh4$W?Mu0DOE4kMN z%S=nN%@%N(;+lbWqpBZE2SV0Casc2*w|$$z7oh|1{p9T7Hx8c9%GTT;pXp5D0&Cer z@vA%4lht_Bk6g5!49JDCARC@jW`V18<=g>!c=EUchPOz?7l#T0hzEe=NBx=hOKlP6 zK>;mRhHb!CTk3A5O>2L&i>I~}t+l?kDAGTcc*{K~nsI_r6`&H(%WZY<0r|6c$s#vgn@nY-|@N^b;x`Pah= zu57H5tARq_`0)l`bAP5Kof`A|(2nYg#fFK|U z2m*qDARq_`0)l`bAP5Kof`A|(2nYg#fFK|U2m*pY5h3s&UR1&ac{L4X00000NkvXX Hu0mjf%1v%& literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/temperate.png b/src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/temperate.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3d89f3c5f771c215b29aea8953a1ff0ca06b6f GIT binary patch literal 1353 zcmV-P1-AN$P)0Z*l%T>uk4YpY54FbIv|H`p$n@|GNDD zT6--sS7QEI`t^?k)*M@aTZPAi#i1+e#8w?y zc=#tWh1figK_vjBuc^xw(qX%e`5>4E(2L0=XG`nQf>6Hp<%P@ z_`+}+Xb=1A#f~k2y-@Ce%X5Py3p2N4^{w5#$#?56Y*1 z4;gy<&k8n@aqT}lgzdR1oU4}_mlMYgP68Gw!7jzgzE<1ijz13Jmk zreNcz9eplv*S)<^l;1z^ls|jkG0CDUdXXU&E;e+HK~fa@qwAPqNtAv5$ z-cep%@s$JENN5}0Arl*a6=%;jakg%dh0k|8K$}W*u=}A$L7ZZ@vltj!y~5l1!BPV{ zzBGw_1zHz963lPwfwRGt*aFOUeucK_CE0pf>zJOc!VD|~*1df>73z&XQ8d;#oZ zZ|gI>5PLXw9&BG)x;y^Uhu-afJ}YPF8}Byw{_w;mmNxL)H4Z;x0q-}cuJ1ZF*s*G> zkNNDKr(OFqCfGLdwcxf|@BBRj>9?;9VO#wrS#hjV3_=quj^B}>k3Tj#K05|IOgtl{(mO~CU=d+&Pfch{p*HJU-~mvxMSCE+nx8e4H(+i{O^z?5ckUBM-ejVfA=k2 z8=aOHe=^^r#ki}h1l2d*Hl2j{;vH1ze;;tsiDL(;8s+Gmq`~+liSCizF zpMWIQ%3^GO0ZOMsBJ3{+DtzeU zA&@`|3Mz_jNok2Bmo!34EF=ZH?eFZ)dUo6EUhD39jX9ua=A1cmW`1X8&bgaKKJCrE z+5|-U$0Ag=aLSf;@S7Sby0(bo@4l*@g_uXb;mo-#9?zsc$IqBWr9`8HrW9zqjZKe@ z+Ji(3H?ExK497FQ`2xTW^nEi9uqVRof77P~08YMqEb&JQI3mJ=WbF08yaLA;01kil zigO|Oe4G1QyAFPDy z3HS}|kLTo_kPRcyU@ZQ?!)cZGYKEx2zLM@X)>)j{fyX#EUW4_l3v=Lk4|SFD0;6Z1 z=e4QO$Q&5a_suK?$Zcg5-}gNeh9MEEJHDUDC}ed;u5;s8-q5uh^xl%goavNVD_GVX zH}`Nm+c7Y!GNh|a3!T%jcbBaQ#SG`n&hZ2nGOsI+jvb_BmLS$KNM%VXKlb3}ka_-) zhePds^Df?6o8VkVorqouHdj%TI7(1xgRTv}w?IinwS6KwZ4b_K!WV$B{o~sR`|5O1 zcK8A?vAjwd0%P);nu4;!p%s(kMtRr#&= zeV$`!FpL>-F{K=I(9IWspbc>AA0L^dNOg-E1|4+sO#waZbvj7H@{4l`e_^yN-1D4k z9CG~NVTWhpF*kAlzOr?=*9=|#-M};iP)M;C_R&w5opq1peR@mK>DGZ?rD!#kQ~&%f z$!6!3M%O<$$IfHQ&AY^vbM7%O9*&`neEDIYG;{+9jG?iNVzhrc7&@(q%!5&piu zP%U0%%Fy=5wwfpB&pN((6y!PY0QYBZ{#gwL{FLRdN48Rfn2xxZMaQU&%&$zk zTv)UXz@3Ke3H=ndoxhm!i72qTyOhm(Sn4!8gvS)u4A3QN!i*r63A0bxN!_SR>uVDg zr4ibEpxMshMa?Hu()FwVo{B6ku+WR*S9;`BO6zqy(m~r1kPc;DI`ms6*;BgkXCFZh z>p4XhoM;OL5C;IrW7Gofy&RhD7}5X*Pqoe%6*sk*#nVz$V5JW0<>JVE(7gkIR5v?% z;gAwV=ss+_MZJT`ix}SweE(x%Rq-T0H;& literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/pig/pig_muddy.png b/src/hfas/resources/assets/ww_hfas/textures/entity/pig/pig_muddy.png new file mode 100644 index 0000000000000000000000000000000000000000..691b1b13b86408c51c7f1041f383fb88c66f7dd7 GIT binary patch literal 1929 zcmV;42X^?0P)j4tjU)^$ zfSZgKW6v)KTvgHW!TGaBP%4Fw3d$~kn{fLB4;JK*Y#3KCwg-Lb|76YWts_ud9tFOv z0(AedOFr)El4a{w88FtxyNTOln^*g&(Xt9a@)H{y%-U~l94BAx>o&aoF?4a*9_IPi zw{?u{UDhObP8=%_@9PlG-$+j!X&Lgsk#k|yUdfn@OMU(M;`@veXHKeaGnGEyw@{d zcYS-Y&vta=kH&4w-;_~hYk3jK}Or?wr9SXID&x5D0gP>vr$$Wc`*cIPy5fWef z<9BlOdC8FI1_;tTQ{29AD19_g*}D`=Voy&9SxX^pFK>YmNCxoIZ z3Y6A>`^0S%ZW0netn(^G=0bH!@g)YaTwBK6Q)~(kR32CW41is2#>LRNb-N7tcL0t_ z_+oa*bz(MA#`oQEkI*qB!dMey?jYDU_~1(nDNgz4K`+Y0so+n$cI$1czO>;c4Z zbviCqaMhbVptZS4fC}LWZjX`a_*$sln#AF^1(Zafl|X&$)>r?q#FMG)8*MMBjo4T; zkWH}#DzkZ&T@7VEP^m9IzHOUW&m_GJjP z&6Of^p*p4L^D%N8A#(t9AekC%dkO-OV^j44Ffr|)rB}X*GIIZe1cTtKg8%6#G`S)$ z2fs~760s%?j|?3))h_@GWU)SYYeWmv%CxkCMV5lvLGdL9u|{9I3};`!hzLoVgmZ7a z;gOm6{u-)Y0DdP-erI(8%=_R|^A18!7ETwyxD>EaV8;nXEMgk?zfbZMe#y&;$u^Jy ze;rjXfT?_hKH>sI=wZ}kDRBqXr0fxzH12>1J&c+xCGLQlls!U|#vKr$hf$NI#2rwR zvPWprxC0{eFs{o|Dh(2MK&2I{H~Y8)>g|bEnoryTl~%0Y?Bfoowq!WQ*Due3e9-$= zrcIeF*Sq^X>c&sDFIatM-q+%e91yJ{Efo5#fwceeAXm%DN?rv-d`pD)D0jjb(e%(n)^ z0;(&fsIJftV*3lKD+N#A(1^^cn5;B-(2x~{a8;0;Nny`o7@M)kGZ$>_K69Va&VXG3 zcmTKphHTuw*Cte5_=AFYju<=b3Be=uqqc(hS?+_B-WC?AamX_IZK*O*&g1zVu1PF~jP|$U6y^ z)>v~AKe``^uS3R2+S{&C9$`0FBrS>hC05&!ZLt{epANE9s32M@@6JGb`RTE3Eca;$*Ok!-|0zbV;$(7T#7>LZhm8Mba9mC; z$V>pcG>w_Ke%nrp(lHaG5I*UaF{!_y>rq*@u2QaUuM(GrRr}=&+J4RZnw8db5W0KS z(}a(hCAPp-0LB#T@3X2j!hVvS-jgk(0crF;Tk}jdOSL8jgDHwfmw3Po8@{=rF=n~+ zxuGxCH%SEcv~QK@(+o6DyaUba*5$jv9LD5a59Z9VQ&U~cw_-4TUgSMDB9oL|0VuR; zQ@Mgk)VQivX9M{9hQ_=+EG%Z5*ZkG5@9y8g>o>6=n@*mWGY1Z8Az0qBm230!Ahe3v z7uoM(=fGY@x_>6H-j3m3PGoOrDqbwghdSP(^y7ZV-k=1=$Bo2Ro4>kNzx8pM=h!VozVM*g3A!a^sv2R2-Mk#c`75H5e kZ%b1_-%=9)x8Vx>1paDw)zR^d1poj507*qoM6N<$g8r)}^#A|> literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/piranha.png b/src/hfas/resources/assets/ww_hfas/textures/entity/piranha.png new file mode 100644 index 0000000000000000000000000000000000000000..c34e5e6d6b6f562dcbc0a3facb094f0506c0275c GIT binary patch literal 856 zcmV-e1E>6nP)pvf*=GBu`(%y2q~;gA%cY#Hll@K6VQNyTEr@aU^-(Z zauN_R5~78OSa^O#L-dqG0~W&5-*R*AZQkwM7cQw1_-8(Lc6Z*)f9K4Jp}`cKJvnUU z!-?_qW%a&=H25dVjfSAVtJUP` z%&g4Ue^@{N`X;B6x!;T8CPD0$a#>2Hl8`)c;L{%wfF1+$^Vg!i`0e`-a`3xI?c=;$ z7`?e~v)t^aRPcFIp1Xos#)Db-`7 zQNlq!zKDa7Ko6kzTz+Pz+Db}GPa8;HV~doZJqEHtI>^VDKt>kOk$}p$m*ew6!oc_E z*_H#44)Q@l$jIgJLN`+Zo}${_lm@avI>-kJA)|jePmrgWbur0h`D1+svOzk?N2%#2 zqy!wo(+d%cJ;YHpfL;WxNysLi5I`RrxzslK@P$C)AQY3eW;vh>d?`>H3Hy;QbOa;S zPr^X$SZR36z~4Yi@WFnPaC^;{Qf_7dF$##RdaN`&JHQ4m0_ZMCLVK-#l3)g?O~RM2 z-)PMV_2)@5baX%ff#3G;5`Z2HI0L8vdQy5?Kr8SSK^q4+0Qd)lo)=Z2^gvtT?+@7>=fJ|} zIRR|ud1-5q06#zB$n&R96`GptQFNRG{7eH4%#tp7v({sL9p?Z)P#|=OOWsgiXw7g5 zAc#@}^wolS_Ug^D``3*m&A#0`3(xOvT&!obJwtV_rd&&4tpY1vfjmP01pom5|1J+} iC;$Ke21!IgR09AgWX@2cC?t0P0000vO-ft^c;ujb(xR z{Ryyd$kYLHzsEeK=IaP&^3msRX)C|aNPrfL0)YpV-!&jpBI z@T?K`82F@j0Ca5Gq_MxHkF~SV%sYT^fH8}%x^U2$y8_`jpUl|2X#Gq9prddAKbu!7 zsteJ#f%%zl03$nF1Gs6?`m`f$>nD8!uoiF;Vjp}Xn13fodB{p0I(h12zbq7A88H~pT@--B=F1=1Te`k=S)Y6_oTv-u0=2Vi?)DS4 zV`_i!T|IdG!s$%#;P{zSzN!aHI)ZQ<^szlum~)*xI3A7;4jHG;ATTH{2f=TB!JFQ^ z|LJH@nd*#SAUN(~>m4tf)CUY~LLgix4FNg{C;<0pO=fV$-PS{zv)BRuAQV7mhP$pC z&pf30xA8>1`4H+6^jZ9PCAu60&vp(ckBndt?0MICk5?cbL7=nEYV7=W%ls$UHK(ON zIs+u$S@}^LmQT)Jk5bWr}h_=!-6Pyhe`07*qoM6N<$f{%iuCIA2c literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder.png b/src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder.png new file mode 100644 index 0000000000000000000000000000000000000000..0b92ed6b9f1e3c6401f76e887ec5db02cde7ac0c GIT binary patch literal 936 zcmV;Z16TZsP)Px&Vo5|nRA_q@OOqEM+w6#}{_f?@VN;x^5H-KnCv#fZSIG&$r)vT__W@-e{m0nzk*yhM^n8NsLIw z=@@{a8ySb4vqt0HyWvcyeLCA(i0KA{+uC8uOX80i6T^v zGI>seOby6KRTU#~G>X$xlWXM~3r;+>lbk4n=QPmlMuYy#mpH9f#+c88kc1G z^pfdnF)v2WXV7SXl4XnLDI5Sej-E)ync^hJ-1TF_aS~&U$n^6CNiAxYULy!zQzlQL z0GzRH0OYR}Cz5e0SiPELVNxO2=S8XgvUmyyAn-eEwa*dw9Rk0D)QN-VPe15& z^?yTk*#ef0O8(^YSoKWMny$y2UKaqii5*B#8ce0ZePcs-r5MZ@M0vUtZ5Rtp;XQp_!(I{lzr^ zjNLtq-96&_`-FFY`6vQV*}L)81VH#*-t@Yt0Wl8)_P_sbwZ8*|-=$W!5YZ5r)qo#< z1U`})Afh2}888-*Pn#8dEo*8e?5D~*=>*Nty=(W-rvVO4B*MbW$IfvDm&*d zPMWSqt!}ZlQBMQ0woym;T^>BRyV^AXn7##+XSVzf_=Hbbef$IO6r5C^M_)Gp0000< KMNUMnLSTZyfxzSd literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder_sign.png b/src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..0b92ed6b9f1e3c6401f76e887ec5db02cde7ac0c GIT binary patch literal 936 zcmV;Z16TZsP)Px&Vo5|nRA_q@OOqEM+w6#}{_f?@VN;x^5H-KnCv#fZSIG&$r)vT__W@-e{m0nzk*yhM^n8NsLIw z=@@{a8ySb4vqt0HyWvcyeLCA(i0KA{+uC8uOX80i6T^v zGI>seOby6KRTU#~G>X$xlWXM~3r;+>lbk4n=QPmlMuYy#mpH9f#+c88kc1G z^pfdnF)v2WXV7SXl4XnLDI5Sej-E)ync^hJ-1TF_aS~&U$n^6CNiAxYULy!zQzlQL z0GzRH0OYR}Cz5e0SiPELVNxO2=S8XgvUmyyAn-eEwa*dw9Rk0D)QN-VPe15& z^?yTk*#ef0O8(^YSoKWMny$y2UKaqii5*B#8ce0ZePcs-r5MZ@M0vUtZ5Rtp;XQp_!(I{lzr^ zjNLtq-96&_`-FFY`6vQV*}L)81VH#*-t@Yt0Wl8)_P_sbwZ8*|-=$W!5YZ5r)qo#< z1U`})Afh2}888-*Pn#8dEo*8e?5D~*=>*Nty=(W-rvVO4B*MbW$IfvDm&*d zPMWSqt!}ZlQBMQ0woym;T^>BRyV^AXn7##+XSVzf_=Hbbef$IO6r5C^M_)Gp0000< KMNUMnLSTZyfxzSd literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/ember.png b/src/hfas/resources/assets/ww_hfas/textures/entity/signs/ember.png new file mode 100644 index 0000000000000000000000000000000000000000..984af393e2398045e5f6145e8e72e218ad9a3571 GIT binary patch literal 908 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 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/cinder_hanging_sign.png b/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/cinder_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..7690fe12ca48ed063fa134036868336300845cd5 GIT binary patch literal 1070 zcmV+}1kwA6P)Px&=t)FDRA_ll02UcbaNb_{(Xr2!!f;?N6`>~OGzB7_vlh!d9{ z@--@s@FBQyBl!juQW|J49FPcyK$EHpsoxSSo9uem8>P!(J7YVs(S90 z|MNUET3O))x8Hrw1Gql(5pg}kUOtRgZE}2Yi2MF+v}%*~P95cL0j=7^Gd<#ZhK)Z~ z(X%zZ7{6*&`s2^-&et@1hjYR0JL`N zRBH{?xp|b8WsVOHaUQK=tvv=nottOx`|qR35W_`0H(K$vr2FewY38?R^#&mpsdCu~*v!;Lr8nFZE3b+jblK+0*{f7F?gvsn!}C z+jVa6G273cN`u#`O;}k5{Py>C-B$mv*Sk!VQn}(ie6XU-7K+~A>uVRz_QK+l2fhJ- zhYwb+^fkXQvxTBJTPS*^a>eT%Uszo7O6AI_@j(bpsa)}93q?^0ox4C*<+IPf^x~-$u}GA*+aaT;2@t4ob#7&Ldb zNvAV%!TtT#(9P264Ey^n(&-Gp{_^u{(GjP=1l9Hxf^!7&Sga^XKxzq}lBLIqA6F*Btz634@klNbRWcK@;x%Dr@d+)7;q}Dn2>a o`xSW6_%UO~j2Sa#%$T6~7spk|J()^{G5`Po07*qoM6N<$f|AS;umAu6 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember.png b/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea09df4fd803d5282bf0840328eaa5ced9e404e GIT binary patch literal 1063 zcmV+?1laqDP)Px&;Ymb6RA_6nXGKZHCC)mLCBEd<1~!?8>tx-{flX zDVHjHY`8jVJ|}rizsGj(C4dxZm=*;+;;H!@GnKNuE50^NiZO+b|WnoHV$v3%F+2h;RxqYT9o#S-dD8O%9Eh*UjCt|7j91uCOW7_~yxaaJG z_U@tcQR0vTE>wz?vJ*UPZey4hn%kuL93B9WWeJlFSEsuhiEr=o7SCnb+!xWYZRS^& zFieZ*TSnjg1znep>)1B)3l}j=D-rPkscTm*hfTjHBVWo+Fx7p=_j(nl+ve}hhp73S z>;qSePx*N(Bb`t@|0zzl&1c$IVS#?%W<} zH$O2Jmsi8Z<<+oSYlQLr`r3L}tu+qq4}#!SYmIPmc{LRGp3aL$gyRaS)*4}bZ9R*RgFIUDvsF_oufaBM$u+@Lh*VEl)Y?NZ~6fTdsw80U-+hTfD$gyip_d%~$ns zQj3JX|ISNFdwcS5JJUZYi?i)a2BViJa6Rd;liFXuc`MOO$i&mRl*`G-0nmfM^-wgG za@LV&Wt^xS+WqBl68of)5fSu)U|?hwO(k$W45G4#mxdR-02tanNu&X6dk0lf=0efG8^Q4*xnR zno4217%hgiPZ((?C;LRiAtD8@#C6&&x$gx5L)#~ev`jBI(^9eEJAp6uojMN0_ufC?Z+5n hj4{R-V~jD9!oQvz{!|*o!vFvP002ovPDHLkV1o6O00#g7 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember_hanging_sign.png b/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea09df4fd803d5282bf0840328eaa5ced9e404e GIT binary patch literal 1063 zcmV+?1laqDP)Px&;Ymb6RA_6nXGKZHCC)mLCBEd<1~!?8>tx-{flX zDVHjHY`8jVJ|}rizsGj(C4dxZm=*;+;;H!@GnKNuE50^NiZO+b|WnoHV$v3%F+2h;RxqYT9o#S-dD8O%9Eh*UjCt|7j91uCOW7_~yxaaJG z_U@tcQR0vTE>wz?vJ*UPZey4hn%kuL93B9WWeJlFSEsuhiEr=o7SCnb+!xWYZRS^& zFieZ*TSnjg1znep>)1B)3l}j=D-rPkscTm*hfTjHBVWo+Fx7p=_j(nl+ve}hhp73S z>;qSePx*N(Bb`t@|0zzl&1c$IVS#?%W<} zH$O2Jmsi8Z<<+oSYlQLr`r3L}tu+qq4}#!SYmIPmc{LRGp3aL$gyRaS)*4}bZ9R*RgFIUDvsF_oufaBM$u+@Lh*VEl)Y?NZ~6fTdsw80U-+hTfD$gyip_d%~$ns zQj3JX|ISNFdwcS5JJUZYi?i)a2BViJa6Rd;liFXuc`MOO$i&mRl*`G-0nmfM^-wgG za@LV&Wt^xS+WqBl68of)5fSu)U|?hwO(k$W45G4#mxdR-02tanNu&X6dk0lf=0efG8^Q4*xnR zno4217%hgiPZ((?C;LRiAtD8@#C6&&x$gx5L)#~ev`jBI(^9eEJAp6uojMN0_ufC?Z+5n hj4{R-V~jD9!oQvz{!|*o!vFvP002ovPDHLkV1o6O00#g7 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/azalea.png b/src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/azalea.png new file mode 100644 index 0000000000000000000000000000000000000000..38f2ebba2748877d28225836a6b3eb3eb0793d42 GIT binary patch literal 434 zcmV;j0ZsmiP)%VSnhjso9{_tbg!#(v0W|L`<9JHJTM#2>*jFE3ubexUH* zb(xnopb81AAj?Y|pluZ_^Kum3G*4VR4h2*|fc4nvTHX>X^@?7E zGwuG&#-Ly|i`=ewGPT+`a*J``+x+fXT?VoY&w(r^<^ui+u(P@0D<5ybAt(h!t8GOd zb32gVI^zce-O*fPIspU$eVT?G6KR@ko-=PCJ&-7V?SF9QU|imaCageGh|>vlgY;`6 z$VfyAkpAs(?$~bw##}s}iZuyEEk0=jji;M55%vMC*h{Qt-as1_>!CD>WK_fX cLyJ%2A97s9$38AGBLDyZ07*qoM6N<$f+#-1W&i*H literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/cinder.png b/src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/cinder.png new file mode 100644 index 0000000000000000000000000000000000000000..93b97394d1b97a47c2e84c1220fc1d14c8e305ea GIT binary patch literal 462 zcmV;<0WtoGP)Px$h)G02R5*=|lFM$>Koo{Qo5-0Or;Va^fdojEiprwxs@WiwZg_)=9Xs9w@gnTl z0T0v#pejUhVs+G!X58^qO<0&2+Y!AS$NHZBL!f4 zR=|(%02nR*;YvF7>fmJc_TAZv2WlM``@`Pe>xa1i#l`KHS-yCbNE;UfjFyiguj3+s z_a8p4($NsIe$&xam+5=DVyP|GS-yS!62$;Tv8VyMVwtP@(UwwPvDCI9=Bge$6O^tt z=(Qcaa_K74q>o4h)>(wENpU8Epi!#X!PBj+pyQQAB034eB!JW^oO^A6b(S>gcZgod zPhwpy~0k$FC1`E}pqW}N^07*qoM6N<$ Eg3-j?%>V!Z literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/ember.png b/src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/ember.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d7b2405570dcb3675bb38f0745ffc11d84980b GIT binary patch literal 479 zcmV<50U-W~P)Px$nMp)JR5*=|lf7=#KoG}&ck=nXHo<|Dh^{~g6a+;SQ6V8ggrc-mL}@8_3*Lnn zKs*2)Egc;N4GqC}md?jwuXnw7ktvQ{>;#cawX^g8m>GKqZ(ba>+tn!_(*smh@blYe zq9o>89CLSD@M`j%Pd@@a=#;9incRDVstTTpCG*u8gU9=OEkJbZ0og2PJ^R8|ngV#C zs;)7rrj(M~kDimwa)dsmloB8J_nx%}M=x70iSxLjJM8X0yo~!#+_0Nuv;0aTU7QzC zRdFTqdE5Zt^~rI2=lU5t>$NY;gP;d=wRsSbtrDy@ynXk65CBNIWG9Y&5r7p~Z3sog zbfkQ3iefrad@T$BLD$hKH(D_k389Fv+K`bj9c_rtz}R1ZcMyf4Z?(}1fKWvJ#ktOa zvRL?Y&;?j+7>lGwbV9BZt2eDXQ~wppV&UEY7omvQx;gRra5Im+0CY}W@v>O>d&k*~ z&@_zG8#G$cXyqN;Lc8Jfrs~HMn V*6;JAS5p80002ovPDHLkV1m;*-5vk{ literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/gui/signs/azalea.png b/src/hfas/resources/assets/ww_hfas/textures/gui/signs/azalea.png new file mode 100644 index 0000000000000000000000000000000000000000..3880172cfe28dba9c7e5873df562cf4f1d6929c0 GIT binary patch literal 362 zcmV-w0hRuVP)7xV6ooI5r8tS`P+)_N0d?t!I#r!`2cD!Wdtah&1_KK}L85Bn0VS1F#W)w+=}l#c zZ;5m5<71yI_db_zC68jz5qSotT8%zuTU*zd9Oz=n{+PjNaQ){|e6y)ucj;N}h8LMO z#OOvgeQ)*pT*^VhIeZHNE)vHY+Z>xs$LcgAXhvbfmb*#M@Re+F;EX5Z-&ks$O<(nZ z0*_+VKvVV@w%(>yeiBoL$xXH?`hruhdf>`f7&8BBUG)H8we7KCZ2CYB@Mf}!xM{-i z7F>Gu4sf25ws&FTU;2;5ynKIoY8Y;z%I-E89)a}2Gjd|q=CZZA6=xlRoL3IeH_8-vheN$;8PvuLKCL;a_38o=JOeBnhv6v#X zi;7Ye2}j;VqT)-p%lSeiVCXP@wMUEgwhAx_?asyHl$nb0SH7t!l2~Mn+qb^_yFxw_ zz_33YZds~`29c25wO^TRIT-_lMG@cxl0tUgk9dFV1D;h#(Ak^aV-ndBe#W)ggu7qN zE1*87zMk5SK$t>Tb%s$P=2xG-6DLI)o_Esz_~Bidh7QLcyW93F0O$(tn`4LzfOBI6IXtDxyP5 zmRbkNVA0a56p87NguG}%VuG(Z_xXLi6r8;9KF@vw`g<= z6lv;7?KTp#_709+|JNyBC!9pTVUs&OZmD~hYDN6!TJT!>RC5>*hvb>(WsuO)_5k%# z5!u=e9{K$muYWf1qSb|bxeBL<-J+qivXPe#JSd{NE6fI|iiLK=i@AYreK+nmqdk_H zJ4a$Lh_@gAO2_j;K_=MRyaFFi!v?JD?+)um1a6K*JN@O=BJ`8Hbxe;B5DJ+Ml;z45 z1>vT%{BjbtN=A#Qbyj!wFcE)@u|S99G|K_x4vv0YU}?NrPSW;&2?Z@exEH`a~oW z2;fhyEF$Vn$agT()ov{$>cfC)h zrC1$`oGqHNGw*^Vk}0B0{|gjBGHt!?kIDor+WvMXb&|6g7AFZc@b`=Q*rv?GX@X_0WKakhOa;WfcY>nWIZSbsHnSu zHP~w_AgjU4Mls;d%{>g?zWf4fAl48TY{r8O0XZFnVFn6uv13!pfZ_s>3Xp$60HzUS z2tI&f04NMV02Wv*i5AD2V^gT3wkyjVaxx2(%4rQpVOjSKla;v~W3$`*6w z!kfk?XBB6PP|#FZiasEn5JCt@DbbE%EdpZ96{aDBfI0L#cz9Ajd?xt5-_LAuI*OZM z_8WMfr_Cn*h8rqChHAB{@5MG7Jc?uS`Qg4kU8;`Oi_)y|aWq^MzT>!ZrM>zRNkL?- z@rsR7Q5&LAvhlM1h(*^;x!xypJOWj1b-N%jEsA$4Vj*!RueH+R+(CI&u$aKk+Tc%Q zG3C3P>o~n>5(IZ(<};^Iv@wZI-g+^A#411|P}|fhEsCaXdyhDKgrQfsZ=|!4aNH`+ z)XNQjWgN%k@X5(;5q5pn*YOJ69K2nS&66K00000NkvXXu0mjf0eQL# literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/azalea_sign.png b/src/hfas/resources/assets/ww_hfas/textures/item/azalea_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..092e6449b679f0986223b9bbd38a6defe4a6a4ab GIT binary patch literal 345 zcmV-f0jB^ZqC$l}OrZ0~Y-)Hx z^x`{or!%wL*|sA8eKHJib9K1{4&Od36-^B#IV^e>`=ukRLyO`sxo!uUEL~^}o`zEQ z%cQin9{N%)c!_4D8;-wu_UOXY@yy8W^UzYLF!MmeJu1%KYiO$`I6L(%!ArANA(S*G zd2y2XI|I=K+?`KFB}Nl5D+g%;tibpX85Ir0Y5rF$@M)-Ahbw4;``-HHrOmrw9Wa{3 zyZARe`Xg;93DInvFZVr9-Y1a+j{~Pyzk+K3nvV~1lF#Q{vgLFImt$_$KTRAjT=LHY r>eZ4=qJ_-O9}~QcK9go6+Y+n*TcIw}Drcv+RUC8n#?Fs(V<{kAhfDM4JJhvWSdtmtMU{db;uS z<^=$u-tIKK^RT}-vdlKAFO@fBs^D%dQ~-d_ssq%U1dtc&vy(7!F90YWGMtAtRO%pf=mN@7V*yfhjFW^ zVT=lLLR_wng{2X};?cCq_!F_Fa`b>zZAA}9u P00000NkvXXu0mjf?dFL4 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/blaze_door.png b/src/hfas/resources/assets/ww_hfas/textures/item/blaze_door.png new file mode 100644 index 0000000000000000000000000000000000000000..9191d0b8fbfb1b1315b51d5cd3d4e1f556a3d4d0 GIT binary patch literal 382 zcmV-^0fGLBP)Px$I7vi7R5*>rlg&=TKoo^P!09wjF~$VqPqab|6%yTHbb&h`&y8>3)0nu_#E6?x z5Em@egkoAu7#EdVXhC=0&7E`anKS3kWZ=IemjumbOE=C=ehQXM@9;yeuP)<#EA#z{ zAMkj8N4a7%aJ{%b#f^*B3_m51w@e(nn0o{5*v0sy1lBYBMYF9Maw%TuAQ^3M7@xN9 zY()z{TrM#20{~t+F3Azxj;kx1X561fYJ^}MP}r{PgY(naLE9VZYOPLgt)l1onIk;h z+@dzt0eBu3G(fN4W%T;a;nDGO2LOf??C$JgNP+FtFr=VVDq~2I;${j6rN~<*LMgB$ zLMcq+8~-NoF%J10jR2zT&*8r~0PxyRGr8CAX7VyGv0AG~>XsQ5rhmc@Q_q+Z7`PsT cMYb~H3*|ItV3g>TW&i*H07*qoM6N<$g04BJwEzGB literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/calamari.png b/src/hfas/resources/assets/ww_hfas/textures/item/calamari.png new file mode 100644 index 0000000000000000000000000000000000000000..963ea1612bbb0c9da9f14069a348c519eb3ae0f2 GIT binary patch literal 420 zcmV;V0bBlwP)ok& zYZl^Q&Ld2V8X1}Yn0I%-&OPVe8^FiTE^cf|l?g^p zO-8)|SGV`JsCHY_T&$F^43kzvr`xIhO|A+7JPa1|8J1xZjL0kTr`p5j5&$g2B#}y! zFKEKajtNoATGdv=>e6?Xd3k!`sTTqOXvbK5+&lw&10F#ebAj`Bq^=04zaI`xUTMd1g z+s_;@9`^ku#NrtnAeu|kt~Y5lbPkV?mihVAT+d)f+9f0@04tQ8C60%E*Ju9PiW7@x z?C4&0Nf%($8=!_&+Ru-CzW4tBgIGLcyO}KJGrs3v!e$|W8w6O}4DbV>mVarpl^ibs O0000Px%GD$>1R5*>Lk>5*GVHn3h?=;Ms?9$5+!)kMIZzH zH|jD$`~&)7bnA@{2im|BP7tOUmU!4Tva5RFh4+Ey`+2_4^T298np7y;8HW>APvZZM)y7t*PSi zy)LVR(ZOB-X4AUih{_mCtB7C#d!*0OSznk(+S$c-ydet3BPOR;5PuU(BQXHp4?VH~ zZoPbKLR$27QPK^n71uSRY@2e&NS`U}4D z2tfY%GwLKK`MoUOu5JL1_75ofFJq7Np^c4~M`(BE#hS7RK!+U0_bH9-)oYqAcyYMT zv99_y@0000Px%ZAnByR5*>TlHE&_aTLct&of^(r*o;xmolAAM!JTE=(Z3g!vwoaLWI01=tjt! z{s6lO3c9GE3nA}%qpLuK6c)yy4HX16r82!}Q-|A}%e}Z~?&)IfsX^ZLy*lT2e&=(} z_s0*8QAev;?r1g3$JMjS`#TvOvf)|VlL7jy((hBV+)!B{{C)5B`(-6o3fXCWRtbGk zrnxF#1mLktjcmJwW_uT7dR;h79w`tZ+dOECQI#)}r`3^)M%aHINpAd0$ z$OgdpROpW{txlPqjR$Qp1kVTJ)dn_2lMFD>Z9#OGw#xfKFWoKW+V6Lmcy`C=%Z5IBU ZegXF}63SL7eQf{$002ovPDHLkV1gI;KkNVi literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cinder_door.png b/src/hfas/resources/assets/ww_hfas/textures/item/cinder_door.png new file mode 100644 index 0000000000000000000000000000000000000000..9191d0b8fbfb1b1315b51d5cd3d4e1f556a3d4d0 GIT binary patch literal 382 zcmV-^0fGLBP)Px$I7vi7R5*>rlg&=TKoo^P!09wjF~$VqPqab|6%yTHbb&h`&y8>3)0nu_#E6?x z5Em@egkoAu7#EdVXhC=0&7E`anKS3kWZ=IemjumbOE=C=ehQXM@9;yeuP)<#EA#z{ zAMkj8N4a7%aJ{%b#f^*B3_m51w@e(nn0o{5*v0sy1lBYBMYF9Maw%TuAQ^3M7@xN9 zY()z{TrM#20{~t+F3Azxj;kx1X561fYJ^}MP}r{PgY(naLE9VZYOPLgt)l1onIk;h z+@dzt0eBu3G(fN4W%T;a;nDGO2LOf??C$JgNP+FtFr=VVDq~2I;${j6rN~<*LMgB$ zLMcq+8~-NoF%J10jR2zT&*8r~0PxyRGr8CAX7VyGv0AG~>XsQ5rhmc@Q_q+Z7`PsT cMYb~H3*|ItV3g>TW&i*H07*qoM6N<$g04BJwEzGB literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cinder_hanging_sign.png b/src/hfas/resources/assets/ww_hfas/textures/item/cinder_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..de4a68bde5296dc1114e23af3fd1f0a9675c11d6 GIT binary patch literal 472 zcmV;}0Vn>6P)Px$l1W5CR5*>LkikmhP!xv0b|j{ul}@3~YM{7iB#sgq5!A(i?)nn*9=?mXap%4} z-3)_Joncm$wul{OqeeqQZ<3qHq%I0EYKp>~&AsRT=l*>Ef&Z)mz{(eM@^SGK*6K0< zuIqB4X{cLYNe&K(^(8hHCDktfUK5Q2&d$CU<^aMlfZH2}!w=N!b!^*4k^hju-JdHy zFH{)DL8<}VJ2&}A?RI-I3pYmBRqW1gUp6!)r0T9Ht;=<2j9naoi`1t)!Lgg@2*E;%cuZm2s$kQ O0000Px$Q%OWYR5*>rlEF#>Q51$h2hkZFL3{#N8bgINDp*KRFVQB#bz zXcL4%3lVhXPDm7|x#NsU+M;H3a;Bn9|K{Fv&wsyr&gH;=E8=d>>h&dJ_7SM@@Ec;r zLO3|D4%b(gk?4A^bN|59Hqi76z7Kz~}G&q`77J z0hVDfw=5=;@vi{sbOu-(q#%__)n%l(jl6%z-RVi7R|-0GrCgk&42F!FjZn|GfKju- z+lxuETKO9wS*;+|YAAzYs3#hl0hX;ccB}2pN08nD=8k=pZFTf500000NkvXXu0mjf DHXXJ& literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cooked_calamari.png b/src/hfas/resources/assets/ww_hfas/textures/item/cooked_calamari.png new file mode 100644 index 0000000000000000000000000000000000000000..28d0809b246d08bbacaa2f98c6683002eabb07e6 GIT binary patch literal 428 zcmV;d0aN~oP)bW7TY*J*xs<7w(rJy%f(Nb~xZ|{!0`HFOe6%Neu55UNH!M6=V4O<0Au;?^>`5=DTMYW-&1QhZzDlX?<(Ne|^^& z261Hr2KJRk4DTZ=!5TzvA7*&-W*x)FGDEJJ{1~K4X0BHsRFm3(>Xb=O#XNDw(&ms&AOh7h7BSiBz zAuopeua|+8gXI`Nfph=86j%Tx2?8(!!5km~69@5IGGiFpR~-O*AM65SJ$q6motj|C(#26PR0ZA8{c4jTX= Wmw-|A)63KV0000!!>+X#z}`5u zlYv1>k_#*kBTx(g3BsJbs$n5m4ah)1tN%z9B6QbSQv0GOkREl qER8F=u;|4u1hSb}+p(KKq9_2{T!v54zn7!{0000%HGWuB)X*OV=NX?bF@lsKLlWIURA9%wR0^<+*G&RPIOQ-VB|SS2tdUA>cda< z-p^@i(X+sW-nwhGtGodFEQ>K$g&dtG5rYZxV zP)Wm{1&TzDXe#>=Nj=?<^|Eh5RELnsf7fXKn@1RcJ5uKG!`JLv^3&Uw%s@2+W=^(* zX)gm%4hfUBjhfTA)q21hDCN6+K<;#>`HQOSi)+_6Xk~j+=MHu#U-+Rv@nzNvAY6md z!JeddhMy3Kzp-htwzRcs+qx$0*x#vv2mQ7_aOPMD!AxIhB)!1s!e>s9ldZv9j7kp?B(kUf`U~6 zh`Zl=`_4K~z6%3z8p5*|UlbGqsdREprLPkwJFN;p`p@I1`v<(ip-%Shi*YT`poBwzj038UYGq1>f(w(c< w#GPj{llvC{0RR7!opnzD000I_L_t&o0Di6dwYhpc#sB~S07*qoM6N<$g7?-S-2eap literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/crab_claw.png b/src/hfas/resources/assets/ww_hfas/textures/item/crab_claw.png new file mode 100644 index 0000000000000000000000000000000000000000..ec34009694583d155d0a451911a2ddc6841b0d93 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!M1W6-E0F$sKKJkP=;s}Q=kxuy z1h`B$wa?WsJ~n@AEl`fJB*-tA!Qt7BG$1F))5S5Q;#TRYR^9^!0?rp@-tRBGYf!gv z{v5fPH+OZOxYk>9`-okx*hIZH-V1v3gpWjaxjtAd^K~Kv;{+y`cack&#WnajlmoTf iwU`XvL`}K0mjA;ICZ+Bvq2)l+89ZJ6T-G@yGywoq=Rp?$ literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/duckweed.png b/src/hfas/resources/assets/ww_hfas/textures/item/duckweed.png new file mode 100644 index 0000000000000000000000000000000000000000..2bafc6d8003a69fc05f39aa5023485b8ad685830 GIT binary patch literal 447 zcmV;w0YLtVP)Mni%uk={;t~ zWzbv9ypMan?t8$0jia-T+5T~UmeflnH`F=`;C!{5#b&*XBuQEUqJIS-29WQmxVgXTeF!KS&DXB|d84_?Px%MoC0LR5*>LlHW^{Q5?oUM>m%<=5()EZ)}=dzO*)J>BVXoX$^N_w?XE05Cq@ALh_ ze?pvmj0}01S=d$q_S0!PJDWtass0pcDiqP~H7CiIMk4@&&UOI0EjHDY%WKC-vudcT z<$l0j?OLlI+hLRDAuJ#E?;CS6hZurTp`|kwNfSU z?txtsIbcT=j#R|cyZvgVAYl4lMeMS70MKe`0APA4!f2nO31s#Q=**dQyz+4s(eH7y zwU=esre|WcpgHh++(4eytsTyqG92Y=5r8_{r|@KE`FBAXv9$yMkK7Uys|C%4-<)T9 zw~ph|w#bzX<4BMP&ip0hq05*FI mN}EJ9UQz?~=~H3Px%b4f%&R5*>TlFv_)aU92A&l5<(CImPM6{k>7KafefNisLqkIB8(%z5(Asm)GZ zy3qU!?BYCi)8=aH;>Kz#H*0aod4SDX7F#L80t6KV9^mOC z&WK^Jqzro{<*f5YXihJtCwxRU_7s4iNB*}fDSaI+LgUV2INAgdPj`%L>?uKy%($qVX$8X2#w-#UlE&DL}O^9TG%Hk*Xc5u)cjRM&pi`t z>TJ|n@%V=){>oSyIjFu$BV@nvYkrWKp=abJ-)IgrXp&Q**G!2N(5(Qu$w@|kS{ z0~VgYO;auGvz^P4lZ>Cmd` z0s|Jc@K-8J>FAJBrHc6U<0eziF62@|h0HH!ImqXki>8@$Xlc=Q5Krlvy61953Z=^N zFMP&A(A*5s=}U}_7*xn^y2g~Vi@E5rLeKSHDsm0+uD2h%qmS^Bk&xS_LK?PuJ4-5L zE}F*EFR}GI!R$f=|BddGK?=A#3B@4fhEOa4z%y4Jun{q9)M7swtV3?%xg%wEAtDHm z?zo9(1Z8y41;9#dhmbP^z~hL*d4rxmiCu0DxdBL*W&C9D*{g(pSdQPI{X$JxUE5NX zY-q3XV&@{4yX`p4CgSM~AHK$r%1Nv`Ek1h{fM9DLO`$Ba{w>Mis9#uJ+ftPPyk7YP zz}SdOkb10y<8>uuZ=MC=!Ocr7efiGS4kMDwN};G%0N$@hxjoP=BzE@!a5&qMdaT6a fbtTxE=fA~YFbNhA2a%(!00000NkvXXu0mjf#t=&@ literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/ember_door.png b/src/hfas/resources/assets/ww_hfas/textures/item/ember_door.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf0c340c8035e858f346472de281c3c2fb2f8dd GIT binary patch literal 370 zcmV-&0ge8NP)Px$EJ;K`R5*>rlf6y?K@^2Q$l_fDrFj5dZF~r2q(%14yd6WP4>sa zj0u4O%vx-A*=5kR^EM|pbM7}cCo}NhRVy|Rv+Lykc9Qpl-Od__9EZoJ=X}mNGz8l= zo7EZ}hp7G#tv^tzlj~i}l>GHWz^JiA$02Uls{y!YlBidQ%NhO3@pRz!;_%9&=+*ssqMY-s2&PFlsD8Bz;UGoHSh!sRo$Ua(|OC zY3hakZyNyfx6hKkhrvTX0;}L8t0Fmz#`91)PpVlkXHzkmBiHX=- QH2?qr07*qoM6N<$g6HI)^Z)<= literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/ember_hanging_sign.png b/src/hfas/resources/assets/ww_hfas/textures/item/ember_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..1cc6c2e78860c01b37358d446047734876df58cd GIT binary patch literal 444 zcmV;t0YmPx$c1c7*R5*>jkxfeiQ51$BzbFvg)HF;;Bayi&0~b-tsFk~*pU^L9-@oV|1lGQt zAf*H$x^P-F)y42ClRBf=BE8O(Mi6v1_v1O|z303a{um*E-R#x~VE^C{fL5!;!)=L^ zC6B$;0oQF4XMH=s0E(6SP;{bnWUg>mtD$KcLI_oS{-k3!Us)bbnX#0>ZnkH)l+Wi! z^V*%o!u~@pmmB%l->~r4#6qDEn%BWBrY_D-k4O4o@U7@28pZbF7%>L`+l$kAYjSaU z6#|I*lZ)>QJl3jgWOt^Q9@Hyk+;m2Px$Nl8ROR5*>rkWEg)P!xqfu#F~0G2y4w5WoavWSO!9$L_(2yD;vA#2q+r56-|5 z0irMvq?Y8-JcSm61LzZkk{Acx(S7%vd+vD${<|VUb8~qyGp5ru!mFkM(DU~(b*XxH z=x}>?AJLY{5AVBln+*z9`FrR?t6l@ZE0z>K_B;Sq1jL{ZfID;;yDmZqj7(+?H+6}< zn5_sTb9tCM^5jcytSb#;~ipn853%F#j*pmIC~ tbgE7oXm8|fb#UE|1Mv9bgmV6z!538ziI|n1RD%Ej002ovPDHLkV1iK)rf2{F literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/fang.png b/src/hfas/resources/assets/ww_hfas/textures/item/fang.png new file mode 100644 index 0000000000000000000000000000000000000000..897b5d9cd30fce3203db348584d60bd4c71f9e39 GIT binary patch literal 331 zcmV-R0kr;!P)^6VLya; zU0k&QqnP{n>MfHX6+{BuU7w!8iw#%GCCX+Dw#VwZ54IOy5`Z^@i$h3}Hc|{SpDk#) zvlG0}R|$Yqto4@l&-RI>(G9~S0lrVcMZ&0)1b`7Ka1V%&?wb~GL*dI}n6bXPENkpM0Di$D`Rr@yp00960rWcn800006 dNklO>(7f_Ux?A(W2=7U`I|%y{7b+0Skkyh z@Y#;3Gw;hjyW84vU;S8nXNt30q^(hHu~>sg_|?9rg4$Wj?ka3i%=B8dm2)9;kVmSc yaLFEqQ%zayw_+_Guyeov5gDMrDYX9OLQg=d#Wzp$P!}bYg1& literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/mudcrab_spawn_egg.png b/src/hfas/resources/assets/ww_hfas/textures/item/mudcrab_spawn_egg.png new file mode 100644 index 0000000000000000000000000000000000000000..b98ccf46c7319714576099c20207fd906223a258 GIT binary patch literal 432 zcmV;h0Z;ykP)Px$YDq*vR5*>*lEEv3aTv!x?`uhOAhf-!jqJkO6uB;GtrQb#NB@Jv%9W!7A5MPcw{0QA9VKi0WcqG!aEcIKuce;aCi^E-gpI9j}w41wcK#v8uPNAzePks zC_z7ki))mi-*C4(J3-;%8rNGA`a9t2x$%YEO$B9NL-EL*q%RFs9ojcedMSfiM)Anx zZYuQq(P(+tCKO>pel>h($0d!JMQvg8b*k%9#0G>%iK~#9!-H*`?!ypVq zozUdp*&xmY#n}KhNX-VY{|G%mZAGOn(32(5)9D$=i|pH43Z{i(P}Qa6)lxRI1Q7f& zg0ayZiy1(7v{dlAx5ljA#n2l9z?0qqx z%}Z2a6vm&q1g1y~%ycy}qXvSJq(uZ1M1urjo2iIC7A+K7WvhyUpjA}VzD@NPv5B94lTI9_L9{J^h;qrZdqIwA^Qc<%eY=Q-y&=RNOnw2$v*)qxVII2bMY zVcP^Cj=2pbR^U68uZ?bnQch7m@AxE!#`~(aoxMyWGi9_!(nGdrFgAz%VD4hAQJ*^g#2>iGK2dV=WG=XRx5XOvhN zh7Mo?HQ_}wknv*ToXAM&7=2Oh+~=+6%Uam7!vTlv-0{VeHnk+$RR2+X+oGXb)3rg?o63v6wGl20F7@K{~lw#J#m=FdTq^1_j*{P$%7X)Hc8 zu4{NaC>dKhtO7(B90*>8#4ND2dR!y0OSjuZ5HdczUMwm3VvOvm4(-fI8(`>}N z#6lj6X%=HASO2e>+x_lv>wms;{^y+E{k|;dzOIHEC9Uf6QialuNTmee;^@dQ=I3W| zys?1wwH0)Cw1W`#DCSy%1h@-78&1#85e`MrHnD`hifptrHKMGj0Cn~CVvo5NA_3Tl zyncd^xoJBVw@-P>7-o@AIdT1~lF zTHOT~DPg991aP@rDH{TEX~@B0yBnuv&0^VVwZd+6bXp}4o5DW&TCX0ok0FQqq0lZ#s#^B~fhvdcMaj8}TKA+Fv z@pwct6bgxxL3;zU*$k)C3C^-dsQ?y~{u%l|az-l&K(fQ(fF2T!M)B9*36cOb(h!@? z2Euq{K8+`PoYCqR00960I~|5p00006NklPx$(n&-?R5*>*k-LMsg^pI|C?j6mScWcy(2Ck>W^7Wlte?ZUadA`r@`{DQd z{@}kqRsZ^Uc>k^d*owsf2)|mYSX)y`3=IXuwcr5WUQf{+egPmVLCS>CP(bva?FL}* z@+H2;k}gb z7iqFJ5DZ@7WPKgC$8ORrH38r{EtAgZ)9H*dQ#L}s*C!->k2YU7cDtR4u^TkEI@wJt zeA99~nVZMfVCC1gie|0n{ikI#H+s(Jcx z=?HLWp54fDr{xT5o>K-SpU(rJY8r!Cc$rgq)Z;K9#u_uZMj(r_uXA1bLa7d5C3>Kn zwBo%6VEu;*zHF0>R3v$C&~Iw;m{)OHd5`Q7js891-b3CFM>fY$kOJT@6K z93UQijGjngNk-V&Tqq5({oJVd?egOo_H&}I&AeUm&m-uG6abcF1fU#XhFCj}0LP7H aGr%89xw1F7xhy6C0000Px$EJ;K`R5*>rlf6y?K@^2Q$l_fDrFj5dZF~r2q(%14yd6WP4>sa zj0u4O%vx-A*=5kR^EM|pbM7}cCo}NhRVy|Rv+Lykc9Qpl-Od__9EZoJ=X}mNGz8l= zo7EZ}hp7G#tv^tzlj~i}l>GHWz^JiA$02Uls{y!YlBidQ%NhO3@pRz!;_%9&=+*ssqMY-s2&PFlsD8Bz;UGoHSh!sRo$Ua(|OC zY3hakZyNyfx6hKkhrvTX0;}L8t0Fmz#`91)PpVlkXHzkmBiHX=- QH2?qr07*qoM6N<$g6HI)^Z)<= literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/mob_effect/choke.png b/src/hfas/resources/assets/ww_hfas/textures/mob_effect/choke.png new file mode 100644 index 0000000000000000000000000000000000000000..af15aca60368230b91e6545db4edb461200e3f55 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@RheIi4<#Ar*6y6BY<1un4N1yZ2wy z@X48bYkPdI6bT9|vI>izXHM?oRT8^!e8HY;Vj|zlbUEi_MSjTq7Gu@=Ff3Ji4lk3! z;cf2E4SZIuJD4x9Nl{_JwYXL#KBE?u^@*1^$hIp=uqjq|3!HEcKJ9WMyX8p7w^`4( ziYNG-Fc4|Jkj!N1v(5RY!K@V#&f!NGL}#-kgmdKI;Vst03ygx6951J literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/mob_effect/sink.png b/src/hfas/resources/assets/ww_hfas/textures/mob_effect/sink.png new file mode 100644 index 0000000000000000000000000000000000000000..58cbce03b7a4816af131bc7e10fa9cf624046664 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rhe3Qrfukcv6U2@8Z0SOmG!?)}#^ zd~$H*+8&=PMS{Xxd6FETwfN6vTo#^|{@|%{ccKJKkjsgNsUEW~9(^Hxqq;ngG1)2M z!%-<=-$n9l8(L4ssTii0%Rh=~@l{l`R0}e(c)XDzU*h5A6AoRDC)xy!rmToiKAI}R a%#g5IH+aUa2w9*T7(8A5T-G@yGywprmp$76 literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/screens/cinder_hanging_sign.png b/src/hfas/resources/assets/ww_hfas/textures/screens/cinder_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..93b97394d1b97a47c2e84c1220fc1d14c8e305ea GIT binary patch literal 462 zcmV;<0WtoGP)Px$h)G02R5*=|lFM$>Koo{Qo5-0Or;Va^fdojEiprwxs@WiwZg_)=9Xs9w@gnTl z0T0v#pejUhVs+G!X58^qO<0&2+Y!AS$NHZBL!f4 zR=|(%02nR*;YvF7>fmJc_TAZv2WlM``@`Pe>xa1i#l`KHS-yCbNE;UfjFyiguj3+s z_a8p4($NsIe$&xam+5=DVyP|GS-yS!62$;Tv8VyMVwtP@(UwwPvDCI9=Bge$6O^tt z=(Qcaa_K74q>o4h)>(wENpU8Epi!#X!PBj+pyQQAB034eB!JW^oO^A6b(S>gcZgod zPhwpy~0k$FC1`E}pqW}N^07*qoM6N<$ Eg3-j?%>V!Z literal 0 HcmV?d00001 diff --git a/src/hfas/resources/assets/ww_hfas/textures/screens/ember_hanging_sign.png b/src/hfas/resources/assets/ww_hfas/textures/screens/ember_hanging_sign.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d7b2405570dcb3675bb38f0745ffc11d84980b GIT binary patch literal 479 zcmV<50U-W~P)Px$nMp)JR5*=|lf7=#KoG}&ck=nXHo<|Dh^{~g6a+;SQ6V8ggrc-mL}@8_3*Lnn zKs*2)Egc;N4GqC}md?jwuXnw7ktvQ{>;#cawX^g8m>GKqZ(ba>+tn!_(*smh@blYe zq9o>89CLSD@M`j%Pd@@a=#;9incRDVstTTpCG*u8gU9=OEkJbZ0og2PJ^R8|ngV#C zs;)7rrj(M~kDimwa)dsmloB8J_nx%}M=x70iSxLjJM8X0yo~!#+_0Nuv;0aTU7QzC zRdFTqdE5Zt^~rI2=lU5t>$NY;gP;d=wRsSbtrDy@ynXk65CBNIWG9Y&5r7p~Z3sog zbfkQ3iefrad@T$BLD$hKH(D_k389Fv+K`bj9c_rtz}R1ZcMyf4Z?(}1fKWvJ#ktOa zvRL?Y&;?j+7>lGwbV9BZt2eDXQ~wppV&UEY7omvQx;gRra5Im+0CY}W@v>O>d&k*~ z&@_zG8#G$cXyqN;Lc8Jfrs~HMn V*6;JAS5p80002ovPDHLkV1m;*-5vk{ literal 0 HcmV?d00001 diff --git a/src/hfas/resources/data/c/tags/block/fence_gates/wooden.json b/src/hfas/resources/data/c/tags/block/fence_gates/wooden.json new file mode 100644 index 0000000..5924312 --- /dev/null +++ b/src/hfas/resources/data/c/tags/block/fence_gates/wooden.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence_gate", + "ww_hfas:soul_fence_gate", + "ww_hfas:azalea_fence_gate" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/block/fences.json b/src/hfas/resources/data/c/tags/block/fences.json new file mode 100644 index 0000000..c52925f --- /dev/null +++ b/src/hfas/resources/data/c/tags/block/fences.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence", + "ww_hfas:soul_fence", + "ww_hfas:azalea_fence" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/block/fences/wooden.json b/src/hfas/resources/data/c/tags/block/fences/wooden.json new file mode 100644 index 0000000..c52925f --- /dev/null +++ b/src/hfas/resources/data/c/tags/block/fences/wooden.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence", + "ww_hfas:soul_fence", + "ww_hfas:azalea_fence" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/block/stripped_logs.json b/src/hfas/resources/data/c/tags/block/stripped_logs.json new file mode 100644 index 0000000..94855fa --- /dev/null +++ b/src/hfas/resources/data/c/tags/block/stripped_logs.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:stripped_blaze_log", + "ww_hfas:stripped_soul_log", + "ww_hfas:stripped_azalea_log" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/block/stripped_woods.json b/src/hfas/resources/data/c/tags/block/stripped_woods.json new file mode 100644 index 0000000..c297d5c --- /dev/null +++ b/src/hfas/resources/data/c/tags/block/stripped_woods.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:stripped_blaze_wood", + "ww_hfas:stripped_soul_wood", + "ww_hfas:stripped_azalea_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/item/fence_gates/wooden.json b/src/hfas/resources/data/c/tags/item/fence_gates/wooden.json new file mode 100644 index 0000000..5924312 --- /dev/null +++ b/src/hfas/resources/data/c/tags/item/fence_gates/wooden.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence_gate", + "ww_hfas:soul_fence_gate", + "ww_hfas:azalea_fence_gate" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/item/fences/wooden.json b/src/hfas/resources/data/c/tags/item/fences/wooden.json new file mode 100644 index 0000000..c52925f --- /dev/null +++ b/src/hfas/resources/data/c/tags/item/fences/wooden.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence", + "ww_hfas:soul_fence", + "ww_hfas:azalea_fence" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/item/stripped_logs.json b/src/hfas/resources/data/c/tags/item/stripped_logs.json new file mode 100644 index 0000000..94855fa --- /dev/null +++ b/src/hfas/resources/data/c/tags/item/stripped_logs.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:stripped_blaze_log", + "ww_hfas:stripped_soul_log", + "ww_hfas:stripped_azalea_log" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/item/stripped_woods.json b/src/hfas/resources/data/c/tags/item/stripped_woods.json new file mode 100644 index 0000000..c297d5c --- /dev/null +++ b/src/hfas/resources/data/c/tags/item/stripped_woods.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:stripped_blaze_wood", + "ww_hfas:stripped_soul_wood", + "ww_hfas:stripped_azalea_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/all_hanging_signs.json b/src/hfas/resources/data/minecraft/tags/block/all_hanging_signs.json new file mode 100644 index 0000000..661dab3 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/all_hanging_signs.json @@ -0,0 +1,28 @@ +{ + "values": [ + { + "required": false, + "id": "ww_hfas:blaze_hanging_sign" + }, + { + "required": false, + "id": "ww_hfas:blaze_wall_hanging_sign" + }, + { + "required": false, + "id": "ww_hfas:soul_hanging_sign" + }, + { + "required": false, + "id": "ww_hfas:soul_wall_hanging_sign" + }, + { + "required": false, + "id": "ww_hfas:azalea_hanging_sign" + }, + { + "required": false, + "id": "ww_hfas:azalea_wall_hanging_sign" + } + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/block/all_signs.json b/src/hfas/resources/data/minecraft/tags/block/all_signs.json new file mode 100644 index 0000000..26d2659 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/all_signs.json @@ -0,0 +1,28 @@ +{ + "values": [ + { + "required": false, + "id": "ww_hfas:blaze_sign" + }, + { + "required": false, + "id": "ww_hfas:blaze_wall_sign" + }, + { + "required": false, + "id": "ww_hfas:soul_sign" + }, + { + "required": false, + "id": "ww_hfas:soul_wall_sign" + }, + { + "required": false, + "id": "ww_hfas:azalea_sign" + }, + { + "required": false, + "id": "ww_hfas:azalea_wall_sign" + } + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/block/ceiling_hanging_signs.json b/src/hfas/resources/data/minecraft/tags/block/ceiling_hanging_signs.json new file mode 100644 index 0000000..aa2d1b9 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/ceiling_hanging_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:azalea_hanging_sign" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/dirt.json b/src/hfas/resources/data/minecraft/tags/block/dirt.json new file mode 100644 index 0000000..cd686ba --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/dirt.json @@ -0,0 +1,6 @@ +{ + "values": [ + "ww_hfas:scorched_grass_block", + "ww_hfas:scorched_dirt" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/doors.json b/src/hfas/resources/data/minecraft/tags/block/doors.json new file mode 100644 index 0000000..2bc45ed --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/doors.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_door", + "ww_hfas:soul_door", + "ww_hfas:azalea_door" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/fence_gates.json b/src/hfas/resources/data/minecraft/tags/block/fence_gates.json new file mode 100644 index 0000000..5924312 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/fence_gates.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence_gate", + "ww_hfas:soul_fence_gate", + "ww_hfas:azalea_fence_gate" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/fences.json b/src/hfas/resources/data/minecraft/tags/block/fences.json new file mode 100644 index 0000000..c52925f --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/fences.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence", + "ww_hfas:soul_fence", + "ww_hfas:azalea_fence" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/flower_pots.json b/src/hfas/resources/data/minecraft/tags/block/flower_pots.json new file mode 100644 index 0000000..79b5c75 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/flower_pots.json @@ -0,0 +1,12 @@ +{ + "values": [ + { + "required": false, + "id": "ww_hfas:potted_blaze_sapling" + }, + { + "required": false, + "id": "ww_hfas:potted_soul_sapling" + } + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/block/leaves.json b/src/hfas/resources/data/minecraft/tags/block/leaves.json new file mode 100644 index 0000000..0ac131e --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/leaves.json @@ -0,0 +1,6 @@ +{ + "values": [ + "ww_hfas:blaze_leaves", + "ww_hfas:soul_leaves" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/logs.json b/src/hfas/resources/data/minecraft/tags/block/logs.json new file mode 100644 index 0000000..e35133a --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/logs.json @@ -0,0 +1,16 @@ +{ + "values": [ + "ww_hfas:blaze_log", + "ww_hfas:blaze_wood", + "ww_hfas:stripped_blaze_log", + "ww_hfas:stripped_blaze_wood", + "ww_hfas:soul_log", + "ww_hfas:soul_wood", + "ww_hfas:stripped_soul_log", + "ww_hfas:stripped_soul_wood", + "ww_hfas:azalea_log", + "ww_hfas:azalea_wood", + "ww_hfas:stripped_azalea_log", + "ww_hfas:stripped_azalea_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/logs_that_burn.json b/src/hfas/resources/data/minecraft/tags/block/logs_that_burn.json new file mode 100644 index 0000000..e35133a --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/logs_that_burn.json @@ -0,0 +1,16 @@ +{ + "values": [ + "ww_hfas:blaze_log", + "ww_hfas:blaze_wood", + "ww_hfas:stripped_blaze_log", + "ww_hfas:stripped_blaze_wood", + "ww_hfas:soul_log", + "ww_hfas:soul_wood", + "ww_hfas:stripped_soul_log", + "ww_hfas:stripped_soul_wood", + "ww_hfas:azalea_log", + "ww_hfas:azalea_wood", + "ww_hfas:stripped_azalea_log", + "ww_hfas:stripped_azalea_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/mineable/axe.json b/src/hfas/resources/data/minecraft/tags/block/mineable/axe.json new file mode 100644 index 0000000..84f0d69 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/mineable/axe.json @@ -0,0 +1,49 @@ +{ + "values": [ + "ww_hfas:azalea_sign", + "ww_hfas:azalea_wall_sign", + "ww_hfas:azalea_hanging_sign", + "ww_hfas:azalea_wall_hanging_sign", + "ww_hfas:azalea_shelf", + "ww_hfas:blaze_log", + "ww_hfas:blaze_wood", + "ww_hfas:stripped_blaze_log", + "ww_hfas:stripped_blaze_wood", + "ww_hfas:blaze_planks", + "ww_hfas:blaze_stairs", + "ww_hfas:blaze_slab", + "ww_hfas:blaze_fence", + "ww_hfas:blaze_fence_gate", + "ww_hfas:blaze_door", + "ww_hfas:blaze_trapdoor", + "ww_hfas:blaze_pressure_plate", + "ww_hfas:blaze_button", + "ww_hfas:soul_log", + "ww_hfas:soul_wood", + "ww_hfas:stripped_soul_log", + "ww_hfas:stripped_soul_wood", + "ww_hfas:soul_planks", + "ww_hfas:soul_stairs", + "ww_hfas:soul_slab", + "ww_hfas:soul_fence", + "ww_hfas:soul_fence_gate", + "ww_hfas:soul_door", + "ww_hfas:soul_trapdoor", + "ww_hfas:soul_pressure_plate", + "ww_hfas:soul_button", + "ww_hfas:azalea_log", + "ww_hfas:azalea_wood", + "ww_hfas:stripped_azalea_log", + "ww_hfas:stripped_azalea_wood", + "ww_hfas:azalea_planks", + "ww_hfas:azalea_stairs", + "ww_hfas:azalea_slab", + "ww_hfas:azalea_fence", + "ww_hfas:azalea_fence_gate", + "ww_hfas:azalea_door", + "ww_hfas:azalea_trapdoor", + "ww_hfas:azalea_pressure_plate", + "ww_hfas:azalea_button", + "ww_hfas:fletching_table" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/hfas/resources/data/minecraft/tags/block/mineable/pickaxe.json new file mode 100644 index 0000000..b1c1fc4 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:kiln" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/overworld_natural_logs.json b/src/hfas/resources/data/minecraft/tags/block/overworld_natural_logs.json new file mode 100644 index 0000000..7771fb0 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/overworld_natural_logs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "ww_hfas:blaze_log", + "ww_hfas:soul_log" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/planks.json b/src/hfas/resources/data/minecraft/tags/block/planks.json new file mode 100644 index 0000000..7eab9b1 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/planks.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_planks", + "ww_hfas:soul_planks", + "ww_hfas:azalea_planks" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/saplings.json b/src/hfas/resources/data/minecraft/tags/block/saplings.json new file mode 100644 index 0000000..26a05ef --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/saplings.json @@ -0,0 +1,6 @@ +{ + "values": [ + "ww_hfas:blaze_sapling", + "ww_hfas:soul_sapling" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/standing_signs.json b/src/hfas/resources/data/minecraft/tags/block/standing_signs.json new file mode 100644 index 0000000..e9aa7f7 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/standing_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:azalea_sign" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/trapdoors.json b/src/hfas/resources/data/minecraft/tags/block/trapdoors.json new file mode 100644 index 0000000..e0fd3d8 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/trapdoors.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_trapdoor", + "ww_hfas:soul_trapdoor", + "ww_hfas:azalea_trapdoor" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wall_hanging_signs.json b/src/hfas/resources/data/minecraft/tags/block/wall_hanging_signs.json new file mode 100644 index 0000000..cb695ca --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wall_hanging_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:azalea_wall_hanging_sign" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wall_signs.json b/src/hfas/resources/data/minecraft/tags/block/wall_signs.json new file mode 100644 index 0000000..e0bf093 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wall_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:azalea_wall_sign" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_buttons.json b/src/hfas/resources/data/minecraft/tags/block/wooden_buttons.json new file mode 100644 index 0000000..d854e4b --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wooden_buttons.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_button", + "ww_hfas:soul_button", + "ww_hfas:azalea_button" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_doors.json b/src/hfas/resources/data/minecraft/tags/block/wooden_doors.json new file mode 100644 index 0000000..2bc45ed --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wooden_doors.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_door", + "ww_hfas:soul_door", + "ww_hfas:azalea_door" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_fences.json b/src/hfas/resources/data/minecraft/tags/block/wooden_fences.json new file mode 100644 index 0000000..c52925f --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wooden_fences.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence", + "ww_hfas:soul_fence", + "ww_hfas:azalea_fence" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_pressure_plates.json b/src/hfas/resources/data/minecraft/tags/block/wooden_pressure_plates.json new file mode 100644 index 0000000..dde9ab5 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wooden_pressure_plates.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_pressure_plate", + "ww_hfas:soul_pressure_plate", + "ww_hfas:azalea_pressure_plate" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_shelves.json b/src/hfas/resources/data/minecraft/tags/block/wooden_shelves.json new file mode 100644 index 0000000..7a3e0de --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wooden_shelves.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:azalea_shelf" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_slabs.json b/src/hfas/resources/data/minecraft/tags/block/wooden_slabs.json new file mode 100644 index 0000000..df411e9 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wooden_slabs.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_slab", + "ww_hfas:soul_slab", + "ww_hfas:azalea_slab" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_stairs.json b/src/hfas/resources/data/minecraft/tags/block/wooden_stairs.json new file mode 100644 index 0000000..805944b --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wooden_stairs.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_stairs", + "ww_hfas:soul_stairs", + "ww_hfas:azalea_stairs" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_trapdoors.json b/src/hfas/resources/data/minecraft/tags/block/wooden_trapdoors.json new file mode 100644 index 0000000..e0fd3d8 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/block/wooden_trapdoors.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_trapdoor", + "ww_hfas:soul_trapdoor", + "ww_hfas:azalea_trapdoor" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/enchantment/non_treasure.json b/src/hfas/resources/data/minecraft/tags/enchantment/non_treasure.json new file mode 100644 index 0000000..38f5c62 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/enchantment/non_treasure.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "ww_hfas:melting" + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/entity_type/arrows.json b/src/hfas/resources/data/minecraft/tags/entity_type/arrows.json new file mode 100644 index 0000000..273784c --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/entity_type/arrows.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "ww_hfas:arrow" + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json b/src/hfas/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json new file mode 100644 index 0000000..0df4532 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "#ww_hfas:water_breathing" + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/entity_type/can_equip_saddle.json b/src/hfas/resources/data/minecraft/tags/entity_type/can_equip_saddle.json new file mode 100644 index 0000000..87065a0 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/entity_type/can_equip_saddle.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "ww_hfas:muddy_pig" + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/item/arrows.json b/src/hfas/resources/data/minecraft/tags/item/arrows.json new file mode 100644 index 0000000..ca12d80 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/arrows.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:tipped_arrow" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/boats.json b/src/hfas/resources/data/minecraft/tags/item/boats.json new file mode 100644 index 0000000..9b6b40f --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/boats.json @@ -0,0 +1,16 @@ +{ + "values": [ + { + "required": false, + "id": "ww_hfas:blaze_boat" + }, + { + "required": false, + "id": "ww_hfas:soul_boat" + }, + { + "required": false, + "id": "ww_hfas:azalea_boat" + } + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/item/buttons.json b/src/hfas/resources/data/minecraft/tags/item/buttons.json new file mode 100644 index 0000000..d854e4b --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/buttons.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_button", + "ww_hfas:soul_button", + "ww_hfas:azalea_button" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/chest_boats.json b/src/hfas/resources/data/minecraft/tags/item/chest_boats.json new file mode 100644 index 0000000..5f47b85 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/chest_boats.json @@ -0,0 +1,16 @@ +{ + "values": [ + { + "required": false, + "id": "ww_hfas:blaze_chest_boat" + }, + { + "required": false, + "id": "ww_hfas:soul_chest_boat" + }, + { + "required": false, + "id": "ww_hfas:azalea_chest_boat" + } + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/item/doors.json b/src/hfas/resources/data/minecraft/tags/item/doors.json new file mode 100644 index 0000000..2bc45ed --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/doors.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_door", + "ww_hfas:soul_door", + "ww_hfas:azalea_door" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/fence_gates.json b/src/hfas/resources/data/minecraft/tags/item/fence_gates.json new file mode 100644 index 0000000..5924312 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/fence_gates.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence_gate", + "ww_hfas:soul_fence_gate", + "ww_hfas:azalea_fence_gate" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/hanging_signs.json b/src/hfas/resources/data/minecraft/tags/item/hanging_signs.json new file mode 100644 index 0000000..aa2d1b9 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/hanging_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:azalea_hanging_sign" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/leaves.json b/src/hfas/resources/data/minecraft/tags/item/leaves.json new file mode 100644 index 0000000..0ac131e --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/leaves.json @@ -0,0 +1,6 @@ +{ + "values": [ + "ww_hfas:blaze_leaves", + "ww_hfas:soul_leaves" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/logs.json b/src/hfas/resources/data/minecraft/tags/item/logs.json new file mode 100644 index 0000000..e35133a --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/logs.json @@ -0,0 +1,16 @@ +{ + "values": [ + "ww_hfas:blaze_log", + "ww_hfas:blaze_wood", + "ww_hfas:stripped_blaze_log", + "ww_hfas:stripped_blaze_wood", + "ww_hfas:soul_log", + "ww_hfas:soul_wood", + "ww_hfas:stripped_soul_log", + "ww_hfas:stripped_soul_wood", + "ww_hfas:azalea_log", + "ww_hfas:azalea_wood", + "ww_hfas:stripped_azalea_log", + "ww_hfas:stripped_azalea_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/logs_that_burn.json b/src/hfas/resources/data/minecraft/tags/item/logs_that_burn.json new file mode 100644 index 0000000..e35133a --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/logs_that_burn.json @@ -0,0 +1,16 @@ +{ + "values": [ + "ww_hfas:blaze_log", + "ww_hfas:blaze_wood", + "ww_hfas:stripped_blaze_log", + "ww_hfas:stripped_blaze_wood", + "ww_hfas:soul_log", + "ww_hfas:soul_wood", + "ww_hfas:stripped_soul_log", + "ww_hfas:stripped_soul_wood", + "ww_hfas:azalea_log", + "ww_hfas:azalea_wood", + "ww_hfas:stripped_azalea_log", + "ww_hfas:stripped_azalea_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/planks.json b/src/hfas/resources/data/minecraft/tags/item/planks.json new file mode 100644 index 0000000..7eab9b1 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/planks.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_planks", + "ww_hfas:soul_planks", + "ww_hfas:azalea_planks" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/saplings.json b/src/hfas/resources/data/minecraft/tags/item/saplings.json new file mode 100644 index 0000000..26a05ef --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/saplings.json @@ -0,0 +1,6 @@ +{ + "values": [ + "ww_hfas:blaze_sapling", + "ww_hfas:soul_sapling" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/signs.json b/src/hfas/resources/data/minecraft/tags/item/signs.json new file mode 100644 index 0000000..e9aa7f7 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:azalea_sign" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/trapdoors.json b/src/hfas/resources/data/minecraft/tags/item/trapdoors.json new file mode 100644 index 0000000..e0fd3d8 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/trapdoors.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_trapdoor", + "ww_hfas:soul_trapdoor", + "ww_hfas:azalea_trapdoor" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_buttons.json b/src/hfas/resources/data/minecraft/tags/item/wooden_buttons.json new file mode 100644 index 0000000..d854e4b --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/wooden_buttons.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_button", + "ww_hfas:soul_button", + "ww_hfas:azalea_button" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_doors.json b/src/hfas/resources/data/minecraft/tags/item/wooden_doors.json new file mode 100644 index 0000000..2bc45ed --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/wooden_doors.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_door", + "ww_hfas:soul_door", + "ww_hfas:azalea_door" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_fences.json b/src/hfas/resources/data/minecraft/tags/item/wooden_fences.json new file mode 100644 index 0000000..c52925f --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/wooden_fences.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_fence", + "ww_hfas:soul_fence", + "ww_hfas:azalea_fence" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_pressure_plates.json b/src/hfas/resources/data/minecraft/tags/item/wooden_pressure_plates.json new file mode 100644 index 0000000..dde9ab5 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/wooden_pressure_plates.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_pressure_plate", + "ww_hfas:soul_pressure_plate", + "ww_hfas:azalea_pressure_plate" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_shelves.json b/src/hfas/resources/data/minecraft/tags/item/wooden_shelves.json new file mode 100644 index 0000000..7a3e0de --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/wooden_shelves.json @@ -0,0 +1,5 @@ +{ + "values": [ + "ww_hfas:azalea_shelf" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_slabs.json b/src/hfas/resources/data/minecraft/tags/item/wooden_slabs.json new file mode 100644 index 0000000..df411e9 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/wooden_slabs.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_slab", + "ww_hfas:soul_slab", + "ww_hfas:azalea_slab" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_stairs.json b/src/hfas/resources/data/minecraft/tags/item/wooden_stairs.json new file mode 100644 index 0000000..805944b --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/wooden_stairs.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_stairs", + "ww_hfas:soul_stairs", + "ww_hfas:azalea_stairs" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_trapdoors.json b/src/hfas/resources/data/minecraft/tags/item/wooden_trapdoors.json new file mode 100644 index 0000000..e0fd3d8 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/item/wooden_trapdoors.json @@ -0,0 +1,7 @@ +{ + "values": [ + "ww_hfas:blaze_trapdoor", + "ww_hfas:soul_trapdoor", + "ww_hfas:azalea_trapdoor" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/potion/tradeable.json b/src/hfas/resources/data/minecraft/tags/potion/tradeable.json new file mode 100644 index 0000000..8487bb4 --- /dev/null +++ b/src/hfas/resources/data/minecraft/tags/potion/tradeable.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "ww_hfas:reach", + "ww_hfas:long_reach" + ] +} diff --git a/src/hfas/resources/data/neoforge/data_maps/block/strippables.json b/src/hfas/resources/data/neoforge/data_maps/block/strippables.json new file mode 100644 index 0000000..bca011a --- /dev/null +++ b/src/hfas/resources/data/neoforge/data_maps/block/strippables.json @@ -0,0 +1,22 @@ +{ + "values": { + "ww_hfas:azalea_log": { + "stripped_block": "ww_hfas:stripped_azalea_log" + }, + "ww_hfas:azalea_wood": { + "stripped_block": "ww_hfas:stripped_azalea_wood" + }, + "ww_hfas:blaze_log": { + "stripped_block": "ww_hfas:stripped_blaze_log" + }, + "ww_hfas:blaze_wood": { + "stripped_block": "ww_hfas:stripped_blaze_wood" + }, + "ww_hfas:soul_log": { + "stripped_block": "ww_hfas:stripped_soul_log" + }, + "ww_hfas:soul_wood": { + "stripped_block": "ww_hfas:stripped_soul_wood" + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_planks.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_planks.json new file mode 100644 index 0000000..da67a8e --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_planks.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_planks" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_slab.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_slab.json new file mode 100644 index 0000000..ab61f14 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_slab.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_slab" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_stairs.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_stairs.json new file mode 100644 index 0000000..531589f --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_stairs.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_stairs" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_wood.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_wood.json new file mode 100644 index 0000000..803e1ce --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_wood.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_wood" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_planks.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_planks.json new file mode 100644 index 0000000..df7917b --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_planks.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_planks" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_slab.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_slab.json new file mode 100644 index 0000000..09eacd2 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_slab.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_slab" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_stairs.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_stairs.json new file mode 100644 index 0000000..64c7771 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_stairs.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_stairs" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_wood.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_wood.json new file mode 100644 index 0000000..9d0a0cf --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_wood.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_wood" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_planks.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_planks.json new file mode 100644 index 0000000..d70d43e --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_planks.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_planks" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_planks" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_slab.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_slab.json new file mode 100644 index 0000000..df8ae9c --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_slab.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_slab" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_slab" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_stairs.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_stairs.json new file mode 100644 index 0000000..9fd2421 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_stairs.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_stairs" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_stairs" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_wood.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_wood.json new file mode 100644 index 0000000..ffb1150 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_wood.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_wood" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_wood" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_fence.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_fence.json new file mode 100644 index 0000000..735c7d1 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_fence.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_fence" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_hanging_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_hanging_sign.json new file mode 100644 index 0000000..cd4637a --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_hanging_sign.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_stripped_azalea_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:stripped_azalea_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_hanging_sign" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_stripped_azalea_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_hanging_sign" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_shelf.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_shelf.json new file mode 100644 index 0000000..0246bf9 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_shelf.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_stripped_azalea_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:stripped_azalea_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_shelf" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_stripped_azalea_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_shelf" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_sign.json new file mode 100644 index 0000000..13e958b --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_sign.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_sign" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_sign" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_fence.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_fence.json new file mode 100644 index 0000000..59597f8 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_fence.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_fence" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_hanging_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_hanging_sign.json new file mode 100644 index 0000000..b12d42e --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_hanging_sign.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_stripped_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:stripped_blaze_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_hanging_sign" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_stripped_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_hanging_sign" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_sign.json new file mode 100644 index 0000000..a603ced --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_sign.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_sign" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_sign" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/kiln.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/kiln.json new file mode 100644 index 0000000..dcd20fa --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/kiln.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_furnace": { + "conditions": { + "items": [ + { + "items": "minecraft:furnace" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:kiln" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_furnace" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:kiln" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_fence.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_fence.json new file mode 100644 index 0000000..ac66a91 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_fence.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_fence" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_fence" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_hanging_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_hanging_sign.json new file mode 100644 index 0000000..e73b842 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_hanging_sign.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_stripped_log": { + "conditions": { + "items": [ + { + "items": "ww_hfas:stripped_soul_log" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_hanging_sign" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_stripped_log" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_hanging_sign" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_sign.json new file mode 100644 index 0000000..93c92cc --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_sign.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_sign" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_sign" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_button.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_button.json new file mode 100644 index 0000000..d9905e1 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_button.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_button" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_door.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_door.json new file mode 100644 index 0000000..eef4172 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_door.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_door" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_fence_gate.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_fence_gate.json new file mode 100644 index 0000000..c8f2e7f --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_fence_gate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_fence_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_fence_gate" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_pressure_plate.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_pressure_plate.json new file mode 100644 index 0000000..a65b524 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_pressure_plate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_pressure_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_pressure_plate" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_trapdoor.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_trapdoor.json new file mode 100644 index 0000000..916dba0 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_trapdoor.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_button.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_button.json new file mode 100644 index 0000000..3e2a199 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_button.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_button" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_door.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_door.json new file mode 100644 index 0000000..7644748 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_door.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_door" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_fence_gate.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_fence_gate.json new file mode 100644 index 0000000..f5ce8fa --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_fence_gate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_fence_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_fence_gate" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_pressure_plate.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_pressure_plate.json new file mode 100644 index 0000000..9ad5c50 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_pressure_plate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_pressure_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_pressure_plate" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_trapdoor.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_trapdoor.json new file mode 100644 index 0000000..c368c32 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_trapdoor.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_button.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_button.json new file mode 100644 index 0000000..dc8c182 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_button.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_button" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_button" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_door.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_door.json new file mode 100644 index 0000000..9da37a6 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_door.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_door" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_door" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_fence_gate.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_fence_gate.json new file mode 100644 index 0000000..cc68c82 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_fence_gate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_fence_gate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_fence_gate" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_pressure_plate.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_pressure_plate.json new file mode 100644 index 0000000..fc8585b --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_pressure_plate.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_pressure_plate" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_pressure_plate" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_trapdoor.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_trapdoor.json new file mode 100644 index 0000000..5e18497 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_trapdoor.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_trapdoor" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_trapdoor" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_boat.json new file mode 100644 index 0000000..3dc39e3 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_boat" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_chest_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_chest_boat.json new file mode 100644 index 0000000..25f7742 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_azalea_boat": { + "conditions": { + "items": [ + { + "items": "ww_hfas:azalea_boat" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:azalea_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_azalea_boat" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:azalea_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_boat.json new file mode 100644 index 0000000..7899eac --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_boat" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_chest_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_chest_boat.json new file mode 100644 index 0000000..ea1b322 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_blaze_boat": { + "conditions": { + "items": [ + { + "items": "ww_hfas:blaze_boat" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:blaze_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_blaze_boat" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:blaze_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_boat.json new file mode 100644 index 0000000..2513c20 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_planks": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_planks" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_planks" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_boat" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_chest_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_chest_boat.json new file mode 100644 index 0000000..db25256 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_chest_boat.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_soul_boat": { + "conditions": { + "items": [ + { + "items": "ww_hfas:soul_boat" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "ww_hfas:soul_chest_boat" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_soul_boat" + ] + ], + "rewards": { + "recipes": [ + "ww_hfas:soul_chest_boat" + ] + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/enchantment/melting.json b/src/hfas/resources/data/ww_hfas/enchantment/melting.json new file mode 100644 index 0000000..76d9bf1 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/enchantment/melting.json @@ -0,0 +1,21 @@ +{ + "description": { + "translate": "enchantment.ww_hfas.melting" + }, + "supported_items": "#minecraft:enchantable/mining", + "weight": 2, + "max_level": 1, + "min_cost": { + "base": 15, + "per_level_above_first": 0 + }, + "max_cost": { + "base": 65, + "per_level_above_first": 0 + }, + "anvil_cost": 4, + "slots": [ + "mainhand" + ], + "effects": {} +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_button.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_button.json new file mode 100644 index 0000000..03bcf0a --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_button" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_button" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_door.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_door.json new file mode 100644 index 0000000..c7877c6 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "ww_hfas:azalea_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "ww_hfas:azalea_door" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_door" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence.json new file mode 100644 index 0000000..a03a4c0 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_fence" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_fence" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence_gate.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence_gate.json new file mode 100644 index 0000000..5ebe521 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_fence_gate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_fence_gate" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_hanging_sign.json new file mode 100644 index 0000000..6fc4f64 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_hanging_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_hanging_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_hanging_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_log.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_log.json new file mode 100644 index 0000000..4ffbb47 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_log" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_planks.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_planks.json new file mode 100644 index 0000000..588f0d4 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_planks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_planks" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_pressure_plate.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_pressure_plate.json new file mode 100644 index 0000000..0392b05 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_pressure_plate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_pressure_plate" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_shelf.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_shelf.json new file mode 100644 index 0000000..5fc4d38 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_shelf.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_shelf" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_shelf" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_sign.json new file mode 100644 index 0000000..a43d569 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_slab.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_slab.json new file mode 100644 index 0000000..2911549 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_slab.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_slab" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_stairs.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_stairs.json new file mode 100644 index 0000000..29b96f7 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_stairs" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_trapdoor.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_trapdoor.json new file mode 100644 index 0000000..21e1b86 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_trapdoor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_trapdoor" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_hanging_sign.json new file mode 100644 index 0000000..883a76f --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_hanging_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_hanging_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_wall_hanging_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_sign.json new file mode 100644 index 0000000..57a8056 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_wall_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wood.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wood.json new file mode 100644 index 0000000..26f3879 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:azalea_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/azalea_wood" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_button.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_button.json new file mode 100644 index 0000000..eacccfa --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_button" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_button" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_door.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_door.json new file mode 100644 index 0000000..66d0ff8 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "ww_hfas:blaze_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "ww_hfas:blaze_door" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_door" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence.json new file mode 100644 index 0000000..c7791f2 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_fence" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_fence" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence_gate.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence_gate.json new file mode 100644 index 0000000..4108bf7 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_fence_gate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_fence_gate" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_hanging_sign.json new file mode 100644 index 0000000..0303978 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_hanging_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_hanging_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_hanging_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_leaves.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_leaves.json new file mode 100644 index 0000000..142bb19 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_leaves.json @@ -0,0 +1,130 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + ], + "name": "ww_hfas:blaze_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "ww_hfas:blaze_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_leaves" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_log.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_log.json new file mode 100644 index 0000000..e615727 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_log" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_planks.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_planks.json new file mode 100644 index 0000000..b20003d --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_planks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_planks" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_pressure_plate.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_pressure_plate.json new file mode 100644 index 0000000..03fbb58 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_pressure_plate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_pressure_plate" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sapling.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sapling.json new file mode 100644 index 0000000..1245cb2 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_sapling" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sign.json new file mode 100644 index 0000000..6c96540 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_slab.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_slab.json new file mode 100644 index 0000000..4e599ef --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_slab.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_slab" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_stairs.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_stairs.json new file mode 100644 index 0000000..2e561c2 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_stairs" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_trapdoor.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_trapdoor.json new file mode 100644 index 0000000..7225d07 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_trapdoor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_trapdoor" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_hanging_sign.json new file mode 100644 index 0000000..63cbd85 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_hanging_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_hanging_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_wall_hanging_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_sign.json new file mode 100644 index 0000000..ecc76a3 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_wall_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wood.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wood.json new file mode 100644 index 0000000..4bcd111 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/blaze_wood" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/fletching_table.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/fletching_table.json new file mode 100644 index 0000000..a4d401d --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/fletching_table.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:fletching_table" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/fletching_table" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/kiln.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/kiln.json new file mode 100644 index 0000000..e747fbc --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/kiln.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "function": "minecraft:copy_components", + "include": [ + "minecraft:custom_name" + ], + "source": "block_entity" + } + ], + "name": "ww_hfas:kiln" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/kiln" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_blaze_sapling.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_blaze_sapling.json new file mode 100644 index 0000000..58909e1 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_blaze_sapling.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:blaze_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/potted_blaze_sapling" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_soul_sapling.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_soul_sapling.json new file mode 100644 index 0000000..0e32e13 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_soul_sapling.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:flower_pot" + } + ], + "rolls": 1.0 + }, + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/potted_soul_sapling" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_dirt.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_dirt.json new file mode 100644 index 0000000..c1b779f --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_dirt.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:scorched_dirt" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/scorched_dirt" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass.json new file mode 100644 index 0000000..a037703 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:scorched_grass" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/scorched_grass" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass_block.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass_block.json new file mode 100644 index 0000000..0404662 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass_block.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:scorched_grass_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/scorched_grass_block" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_twig.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_twig.json new file mode 100644 index 0000000..36aef82 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_twig.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:scorched_twig" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/scorched_twig" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_button.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_button.json new file mode 100644 index 0000000..fcf2dbf --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_button.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_button" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_button" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_door.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_door.json new file mode 100644 index 0000000..05fca31 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_door.json @@ -0,0 +1,29 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "ww_hfas:soul_door", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "ww_hfas:soul_door" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_door" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence.json new file mode 100644 index 0000000..c1a07cf --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_fence" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_fence" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence_gate.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence_gate.json new file mode 100644 index 0000000..56c8bf8 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence_gate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_fence_gate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_fence_gate" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_hanging_sign.json new file mode 100644 index 0000000..f3dbb37 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_hanging_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_hanging_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_hanging_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_leaves.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_leaves.json new file mode 100644 index 0000000..6ebea64 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_leaves.json @@ -0,0 +1,130 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + ], + "name": "ww_hfas:soul_leaves" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:survives_explosion" + }, + { + "chances": [ + 0.05 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "name": "ww_hfas:soul_sapling" + } + ] + } + ], + "rolls": 1.0 + }, + { + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "items": "minecraft:shears" + } + }, + { + "condition": "minecraft:match_tool", + "predicate": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ] + } + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "chances": [ + 0.02, + 0.022222223, + 0.025, + 0.033333335, + 0.1 + ], + "condition": "minecraft:table_bonus", + "enchantment": "minecraft:fortune" + } + ], + "functions": [ + { + "count": { + "type": "minecraft:uniform", + "max": 2.0, + "min": 1.0 + }, + "function": "minecraft:set_count" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "minecraft:stick" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_leaves" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_log.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_log.json new file mode 100644 index 0000000..82b0242 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_log" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_planks.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_planks.json new file mode 100644 index 0000000..35d336c --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_planks.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_planks" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_planks" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_pressure_plate.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_pressure_plate.json new file mode 100644 index 0000000..91041d4 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_pressure_plate.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_pressure_plate" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_pressure_plate" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sapling.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sapling.json new file mode 100644 index 0000000..a8a4051 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sapling.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_sapling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_sapling" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sign.json new file mode 100644 index 0000000..b4f5967 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_slab.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_slab.json new file mode 100644 index 0000000..3d22200 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_slab.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_slab" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_stairs.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_stairs.json new file mode 100644 index 0000000..69b0580 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_stairs.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_stairs" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_trapdoor.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_trapdoor.json new file mode 100644 index 0000000..c107f7c --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_trapdoor.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_trapdoor" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_trapdoor" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_hanging_sign.json new file mode 100644 index 0000000..aac71f5 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_hanging_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_hanging_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_wall_hanging_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_sign.json new file mode 100644 index 0000000..9688647 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_sign.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_sign" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_wall_sign" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wood.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wood.json new file mode 100644 index 0000000..75443c9 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:soul_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/soul_wood" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_log.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_log.json new file mode 100644 index 0000000..5049168 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:stripped_azalea_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/stripped_azalea_log" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_wood.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_wood.json new file mode 100644 index 0000000..97742ac --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:stripped_azalea_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/stripped_azalea_wood" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_log.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_log.json new file mode 100644 index 0000000..c2ff7d3 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:stripped_blaze_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/stripped_blaze_log" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_wood.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_wood.json new file mode 100644 index 0000000..e31f358 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:stripped_blaze_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/stripped_blaze_wood" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_log.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_log.json new file mode 100644 index 0000000..f435582 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_log.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:stripped_soul_log" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/stripped_soul_log" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_wood.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_wood.json new file mode 100644 index 0000000..0159cdf --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_wood.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:stripped_soul_wood" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/stripped_soul_wood" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/tiny_cactus.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/tiny_cactus.json new file mode 100644 index 0000000..318ad19 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/blocks/tiny_cactus.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "ww_hfas:tiny_cactus" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "ww_hfas:blocks/tiny_cactus" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/entities/muddy_pig.json b/src/hfas/resources/data/ww_hfas/loot_table/entities/muddy_pig.json new file mode 100644 index 0000000..615a197 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/loot_table/entities/muddy_pig.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:loot_table", + "value": "minecraft:entities/pig" + } + ] + } + ] +} diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_azalea_tree.json b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_azalea_tree.json new file mode 100644 index 0000000..ac3385a --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_azalea_tree.json @@ -0,0 +1,6 @@ +{ + "type": "neoforge:add_features", + "biomes": "minecraft:lush_caves", + "features": "ww_hfas:azalea_tree_placed", + "step": "vegetal_decoration" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_blaze_tree.json b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_blaze_tree.json new file mode 100644 index 0000000..12df402 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_blaze_tree.json @@ -0,0 +1,6 @@ +{ + "type": "neoforge:add_features", + "biomes": "minecraft:nether_wastes", + "features": "ww_hfas:blaze_tree_placed", + "step": "vegetal_decoration" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_muddy_pig.json b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_muddy_pig.json new file mode 100644 index 0000000..dc51a18 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_muddy_pig.json @@ -0,0 +1,10 @@ +{ + "type": "neoforge:add_spawns", + "biomes": "#ww_hfas:spawns_muddy_pig", + "spawners": { + "type": "ww_hfas:muddy_pig", + "weight": 10, + "minCount": 2, + "maxCount": 4 + } +} diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_soul_tree.json b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_soul_tree.json new file mode 100644 index 0000000..362fc7c --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_soul_tree.json @@ -0,0 +1,6 @@ +{ + "type": "neoforge:add_features", + "biomes": "minecraft:soul_sand_valley", + "features": "ww_hfas:soul_tree_placed", + "step": "vegetal_decoration" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/remove_vanilla_azalea_tree.json b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/remove_vanilla_azalea_tree.json new file mode 100644 index 0000000..b7ceefe --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/remove_vanilla_azalea_tree.json @@ -0,0 +1,6 @@ +{ + "type": "neoforge:remove_features", + "biomes": "minecraft:lush_caves", + "features": "minecraft:rooted_azalea_tree", + "steps": "vegetal_decoration" +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_boat.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_boat.json new file mode 100644 index 0000000..838ae63 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_boat.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "boat", + "key": { + "#": "ww_hfas:azalea_planks" + }, + "pattern": [ + "# #", + "###" + ], + "result": { + "id": "ww_hfas:azalea_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_button.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_button.json new file mode 100644 index 0000000..cc6de8d --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_button.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + "ww_hfas:azalea_planks" + ], + "result": { + "id": "ww_hfas:azalea_button" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_chest_boat.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_chest_boat.json new file mode 100644 index 0000000..1933d42 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_chest_boat.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "chest_boat", + "ingredients": [ + "ww_hfas:azalea_boat", + "minecraft:chest" + ], + "result": { + "id": "ww_hfas:azalea_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_door.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_door.json new file mode 100644 index 0000000..4e86a42 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_door.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "ww_hfas:azalea_planks" + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "id": "ww_hfas:azalea_door" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_fence.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_fence.json new file mode 100644 index 0000000..bc4b764 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_fence.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "#": "minecraft:stick", + "W": "ww_hfas:azalea_planks" + }, + "pattern": [ + "W#W", + "W#W" + ], + "result": { + "count": 3, + "id": "ww_hfas:azalea_fence" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_fence_gate.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_fence_gate.json new file mode 100644 index 0000000..df68448 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_fence_gate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "minecraft:stick", + "W": "ww_hfas:azalea_planks" + }, + "pattern": [ + "#W#", + "#W#" + ], + "result": { + "id": "ww_hfas:azalea_fence_gate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_hanging_sign.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_hanging_sign.json new file mode 100644 index 0000000..e42a552 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_hanging_sign.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": "minecraft:iron_chain", + "L": "ww_hfas:stripped_azalea_log" + }, + "pattern": [ + "C C", + "LLL", + "LLL" + ], + "result": { + "count": 6, + "id": "ww_hfas:azalea_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_planks.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_planks.json new file mode 100644 index 0000000..d155086 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_planks.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "group": "planks", + "ingredients": [ + "ww_hfas:azalea_log" + ], + "result": { + "count": 4, + "id": "ww_hfas:azalea_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_pressure_plate.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_pressure_plate.json new file mode 100644 index 0000000..cf2bdf3 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_pressure_plate.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "ww_hfas:azalea_planks" + }, + "pattern": [ + "##" + ], + "result": { + "id": "ww_hfas:azalea_pressure_plate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_shelf.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_shelf.json new file mode 100644 index 0000000..fc7ca67 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_shelf.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "L": "ww_hfas:stripped_azalea_log" + }, + "pattern": [ + "LLL", + " ", + "LLL" + ], + "result": { + "count": 6, + "id": "ww_hfas:azalea_shelf" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_sign.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_sign.json new file mode 100644 index 0000000..a4317ab --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_sign.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "P": "ww_hfas:azalea_planks", + "S": "minecraft:stick" + }, + "pattern": [ + "PPP", + "PPP", + " S " + ], + "result": { + "count": 3, + "id": "ww_hfas:azalea_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_slab.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_slab.json new file mode 100644 index 0000000..2d8e2cd --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_slab.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": "ww_hfas:azalea_planks" + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "id": "ww_hfas:azalea_slab" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_stairs.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_stairs.json new file mode 100644 index 0000000..4d7f01b --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_stairs.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": "ww_hfas:azalea_planks" + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 4, + "id": "ww_hfas:azalea_stairs" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_trapdoor.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_trapdoor.json new file mode 100644 index 0000000..ad70711 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_trapdoor.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "ww_hfas:azalea_planks" + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "id": "ww_hfas:azalea_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_wood.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_wood.json new file mode 100644 index 0000000..61e1629 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/azalea_wood.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": "ww_hfas:azalea_log" + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "id": "ww_hfas:azalea_wood" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_boat.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_boat.json new file mode 100644 index 0000000..a305b91 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_boat.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "boat", + "key": { + "#": "ww_hfas:blaze_planks" + }, + "pattern": [ + "# #", + "###" + ], + "result": { + "id": "ww_hfas:blaze_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_button.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_button.json new file mode 100644 index 0000000..dc32b34 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_button.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + "ww_hfas:blaze_planks" + ], + "result": { + "id": "ww_hfas:blaze_button" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_chest_boat.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_chest_boat.json new file mode 100644 index 0000000..cea4e61 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_chest_boat.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "chest_boat", + "ingredients": [ + "ww_hfas:blaze_boat", + "minecraft:chest" + ], + "result": { + "id": "ww_hfas:blaze_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_door.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_door.json new file mode 100644 index 0000000..76213fa --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_door.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "ww_hfas:blaze_planks" + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "id": "ww_hfas:blaze_door" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_fence.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_fence.json new file mode 100644 index 0000000..4504271 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_fence.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "#": "minecraft:stick", + "W": "ww_hfas:blaze_planks" + }, + "pattern": [ + "W#W", + "W#W" + ], + "result": { + "count": 3, + "id": "ww_hfas:blaze_fence" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_fence_gate.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_fence_gate.json new file mode 100644 index 0000000..745475a --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_fence_gate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "minecraft:stick", + "W": "ww_hfas:blaze_planks" + }, + "pattern": [ + "#W#", + "#W#" + ], + "result": { + "id": "ww_hfas:blaze_fence_gate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_hanging_sign.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_hanging_sign.json new file mode 100644 index 0000000..0d82e36 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_hanging_sign.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "hanging_sign", + "key": { + "#": "ww_hfas:stripped_blaze_log", + "X": "minecraft:iron_chain" + }, + "pattern": [ + "X X", + "###", + "###" + ], + "result": { + "count": 6, + "id": "ww_hfas:blaze_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_planks.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_planks.json new file mode 100644 index 0000000..03a10d1 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_planks.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "group": "planks", + "ingredients": [ + "ww_hfas:blaze_log" + ], + "result": { + "count": 4, + "id": "ww_hfas:blaze_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_pressure_plate.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_pressure_plate.json new file mode 100644 index 0000000..3245696 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_pressure_plate.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "ww_hfas:blaze_planks" + }, + "pattern": [ + "##" + ], + "result": { + "id": "ww_hfas:blaze_pressure_plate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_sign.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_sign.json new file mode 100644 index 0000000..8172341 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_sign.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "key": { + "#": "ww_hfas:blaze_planks", + "X": "minecraft:stick" + }, + "pattern": [ + "###", + "###", + " X " + ], + "result": { + "count": 3, + "id": "ww_hfas:blaze_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_slab.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_slab.json new file mode 100644 index 0000000..69b4720 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_slab.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": "ww_hfas:blaze_planks" + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "id": "ww_hfas:blaze_slab" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_stairs.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_stairs.json new file mode 100644 index 0000000..52a15d9 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_stairs.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": "ww_hfas:blaze_planks" + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 4, + "id": "ww_hfas:blaze_stairs" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_trapdoor.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_trapdoor.json new file mode 100644 index 0000000..8f0f059 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_trapdoor.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "ww_hfas:blaze_planks" + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "id": "ww_hfas:blaze_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_wood.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_wood.json new file mode 100644 index 0000000..00cfa11 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/blaze_wood.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": "ww_hfas:blaze_log" + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "id": "ww_hfas:blaze_wood" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/kiln.json b/src/hfas/resources/data/ww_hfas/recipe/kiln.json new file mode 100644 index 0000000..99e7195 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/kiln.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "B": "minecraft:brick", + "F": "minecraft:furnace", + "M": "minecraft:packed_mud" + }, + "pattern": [ + " B ", + "BFB", + "MMM" + ], + "result": { + "id": "ww_hfas:kiln" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_boat.json b/src/hfas/resources/data/ww_hfas/recipe/soul_boat.json new file mode 100644 index 0000000..c871897 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_boat.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "boat", + "key": { + "#": "ww_hfas:soul_planks" + }, + "pattern": [ + "# #", + "###" + ], + "result": { + "id": "ww_hfas:soul_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_button.json b/src/hfas/resources/data/ww_hfas/recipe/soul_button.json new file mode 100644 index 0000000..127d543 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_button.json @@ -0,0 +1,10 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients": [ + "ww_hfas:soul_planks" + ], + "result": { + "id": "ww_hfas:soul_button" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_chest_boat.json b/src/hfas/resources/data/ww_hfas/recipe/soul_chest_boat.json new file mode 100644 index 0000000..14dfde6 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_chest_boat.json @@ -0,0 +1,11 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "chest_boat", + "ingredients": [ + "ww_hfas:soul_boat", + "minecraft:chest" + ], + "result": { + "id": "ww_hfas:soul_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_door.json b/src/hfas/resources/data/ww_hfas/recipe/soul_door.json new file mode 100644 index 0000000..4a3515f --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_door.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "ww_hfas:soul_planks" + }, + "pattern": [ + "##", + "##", + "##" + ], + "result": { + "count": 3, + "id": "ww_hfas:soul_door" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_fence.json b/src/hfas/resources/data/ww_hfas/recipe/soul_fence.json new file mode 100644 index 0000000..d64e115 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_fence.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "#": "minecraft:stick", + "W": "ww_hfas:soul_planks" + }, + "pattern": [ + "W#W", + "W#W" + ], + "result": { + "count": 3, + "id": "ww_hfas:soul_fence" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_fence_gate.json b/src/hfas/resources/data/ww_hfas/recipe/soul_fence_gate.json new file mode 100644 index 0000000..5c0427f --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_fence_gate.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "minecraft:stick", + "W": "ww_hfas:soul_planks" + }, + "pattern": [ + "#W#", + "#W#" + ], + "result": { + "id": "ww_hfas:soul_fence_gate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_hanging_sign.json b/src/hfas/resources/data/ww_hfas/recipe/soul_hanging_sign.json new file mode 100644 index 0000000..2a1bad9 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_hanging_sign.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "hanging_sign", + "key": { + "#": "ww_hfas:stripped_soul_log", + "X": "minecraft:iron_chain" + }, + "pattern": [ + "X X", + "###", + "###" + ], + "result": { + "count": 6, + "id": "ww_hfas:soul_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_planks.json b/src/hfas/resources/data/ww_hfas/recipe/soul_planks.json new file mode 100644 index 0000000..5170187 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_planks.json @@ -0,0 +1,12 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "building", + "group": "planks", + "ingredients": [ + "ww_hfas:soul_log" + ], + "result": { + "count": 4, + "id": "ww_hfas:soul_planks" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_pressure_plate.json b/src/hfas/resources/data/ww_hfas/recipe/soul_pressure_plate.json new file mode 100644 index 0000000..5cc9c34 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_pressure_plate.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "ww_hfas:soul_planks" + }, + "pattern": [ + "##" + ], + "result": { + "id": "ww_hfas:soul_pressure_plate" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_sign.json b/src/hfas/resources/data/ww_hfas/recipe/soul_sign.json new file mode 100644 index 0000000..67bdf79 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_sign.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "sign", + "key": { + "#": "ww_hfas:soul_planks", + "X": "minecraft:stick" + }, + "pattern": [ + "###", + "###", + " X " + ], + "result": { + "count": 3, + "id": "ww_hfas:soul_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_slab.json b/src/hfas/resources/data/ww_hfas/recipe/soul_slab.json new file mode 100644 index 0000000..0eaf551 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_slab.json @@ -0,0 +1,14 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": "ww_hfas:soul_planks" + }, + "pattern": [ + "###" + ], + "result": { + "count": 6, + "id": "ww_hfas:soul_slab" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_stairs.json b/src/hfas/resources/data/ww_hfas/recipe/soul_stairs.json new file mode 100644 index 0000000..73d24a8 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_stairs.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": "ww_hfas:soul_planks" + }, + "pattern": [ + "# ", + "## ", + "###" + ], + "result": { + "count": 4, + "id": "ww_hfas:soul_stairs" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_trapdoor.json b/src/hfas/resources/data/ww_hfas/recipe/soul_trapdoor.json new file mode 100644 index 0000000..cf7531c --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_trapdoor.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "redstone", + "key": { + "#": "ww_hfas:soul_planks" + }, + "pattern": [ + "###", + "###" + ], + "result": { + "count": 2, + "id": "ww_hfas:soul_trapdoor" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_wood.json b/src/hfas/resources/data/ww_hfas/recipe/soul_wood.json new file mode 100644 index 0000000..d43c564 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/soul_wood.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "building", + "key": { + "#": "ww_hfas:soul_log" + }, + "pattern": [ + "##", + "##" + ], + "result": { + "count": 3, + "id": "ww_hfas:soul_wood" + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/wool_to_string.json b/src/hfas/resources/data/ww_hfas/recipe/wool_to_string.json new file mode 100644 index 0000000..f000199 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/recipe/wool_to_string.json @@ -0,0 +1,3 @@ +{ + "type": "ww_hfas:wool_to_string" +} diff --git a/src/hfas/resources/data/ww_hfas/tags/block/azalea_logs.json b/src/hfas/resources/data/ww_hfas/tags/block/azalea_logs.json new file mode 100644 index 0000000..8b47bdf --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/block/azalea_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "ww_hfas:azalea_log", + "ww_hfas:azalea_wood", + "ww_hfas:stripped_azalea_log", + "ww_hfas:stripped_azalea_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/block/blaze_logs.json b/src/hfas/resources/data/ww_hfas/tags/block/blaze_logs.json new file mode 100644 index 0000000..5b0cec5 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/block/blaze_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "ww_hfas:blaze_log", + "ww_hfas:blaze_wood", + "ww_hfas:stripped_blaze_log", + "ww_hfas:stripped_blaze_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/block/muddy_pig_spawnable_on.json b/src/hfas/resources/data/ww_hfas/tags/block/muddy_pig_spawnable_on.json new file mode 100644 index 0000000..dbe5311 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/block/muddy_pig_spawnable_on.json @@ -0,0 +1,8 @@ +{ + "replace": false, + "values": [ + "#minecraft:animals_spawnable_on", + "minecraft:mud", + "minecraft:muddy_mangrove_roots" + ] +} diff --git a/src/hfas/resources/data/ww_hfas/tags/block/soul_logs.json b/src/hfas/resources/data/ww_hfas/tags/block/soul_logs.json new file mode 100644 index 0000000..aefaa6f --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/block/soul_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "ww_hfas:soul_log", + "ww_hfas:soul_wood", + "ww_hfas:stripped_soul_log", + "ww_hfas:stripped_soul_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/entity_type/choke_affected.json b/src/hfas/resources/data/ww_hfas/tags/entity_type/choke_affected.json new file mode 100644 index 0000000..7b89899 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/entity_type/choke_affected.json @@ -0,0 +1,49 @@ +{ + "replace": false, + "values": [ + "minecraft:player", + "minecraft:fox", + "minecraft:camel", + "minecraft:camel_husk", + "minecraft:chicken", + "minecraft:mooshroom", + "minecraft:cow", + "minecraft:donkey", + "minecraft:horse", + "minecraft:mule", + "minecraft:parrot", + "minecraft:pig", + "minecraft:rabbit", + "minecraft:sheep", + "minecraft:sniffer", + "minecraft:turtle", + "minecraft:wandering_trader", + "minecraft:goat", + "minecraft:villager", + "minecraft:cat", + "minecraft:frog", + "minecraft:ocelot", + "minecraft:snow_golem", + "minecraft:bee", + "minecraft:panda", + "minecraft:iron_golem", + "minecraft:llama", + "minecraft:polar_bear", + "minecraft:trader_llama", + "minecraft:wolf", + "minecraft:evoker", + "minecraft:hoglin", + "minecraft:piglin_brute", + "minecraft:pillager", + "minecraft:ravager", + "minecraft:vindicator", + "minecraft:warden", + "minecraft:witch", + "minecraft:creeper", + "minecraft:cave_spider", + "minecraft:spider", + "minecraft:enderman", + "minecraft:piglin", + "ww_hfas:muddy_pig" + ] +} diff --git a/src/hfas/resources/data/ww_hfas/tags/entity_type/sink_affected.json b/src/hfas/resources/data/ww_hfas/tags/entity_type/sink_affected.json new file mode 100644 index 0000000..df1cf35 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/entity_type/sink_affected.json @@ -0,0 +1,47 @@ +{ + "replace": false, + "values": [ + "minecraft:player", + "minecraft:fox", + "minecraft:camel", + "minecraft:camel_husk", + "minecraft:chicken", + "minecraft:mooshroom", + "minecraft:cow", + "minecraft:donkey", + "minecraft:horse", + "minecraft:mule", + "minecraft:parrot", + "minecraft:pig", + "minecraft:rabbit", + "minecraft:sheep", + "minecraft:sniffer", + "minecraft:tadpole", + "minecraft:turtle", + "minecraft:wandering_trader", + "minecraft:goat", + "minecraft:villager", + "minecraft:axolotl", + "minecraft:cat", + "minecraft:frog", + "minecraft:ocelot", + "minecraft:snow_golem", + "minecraft:bee", + "minecraft:panda", + "minecraft:iron_golem", + "minecraft:llama", + "minecraft:polar_bear", + "minecraft:trader_llama", + "minecraft:wolf", + "minecraft:evoker", + "minecraft:hoglin", + "minecraft:piglin_brute", + "minecraft:pillager", + "minecraft:ravager", + "minecraft:vindicator", + "minecraft:warden", + "minecraft:witch", + "minecraft:piglin", + "ww_hfas:muddy_pig" + ] +} diff --git a/src/hfas/resources/data/ww_hfas/tags/entity_type/water_breathing.json b/src/hfas/resources/data/ww_hfas/tags/entity_type/water_breathing.json new file mode 100644 index 0000000..c35d811 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/entity_type/water_breathing.json @@ -0,0 +1,33 @@ +{ + "replace": false, + "values": [ + "minecraft:cod", + "minecraft:salmon", + "minecraft:tropical_fish", + "minecraft:pufferfish", + "minecraft:squid", + "minecraft:glow_squid", + "minecraft:dolphin", + "minecraft:drowned", + "minecraft:guardian", + "minecraft:elder_guardian", + "minecraft:bogged", + "minecraft:slime", + "minecraft:magma_cube", + "minecraft:zombie", + "minecraft:zombie_villager", + "minecraft:husk", + "minecraft:skeleton", + "minecraft:stray", + "minecraft:wither_skeleton", + "minecraft:zombified_piglin", + "minecraft:zoglin", + "minecraft:phantom", + "minecraft:zombie_horse", + "minecraft:skeleton_horse", + "minecraft:wither", + { "id": "ww_hfas:mudcrab", "required": false }, + { "id": "ww_hfas:direfish", "required": false }, + { "id": "ww_hfas:piranha", "required": false } + ] +} diff --git a/src/hfas/resources/data/ww_hfas/tags/item/azalea_logs.json b/src/hfas/resources/data/ww_hfas/tags/item/azalea_logs.json new file mode 100644 index 0000000..8b47bdf --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/item/azalea_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "ww_hfas:azalea_log", + "ww_hfas:azalea_wood", + "ww_hfas:stripped_azalea_log", + "ww_hfas:stripped_azalea_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/item/blaze_logs.json b/src/hfas/resources/data/ww_hfas/tags/item/blaze_logs.json new file mode 100644 index 0000000..5b0cec5 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/item/blaze_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "ww_hfas:blaze_log", + "ww_hfas:blaze_wood", + "ww_hfas:stripped_blaze_log", + "ww_hfas:stripped_blaze_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/item/kiln_excluded.json b/src/hfas/resources/data/ww_hfas/tags/item/kiln_excluded.json new file mode 100644 index 0000000..dce14ed --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/item/kiln_excluded.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + { "id": "#c:ores", "required": false }, + { "id": "#c:raw_materials", "required": false }, + { "id": "#c:ingots", "required": false }, + { "id": "#c:nuggets", "required": false }, + { "id": "#c:gems", "required": false } + ] +} diff --git a/src/hfas/resources/data/ww_hfas/tags/item/kiln_metal_outputs.json b/src/hfas/resources/data/ww_hfas/tags/item/kiln_metal_outputs.json new file mode 100644 index 0000000..d5fb4b7 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/item/kiln_metal_outputs.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + { "id": "#c:ingots", "required": false }, + { "id": "#c:nuggets", "required": false } + ] +} diff --git a/src/hfas/resources/data/ww_hfas/tags/item/soul_logs.json b/src/hfas/resources/data/ww_hfas/tags/item/soul_logs.json new file mode 100644 index 0000000..aefaa6f --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/item/soul_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "ww_hfas:soul_log", + "ww_hfas:soul_wood", + "ww_hfas:stripped_soul_log", + "ww_hfas:stripped_soul_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/worldgen/biome/spawns_muddy_pig.json b/src/hfas/resources/data/ww_hfas/tags/worldgen/biome/spawns_muddy_pig.json new file mode 100644 index 0000000..7cea7fd --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/tags/worldgen/biome/spawns_muddy_pig.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:swamp", + "minecraft:mangrove_swamp" + ] +} diff --git a/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/azalea_tree.json b/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/azalea_tree.json new file mode 100644 index 0000000..2f599d6 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/azalea_tree.json @@ -0,0 +1,71 @@ +{ + "type": "minecraft:tree", + "config": { + "below_trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:rooted_dirt" + } + }, + "decorators": [], + "foliage_placer": { + "type": "minecraft:random_spread_foliage_placer", + "foliage_height": 2, + "leaf_placement_attempts": 50, + "offset": 0, + "radius": 3 + }, + "foliage_provider": { + "type": "minecraft:weighted_state_provider", + "entries": [ + { + "data": { + "Name": "minecraft:azalea_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + }, + "weight": 3 + }, + { + "data": { + "Name": "minecraft:flowering_azalea_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + }, + "weight": 1 + } + ] + }, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size" + }, + "trunk_placer": { + "type": "minecraft:bending_trunk_placer", + "base_height": 4, + "bend_length": { + "type": "minecraft:uniform", + "max_inclusive": 2, + "min_inclusive": 1 + }, + "height_rand_a": 2, + "height_rand_b": 0, + "min_height_for_leaves": 3 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "ww_hfas:azalea_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/blaze_tree.json b/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/blaze_tree.json new file mode 100644 index 0000000..f2acfdf --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/blaze_tree.json @@ -0,0 +1,62 @@ +{ + "type": "minecraft:tree", + "config": { + "below_trunk_provider": { + "type": "minecraft:rule_based_state_provider", + "rules": [ + { + "if_true": { + "type": "minecraft:not", + "predicate": { + "type": "minecraft:matching_block_tag", + "tag": "minecraft:cannot_replace_below_tree_trunk" + } + }, + "then": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + } + } + ] + }, + "decorators": [], + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "ww_hfas:blaze_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size" + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 4, + "height_rand_a": 2, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "ww_hfas:blaze_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/soul_tree.json b/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/soul_tree.json new file mode 100644 index 0000000..9fe2d82 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/soul_tree.json @@ -0,0 +1,62 @@ +{ + "type": "minecraft:tree", + "config": { + "below_trunk_provider": { + "type": "minecraft:rule_based_state_provider", + "rules": [ + { + "if_true": { + "type": "minecraft:not", + "predicate": { + "type": "minecraft:matching_block_tag", + "tag": "minecraft:cannot_replace_below_tree_trunk" + } + }, + "then": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "minecraft:dirt" + } + } + } + ] + }, + "decorators": [], + "foliage_placer": { + "type": "minecraft:blob_foliage_placer", + "height": 3, + "offset": 0, + "radius": 2 + }, + "foliage_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "ww_hfas:soul_leaves", + "Properties": { + "distance": "7", + "persistent": "false", + "waterlogged": "false" + } + } + }, + "ignore_vines": false, + "minimum_size": { + "type": "minecraft:two_layers_feature_size" + }, + "trunk_placer": { + "type": "minecraft:straight_trunk_placer", + "base_height": 4, + "height_rand_a": 2, + "height_rand_b": 0 + }, + "trunk_provider": { + "type": "minecraft:simple_state_provider", + "state": { + "Name": "ww_hfas:soul_log", + "Properties": { + "axis": "y" + } + } + } + } +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/azalea_tree_placed.json b/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/azalea_tree_placed.json new file mode 100644 index 0000000..6e408d5 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/azalea_tree_placed.json @@ -0,0 +1,48 @@ +{ + "feature": "ww_hfas:azalea_tree", + "placement": [ + { + "type": "minecraft:count", + "count": { + "type": "minecraft:uniform", + "max_inclusive": 2, + "min_inclusive": 1 + } + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:uniform", + "max_inclusive": { + "absolute": 256 + }, + "min_inclusive": { + "above_bottom": 0 + } + } + }, + { + "type": "minecraft:environment_scan", + "allowed_search_condition": { + "type": "minecraft:matching_block_tag", + "tag": "minecraft:air" + }, + "direction_of_search": "up", + "max_steps": 12, + "target_condition": { + "type": "minecraft:solid" + } + }, + { + "type": "minecraft:random_offset", + "xz_spread": 0, + "y_spread": -1 + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/blaze_tree_placed.json b/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/blaze_tree_placed.json new file mode 100644 index 0000000..1439cda --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/blaze_tree_placed.json @@ -0,0 +1,4 @@ +{ + "feature": "ww_hfas:blaze_tree", + "placement": [] +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/soul_tree_placed.json b/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/soul_tree_placed.json new file mode 100644 index 0000000..b6396b3 --- /dev/null +++ b/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/soul_tree_placed.json @@ -0,0 +1,4 @@ +{ + "feature": "ww_hfas:soul_tree", + "placement": [] +} \ No newline at end of file diff --git a/src/hfas/resources/ww_hfas.mixins.json b/src/hfas/resources/ww_hfas.mixins.json new file mode 100644 index 0000000..158f14f --- /dev/null +++ b/src/hfas/resources/ww_hfas.mixins.json @@ -0,0 +1,35 @@ +{ + "required": true, + "package": "org.polaris2023.wildwind.hfas.mixin", + "compatibilityLevel": "JAVA_25", + "mixins": [ + "FurnaceFuelAccessor", + "SinglePoolElementMixin", + "AbstractSkeletonMixin", + "AzaleaBlockMixin", + "EnchantmentHelperMixin", + "ItemStackMixin", + "MobMixin", + "PlayerMixin", + "ServerPlayerGameModeMixin", + "CrafterBlockMixin", + "EntityFluidMovementMixin", + "WaterAnimalAirSupplyMixin", + "IronGolemAirSupplyMixin", + "AbstractArrowAccessor", + "ReachArrowCraftingMixin", + "ReachArrowLootMixin", + "LootPoolEntriesAccessor", + "LootTablePoolsAccessor" + ], + "injectors": { + "defaultRequire": 1 + }, + "overwrites": { + "requireAnnotations": true + }, + "client": [ + "SignRenderStateMixin", + "AzaleaSignRendererMixin" + ] +} diff --git a/src/hfas/test/org/polaris2023/wildwind/hfas/client/MuddyPigModelTest.java b/src/hfas/test/org/polaris2023/wildwind/hfas/client/MuddyPigModelTest.java new file mode 100644 index 0000000..adbd5c3 --- /dev/null +++ b/src/hfas/test/org/polaris2023/wildwind/hfas/client/MuddyPigModelTest.java @@ -0,0 +1,60 @@ +package org.polaris2023.wildwind.hfas.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.animal.pig.PigModel; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.builders.CubeDeformation; +import net.minecraft.client.renderer.entity.state.PigRenderState; +import org.junit.jupiter.api.Test; +import org.joml.Vector3f; +import static org.junit.jupiter.api.Assertions.*; + +class MuddyPigModelTest { + @Test + void adultAndBabyBakeWithNineAuthoredCubesAndCorrectBounds() { + bounds(MuddyPigModel.adultLayer().bakeRoot(), new float[]{-5, 0, -16, 5, 24, 8}); + bounds(MuddyPigModel.babyLayer().bakeRoot(), new float[]{-4, 10, -8, 3, 24, 5}); + } + + private void bounds(ModelPart root, float[] expected) { + int[] count = {0}; + float[] bounds = {Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY, Float.POSITIVE_INFINITY, + Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY}; + root.visit(new PoseStack(), (pose, path, index, cube) -> { + count[0]++; + for (float x : new float[]{cube.minX, cube.maxX}) + for (float y : new float[]{cube.minY, cube.maxY}) + for (float z : new float[]{cube.minZ, cube.maxZ}) { + Vector3f v = pose.pose().transformPosition(new Vector3f(x / 16, y / 16, z / 16)).mul(16); + for (int axis = 0; axis < 3; axis++) { + bounds[axis] = Math.min(bounds[axis], v.get(axis)); + bounds[axis + 3] = Math.max(bounds[axis + 3], v.get(axis)); + } + } + }); + assertEquals(9, count[0]); + assertArrayEquals(expected, bounds, 0.0001F); + } + + @Test + void bothAgesUseVanillaPigHeadAndWalkAnimation() { + for (var layer : new net.minecraft.client.model.geom.builders.LayerDefinition[]{ + MuddyPigModel.adultLayer(), MuddyPigModel.babyLayer()}) { + var root = layer.bakeRoot(); + var vanillaRoot = PigModel.createBodyLayer(CubeDeformation.NONE).bakeRoot(); + var muddy = new MuddyPigModel(root); + var vanilla = new PigModel(vanillaRoot); + var state = new PigRenderState(); + state.xRot = 25; + state.yRot = -30; + state.walkAnimationPos = 2.5F; + state.walkAnimationSpeed = 0.7F; + muddy.setupAnim(state); + vanilla.setupAnim(state); + for (String part : new String[]{"head", "right_hind_leg", "left_hind_leg", "right_front_leg", "left_front_leg"}) { + assertEquals(vanillaRoot.getChild(part).xRot, root.getChild(part).xRot); + assertEquals(vanillaRoot.getChild(part).yRot, root.getChild(part).yRot); + } + } + } +} diff --git a/src/structures/gametest/config/ww_structures/definitions/blocked.json b/src/structures/gametest/config/ww_structures/definitions/blocked.json new file mode 100644 index 0000000..4c0bbc2 --- /dev/null +++ b/src/structures/gametest/config/ww_structures/definitions/blocked.json @@ -0,0 +1,7 @@ +{ + "name": "blocked", + "template": "example_ruins.nbt", + "biomes": ["minecraft:plains"], + "placement": {"spacing": 2, "separation": 1, "salt": 123456}, + "conditions": {"min_y": 1000, "max_y": 1001} +} diff --git a/src/structures/gametest/config/ww_structures/definitions/disabled.json b/src/structures/gametest/config/ww_structures/definitions/disabled.json new file mode 100644 index 0000000..6997a49 --- /dev/null +++ b/src/structures/gametest/config/ww_structures/definitions/disabled.json @@ -0,0 +1,6 @@ +{ + "name": "disabled", + "enabled": false, + "template": "example_ruins.nbt", + "biomes": ["minecraft:plains"] +} diff --git a/src/structures/gametest/config/ww_structures/definitions/smoke.json b/src/structures/gametest/config/ww_structures/definitions/smoke.json new file mode 100644 index 0000000..b66cc37 --- /dev/null +++ b/src/structures/gametest/config/ww_structures/definitions/smoke.json @@ -0,0 +1,9 @@ +{ + "name": "smoke", + "template": "wide_ruins.nbt", + "biomes": ["minecraft:plains"], + "placement": {"spacing": 2, "separation": 1, "salt": 142857, "frequency": 1.0}, + "y_offset": -1, + "rotation": "clockwise_90", + "conditions": {"min_y": -2032, "max_y": 2031, "max_terrain_difference": 0, "avoid_fluids": true, "ground_blocks": ["#minecraft:dirt", "minecraft:grass_block"]} +} diff --git a/src/structures/gametest/config/ww_structures/templates/wide_ruins.nbt b/src/structures/gametest/config/ww_structures/templates/wide_ruins.nbt new file mode 100644 index 0000000000000000000000000000000000000000..66d00f6f1873c31ef1e7305499fb20c6183852a9 GIT binary patch literal 1275 zcmajT`%6<%0KoCPUAOt#q=$u-Nz9B8Eszz>%zg-@;_468@wCj&4`OgdgJP33YL8-2 zn4na$GJ+z(bJX+8T&>r=J?XLfA&!DlV&&_OrL~?eGWr9Ket-J%$vKxS{7*mEGW_!F zr@gC`(cE=E6W?#mNL6=SQ?AJd`5L`bH`(2?t)qG5)zKUKYHEM!O^d%;C;p5M-;~<& zp7%|Rl&{&@_F$m#=Y^5Mfn3(*pLiQ{$jG%}HJS?5mBAbY_U__DmBmfbbk)+Ju5SY=-rUEP|DE$jyvo9#Z8raDWbZ*)r0Pf(Bdw>-pqi7UDud5og1g zBAY-l9paM-m%x}RXMkop1MdUnkCSfbgR<&eM zM(tk4rzNmc(UQPAYWJ`dQjVN@%%{WD?qgZxHF6qp5$sg8bik)V*wU^xxD znSsnhs+I~WY1qp$NiT95a6UZ9Cl51|2ILg+O88FEj9@bj^T~vZ;X75cfJPejv25}g zIr*dm8MMjGM6w!v7qAJIC>o!VffcqOo0ly-$LIVrrPAz~JYU}S_P^6x4-MCyxp$xK z=*WLqwP^h8#>&&TKU9u)SM-JAu@m9`Q#m&hUq*k-#HV6S_wT-sj> functions = DeferredRegister.create(Registries.TEST_FUNCTION, "ww_hfas_tests"); + functions.register("generation", () -> StructureGameTests::generation); + functions.register(bus); + } + + private static void generation(GameTestHelper helper) { + helper.assertTrue(net.neoforged.fml.ModList.get().isLoaded("ww_hfas") + && !net.neoforged.fml.ModList.get().isLoaded("ww_structures"), + Component.literal("Structures and items must load from the single HFAS mod")); + for (var item : org.polaris2023.wildwind.hfas.registry.ModItems.MATERIALS) { + helper.assertTrue(net.minecraft.core.registries.BuiltInRegistries.ITEM.containsKey(item.getId()) + && item.get().getClass() == net.minecraft.world.item.Item.class + && !item.toStack().has(net.minecraft.core.component.DataComponents.FOOD), + Component.literal("Plain material must be available alongside structures: " + item.getId())); + } + var level = helper.getLevel(); + var id = Identifier.parse("ww_structures:smoke"); + var holder = level.registryAccess().lookupOrThrow(Registries.STRUCTURE).getOrThrow(ResourceKey.create(Registries.STRUCTURE, id)); + helper.assertTrue(holder.value() instanceof ConfiguredStructure, Component.literal("Config must become a registered structure")); + for (String rejected : new String[]{"blocked", "disabled"}) { + var rejectedHolder = level.registryAccess().lookupOrThrow(Registries.STRUCTURE).getOrThrow( + ResourceKey.create(Registries.STRUCTURE, Identifier.parse("ww_structures:" + rejected))); + helper.assertTrue(level.getChunkSource().getGenerator().findNearestMapStructure(level, HolderSet.direct(rejectedHolder), + new BlockPos(2048, 0, 2048), 2, false) == null, Component.literal(rejected + " must not generate")); + } + // Far from the test arena; generate through the actual ChunkGenerator, not /place. + var result = level.getChunkSource().getGenerator().findNearestMapStructure(level, HolderSet.direct(holder), + new BlockPos(2048, 0, 2048), 4, false); + helper.assertTrue(result != null, Component.literal("Native locate must discover the configured structure")); + var pos = result.getFirst(); + var chunk = level.getChunk(pos); + var start = chunk.getStartForStructure(holder.value()); + helper.assertTrue(start != null && start.isValid(), Component.literal("Generated chunk must contain a valid start")); + var piece = (ConfiguredTemplatePiece) start.getPieces().getFirst(); + var box = piece.getBoundingBox(); + helper.assertTrue(box.getXSpan() == 19 && box.getZSpan() == 23, Component.literal("Rotation must swap template footprint")); + BlockPos floor = new BlockPos(box.minX(), box.minY(), box.minZ()); + // Load every intersecting chunk so that the cross-chunk template has been placed completely. + for (int x = box.minX() >> 4; x <= box.maxX() >> 4; x++) { + for (int z = box.minZ() >> 4; z <= box.maxZ() >> 4; z++) level.getChunk(x, z); + } + helper.assertTrue(level.getBlockState(floor).is(Blocks.MOSSY_COBBLESTONE), Component.literal("Template foundation must generate")); + helper.assertTrue(level.getBlockState(floor.above(1)).is(Blocks.STONE_BRICKS), Component.literal("Template pillar must generate")); + for (int x : new int[]{box.minX(), box.maxX()}) { + for (int z : new int[]{box.minZ(), box.maxZ()}) { + helper.assertTrue(level.getBlockState(new BlockPos(x, box.minY(), z)).is(Blocks.MOSSY_COBBLESTONE), + Component.literal("All corners must generate across chunk boundaries")); + helper.assertTrue(level.getBlockState(new BlockPos(x, box.minY() + 1, z)).is(Blocks.STONE_BRICKS), + Component.literal("Rotated pillars must generate across chunk boundaries")); + } + } + var serialization = StructurePieceSerializationContext.fromLevel(level); + CompoundTag saved = piece.createTag(serialization); + var restored = new ConfiguredTemplatePiece(serialization, saved); + helper.assertTrue(restored.templatePosition().equals(piece.templatePosition()) && restored.getRotation() == piece.getRotation(), + Component.literal("Piece origin and rotation must survive chunk NBT round trip")); + helper.runAfterDelay(2, () -> { + var index = level.getDataStorage().computeIfAbsent(GeneratedStructureIndex.TYPE); + helper.assertTrue(index.nearest(id, pos).isPresent(), Component.literal("Full chunk must enter the generated structure index")); + var source = level.getServer().createCommandSourceStack().withLevel(level); + var dispatcher = level.getServer().getCommands().getDispatcher(); + try { + helper.assertTrue(dispatcher.execute("wwstructure locate smoke", source.withPosition(Vec3.atCenterOf(pos))) == 1, + Component.literal("Generated locate command must succeed")); + helper.assertTrue(dispatcher.execute("wwstructure search smoke 2", source.withPosition(Vec3.atCenterOf(pos))) == 1, + Component.literal("Native search command must succeed")); + helper.assertTrue(dispatcher.execute("wwstructure locate missing", source) == 0, + Component.literal("Unknown structure must report no result")); + } catch (com.mojang.brigadier.exceptions.CommandSyntaxException exception) { + throw new IllegalStateException(exception); + } + helper.succeed(); + }); + } +} diff --git a/src/structures/gametest/java/org/polaris2023/wildwind/structures/test/mixin/GameTestServerMixin.java b/src/structures/gametest/java/org/polaris2023/wildwind/structures/test/mixin/GameTestServerMixin.java new file mode 100644 index 0000000..6b86b94 --- /dev/null +++ b/src/structures/gametest/java/org/polaris2023/wildwind/structures/test/mixin/GameTestServerMixin.java @@ -0,0 +1,14 @@ +package org.polaris2023.wildwind.structures.test.mixin; + +import net.minecraft.gametest.framework.GameTestServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +/** Vanilla GameTest disables structure generation. Enable it only in the test mod. */ +@Mixin(GameTestServer.class) +public abstract class GameTestServerMixin { + @ModifyArg(method = "", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/level/levelgen/WorldOptions;(JZZ)V"), index = 1) + private static boolean structuresTests$enableStructures(boolean original) { return true; } +} diff --git a/src/structures/gametest/resources/data/minecraft/worldgen/world_preset/flat.json b/src/structures/gametest/resources/data/minecraft/worldgen/world_preset/flat.json new file mode 100644 index 0000000..e53cbdd --- /dev/null +++ b/src/structures/gametest/resources/data/minecraft/worldgen/world_preset/flat.json @@ -0,0 +1,21 @@ +{ + "dimensions": { + "minecraft:overworld": { + "type": "minecraft:overworld", + "generator": { + "type": "minecraft:flat", + "settings": { + "biome": "minecraft:plains", + "features": false, + "lakes": false, + "layers": [ + {"block": "minecraft:bedrock", "height": 1}, + {"block": "minecraft:dirt", "height": 2}, + {"block": "minecraft:grass_block", "height": 1} + ], + "structure_overrides": ["ww_structures:smoke", "ww_structures:blocked"] + } + } + } + } +} diff --git a/src/structures/gametest/resources/data/ww_hfas_tests/test_instance/generation.json b/src/structures/gametest/resources/data/ww_hfas_tests/test_instance/generation.json new file mode 100644 index 0000000..7504a4d --- /dev/null +++ b/src/structures/gametest/resources/data/ww_hfas_tests/test_instance/generation.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "function": "ww_hfas_tests:generation", + "environment": "minecraft:default", + "structure": "ww_structures:smoke", + "max_ticks": 200 +} diff --git a/src/structures/gametest/resources/ww_hfas_tests.mixins.json b/src/structures/gametest/resources/ww_hfas_tests.mixins.json new file mode 100644 index 0000000..cb18fe7 --- /dev/null +++ b/src/structures/gametest/resources/ww_hfas_tests.mixins.json @@ -0,0 +1,7 @@ +{ + "required": true, + "package": "org.polaris2023.wildwind.structures.test.mixin", + "compatibilityLevel": "JAVA_25", + "mixins": ["GameTestServerMixin"], + "injectors": {"defaultRequire": 1} +} diff --git a/src/structures/java/org/polaris2023/wildwind/structures/StructureModule.java b/src/structures/java/org/polaris2023/wildwind/structures/StructureModule.java new file mode 100644 index 0000000..642d5e1 --- /dev/null +++ b/src/structures/java/org/polaris2023/wildwind/structures/StructureModule.java @@ -0,0 +1,35 @@ +package org.polaris2023.wildwind.structures; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.levelgen.structure.StructureType; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.structures.command.StructureCommands; +import org.polaris2023.wildwind.structures.config.ConfigStructurePack; +import org.polaris2023.wildwind.structures.worldgen.ConfiguredStructure; +import org.polaris2023.wildwind.structures.worldgen.ConfiguredTemplatePiece; +import org.polaris2023.wildwind.structures.worldgen.GeneratedStructureIndex; + +public final class StructureModule { + // Keep registry and saved-data IDs compatible with the former standalone module. + public static final String NAMESPACE = "ww_structures"; + private static final DeferredRegister> TYPES = DeferredRegister.create(Registries.STRUCTURE_TYPE, NAMESPACE); + private static final DeferredRegister PIECES = DeferredRegister.create(Registries.STRUCTURE_PIECE, NAMESPACE); + public static final DeferredHolder, StructureType> STRUCTURE = + TYPES.register("configured", () -> () -> ConfiguredStructure.CODEC); + public static final DeferredHolder PIECE = + PIECES.register("template", () -> ConfiguredTemplatePiece::new); + + private StructureModule() {} + + public static void register(IEventBus bus) { + TYPES.register(bus); + PIECES.register(bus); + bus.addListener(ConfigStructurePack::addPack); + NeoForge.EVENT_BUS.addListener(StructureCommands::register); + NeoForge.EVENT_BUS.addListener(GeneratedStructureIndex::onChunkLoad); + } +} diff --git a/src/structures/java/org/polaris2023/wildwind/structures/command/StructureCommands.java b/src/structures/java/org/polaris2023/wildwind/structures/command/StructureCommands.java new file mode 100644 index 0000000..d07d89e --- /dev/null +++ b/src/structures/java/org/polaris2023/wildwind/structures/command/StructureCommands.java @@ -0,0 +1,91 @@ +package org.polaris2023.wildwind.structures.command; + +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import java.util.TreeSet; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.permissions.Permissions; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import org.polaris2023.wildwind.structures.StructureModule; +import org.polaris2023.wildwind.structures.worldgen.ConfiguredStructure; +import org.polaris2023.wildwind.structures.worldgen.GeneratedStructureIndex; + +public final class StructureCommands { + public static void register(RegisterCommandsEvent event) { + event.getDispatcher().register(Commands.literal("wwstructure") + .requires(source -> source.permissions().hasPermission(Permissions.COMMANDS_GAMEMASTER)) + .then(Commands.literal("list").executes(context -> { + var names = names(context.getSource()); + context.getSource().sendSuccess(() -> Component.literal("结构名称(配置或当前维度历史记录):" + String.join(", ", names)), false); + return names.size(); + })) + .then(Commands.literal("locate").then(Commands.argument("name", StringArgumentType.word()) + .suggests((context, builder) -> SharedSuggestionProvider.suggest(names(context.getSource()), builder)) + .executes(context -> locate(context.getSource(), StringArgumentType.getString(context, "name"))))) + .then(Commands.literal("search").then(Commands.argument("name", StringArgumentType.word()) + .suggests((context, builder) -> SharedSuggestionProvider.suggest(names(context.getSource()), builder)) + .executes(context -> search(context.getSource(), StringArgumentType.getString(context, "name"), 16)) + .then(Commands.argument("radius", IntegerArgumentType.integer(1, 64)) + .executes(context -> search(context.getSource(), StringArgumentType.getString(context, "name"), + IntegerArgumentType.getInteger(context, "radius"))))))); + } + + private static TreeSet names(CommandSourceStack source) { + TreeSet names = new TreeSet<>(); + source.registryAccess().lookupOrThrow(Registries.STRUCTURE).listElements() + .filter(holder -> holder.value() instanceof ConfiguredStructure) + .forEach(holder -> names.add(holder.key().identifier().toString())); + source.getLevel().getDataStorage().computeIfAbsent(GeneratedStructureIndex.TYPE).names() + .forEach(id -> names.add(id.toString())); + return names; + } + + private static Identifier id(String name) { + return Identifier.tryParse(name.contains(":") ? name : StructureModule.NAMESPACE + ":" + name); + } + + private static int locate(CommandSourceStack source, String name) { + Identifier id = id(name); + if (id == null) { source.sendFailure(Component.literal("无效的结构名称:" + name)); return 0; } + var found = source.getLevel().getDataStorage().computeIfAbsent(GeneratedStructureIndex.TYPE) + .nearest(id, BlockPos.containing(source.getPosition())); + if (found.isEmpty()) { + source.sendFailure(Component.literal("当前维度没有该结构的已生成记录:" + id + "。可用 /wwstructure search " + name + " 寻找生成位置。")); + return 0; + } + return report(source, id, found.get(), "最近的已生成结构"); + } + + private static int search(CommandSourceStack source, String name, int radius) { + Identifier id = id(name); + if (id == null) { source.sendFailure(Component.literal("无效的结构名称:" + name)); return 0; } + var holder = source.registryAccess().lookupOrThrow(Registries.STRUCTURE).get(ResourceKey.create(Registries.STRUCTURE, id)); + if (holder.isEmpty() || !(holder.get().value() instanceof ConfiguredStructure)) { + source.sendFailure(Component.literal("未启用或不存在的结构:" + id)); + return 0; + } + var level = source.getLevel(); + var found = level.getChunkSource().getGenerator().findNearestMapStructure(level, HolderSet.direct(holder.get()), + BlockPos.containing(source.getPosition()), radius, false); + if (found == null) { + source.sendFailure(Component.literal("搜索范围内未找到 " + id + ";请检查群系、生成条件和世界的结构生成开关。")); + return 0; + } + return report(source, id, found.getFirst(), "原版搜索结果(可能尚未生成完整区块)"); + } + + private static int report(CommandSourceStack source, Identifier id, BlockPos position, String label) { + int distance = (int) Math.sqrt(GeneratedStructureIndex.horizontalDistanceSquared(position, BlockPos.containing(source.getPosition()))); + source.sendSuccess(() -> Component.literal(label + " " + id + ": [" + position.getX() + ", " + position.getY() + ", " + + position.getZ() + "],维度 " + source.getLevel().dimension().identifier() + ",水平距离 " + distance + " 格"), false); + return 1; + } +} diff --git a/src/structures/java/org/polaris2023/wildwind/structures/config/ConfigStructurePack.java b/src/structures/java/org/polaris2023/wildwind/structures/config/ConfigStructurePack.java new file mode 100644 index 0000000..2d23754 --- /dev/null +++ b/src/structures/java/org/polaris2023/wildwind/structures/config/ConfigStructurePack.java @@ -0,0 +1,229 @@ +package org.polaris2023.wildwind.structures.config; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.mojang.logging.LogUtils; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import net.minecraft.SharedConstants; +import net.minecraft.nbt.NbtAccounter; +import net.minecraft.nbt.NbtIo; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.server.packs.PackLocationInfo; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.PackSelectionConfig; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.metadata.pack.PackMetadataSection; +import net.minecraft.server.packs.repository.Pack; +import net.minecraft.server.packs.repository.PackSource; +import net.minecraft.server.packs.resources.IoSupplier; +import net.minecraft.util.InclusiveRange; +import net.neoforged.fml.loading.FMLPaths; +import net.neoforged.neoforge.event.AddPackFindersEvent; +import net.neoforged.neoforge.resource.EmptyPackResources; +import org.polaris2023.wildwind.structures.StructureModule; + +/** Each server repository gets one immutable snapshot, including template bytes. */ +public final class ConfigStructurePack extends EmptyPackResources { + private static final Gson JSON = new GsonBuilder().setPrettyPrinting().create(); + private final Map resources; + + private ConfigStructurePack(PackLocationInfo info, Map resources) { + super(info, new PackMetadataSection(Component.literal("Wild Wind configured structures"), + new InclusiveRange<>(SharedConstants.getCurrentVersion().packVersion(PackType.SERVER_DATA)))); + this.resources = resources; + } + + public static void addPack(AddPackFindersEvent event) { + if (event.getPackType() != PackType.SERVER_DATA || event.isTrusted()) return; + Path root = FMLPaths.CONFIGDIR.get().resolve(StructureModule.NAMESPACE); + final Map snapshot; + try { + snapshot = load(root); + } catch (IOException | RuntimeException exception) { + // Fail before registries load; silently dropping a bad definition would change the world. + throw new IllegalStateException("Cannot load structure config at " + root + ": " + exception.getMessage(), exception); + } + var supplier = new Pack.ResourcesSupplier() { + @Override public PackResources openPrimary(PackLocationInfo info) { return new ConfigStructurePack(info, snapshot); } + @Override public PackResources openFull(PackLocationInfo info, Pack.Metadata metadata) { return openPrimary(info); } + }; + var pack = Pack.readMetaAndCreate(new PackLocationInfo("ww_structures/config", + Component.literal("Wild Wind · 结构生成配置"), PackSource.DEFAULT, Optional.empty()), + supplier, PackType.SERVER_DATA, new PackSelectionConfig(true, Pack.Position.TOP, false)); + if (pack == null) throw new IllegalStateException("Could not create structure configuration datapack"); + event.addRepositorySource(consumer -> consumer.accept(pack)); + } + + public static Map load(Path root) throws IOException { + Files.createDirectories(root.resolve("definitions")); + Files.createDirectories(root.resolve("templates")); + Path example = root.resolve("example_ruins.json.disabled"); + if (Files.notExists(example)) { + try (InputStream input = ConfigStructurePack.class.getResourceAsStream("/examples/example_ruins.json")) { + if (input == null) throw new IOException("Missing bundled example"); + Files.copy(input, example); + } + } + Path exampleTemplate = root.resolve("templates/example_ruins.nbt"); + if (Files.notExists(exampleTemplate)) { + try (InputStream input = ConfigStructurePack.class.getResourceAsStream("/examples/example_ruins.nbt")) { + if (input == null) throw new IOException("Missing bundled example template"); + Files.copy(input, exampleTemplate); + } + } + Map output = new HashMap<>(); + Set names = new HashSet<>(); + Path definitions = root.resolve("definitions").toRealPath(); + try (var files = Files.list(definitions)) { + for (Path file : files.filter(p -> p.getFileName().toString().endsWith(".json")).sorted().toList()) { + try { + if (!file.toRealPath().startsWith(definitions)) throw new IOException("Definition symlink escapes directory"); + if (Files.size(file) > 1024 * 1024) throw new IOException("Definition exceeds 1 MiB"); + JsonObject json = JsonParser.parseString(Files.readString(file, StandardCharsets.UTF_8)).getAsJsonObject(); + StructureDefinition definition = StructureDefinition.parse(json); + if (!names.add(definition.name())) throw new IllegalArgumentException("Duplicate name: " + definition.name()); + Path template = definition.resolveTemplate(root.resolve("templates")); + if (Files.size(template) > 16 * 1024 * 1024) throw new IOException("Template exceeds 16 MiB"); + byte[] bytes = Files.readAllBytes(template); + validateTemplate(bytes); + addDefinition(output, definition, bytes); + } catch (IOException | RuntimeException exception) { + throw new IOException(file.getFileName() + ": " + exception.getMessage(), exception); + } + } + } + LogUtils.getLogger().info("Loaded {} configured Wild Wind structures from {}", names.size(), root); + return Map.copyOf(output); + } + + static void validateTemplate(byte[] bytes) throws IOException { + var nbt = NbtIo.readCompressed(new ByteArrayInputStream(bytes), NbtAccounter.create(64L * 1024 * 1024)); + var size = nbt.getListOrEmpty("size"); + if (size.size() != 3) throw new IOException("Template must have a three-component size"); + int x = size.getInt(0).orElse(0), y = size.getInt(1).orElse(0), z = size.getInt(2).orElse(0); + if (x < 1 || x > 64 || z < 1 || z > 64 || y < 1 || y > 256) { + throw new IOException("Template size must be within 64 x 256 x 64"); + } + var blocks = nbt.getListOrEmpty("blocks"); + var palettes = nbt.getListOrEmpty("palettes"); + var palette = nbt.getListOrEmpty("palette"); + if (!palettes.isEmpty()) palette = palettes.getList(0).orElseThrow(() -> new IOException("Invalid palettes list")); + if (blocks.isEmpty() || palette.isEmpty()) { + throw new IOException("Template must contain blocks and palette/palettes (compressed structure NBT required)"); + } + int paletteSize = palette.size(); + validatePalette(palette); + for (int i = 0; i < palettes.size(); i++) { + var variant = palettes.getList(i).orElseThrow(() -> new IOException("Invalid palette variant")); + if (variant.size() != paletteSize) throw new IOException("Palette variants must have equal length"); + validatePalette(variant); + } + for (int i = 0; i < blocks.size(); i++) { + var block = blocks.getCompound(i).orElseThrow(() -> new IOException("Invalid block entry")); + int state = block.getIntOr("state", -1); + var pos = block.getListOrEmpty("pos"); + if (state < 0 || state >= paletteSize || pos.size() != 3) throw new IOException("Invalid block state index or position"); + int px = pos.getInt(0).orElse(-1), py = pos.getInt(1).orElse(-1), pz = pos.getInt(2).orElse(-1); + if (px < 0 || px >= x || py < 0 || py >= y || pz < 0 || pz >= z) { + throw new IOException("Block position lies outside template size"); + } + } + } + + private static void validatePalette(net.minecraft.nbt.ListTag palette) throws IOException { + for (int i = 0; i < palette.size(); i++) { + var state = palette.getCompound(i).orElseThrow(() -> new IOException("Invalid palette entry")); + String name = state.getStringOr("Name", ""); + if (!name.contains(":") || Identifier.tryParse(name) == null) throw new IOException("Invalid palette block ID: " + name); + } + } + + static void addDefinition(Map output, StructureDefinition definition, byte[] template) { + String name = definition.name(); + String id = StructureModule.NAMESPACE + ":" + name; + JsonObject structure = new JsonObject(); + structure.addProperty("type", StructureModule.NAMESPACE + ":configured"); + structure.addProperty("biomes", "#" + id); + structure.add("spawn_overrides", new JsonObject()); + structure.addProperty("step", "surface_structures"); + structure.addProperty("terrain_adaptation", "none"); + structure.addProperty("template", id); + structure.addProperty("heightmap", definition.heightmap()); + structure.addProperty("y_offset", definition.yOffset()); + structure.addProperty("rotation", definition.rotation()); + structure.addProperty("include_entities", definition.includeEntities()); + structure.addProperty("min_y", definition.conditions().minY()); + structure.addProperty("max_y", definition.conditions().maxY()); + structure.addProperty("max_terrain_difference", definition.conditions().maxTerrainDifference()); + structure.addProperty("avoid_fluids", definition.conditions().avoidFluids()); + if (definition.conditions().groundBlocks().isEmpty()) structure.add("ground_blocks", new JsonArray()); + else { + structure.addProperty("ground_blocks", "#" + id); + putJson(output, "tags/block/" + name + ".json", tag(definition.conditions().groundBlocks())); + } + putJson(output, "worldgen/structure/" + name + ".json", structure); + putJson(output, "tags/worldgen/biome/" + name + ".json", tag(definition.biomes())); + output.put(resource("structure/" + name + ".nbt"), template); + // Keep disabled structures and templates registered so existing chunk starts remain readable. + if (!definition.enabled()) return; + JsonObject set = new JsonObject(); + JsonArray entries = new JsonArray(); + JsonObject entry = new JsonObject(); + entry.addProperty("structure", id); + entry.addProperty("weight", 1); + entries.add(entry); + set.add("structures", entries); + JsonObject placement = new JsonObject(); + placement.addProperty("type", "minecraft:random_spread"); + placement.addProperty("spacing", definition.spacing()); + placement.addProperty("separation", definition.separation()); + placement.addProperty("salt", definition.salt()); + placement.addProperty("frequency", definition.frequency()); + placement.addProperty("frequency_reduction_method", "default"); + placement.addProperty("spread_type", "linear"); + set.add("placement", placement); + putJson(output, "worldgen/structure_set/" + name + ".json", set); + } + + private static JsonObject tag(java.util.List values) { + JsonObject tag = new JsonObject(); + tag.addProperty("replace", false); + tag.add("values", JSON.toJsonTree(values)); + return tag; + } + + private static Identifier resource(String path) { return Identifier.fromNamespaceAndPath(StructureModule.NAMESPACE, path); } + private static void putJson(Map output, String path, JsonObject json) { + output.put(resource(path), JSON.toJson(json).getBytes(StandardCharsets.UTF_8)); + } + + @Override public Set getNamespaces(PackType type) { + return type == PackType.SERVER_DATA ? Set.of(StructureModule.NAMESPACE) : Set.of(); + } + @Override public IoSupplier getResource(PackType type, Identifier location) { + byte[] bytes = type == PackType.SERVER_DATA ? resources.get(location) : null; + return bytes == null ? null : () -> new ByteArrayInputStream(bytes); + } + @Override public void listResources(PackType type, String namespace, String path, ResourceOutput output) { + if (type != PackType.SERVER_DATA) return; + resources.forEach((id, bytes) -> { + if (id.getNamespace().equals(namespace) && id.getPath().startsWith(path + "/")) { + output.accept(id, () -> new ByteArrayInputStream(bytes)); + } + }); + } +} diff --git a/src/structures/java/org/polaris2023/wildwind/structures/config/StructureDefinition.java b/src/structures/java/org/polaris2023/wildwind/structures/config/StructureDefinition.java new file mode 100644 index 0000000..88dc35c --- /dev/null +++ b/src/structures/java/org/polaris2023/wildwind/structures/config/StructureDefinition.java @@ -0,0 +1,135 @@ +package org.polaris2023.wildwind.structures.config; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** Validated user configuration. Registry and template validation happens when building the pack. */ +public record StructureDefinition(String name, boolean enabled, String template, List biomes, + int spacing, int separation, int salt, double frequency, String heightmap, + int yOffset, String rotation, boolean includeEntities, Conditions conditions) { + public record Conditions(int minY, int maxY, int maxTerrainDifference, + boolean avoidFluids, List groundBlocks) {} + + public static StructureDefinition parse(JsonObject json) { + keys(json, Set.of("name", "enabled", "template", "biomes", "placement", "heightmap", + "y_offset", "rotation", "include_entities", "conditions")); + String name = string(json, "name", null); + if (!name.matches("[a-z0-9_][a-z0-9_-]{0,63}")) { + throw new IllegalArgumentException("name must match [a-z0-9_][a-z0-9_-]{0,63}"); + } + String template = string(json, "template", null); + if (!template.endsWith(".nbt")) throw new IllegalArgumentException("template must end with .nbt"); + List biomes = identifiers(json, "biomes"); + if (biomes.isEmpty()) throw new IllegalArgumentException("biomes must not be empty"); + JsonObject placement = object(json, "placement"); + keys(placement, Set.of("spacing", "separation", "salt", "frequency")); + int spacing = integer(placement, "spacing", 32, 1, 4096); + int separation = integer(placement, "separation", 8, 0, 4095); + if (separation >= spacing) throw new IllegalArgumentException("separation must be smaller than spacing"); + int salt = integer(placement, "salt", name.hashCode() & Integer.MAX_VALUE, 0, Integer.MAX_VALUE); + double frequency = number(placement, "frequency", 1.0); + if (!Double.isFinite(frequency) || frequency <= 0 || frequency > 1) { + throw new IllegalArgumentException("frequency must be > 0 and <= 1 (use enabled=false to disable)"); + } + String heightmap = string(json, "heightmap", "WORLD_SURFACE_WG"); + if (!Set.of("WORLD_SURFACE_WG", "OCEAN_FLOOR_WG").contains(heightmap)) { + throw new IllegalArgumentException("heightmap must be WORLD_SURFACE_WG or OCEAN_FLOOR_WG"); + } + String rotation = string(json, "rotation", "random"); + if (!Set.of("random", "none", "clockwise_90", "clockwise_180", "counterclockwise_90").contains(rotation)) { + throw new IllegalArgumentException("unsupported rotation: " + rotation); + } + JsonObject conditions = object(json, "conditions"); + keys(conditions, Set.of("min_y", "max_y", "max_terrain_difference", "avoid_fluids", "ground_blocks")); + int minY = integer(conditions, "min_y", -64, -2032, 2031); + int maxY = integer(conditions, "max_y", 320, -2032, 2031); + if (minY > maxY) throw new IllegalArgumentException("min_y must be <= max_y"); + return new StructureDefinition(name, bool(json, "enabled", true), template, biomes, spacing, separation, salt, frequency, + heightmap, integer(json, "y_offset", 0, -256, 256), rotation, + bool(json, "include_entities", false), + new Conditions(minY, maxY, integer(conditions, "max_terrain_difference", 8, 0, 512), + bool(conditions, "avoid_fluids", true), identifiers(conditions, "ground_blocks"))); + } + + /** Both lexical traversal and symlink escapes are rejected. */ + public Path resolveTemplate(Path directory) throws java.io.IOException { + Path root = directory.toRealPath(); + Path relative = Path.of(template); + if (relative.isAbsolute() || template.contains("\\") || template.contains(":")) { + throw new IllegalArgumentException("template must be a relative path using /"); + } + Path candidate = root.resolve(relative).normalize(); + if (!candidate.startsWith(root)) throw new IllegalArgumentException("template escapes templates directory"); + Path real = candidate.toRealPath(); + if (!real.startsWith(root)) throw new IllegalArgumentException("template symlink escapes templates directory"); + return real; + } + + public static boolean bool(JsonObject object, String key, boolean fallback) { + if (!object.has(key)) return fallback; + JsonElement value = object.get(key); + if (!value.isJsonPrimitive() || !value.getAsJsonPrimitive().isBoolean()) { + throw new IllegalArgumentException(key + " must be a boolean"); + } + return value.getAsBoolean(); + } + + private static void keys(JsonObject object, Set allowed) { + for (String key : object.keySet()) { + if (!allowed.contains(key)) throw new IllegalArgumentException("unknown option: " + key); + } + } + + private static JsonObject object(JsonObject parent, String key) { + if (!parent.has(key)) return new JsonObject(); + if (!parent.get(key).isJsonObject()) throw new IllegalArgumentException(key + " must be an object"); + return parent.getAsJsonObject(key); + } + + private static String string(JsonObject object, String key, String fallback) { + if (!object.has(key)) { + if (fallback == null) throw new IllegalArgumentException("missing option: " + key); + return fallback; + } + JsonElement value = object.get(key); + if (!value.isJsonPrimitive() || !value.getAsJsonPrimitive().isString()) { + throw new IllegalArgumentException(key + " must be a string"); + } + return value.getAsString(); + } + + private static double number(JsonObject object, String key, double fallback) { + if (!object.has(key)) return fallback; + JsonElement value = object.get(key); + if (!value.isJsonPrimitive() || !value.getAsJsonPrimitive().isNumber()) { + throw new IllegalArgumentException(key + " must be a number"); + } + return value.getAsDouble(); + } + + private static int integer(JsonObject object, String key, int fallback, int min, int max) { + double value = number(object, key, fallback); + if (!Double.isFinite(value) || value != Math.rint(value) || value < min || value > max) { + throw new IllegalArgumentException(key + " must be an integer in [" + min + ", " + max + "]"); + } + return (int) value; + } + + private static List identifiers(JsonObject object, String key) { + if (!object.has(key)) return List.of(); + if (!object.get(key).isJsonArray()) throw new IllegalArgumentException(key + " must be an array"); + List values = new ArrayList<>(); + for (JsonElement entry : object.getAsJsonArray(key)) { + if (!entry.isJsonPrimitive() || !entry.getAsJsonPrimitive().isString() + || !entry.getAsString().matches("#?[a-z0-9_.-]+:[a-z0-9/._-]+")) { + throw new IllegalArgumentException(key + " entries must be namespaced IDs or #tags"); + } + values.add(entry.getAsString()); + } + return List.copyOf(values); + } +} diff --git a/src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredStructure.java b/src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredStructure.java new file mode 100644 index 0000000..850305b --- /dev/null +++ b/src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredStructure.java @@ -0,0 +1,111 @@ +package org.polaris2023.wildwind.structures.worldgen; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import java.util.Optional; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderSet; +import net.minecraft.core.RegistryCodecs; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureType; +import org.polaris2023.wildwind.structures.StructureModule; + +public final class ConfiguredStructure extends Structure { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + settingsCodec(instance), + Identifier.CODEC.fieldOf("template").forGetter(s -> s.template), + Heightmap.Types.CODEC.fieldOf("heightmap").forGetter(s -> s.heightmap), + Codec.intRange(-256, 256).fieldOf("y_offset").forGetter(s -> s.yOffset), + Codec.STRING.fieldOf("rotation").forGetter(s -> s.rotation), + Codec.BOOL.fieldOf("include_entities").forGetter(s -> s.includeEntities), + Codec.INT.fieldOf("min_y").forGetter(s -> s.minY), + Codec.INT.fieldOf("max_y").forGetter(s -> s.maxY), + Codec.intRange(0, 512).fieldOf("max_terrain_difference").forGetter(s -> s.maxTerrainDifference), + Codec.BOOL.fieldOf("avoid_fluids").forGetter(s -> s.avoidFluids), + RegistryCodecs.homogeneousList(Registries.BLOCK).fieldOf("ground_blocks").forGetter(s -> s.groundBlocks) + ).apply(instance, ConfiguredStructure::new)); + + private final Identifier template; + private final Heightmap.Types heightmap; + private final int yOffset; + private final String rotation; + private final boolean includeEntities; + private final int minY, maxY, maxTerrainDifference; + private final boolean avoidFluids; + private final HolderSet groundBlocks; + + public ConfiguredStructure(StructureSettings settings, Identifier template, Heightmap.Types heightmap, + int yOffset, String rotation, boolean includeEntities, int minY, int maxY, + int maxTerrainDifference, boolean avoidFluids, HolderSet groundBlocks) { + super(settings); + this.template = template; + this.heightmap = heightmap; + this.yOffset = yOffset; + this.rotation = rotation; + this.includeEntities = includeEntities; + this.minY = minY; + this.maxY = maxY; + this.maxTerrainDifference = maxTerrainDifference; + this.avoidFluids = avoidFluids; + this.groundBlocks = groundBlocks; + } + + @Override protected Optional findGenerationPoint(GenerationContext context) { + var loaded = context.structureTemplateManager().get(template); + if (loaded.isEmpty()) return Optional.empty(); + var structureTemplate = loaded.get(); + Rotation chosenRotation = rotation.equals("random") ? Rotation.getRandom(context.random()) : rotation(rotation); + var size = structureTemplate.getSize(chosenRotation); + if (size.getX() < 1 || size.getZ() < 1 || size.getY() < 1 + || size.getX() > 64 || size.getZ() > 64 || size.getY() > 256) return Optional.empty(); + int centerX = context.chunkPos().getMiddleBlockX(), centerZ = context.chunkPos().getMiddleBlockZ(); + int left = centerX - size.getX() / 2, front = centerZ - size.getZ() / 2; + int right = left + size.getX() - 1, back = front + size.getZ() - 1; + // Sample four corners and the center before surface decoration. No adjacent chunks are loaded. + int[][] samples = {{left, front}, {right, front}, {left, back}, {right, back}, {centerX, centerZ}}; + int lowest = Integer.MAX_VALUE, highest = Integer.MIN_VALUE, centerHeight = 0; + for (int[] sample : samples) { + int height = context.chunkGenerator().getFirstFreeHeight(sample[0], sample[1], heightmap, + context.heightAccessor(), context.randomState()); + if (height < minY || height > maxY) return Optional.empty(); + lowest = Math.min(lowest, height); + highest = Math.max(highest, height); + centerHeight = height; + var column = context.chunkGenerator().getBaseColumn(sample[0], sample[1], context.heightAccessor(), context.randomState()); + var ground = column.getBlock(height - 1); + if (avoidFluids && (!ground.getFluidState().isEmpty() || !column.getBlock(height).getFluidState().isEmpty())) { + return Optional.empty(); + } + if (groundBlocks.size() > 0 && !groundBlocks.contains(ground.typeHolder())) return Optional.empty(); + } + if (highest - lowest > maxTerrainDifference) return Optional.empty(); + int y = centerHeight + yOffset; + if (y < context.heightAccessor().getMinY() || y + size.getY() > context.heightAccessor().getMaxY() + 1) { + return Optional.empty(); + } + BlockPos corner = new BlockPos(left, y, front); + BlockPos origin = structureTemplate.getZeroPositionWithTransform(corner, Mirror.NONE, chosenRotation); + BlockPos locatePosition = new BlockPos(centerX, y, centerZ); + return Optional.of(new GenerationStub(locatePosition, builder -> builder.addPiece( + new ConfiguredTemplatePiece(context.structureTemplateManager(), template, origin, chosenRotation, includeEntities)))); + } + + static Rotation rotation(String name) { + return switch (name) { + case "none" -> Rotation.NONE; + case "clockwise_90" -> Rotation.CLOCKWISE_90; + case "clockwise_180" -> Rotation.CLOCKWISE_180; + case "counterclockwise_90" -> Rotation.COUNTERCLOCKWISE_90; + default -> throw new IllegalArgumentException("Unknown structure rotation: " + name); + }; + } + + @Override public StructureType type() { return StructureModule.STRUCTURE.get(); } +} diff --git a/src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredTemplatePiece.java b/src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredTemplatePiece.java new file mode 100644 index 0000000..c8167ee --- /dev/null +++ b/src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredTemplatePiece.java @@ -0,0 +1,44 @@ +package org.polaris2023.wildwind.structures.worldgen; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.Identifier; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.TemplateStructurePiece; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; +import net.minecraft.world.level.levelgen.structure.templatesystem.BlockIgnoreProcessor; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; +import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import org.polaris2023.wildwind.structures.StructureModule; + +/** Vanilla pieces clip blocks/entities to each generating chunk and persist template/rotation. */ +public final class ConfiguredTemplatePiece extends TemplateStructurePiece { + public ConfiguredTemplatePiece(StructureTemplateManager manager, Identifier template, BlockPos position, + Rotation rotation, boolean includeEntities) { + super(StructureModule.PIECE.get(), 0, manager, template, template.toString(), settings(rotation, includeEntities), position); + } + + public ConfiguredTemplatePiece(StructurePieceSerializationContext context, CompoundTag tag) { + super(StructureModule.PIECE.get(), tag, context.structureTemplateManager(), + id -> settings(Rotation.valueOf(tag.getStringOr("Rotation", "NONE")), tag.getBooleanOr("IncludeEntities", false))); + } + + private static StructurePlaceSettings settings(Rotation rotation, boolean includeEntities) { + return new StructurePlaceSettings().setRotation(rotation).setIgnoreEntities(!includeEntities) + .addProcessor(BlockIgnoreProcessor.STRUCTURE_BLOCK); + } + + @Override protected void addAdditionalSaveData(StructurePieceSerializationContext context, CompoundTag tag) { + super.addAdditionalSaveData(context, tag); + tag.putString("Rotation", placeSettings.getRotation().name()); + tag.putBoolean("IncludeEntities", !placeSettings.isIgnoreEntities()); + } + + @Override protected void handleDataMarker(String marker, BlockPos position, ServerLevelAccessor level, + RandomSource random, BoundingBox bounds) { + // Custom DATA markers are intentionally not interpreted; structure blocks are filtered out. + } +} diff --git a/src/structures/java/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndex.java b/src/structures/java/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndex.java new file mode 100644 index 0000000..2c2283a --- /dev/null +++ b/src/structures/java/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndex.java @@ -0,0 +1,69 @@ +package org.polaris2023.wildwind.structures.worldgen; + +import com.mojang.serialization.Codec; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.Identifier; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; +import net.minecraft.world.level.saveddata.SavedDataType; +import net.neoforged.neoforge.event.level.ChunkEvent; +import org.polaris2023.wildwind.structures.StructureModule; + +/** Per-dimension index; only full chunks actually loaded into a world are recorded. */ +public final class GeneratedStructureIndex extends SavedData { + public static final Codec CODEC = Codec.unboundedMap(Identifier.CODEC, BlockPos.CODEC.listOf()) + .xmap(GeneratedStructureIndex::new, GeneratedStructureIndex::snapshot); + public static final SavedDataType TYPE = new SavedDataType<>( + Identifier.fromNamespaceAndPath(StructureModule.NAMESPACE, "generated_structures"), GeneratedStructureIndex::new, CODEC); + private final Map> positions = new HashMap<>(); + + public GeneratedStructureIndex() {} + private GeneratedStructureIndex(Map> saved) { + saved.forEach((id, list) -> positions.put(id, new HashSet<>(list))); + } + private Map> snapshot() { + Map> result = new HashMap<>(); + positions.forEach((id, values) -> result.put(id, new ArrayList<>(values))); + return result; + } + public void record(Identifier id, BlockPos position) { + if (positions.computeIfAbsent(id, ignored -> new HashSet<>()).add(position.immutable())) setDirty(); + } + public Set names() { return Set.copyOf(positions.keySet()); } + public Optional nearest(Identifier id, BlockPos from) { + return positions.getOrDefault(id, Set.of()).stream().min(Comparator + .comparingDouble((BlockPos p) -> horizontalDistanceSquared(p, from)) + .thenComparingInt(BlockPos::getX).thenComparingInt(BlockPos::getZ).thenComparingInt(BlockPos::getY)); + } + public static double horizontalDistanceSquared(BlockPos a, BlockPos b) { + double x = (double) a.getX() - b.getX(), z = (double) a.getZ() - b.getZ(); + return x * x + z * z; + } + + public static void onChunkLoad(ChunkEvent.Load event) { + if (!(event.getLevel() instanceof ServerLevel level)) return; + var registry = level.registryAccess().lookupOrThrow(Registries.STRUCTURE); + Map found = new HashMap<>(); + event.getChunk().getAllStarts().forEach((structure, start) -> { + if (!(structure instanceof ConfiguredStructure) || !start.isValid()) return; + Identifier id = registry.getKey(structure); + var bounds = start.getBoundingBox(); + if (id != null) found.put(id, new BlockPos(bounds.getCenter().getX(), bounds.minY(), bounds.getCenter().getZ())); + }); + if (found.isEmpty()) return; + // Do not touch SavedData or request chunks from the chunk-load callback. + level.getServer().execute(() -> { + var index = level.getDataStorage().computeIfAbsent(TYPE); + found.forEach(index::record); + }); + } +} diff --git a/src/structures/resources/examples/example_ruins.json b/src/structures/resources/examples/example_ruins.json new file mode 100644 index 0000000..1bc47cf --- /dev/null +++ b/src/structures/resources/examples/example_ruins.json @@ -0,0 +1,23 @@ +{ + "name": "example_ruins", + "enabled": false, + "template": "example_ruins.nbt", + "biomes": ["minecraft:plains", "#minecraft:is_forest"], + "placement": { + "spacing": 32, + "separation": 8, + "salt": 18372954, + "frequency": 1.0 + }, + "heightmap": "WORLD_SURFACE_WG", + "y_offset": -1, + "rotation": "random", + "include_entities": false, + "conditions": { + "min_y": 60, + "max_y": 160, + "max_terrain_difference": 6, + "avoid_fluids": true, + "ground_blocks": ["#minecraft:dirt", "minecraft:stone", "minecraft:sand"] + } +} diff --git a/src/structures/resources/examples/example_ruins.nbt b/src/structures/resources/examples/example_ruins.nbt new file mode 100644 index 0000000000000000000000000000000000000000..30160f936e618b67b27f237a3055414f9419c5ed GIT binary patch literal 315 zcmb2|=3oE;rvJUy_GYy>h&Vj7t}nmtJ6*~5UW#Jut0|e{Q#n1ZM9#^a#D4m-E9+!| zvgyh^Ruvz9nLct{A~b*Z`4=uJk-IB@K8-o~F6R5jDHSuem+AjoD!0gn@2x@>3jSq-ggZvT1+?@ F7yzGrmumn3 literal 0 HcmV?d00001 diff --git a/src/structures/test/org/polaris2023/wildwind/structures/config/StructureConfigTest.java b/src/structures/test/org/polaris2023/wildwind/structures/config/StructureConfigTest.java new file mode 100644 index 0000000..ca4f032 --- /dev/null +++ b/src/structures/test/org/polaris2023/wildwind/structures/config/StructureConfigTest.java @@ -0,0 +1,137 @@ +package org.polaris2023.wildwind.structures.config; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import java.io.ByteArrayOutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.IntTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtIo; +import net.minecraft.resources.Identifier; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import static org.junit.jupiter.api.Assertions.*; + +class StructureConfigTest { + @TempDir Path directory; + + private static JsonObject definition() { + return JsonParser.parseString(""" + {"name":"ruins", "template":"ruins.nbt", "biomes":["minecraft:plains", "#minecraft:is_forest"]} + """).getAsJsonObject(); + } + + @Test void defaultsAndNamespacedBiomeTags() { + var config = StructureDefinition.parse(definition()); + assertEquals(32, config.spacing()); + assertEquals(8, config.separation()); + assertEquals("#minecraft:is_forest", config.biomes().get(1)); + assertFalse(config.includeEntities()); + assertTrue(config.conditions().avoidFluids()); + } + + @Test void rejectsInvalidPlacementAndMistypedOptions() { + for (String placement : new String[]{"{\"spacing\":8,\"separation\":8}", "{\"frequency\":0}", + "{\"frequency\":1.1}", "{\"spacing\":32.5}", "{\"salt\":-1}", "{\"spacing\":\"32\"}"}) { + JsonObject json = definition(); + json.add("placement", JsonParser.parseString(placement)); + assertThrows(IllegalArgumentException.class, () -> StructureDefinition.parse(json)); + } + JsonObject typo = definition(); + typo.addProperty("y_offest", 5); + assertThrows(IllegalArgumentException.class, () -> StructureDefinition.parse(typo)); + JsonObject booleanString = definition(); + booleanString.addProperty("include_entities", "false"); + assertThrows(IllegalArgumentException.class, () -> StructureDefinition.parse(booleanString)); + } + + @Test void rejectsInvalidNamesBiomesAndHeightRanges() { + for (String name : new String[]{"../escape", "MixedCase", "a:b", ""}) { + JsonObject json = definition(); + json.addProperty("name", name); + assertThrows(IllegalArgumentException.class, () -> StructureDefinition.parse(json)); + } + JsonObject emptyBiomes = definition(); + emptyBiomes.add("biomes", JsonParser.parseString("[]")); + assertThrows(IllegalArgumentException.class, () -> StructureDefinition.parse(emptyBiomes)); + JsonObject json = definition(); + json.add("conditions", JsonParser.parseString("{\"min_y\":100,\"max_y\":80}")); + JsonObject invalidHeight = json; + assertThrows(IllegalArgumentException.class, () -> StructureDefinition.parse(invalidHeight)); + } + + @Test void templatePathsStayInsideDirectory() throws Exception { + Path templates = Files.createDirectories(directory.resolve("templates")); + Files.write(templates.resolve("ruins.nbt"), new byte[0]); + assertEquals(templates.resolve("ruins.nbt").toRealPath(), StructureDefinition.parse(definition()).resolveTemplate(templates)); + for (String path : new String[]{"../escape.nbt", "C:/escape.nbt", "/escape.nbt", "..\\escape.nbt"}) { + JsonObject json = definition(); + json.addProperty("template", path); + var parsed = StructureDefinition.parse(json); + assertThrows(IllegalArgumentException.class, () -> parsed.resolveTemplate(templates)); + } + } + + @Test void disabledStructuresKeepTemplatesButNotPlacementAndDuplicateNamesFail() throws Exception { + ConfigStructurePack.load(directory); + Path definitions = directory.resolve("definitions"); + JsonObject disabled = definition(); + disabled.addProperty("enabled", false); + Files.writeString(definitions.resolve("disabled.json"), disabled.toString()); + Files.write(directory.resolve("templates/ruins.nbt"), template(3, 2, 3)); + var disabledResources = ConfigStructurePack.load(directory); + assertEquals(3, disabledResources.size()); + assertTrue(disabledResources.containsKey(Identifier.parse("ww_structures:structure/ruins.nbt"))); + assertFalse(disabledResources.containsKey(Identifier.parse("ww_structures:worldgen/structure_set/ruins.json"))); + Files.writeString(definitions.resolve("disabled.json"), definition().toString()); + var resources = ConfigStructurePack.load(directory); + assertEquals(4, resources.size()); + Files.writeString(definitions.resolve("b.json"), definition().toString()); + var error = assertThrows(java.io.IOException.class, () -> ConfigStructurePack.load(directory)); + assertTrue(error.getMessage().contains("Duplicate name")); + } + + @Test void packContainsTemplateBiomeTagAndRandomSpreadRule() { + var resources = new HashMap(); + byte[] template = {1, 2, 3}; + ConfigStructurePack.addDefinition(resources, StructureDefinition.parse(definition()), template); + assertArrayEquals(template, resources.get(Identifier.parse("ww_structures:structure/ruins.nbt"))); + var placement = JsonParser.parseString(new String(resources.get(Identifier.parse("ww_structures:worldgen/structure_set/ruins.json")), + java.nio.charset.StandardCharsets.UTF_8)).getAsJsonObject().getAsJsonObject("placement"); + assertEquals("minecraft:random_spread", placement.get("type").getAsString()); + assertEquals(32, placement.get("spacing").getAsInt()); + } + + @Test void rejectsMalformedOrOversizeTemplate() throws Exception { + ConfigStructurePack.validateTemplate(template(3, 2, 3)); + assertThrows(java.io.IOException.class, () -> ConfigStructurePack.validateTemplate(new byte[]{1, 2, 3})); + assertThrows(java.io.IOException.class, () -> ConfigStructurePack.validateTemplate(template(65, 2, 3))); + assertThrows(java.io.IOException.class, () -> ConfigStructurePack.validateTemplate(template(3, 0, 3))); + } + + private static byte[] template(int x, int y, int z) throws Exception { + CompoundTag root = new CompoundTag(); + ListTag size = new ListTag(); + size.add(IntTag.valueOf(x)); size.add(IntTag.valueOf(y)); size.add(IntTag.valueOf(z)); + root.put("size", size); + ListTag blocks = new ListTag(); + CompoundTag block = new CompoundTag(); + block.putInt("state", 0); + ListTag pos = new ListTag(); + for (int i = 0; i < 3; i++) pos.add(IntTag.valueOf(0)); + block.put("pos", pos); + blocks.add(block); + root.put("blocks", blocks); + ListTag palette = new ListTag(); + CompoundTag stone = new CompoundTag(); + stone.putString("Name", "minecraft:stone"); + palette.add(stone); + root.put("palette", palette); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + NbtIo.writeCompressed(root, out); + return out.toByteArray(); + } +} diff --git a/src/structures/test/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndexTest.java b/src/structures/test/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndexTest.java new file mode 100644 index 0000000..bb4888d --- /dev/null +++ b/src/structures/test/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndexTest.java @@ -0,0 +1,29 @@ +package org.polaris2023.wildwind.structures.worldgen; + +import com.mojang.serialization.JsonOps; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.Identifier; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class GeneratedStructureIndexTest { + @Test void nearestUsesHorizontalDistanceAndSurvivesSerialization() { + var id = Identifier.parse("ww_structures:ruins"); + var index = new GeneratedStructureIndex(); + index.record(id, new BlockPos(5, 200, 0)); + index.record(id, new BlockPos(10, 64, 0)); + index.record(Identifier.parse("ww_structures:other"), BlockPos.ZERO); + assertEquals(new BlockPos(5, 200, 0), index.nearest(id, new BlockPos(0, 64, 0)).orElseThrow()); + var json = GeneratedStructureIndex.CODEC.encodeStart(JsonOps.INSTANCE, index).getOrThrow(); + var restored = GeneratedStructureIndex.CODEC.parse(JsonOps.INSTANCE, json).getOrThrow(); + assertEquals(index.nearest(id, BlockPos.ZERO), restored.nearest(id, BlockPos.ZERO)); + assertTrue(restored.nearest(Identifier.parse("ww_structures:missing"), BlockPos.ZERO).isEmpty()); + restored.record(id, new BlockPos(5, 200, 0)); + assertFalse(restored.isDirty(), "Re-loading the same chunk must not dirty the index"); + } + + @Test void largeCoordinatesDoNotOverflow() { + assertEquals(3_600_000_000_000_000d, GeneratedStructureIndex.horizontalDistanceSquared( + new BlockPos(-30_000_000, 0, 0), new BlockPos(30_000_000, 0, 0))); + } +} diff --git a/src/templates/META-INF/neoforge.mods.toml b/src/templates/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..2a98073 --- /dev/null +++ b/src/templates/META-INF/neoforge.mods.toml @@ -0,0 +1,105 @@ +# This is an example neoforge.mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml + +# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. +# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. +license="${mod_license}" + +# A URL to refer people to when problems occur with this mod +#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional + +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory + +# The modid of the mod +modId="${mod_id}" #mandatory + +# The version number of the mod +version="${mod_version}" #mandatory + +# A display name for the mod +displayName="${mod_name}" #mandatory + +# A URL to query for updates for this mod. See the JSON update specification https://docs.neoforged.net/docs/misc/updatechecker/ +#updateJSONURL="https://change.me.example.invalid/updates.json" #optional + +# A URL for the "homepage" for this mod, displayed in the mod UI +#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional + +# A file name (in the root of the mod JAR) containing a logo for display +#logoFile="examplemod.png" #optional + +# A text field displayed in the mod UI +#credits="" #optional + +# The authors of the mod, displayed in the mod UI (optional) +authors="baka4n,viola-Siemens,ENC-Euphony,wdog5734" + +# The description text for the mod (multi line!) (#mandatory) +description=''' +${mod_description} +''' + +# The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded. +[[mixins]] +config="${mod_id}.mixins.json" + +# The [[accessTransformers]] block allows you to declare where your AT file is. +# If this block is omitted, a fallback attempt will be made to load an AT from META-INF/accesstransformer.cfg +#[[accessTransformers]] +#file="META-INF/accesstransformer.cfg" + +# The coremods config file path is not configurable and is always loaded from META-INF/coremods.json + +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.${mod_id}]] #optional + # the modid of the dependency + modId="neoforge" #mandatory + # The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). + # 'required' requires the mod to exist, 'optional' does not + # 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning + type="required" #mandatory + # Optional field describing why the dependency is required or why it is incompatible + # reason="..." + # The version range of the dependency + versionRange="[${neo_version},)" #mandatory + # An ordering relationship for the dependency. + # BEFORE - This mod is loaded BEFORE the dependency + # AFTER - This mod is loaded AFTER the dependency + ordering="NONE" + # Side this dependency is applied on - BOTH, CLIENT, or SERVER + side="BOTH" + +# Here's another dependency +[[dependencies.${mod_id}]] + modId="minecraft" + type="required" + # This version range declares a minimum of the current minecraft version up to but not including the next major version + versionRange="${minecraft_version_range}" + ordering="NONE" + side="BOTH" + +[[dependencies.${mod_id}]] + modId="geckolib" + type="required" + versionRange="[${geocklib_version},)" + ordering="NONE" + side="BOTH" + +# Features are specific properties of the game environment, that you may want to declare you require. This example declares +# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't +# stop your mod loading on the server for example. +#[features.${mod_id}] +#openGLVersion="[3.2,)" + +# Structure generation is now registered by the main mod; loading the old standalone +# mod as well would register the same structure types twice. +[[dependencies.${mod_id}]] + modId="ww_structures" + type="incompatible" + reason="Structure generation is included in Wild Wind. Remove the old standalone ww_structures JAR." + ordering="NONE" + side="BOTH" From 355574ff88a11b28f98e471fb3df52eef8ec4e9b Mon Sep 17 00:00:00 2001 From: cuccuc377-dev <257740650+cuccuc377-dev@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:38:45 +0800 Subject: [PATCH 2/9] docs: add project progress dashboard and completed feature checklist --- PROGRESS.md | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 +- 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 PROGRESS.md diff --git a/PROGRESS.md b/PROGRESS.md new file mode 100644 index 0000000..4f790ab --- /dev/null +++ b/PROGRESS.md @@ -0,0 +1,85 @@ +# 原野之风 · 项目进度 + +最后更新:**2026-10-23** +当前阶段:**功能开发与测试,尚未发布稳定版** +运行环境:Minecraft **26.2** · NeoForge **26.2.0.93** · Java **25** · 模组版本 **1.0.1** + +## 进度总览 + +**当前已交付功能清单:18 / 18 项已实现** + +```text +已交付功能实现 [████████████████████] 100% 18 / 18 +本地单元测试 [████████████████████] 100% 11 / 11 通过 +本地游戏测试 [████████████████████] 100% 24 / 24 通过 +``` + +> 功能进度条只统计下面列出的 18 项已交付内容,包含本次开发及已合并的上游功能;不代表整个模组、未来规划或人工验收全部完成。测试进度表示已有测试的通过比例,不代表代码覆盖率。完整项目的最终范围尚未确定,因此不估算总完成百分比。 + +## 已完成功能 + +| 编号 | 状态 | 功能 | 已实现内容 | +| --- | --- | --- | --- | +| 01 | ✅ | 版本升级与统一模组 | 适配 Minecraft 26.2 / NeoForge;结构、生物、物品和玩法统一打入 `ww_hfas`,保留旧结构配置命名空间。 | +| 02 | ✅ | 可配置结构生成 | JSON 定义结构,独立 NBT 模板目录;支持群系、间距、概率、高度、旋转和地形条件;提供列表、已生成结构最近坐标查询与生成位置搜索。 | +| 03 | ✅ | 木材与植物基础内容 | 焚烬木、灵焰木、杜鹃木基础方块套件;树木配置、去皮、配方及部分燃料;已有植物方块注册。其他木材配套及视觉整理见下方待办。 | +| 04 | ✅ | 泥猪 | 成年/幼年模型和贴图,原版猪动画与音效,繁殖与刷怪蛋,沼泽和红树林沼泽自然生成。ID:`ww_hfas:muddy_pig`。 | +| 05 | ✅ | 上游生物与道具整合 | 合并泥沼蟹、恐鱼、生物桶、刷怪蛋、万用蟹钳及延展药水;食人鱼显示名改为恐鱼,保留 `piranha` ID 兼容存档。 | +| 06 | ✅ | 七种普通物品 | 浮萍、鱿鱼须、熟鱿鱼须、煎蛋、烤种子、熟蛙腿、生蛙腿;图标与翻译齐备,按当前要求全部作为普通材料注册。 | +| 07 | ✅ | 羊毛拆线 | 任意颜色羊毛 + 剪刀无序合成 2 个线;返还剪刀,损耗 1 点耐久并受耐久附魔影响;支持自动合成器。 | +| 08 | ✅ | 蜘蛛网挣脱 | 通常连续移动 30 刻、下坠进入后 160 刻破网;停止移动或离开重置;排除蜘蛛、洞穴蜘蛛、旁观玩家与飞行中的创造玩家。 | +| 09 | ✅ | 沉溺、窒息与呼吸规则 | `sink` 限制名单内实体在流体中上浮;`choke` 加快缺氧;实现水下免缺氧名单、两份效果名单及蝌蚪/美西螈离水特例。 | +| 10 | ✅ | 熔炼附魔 | `melting` 按熔炉配方转换挖掘掉落,每件消耗 1 点经验;精准采集优先,时运先计算数量;整次经验不足不触发。 | +| 11 | ✅ | 骷髅近战设定 | 骷髅、流浪者、沼骸、焦骸生成时有 10% 概率使用石剑与近战 AI;后三者分别附加缓慢、中毒、虚弱。 | +| 12 | ✅ | 耕地保护 | 穿戴摔落缓冲盔甲或具有缓降效果的实体落到耕地上时,不会使耕地退化。 | +| 13 | ✅ | 模组专属分页 | 模组物品统一进入“原野之风”创造分页;包括药水、两种延展箭和熔炼附魔书;全局搜索可用。 | +| 14 | ✅ | 窑炉 | 100 刻烧炼、原料筛选、燃料、漏斗、经验、比较器、命名与锁定;新生成石匠屋添加窑炉;暂用原版熔炉模型和界面。 | +| 15 | ✅ | 杜鹃木告示牌 | 站立/墙面放置,双面文字、染色、发光、涂蜡、含水与数据保护;配方、掉落和燃料;补齐 26.2 贴图布局。 | +| 16 | ✅ | 悬挂式杜鹃木告示牌 | 吊顶/墙面放置、链条及横杆行为,双面编辑、染色、发光、涂蜡;配方、掉落和燃料。 | +| 17 | ✅ | 杜鹃木展示架 | 三槽整组交换;红石连接交换快捷栏 3/6/9 格;比较器输出 0–7;漏斗、存档和底部对齐设置。 | +| 18 | ✅ | 延展之箭与实体 | `ww_hfas:tipped_arrow` / `ww_hfas:arrow`;普通 450 刻、长效 1200 刻;合成、交易、英雄礼物、弓弩与发射器;落地 600 刻后退化为普通箭。 | + +## 工程与验证记录 + +- [x] 创建独立私有仓库 `cuccuc377-dev/WildWindMod`,已上传至 `main`。 +- [x] 保留源码、测试、贴图、模型源文件、构建脚本、需求说明及许可证。 +- [x] 排除 IDE 文件、生成缓存、构建产物、运行日志、本地工具和无关抓取文件。 +- [x] 完成客户端和服务端数据生成。 +- [x] 在整理后的独立目录构建成功;11 项单元测试、24 组游戏测试通过。 +- [x] 开发客户端完成资源加载并正常退出;本次杜鹃木与延展箭资源未报告缺失。 +- [x] GitHub Actions 首次构建成功,验证基线为 `aeccc22`,见 [构建记录](https://github.com/cuccuc377-dev/WildWindMod/actions/runs/39822689750)。 +- [ ] 逐项人工验收告示牌编辑界面、荧光文字、展示架物品显示等视觉效果。 +- [ ] 完成多人联机、长期存档及发布前兼容性验收。 + +以上测试结果记录最近一次已完成的验证,不表示本文件会自动刷新。既有客户端日志仍有制箭台、焦灰草方块和未注册木材资源的材质警告,尚未作为全部资源验收通过。 + +## 开发中与后续事项 + +| 状态 | 项目 | 当前情况 / 下一步 | +| --- | --- | --- | +| 🟡 开发中 | 自定义部件制箭系统 | 已有制箭台、方块实体、菜单、箭羽/箭杆/箭头和数据组件;需补客户端界面、实际合成和配方生成。它与已完成的延展药水箭是不同功能。 | +| ⬜ 待完成 | 其他木材配套 | 船、焚烬木/灵焰木告示牌、盆栽树苗尚未注册;现有占位资源不视为完成。 | +| ⬜ 待验证 | 制箭台替换存档行为 | 检查旧区块替换范围、性能及升级体验;现有配置关闭后不会自动恢复已替换方块。 | +| ⬜ 待整理 | 资源与视觉验收 | 核对现存材质警告、纹理引用及新方块实际显示,完成手动验收。 | +| ⬜ 待完善 | 本地构建流程 | 本地 `build` 尚不自动执行数据生成,仍需按开发指南分步运行;CI 已按顺序执行。 | +| ⬜ 待统一 | 许可证元数据 | `gradle.properties` 的许可标识与仓库分项许可证声明仍有差异,待维护者统一。 | +| ⬜ 规划中 | 其他模块与稳定版发布 | `deco`、`adv`、`vpp` 未启用;稳定版本的验收范围和发布日期尚未确定。 | + +## 功能文档索引 + +- [项目说明与获取命令](README.md) +- [结构生成配置与坐标查询](docs/STRUCTURES.md) +- [泥猪模型、生成与测试](docs/MUDDY_PIG.md) +- [合成、状态效果、附魔和生物规则](docs/GAMEPLAY.md) +- [窑炉](docs/KILN.md) +- [杜鹃木功能方块与延展之箭](docs/AZALEA_AND_REACH_ARROWS.md) +- [开发指南与待完善事项](docs/DEVELOPMENT.md) +- [原始功能需求](docs/specifications/) · [项目来源](docs/PROVENANCE.md) + +## 更新记录 + +| 日期 | 进度变更 | +| --- | --- | +| 2026-10-23 | 建立进度文档,汇总当前 18 项已交付功能、测试结果、GitHub 构建状态及未完成事项。 | + +维护约定:每次交付功能后更新对应条目、统计分母、进度条和日期;测试结果注明已验证的提交或构建记录;仅完成注册或占位资源的功能继续标为开发中。 diff --git a/README.md b/README.md index 909144c..74be6dc 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ > 当前说明对应 Minecraft `26.2` 适配代码,已合并远端 `26.2` 分支的 `26ad2da`。**结构、新物品、泥猪、泥沼蟹、恐鱼及新增玩法均在同一个 `ww_hfas` 模组中;另需安装 GeckoLib 依赖库。** -[开发指南](docs/DEVELOPMENT.md) · [历史变更](CHANGE_LOG.MD) · [问题反馈](https://github.com/cuccuc377-dev/WildWindMod/issues) · [许可证](LICENSE) +[项目进度](PROGRESS.md) · [开发指南](docs/DEVELOPMENT.md) · [历史变更](CHANGE_LOG.MD) · [问题反馈](https://github.com/cuccuc377-dev/WildWindMod/issues) · [许可证](LICENSE) ## 版本与环境 From f366d97df65f5671c35f77b2657a4f498265edd9 Mon Sep 17 00:00:00 2001 From: cuccuc377-dev <257740650+cuccuc377-dev@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:39:00 +0800 Subject: [PATCH 3/9] docs: normalize progress page paragraph spacing --- PROGRESS.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index 4f790ab..b7b645c 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -1,7 +1,9 @@ # 原野之风 · 项目进度 -最后更新:**2026-10-23** -当前阶段:**功能开发与测试,尚未发布稳定版** +最后更新:**2026-10-23** + +当前阶段:**功能开发与测试,尚未发布稳定版** + 运行环境:Minecraft **26.2** · NeoForge **26.2.0.93** · Java **25** · 模组版本 **1.0.1** ## 进度总览 From 5590d84337f8e0be04b7724ee9cf4a7774084ab0 Mon Sep 17 00:00:00 2001 From: cuccuc377-dev <257740650+cuccuc377-dev@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:47:44 +0800 Subject: [PATCH 4/9] docs: revise module plan to Core, Wilderness Update and Barren Update --- PROGRESS.md | 13 ++++++++++++- README.md | 12 +++++------- docs/DEVELOPMENT.md | 4 +++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index b7b645c..79fd96e 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -18,6 +18,16 @@ > 功能进度条只统计下面列出的 18 项已交付内容,包含本次开发及已合并的上游功能;不代表整个模组、未来规划或人工验收全部完成。测试进度表示已有测试的通过比例,不代表代码覆盖率。完整项目的最终范围尚未确定,因此不估算总完成百分比。 +## 模块规划 + +| 编号 | 中文名称 | 英文名称 | +| --- | --- | --- | +| 0 | 原野之风:核心 | Wild Wind:Core | +| 1 | 原野之风:荒野更新 | Wild Wind:Wilderness Update | +| 2 | 原野之风:瘠土更新 | Wild Wind:Barren Update | + +此表记录模块规划;现有已完成功能仍由 `ww_hfas` 统一提供,尚未按这三个模块拆分。编号不表示开发完成顺序。 + ## 已完成功能 | 编号 | 状态 | 功能 | 已实现内容 | @@ -65,7 +75,7 @@ | ⬜ 待整理 | 资源与视觉验收 | 核对现存材质警告、纹理引用及新方块实际显示,完成手动验收。 | | ⬜ 待完善 | 本地构建流程 | 本地 `build` 尚不自动执行数据生成,仍需按开发指南分步运行;CI 已按顺序执行。 | | ⬜ 待统一 | 许可证元数据 | `gradle.properties` 的许可标识与仓库分项许可证声明仍有差异,待维护者统一。 | -| ⬜ 规划中 | 其他模块与稳定版发布 | `deco`、`adv`、`vpp` 未启用;稳定版本的验收范围和发布日期尚未确定。 | +| ⬜ 规划中 | 模块划分与稳定版发布 | 按编号 0 核心、1 荒野更新、2 瘠土更新推进模块规划;功能归属、代码拆分和稳定版验收范围及发布日期尚未确定。 | ## 功能文档索引 @@ -83,5 +93,6 @@ | 日期 | 进度变更 | | --- | --- | | 2026-10-23 | 建立进度文档,汇总当前 18 项已交付功能、测试结果、GitHub 构建状态及未完成事项。 | +| 2026-10-23 | 模块规划更新为 0「核心」、1「荒野更新」、2「瘠土更新」,同步中英文名称;现有代码与统一打包方式不变。 | 维护约定:每次交付功能后更新对应条目、统计分母、进度条和日期;测试结果注明已验证的提交或构建记录;仅完成注册或占位资源的功能继续标为开发中。 diff --git a/README.md b/README.md index 74be6dc..6a6f153 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,13 @@ ## 模块规划 -| 模块 | 名称 | 当前分支状态 | +| 编号 | 中文名称 | 英文名称 | | --- | --- | --- | -| `hfas` | Wild Wind HFAS | 唯一启用的 Gradle 模组,包含木材、植物、新物品、泥猪、结构生成及制箭系统基础代码 | -| `structures` | 内部结构生成功能 | 源码保留在 `src/structures/`,由 HFAS 入口注册、编译并打包,不单独安装 | -| `deco` | Wild Wind Decoration · 装饰 | 旧版模块规划,尚未在当前分支启用 | -| `adv` | Wild Wind Adventure · 冒险 | 旧版模块规划,尚未在当前分支启用 | -| `vpp` | Wild Wind Vanilla++ · 原版修饰 | 旧版模块规划,尚未在当前分支启用 | +| 0 | 原野之风:核心 | Wild Wind:Core | +| 1 | 原野之风:荒野更新 | Wild Wind:Wilderness Update | +| 2 | 原野之风:瘠土更新 | Wild Wind:Barren Update | -模块启用列表见 [settings.gradle.kts](settings.gradle.kts)。 +以上为当前模块编号与命名规划,各模块的功能归属和代码拆分待进一步落实。当前实际启用的 Gradle 子项目仍为 `hfas`,以 `ww_hfas` 统一打包;`src/structures/` 仍是其中的内部结构生成功能,不单独安装。模块启用列表见 [settings.gradle.kts](settings.gradle.kts)。 ## HFAS 内容 diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 586cb27..92a307e 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -70,6 +70,8 @@ HFAS Java 包根目录为 `src/hfas/java/org/polaris2023/wildwind/hfas/`。 ## 模块维护 +模块规划采用编号 **0:原野之风:核心(Wild Wind:Core)**、**1:原野之风:荒野更新(Wild Wind:Wilderness Update)**、**2:原野之风:瘠土更新(Wild Wind:Barren Update)**。功能归属和代码拆分尚待落实,当前构建仍使用 `hfas` 子项目与 `ww_hfas` 模组 ID。 + 当前构建约定将 `src/<模块名>/java/` 和 `src/<模块名>/resources/` 接入相应子项目。`modules/hfas/build.gradle.kts` 额外接入 `src/structures/` 的代码、资源和测试,由 `HFASMod` 调用 `StructureModule.register`;结构功能没有独立 `@Mod` 入口。`modules/<模块名>/` 在配置阶段创建。新增模块需要同步修改 `settings.gradle.kts` 的启用列表,并核对模组入口、资源命名空间、Mixin 配置与共用元数据模板。仅在 README 增加模块名称不会生成可用模块。 ## 待完善事项 @@ -82,7 +84,7 @@ HFAS Java 包根目录为 `src/hfas/java/org/polaris2023/wildwind/hfas/`。 - **数据生成与打包**:CI 已显式生成数据并运行测试;本地 `build` 仍不自动触发数据生成,须遵循本页顺序。 - **存档行为**:验证制箭台对旧区块的替换逻辑、扫描范围与性能;README 已记录默认开启和不会自动回滚的行为。 - **元数据**:由维护者统一 `modLicense` 与仓库许可证声明。 -- **其他模块**:`deco`、`adv`、`vpp` 尚未加入当前分支的 Gradle 模块列表,需要分别实现后再更新状态。 +- **模块划分**:按编号 0「核心」、1「荒野更新」、2「瘠土更新」明确功能归属,再落实对应的代码与构建调整;当前仍统一打包。 ## 提交前验证 From b5b0e068c61c376f581b21d2d2d0b271c74cddd8 Mon Sep 17 00:00:00 2001 From: cuccuc377-dev <257740650+cuccuc377-dev@users.noreply.github.com> Date: Fri, 23 Oct 2026 15:02:44 +0800 Subject: [PATCH 5/9] docs: define wild_wind module IDs --- PROGRESS.md | 11 ++++++----- README.md | 10 +++++----- docs/DEVELOPMENT.md | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index 79fd96e..cbdcda1 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -20,11 +20,11 @@ ## 模块规划 -| 编号 | 中文名称 | 英文名称 | -| --- | --- | --- | -| 0 | 原野之风:核心 | Wild Wind:Core | -| 1 | 原野之风:荒野更新 | Wild Wind:Wilderness Update | -| 2 | 原野之风:瘠土更新 | Wild Wind:Barren Update | +| 编号 | 中文名称 | 英文名称 | 规划模组 ID | +| --- | --- | --- | --- | +| 0 | 原野之风:核心 | Wild Wind:Core | `wild_wind_core` | +| 1 | 原野之风:荒野更新 | Wild Wind:Wilderness Update | `wild_wind_wilderness` | +| 2 | 原野之风:瘠土更新 | Wild Wind:Barren Update | `wild_wind_barren` | 此表记录模块规划;现有已完成功能仍由 `ww_hfas` 统一提供,尚未按这三个模块拆分。编号不表示开发完成顺序。 @@ -94,5 +94,6 @@ | --- | --- | | 2026-10-23 | 建立进度文档,汇总当前 18 项已交付功能、测试结果、GitHub 构建状态及未完成事项。 | | 2026-10-23 | 模块规划更新为 0「核心」、1「荒野更新」、2「瘠土更新」,同步中英文名称;现有代码与统一打包方式不变。 | +| 2026-10-23 | 三个规划模组 ID 统一采用 `wild_wind_` 前缀:`wild_wind_core`、`wild_wind_wilderness`、`wild_wind_barren`;运行时 ID 迁移尚未实施。 | 维护约定:每次交付功能后更新对应条目、统计分母、进度条和日期;测试结果注明已验证的提交或构建记录;仅完成注册或占位资源的功能继续标为开发中。 diff --git a/README.md b/README.md index 6a6f153..01fdc14 100644 --- a/README.md +++ b/README.md @@ -26,11 +26,11 @@ ## 模块规划 -| 编号 | 中文名称 | 英文名称 | -| --- | --- | --- | -| 0 | 原野之风:核心 | Wild Wind:Core | -| 1 | 原野之风:荒野更新 | Wild Wind:Wilderness Update | -| 2 | 原野之风:瘠土更新 | Wild Wind:Barren Update | +| 编号 | 中文名称 | 英文名称 | 规划模组 ID | +| --- | --- | --- | --- | +| 0 | 原野之风:核心 | Wild Wind:Core | `wild_wind_core` | +| 1 | 原野之风:荒野更新 | Wild Wind:Wilderness Update | `wild_wind_wilderness` | +| 2 | 原野之风:瘠土更新 | Wild Wind:Barren Update | `wild_wind_barren` | 以上为当前模块编号与命名规划,各模块的功能归属和代码拆分待进一步落实。当前实际启用的 Gradle 子项目仍为 `hfas`,以 `ww_hfas` 统一打包;`src/structures/` 仍是其中的内部结构生成功能,不单独安装。模块启用列表见 [settings.gradle.kts](settings.gradle.kts)。 diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 92a307e..c04f768 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -70,7 +70,7 @@ HFAS Java 包根目录为 `src/hfas/java/org/polaris2023/wildwind/hfas/`。 ## 模块维护 -模块规划采用编号 **0:原野之风:核心(Wild Wind:Core)**、**1:原野之风:荒野更新(Wild Wind:Wilderness Update)**、**2:原野之风:瘠土更新(Wild Wind:Barren Update)**。功能归属和代码拆分尚待落实,当前构建仍使用 `hfas` 子项目与 `ww_hfas` 模组 ID。 +模块规划采用编号 **0:原野之风:核心(Wild Wind:Core)**、**1:原野之风:荒野更新(Wild Wind:Wilderness Update)**、**2:原野之风:瘠土更新(Wild Wind:Barren Update)**。对应的规划模组 ID 分别为 `wild_wind_core`、`wild_wind_wilderness`、`wild_wind_barren`,统一使用 `wild_wind_` 前缀。功能归属、代码拆分及运行时 ID 迁移尚待落实,当前构建仍使用 `hfas` 子项目与 `ww_hfas` 模组 ID。 当前构建约定将 `src/<模块名>/java/` 和 `src/<模块名>/resources/` 接入相应子项目。`modules/hfas/build.gradle.kts` 额外接入 `src/structures/` 的代码、资源和测试,由 `HFASMod` 调用 `StructureModule.register`;结构功能没有独立 `@Mod` 入口。`modules/<模块名>/` 在配置阶段创建。新增模块需要同步修改 `settings.gradle.kts` 的启用列表,并核对模组入口、资源命名空间、Mixin 配置与共用元数据模板。仅在 README 增加模块名称不会生成可用模块。 From b5e76a1d568700777815fb90cdf0644259a6433b Mon Sep 17 00:00:00 2001 From: cuccuc377-dev <257740650+cuccuc377-dev@users.noreply.github.com> Date: Fri, 23 Oct 2026 15:57:22 +0800 Subject: [PATCH 6/9] Split Wild Wind into Core, Wilderness and Barren mods; remove unfinished fletching --- .github/workflows/build.yml | 23 +- CHANGE_LOG.MD | 12 + PROGRESS.md | 64 ++-- README.md | 286 +++++------------- build.gradle.kts | 267 ++++++++-------- docs/AZALEA_AND_REACH_ARROWS.md | 32 +- docs/DEVELOPMENT.md | 126 ++++---- docs/GAMEPLAY.md | 53 ++-- docs/KILN.md | 10 +- docs/MUDDY_PIG.md | 41 +-- docs/STRUCTURES.md | 16 +- gradle.properties | 6 +- modules/hfas/build.gradle.kts | 76 ----- scripts/sync_generated_resources.py | 70 +++++ settings.gradle.kts | 8 +- .../wildwind/barren/BarrenMod.java | 14 + .../wildwind/barren/block/ModBlocks.java | 47 +++ .../barren/event/CreativeContents.java | 18 ++ .../blockstates/tiny_cactus.json | 7 + .../wild_wind_barren/items/tiny_cactus.json | 6 + .../assets/wild_wind_barren/lang/en_us.json | 4 + .../assets/wild_wind_barren/lang/zh_cn.json | 4 + .../models/block/tiny_cactus.json | 4 +- .../textures/block/tiny_cactus.png | Bin .../loot_table/blocks/tiny_cactus.json | 6 +- .../resources/wild_wind_barren.mixins.json | 13 + .../polaris2023/wildwind/core/CoreMod.java | 23 ++ .../wildwind/core/api/WildWindModules.java | 7 + .../core}/block/AzaleaShelfBlock.java | 2 +- .../wildwind/core}/block/KilnBlock.java | 6 +- .../wildwind/core/block/ModBlocks.java | 188 ++++++++++++ .../core}/block/entity/KilnBlockEntity.java | 10 +- .../core}/block/entity/ModBlockEntities.java | 24 +- .../core}/client/AzaleaSignState.java | 2 +- .../wildwind/core/client/CoreScreens.java | 11 + .../wildwind/core}/client/KilnScreen.java | 4 +- .../core}/enchantment/MeltingEnchantment.java | 8 +- .../wildwind/core}/event/CobwebBreaking.java | 6 +- .../core}/event/FarmlandProtection.java | 6 +- .../wildwind/core/event/FuelHandler.java | 63 ++++ .../core}/event/SkeletonBehavior.java | 2 +- .../wildwind/core}/menu/KilnMenu.java | 4 +- .../wildwind/core}/menu/ModMenus.java | 12 +- .../core}/mixin/AbstractSkeletonMixin.java | 4 +- .../core}/mixin/AzaleaBlockMixin.java | 4 +- .../core}/mixin/AzaleaSignRendererMixin.java | 11 +- .../core}/mixin/CrafterBlockMixin.java | 4 +- .../core}/mixin/FurnaceFuelAccessor.java | 2 +- .../core}/mixin/SignRenderStateMixin.java | 4 +- .../core}/mixin/SinglePoolElementMixin.java | 4 +- .../core/mixin/SkeletonMeleeMixin.java | 18 ++ .../wildwind/core}/recipe/KilnRecipes.java | 8 +- .../wildwind/core}/recipe/ModRecipes.java | 6 +- .../core}/recipe/WoolToStringRecipe.java | 2 +- .../core}/registry/ModCreativeTabs.java | 29 +- .../wildwind/core/registry/ModItems.java | 49 +++ .../core}/worldgen/MasonKilnProcessor.java | 11 +- .../core/worldgen/ModTreeGrowers.java | 9 + .../wildwind/structures/StructureModule.java | 0 .../structures/command/StructureCommands.java | 0 .../config/ConfigStructurePack.java | 0 .../config/StructureDefinition.java | 0 .../worldgen/ConfiguredStructure.java | 0 .../worldgen/ConfiguredTemplatePiece.java | 0 .../worldgen/GeneratedStructureIndex.java | 0 .../blockstates/azalea_button.json | 50 +-- .../blockstates/azalea_door.json | 66 ++-- .../blockstates/azalea_fence.json | 12 +- .../blockstates/azalea_fence_gate.json | 34 +-- .../blockstates/azalea_hanging_sign.json | 124 ++++++++ .../blockstates/azalea_log.json | 16 + .../blockstates/azalea_planks.json | 7 + .../blockstates/azalea_pressure_plate.json | 10 + .../blockstates/azalea_shelf.json | 50 +-- .../blockstates/azalea_sign.json | 64 ++++ .../blockstates/azalea_slab.json | 13 + .../blockstates/azalea_stairs.json | 82 ++--- .../blockstates/azalea_trapdoor.json | 58 ++++ .../blockstates/azalea_wall_hanging_sign.json | 19 ++ .../blockstates/azalea_wall_sign.json | 19 ++ .../blockstates/azalea_wood.json | 16 + .../wild_wind_core}/blockstates/kiln.json | 2 +- .../blockstates/stripped_azalea_log.json | 16 + .../blockstates/stripped_azalea_wood.json | 16 + .../wild_wind_core}/items/azalea_boat.json | 2 +- .../wild_wind_core/items/azalea_button.json | 6 + .../items/azalea_chest_boat.json | 6 + .../wild_wind_core/items/azalea_door.json} | 2 +- .../wild_wind_core/items/azalea_fence.json | 6 + .../items/azalea_fence_gate.json | 6 + .../items/azalea_hanging_sign.json | 6 + .../wild_wind_core/items/azalea_log.json | 6 + .../wild_wind_core/items/azalea_planks.json | 6 + .../items/azalea_pressure_plate.json | 6 + .../wild_wind_core/items/azalea_shelf.json | 6 + .../wild_wind_core/items/azalea_sign.json | 6 + .../wild_wind_core/items/azalea_slab.json | 6 + .../wild_wind_core/items/azalea_stairs.json | 6 + .../wild_wind_core/items/azalea_trapdoor.json | 6 + .../wild_wind_core/items/azalea_wood.json | 6 + .../wild_wind_core/items/baked_seeds.json | 6 + .../wild_wind_core}/items/calamari.json | 2 +- .../wild_wind_core/items/cooked_calamari.json | 6 + .../wild_wind_core}/items/cooked_egg.json | 2 +- .../items/cooked_frog_legs.json | 2 +- .../wild_wind_core}/items/duckweed.json | 2 +- .../wild_wind_core}/items/frog_legs.json | 2 +- .../assets/wild_wind_core}/items/kiln.json | 2 +- .../items/stripped_azalea_log.json | 6 + .../items/stripped_azalea_wood.json | 6 + .../assets/wild_wind_core/lang/en_us.json | 31 ++ .../assets/wild_wind_core/lang/zh_cn.json | 31 ++ .../models/block/azalea_button.json | 4 +- .../models/block/azalea_button_inventory.json | 4 +- .../models/block/azalea_button_pressed.json | 4 +- .../models/block/azalea_door_bottom_left.json | 7 + .../block/azalea_door_bottom_left_open.json | 7 + .../block/azalea_door_bottom_right.json | 7 + .../block/azalea_door_bottom_right_open.json | 7 + .../models/block/azalea_door_top_left.json | 7 + .../block/azalea_door_top_left_open.json | 7 + .../models/block/azalea_door_top_right.json | 7 + .../block/azalea_door_top_right_open.json | 7 + .../models/block/azalea_fence_gate.json | 4 +- .../models/block/azalea_fence_gate_open.json | 4 +- .../models/block/azalea_fence_gate_wall.json | 4 +- .../block/azalea_fence_gate_wall_open.json | 4 +- .../models/block/azalea_fence_inventory.json | 4 +- .../models/block/azalea_fence_post.json | 4 +- .../models/block/azalea_fence_side.json | 4 +- .../azalea_hanging_sign_attached_rot_0.json | 7 + .../azalea_hanging_sign_attached_rot_1.json | 7 + .../azalea_hanging_sign_attached_rot_2.json | 7 + .../azalea_hanging_sign_attached_rot_3.json | 7 + .../block/azalea_hanging_sign_rot_0.json | 7 + .../block/azalea_hanging_sign_rot_1.json | 7 + .../block/azalea_hanging_sign_rot_2.json | 7 + .../block/azalea_hanging_sign_rot_3.json | 7 + .../models/block/azalea_log.json | 7 + .../models/block/azalea_log_horizontal.json | 7 + .../models/block/azalea_planks.json | 4 +- .../models/block/azalea_pressure_plate.json | 4 +- .../block/azalea_pressure_plate_down.json | 4 +- .../models/block/azalea_shelf.json | 7 + .../models/block/azalea_shelf_center.json | 7 + .../models/block/azalea_shelf_inventory.json | 7 + .../models/block/azalea_shelf_left.json | 7 + .../models/block/azalea_shelf_right.json | 7 + .../block/azalea_shelf_unconnected.json | 7 + .../models/block/azalea_shelf_unpowered.json | 7 + .../models/block/azalea_sign_rot_0.json | 7 + .../models/block/azalea_sign_rot_1.json | 7 + .../models/block/azalea_sign_rot_2.json | 7 + .../models/block/azalea_sign_rot_3.json | 7 + .../models/block/azalea_slab.json | 8 + .../models/block/azalea_slab_top.json | 8 + .../models/block/azalea_stairs.json | 8 + .../models/block/azalea_stairs_inner.json | 8 + .../models/block/azalea_stairs_outer.json | 8 + .../models/block/azalea_trapdoor_bottom.json | 6 + .../models/block/azalea_trapdoor_open.json | 6 + .../models/block/azalea_trapdoor_top.json | 6 + .../block/azalea_wall_hanging_sign.json | 7 + .../models/block/azalea_wall_sign.json | 7 + .../models/block/azalea_wood.json | 7 + .../models/block/stripped_azalea_log.json | 7 + .../block/stripped_azalea_log_horizontal.json | 7 + .../models/block/stripped_azalea_wood.json | 7 + .../models/item/azalea_boat.json | 2 +- .../models/item/azalea_chest_boat.json | 2 +- .../models/item/azalea_door.json} | 2 +- .../models/item/azalea_hanging_sign.json | 6 + .../models/item/azalea_sign.json | 6 + .../models/item/baked_seeds.json | 6 + .../wild_wind_core}/models/item/calamari.json | 2 +- .../models/item/cooked_calamari.json | 6 + .../models/item/cooked_egg.json | 2 +- .../models/item/cooked_frog_legs.json | 2 +- .../wild_wind_core}/models/item/duckweed.json | 2 +- .../models/item/frog_legs.json | 2 +- .../textures/block/azalea_door_bottom.png | Bin .../textures/block/azalea_door_top.png | Bin .../textures/block/azalea_hanging_sign.png | Bin .../textures/block/azalea_log.png | Bin .../textures/block/azalea_log_top.png | Bin .../textures/block/azalea_planks.png | Bin .../textures/block/azalea_shelf.png | Bin .../textures/block/azalea_sign.png | Bin .../textures/block/azalea_trapdoor.png | Bin .../textures/block/stripped_azalea_log.png | Bin .../block/stripped_azalea_log_top.png | Bin .../textures/entity/boat/azalea.png | Bin .../textures/entity/chest_boat/azalea.png | Bin .../textures/entity/signs/azalea.png | Bin .../textures/entity/signs/hanging/azalea.png | Bin .../textures/gui/hanging_signs/azalea.png | Bin .../textures/gui/signs/azalea.png | Bin .../textures/item/azalea_boat.png | Bin .../textures/item/azalea_chest_boat.png | Bin .../textures/item/azalea_door.png | Bin .../textures/item/azalea_hanging_sign.png | Bin .../textures/item/azalea_sign.png | Bin .../textures/item/baked_seeds.png | Bin .../textures/item/calamari.png | Bin .../textures/item/cooked_calamari.png | Bin .../textures/item/cooked_egg.png | Bin .../textures/item/cooked_frog_legs.png | Bin .../textures/item/duckweed.png | Bin .../textures/item/frog_legs.png | Bin .../data/c/tags/block/fence_gates/wooden.json | 5 + .../resources/data/c/tags/block/fences.json | 5 + .../data/c/tags/block/fences/wooden.json | 5 + .../data/c/tags/block/stripped_logs.json | 5 + .../data/c/tags/block/stripped_woods.json | 5 + .../data/c/tags/item/fence_gates/wooden.json | 5 + .../data/c/tags/item/fences/wooden.json | 5 + .../data/c/tags/item/stripped_logs.json | 5 + .../data/c/tags/item/stripped_woods.json | 5 + .../tags/block/all_hanging_signs.json | 12 + .../data/minecraft/tags/block/all_signs.json} | 4 +- .../tags/block/ceiling_hanging_signs.json | 5 + .../data/minecraft/tags/block/doors.json | 5 + .../minecraft/tags/block/fence_gates.json | 5 + .../data/minecraft/tags/block/fences.json | 5 + .../data/minecraft/tags/block/logs.json | 8 + .../minecraft/tags/block/logs_that_burn.json | 8 + .../minecraft/tags/block/mineable/axe.json | 22 ++ .../tags/block/mineable/pickaxe.json | 5 + .../tags/block/needs_stone_tool.json | 17 ++ .../tags/block/overworld_natural_logs.json | 5 + .../data/minecraft/tags/block/planks.json | 5 + .../minecraft/tags/block/standing_signs.json | 5 + .../data/minecraft/tags/block/trapdoors.json | 5 + .../tags/block/wall_hanging_signs.json | 5 + .../data/minecraft/tags/block/wall_signs.json | 5 + .../minecraft/tags/block/wooden_buttons.json | 5 + .../minecraft/tags/block/wooden_doors.json | 5 + .../minecraft/tags/block/wooden_fences.json | 5 + .../tags/block/wooden_pressure_plates.json | 5 + .../minecraft/tags/block/wooden_shelves.json | 5 + .../minecraft/tags/block/wooden_slabs.json | 5 + .../minecraft/tags/block/wooden_stairs.json | 5 + .../tags/block/wooden_trapdoors.json | 5 + .../tags/enchantment/non_treasure.json | 2 +- .../data/minecraft/tags/item/boats.json | 8 + .../data/minecraft/tags/item/buttons.json | 5 + .../data/minecraft/tags/item/chest_boats.json | 8 + .../data/minecraft/tags/item/doors.json | 5 + .../data/minecraft/tags/item/fence_gates.json | 5 + .../minecraft/tags/item/hanging_signs.json | 5 + .../data/minecraft/tags/item/logs.json | 8 + .../minecraft/tags/item/logs_that_burn.json | 8 + .../data/minecraft/tags/item/planks.json | 5 + .../data/minecraft/tags/item/signs.json | 5 + .../data/minecraft/tags/item/trapdoors.json | 5 + .../minecraft/tags/item/wooden_buttons.json | 5 + .../minecraft/tags/item/wooden_doors.json | 5 + .../minecraft/tags/item/wooden_fences.json | 5 + .../tags/item/wooden_pressure_plates.json | 5 + .../minecraft/tags/item/wooden_shelves.json | 5 + .../minecraft/tags/item/wooden_slabs.json | 5 + .../minecraft/tags/item/wooden_stairs.json | 5 + .../minecraft/tags/item/wooden_trapdoors.json | 5 + .../neoforge/data_maps/block/strippables.json | 10 + .../building_blocks/azalea_planks.json | 6 +- .../recipes/building_blocks/azalea_slab.json | 6 +- .../building_blocks/azalea_stairs.json | 6 +- .../recipes/building_blocks/azalea_wood.json | 6 +- .../recipes/decorations/azalea_fence.json | 6 +- .../decorations/azalea_hanging_sign.json | 8 +- .../recipes/decorations/azalea_shelf.json | 8 +- .../recipes/decorations/azalea_sign.json | 8 +- .../advancement/recipes/decorations/kiln.json | 6 +- .../recipes/redstone/azalea_button.json | 6 +- .../recipes/redstone/azalea_door.json | 6 +- .../recipes/redstone/azalea_fence_gate.json | 6 +- .../redstone/azalea_pressure_plate.json | 6 +- .../recipes/redstone/azalea_trapdoor.json | 6 +- .../wild_wind_core}/enchantment/melting.json | 2 +- .../loot_table/blocks/azalea_button.json | 6 +- .../loot_table/blocks/azalea_door.json | 8 +- .../loot_table/blocks/azalea_fence.json | 6 +- .../loot_table/blocks/azalea_fence_gate.json | 6 +- .../blocks/azalea_hanging_sign.json | 6 +- .../loot_table/blocks/azalea_log.json | 6 +- .../loot_table/blocks/azalea_planks.json | 6 +- .../blocks/azalea_pressure_plate.json | 6 +- .../loot_table/blocks/azalea_shelf.json | 6 +- .../loot_table/blocks/azalea_sign.json | 6 +- .../loot_table/blocks/azalea_slab.json | 6 +- .../loot_table/blocks/azalea_stairs.json | 6 +- .../loot_table/blocks/azalea_trapdoor.json | 6 +- .../blocks/azalea_wall_hanging_sign.json | 4 +- .../loot_table/blocks/azalea_wall_sign.json | 4 +- .../loot_table/blocks/azalea_wood.json | 6 +- .../loot_table/blocks/kiln.json | 6 +- .../blocks/stripped_azalea_log.json | 6 +- .../blocks/stripped_azalea_wood.json | 6 +- .../biome_modifier/add_azalea_tree.json | 4 +- .../remove_vanilla_azalea_tree.json | 2 +- .../wild_wind_core}/recipe/azalea_button.json | 4 +- .../wild_wind_core}/recipe/azalea_door.json | 4 +- .../wild_wind_core}/recipe/azalea_fence.json | 4 +- .../recipe/azalea_fence_gate.json | 4 +- .../recipe/azalea_hanging_sign.json | 6 +- .../wild_wind_core}/recipe/azalea_planks.json | 4 +- .../recipe/azalea_pressure_plate.json | 4 +- .../wild_wind_core}/recipe/azalea_shelf.json | 6 +- .../wild_wind_core}/recipe/azalea_sign.json | 6 +- .../wild_wind_core}/recipe/azalea_slab.json | 4 +- .../wild_wind_core}/recipe/azalea_stairs.json | 4 +- .../recipe/azalea_trapdoor.json | 4 +- .../wild_wind_core}/recipe/azalea_wood.json | 4 +- .../data/wild_wind_core}/recipe/kiln.json | 4 +- .../wild_wind_core/recipe/wool_to_string.json | 3 + .../tags/block/azalea_logs.json | 8 + .../wild_wind_core/tags/item/azalea_logs.json | 8 + .../tags/item/kiln_excluded.json | 0 .../tags/item/kiln_metal_outputs.json | 0 .../configured_feature/azalea_tree.json | 4 +- .../placed_feature/azalea_tree_placed.json | 4 +- .../resources/examples/example_ruins.json | 0 .../resources/examples/example_ruins.nbt | Bin src/core/resources/wild_wind_core.mixins.json | 23 ++ .../config/StructureConfigTest.java | 0 .../worldgen/GeneratedStructureIndexTest.java | 0 .../polaris2023/wildwind/hfas/HFASMod.java | 15 + .../wildwind/hfas/datagen/HFASDatagen.java | 0 .../datagen/provider/ModDataMapsProvider.java | 33 ++ .../datagen/provider/ModDatapackProvider.java | 6 +- .../datagen/provider/ModLootProvider.java | 7 +- .../datagen/provider/ModModelProvider.java | 226 ++++++++++++++ .../datagen/provider/ModRecipeProvider.java | 31 +- .../provider/lang/EnUsLanguageProvider.java | 123 ++++++++ .../provider/lang/ZhCnLanguageProvider.java | 126 ++++++++ .../lang/ZhEnCombineLangProvider.java | 21 +- .../hfas/datagen/provider/loot/BlockLoot.java | 89 ++++++ .../provider/tag/ModBiomeTagsProvider.java | 2 +- .../provider/tag/ModBlockTagsProvider.java | 106 ++++--- .../tag/ModEntityTypeTagsProvider.java | 4 +- .../provider/tag/ModItemTagsProvider.java | 122 ++++---- .../hfas/worldgen/ModBiomeModifiers.java | 4 +- .../hfas/worldgen/ModConfiguredFeatures.java | 17 +- .../hfas/worldgen/ModPlacedFeatures.java | 6 +- src/hfas/gametest/config/ww_hfas-common.toml | 2 - .../resources/META-INF/neoforge.mods.toml | 14 - .../reach_arrow_acquisition.json | 7 - .../test_instance/upstream_integration.json | 7 - .../polaris2023/wildwind/hfas/HFASMod.java | 72 ----- .../wildwind/hfas/arrow/ArrowFletching.java | 62 ---- .../wildwind/hfas/arrow/ArrowHead.java | 107 ------- .../wildwind/hfas/arrow/ArrowShaft.java | 103 ------- .../hfas/block/FletchingTableBlock.java | 56 ---- .../entity/FletchingTableBlockEntity.java | 132 -------- .../hfas/component/ArrowComponent.java | 124 -------- .../wildwind/hfas/config/ModCommonConfig.java | 59 ---- .../datagen/provider/ModDataMapsProvider.java | 34 --- .../datagen/provider/ModModelProvider.java | 217 ------------- .../provider/lang/EnUsLanguageProvider.java | 126 -------- .../provider/lang/ZhCnLanguageProvider.java | 130 -------- .../hfas/datagen/provider/loot/BlockLoot.java | 91 ------ .../event/FletchingTableReplaceHandler.java | 87 ------ .../wildwind/hfas/event/FuelHandler.java | 86 ------ .../hfas/menu/FletchingTableMenu.java | 128 -------- .../hfas/worldgen/ModTreeGrowers.java | 41 --- .../blockstates/azalea_hanging_sign.json | 124 -------- .../ww_hfas/blockstates/azalea_log.json | 16 - .../ww_hfas/blockstates/azalea_planks.json | 7 - .../blockstates/azalea_pressure_plate.json | 10 - .../ww_hfas/blockstates/azalea_sign.json | 64 ---- .../ww_hfas/blockstates/azalea_slab.json | 13 - .../ww_hfas/blockstates/azalea_trapdoor.json | 68 ----- .../blockstates/azalea_wall_hanging_sign.json | 19 -- .../ww_hfas/blockstates/azalea_wall_sign.json | 19 -- .../ww_hfas/blockstates/azalea_wood.json | 16 - .../blockstates/blaze_hanging_sign.json | 124 -------- .../ww_hfas/blockstates/blaze_leaves.json | 7 - .../assets/ww_hfas/blockstates/blaze_log.json | 16 - .../ww_hfas/blockstates/blaze_planks.json | 7 - .../blockstates/blaze_pressure_plate.json | 10 - .../ww_hfas/blockstates/blaze_sapling.json | 7 - .../ww_hfas/blockstates/blaze_sign.json | 64 ---- .../ww_hfas/blockstates/blaze_slab.json | 13 - .../ww_hfas/blockstates/blaze_trapdoor.json | 68 ----- .../blockstates/blaze_wall_hanging_sign.json | 19 -- .../ww_hfas/blockstates/blaze_wall_sign.json | 19 -- .../ww_hfas/blockstates/blaze_wood.json | 16 - .../ww_hfas/blockstates/fletching_table.json | 7 - .../blockstates/potted_blaze_sapling.json | 7 - .../blockstates/potted_soul_sapling.json | 7 - .../ww_hfas/blockstates/scorched_dirt.json | 7 - .../ww_hfas/blockstates/scorched_grass.json | 7 - .../blockstates/scorched_grass_block.json | 7 - .../ww_hfas/blockstates/scorched_twig.json | 7 - .../blockstates/soul_hanging_sign.json | 124 -------- .../ww_hfas/blockstates/soul_leaves.json | 7 - .../assets/ww_hfas/blockstates/soul_log.json | 16 - .../ww_hfas/blockstates/soul_planks.json | 7 - .../blockstates/soul_pressure_plate.json | 10 - .../ww_hfas/blockstates/soul_sapling.json | 7 - .../assets/ww_hfas/blockstates/soul_sign.json | 64 ---- .../assets/ww_hfas/blockstates/soul_slab.json | 13 - .../ww_hfas/blockstates/soul_trapdoor.json | 68 ----- .../blockstates/soul_wall_hanging_sign.json | 19 -- .../ww_hfas/blockstates/soul_wall_sign.json | 19 -- .../assets/ww_hfas/blockstates/soul_wood.json | 16 - .../blockstates/stripped_azalea_log.json | 16 - .../blockstates/stripped_azalea_wood.json | 16 - .../blockstates/stripped_blaze_log.json | 16 - .../blockstates/stripped_blaze_wood.json | 16 - .../blockstates/stripped_soul_log.json | 16 - .../blockstates/stripped_soul_wood.json | 16 - .../ww_hfas/blockstates/tiny_cactus.json | 7 - .../assets/ww_hfas/items/azalea_button.json | 6 - .../ww_hfas/items/azalea_chest_boat.json | 6 - .../assets/ww_hfas/items/azalea_door.json | 6 - .../assets/ww_hfas/items/azalea_fence.json | 6 - .../ww_hfas/items/azalea_fence_gate.json | 6 - .../ww_hfas/items/azalea_hanging_sign.json | 6 - .../assets/ww_hfas/items/azalea_log.json | 6 - .../assets/ww_hfas/items/azalea_planks.json | 6 - .../ww_hfas/items/azalea_pressure_plate.json | 6 - .../assets/ww_hfas/items/azalea_shelf.json | 6 - .../assets/ww_hfas/items/azalea_sign.json | 6 - .../assets/ww_hfas/items/azalea_slab.json | 6 - .../assets/ww_hfas/items/azalea_stairs.json | 6 - .../assets/ww_hfas/items/azalea_trapdoor.json | 6 - .../assets/ww_hfas/items/azalea_wood.json | 6 - .../assets/ww_hfas/items/blaze_boat.json | 6 - .../assets/ww_hfas/items/blaze_button.json | 6 - .../ww_hfas/items/blaze_chest_boat.json | 6 - .../assets/ww_hfas/items/blaze_door.json | 6 - .../assets/ww_hfas/items/blaze_fence.json | 6 - .../ww_hfas/items/blaze_fence_gate.json | 6 - .../ww_hfas/items/blaze_hanging_sign.json | 6 - .../assets/ww_hfas/items/blaze_log.json | 6 - .../assets/ww_hfas/items/blaze_planks.json | 6 - .../ww_hfas/items/blaze_pressure_plate.json | 6 - .../assets/ww_hfas/items/blaze_sapling.json | 6 - .../assets/ww_hfas/items/blaze_sign.json | 6 - .../assets/ww_hfas/items/blaze_slab.json | 6 - .../assets/ww_hfas/items/blaze_stairs.json | 6 - .../assets/ww_hfas/items/blaze_trapdoor.json | 6 - .../assets/ww_hfas/items/blaze_wood.json | 6 - .../assets/ww_hfas/items/scorched_dirt.json | 6 - .../assets/ww_hfas/items/scorched_grass.json | 6 - .../ww_hfas/items/scorched_grass_block.json | 6 - .../assets/ww_hfas/items/scorched_twig.json | 6 - .../assets/ww_hfas/items/soul_button.json | 6 - .../assets/ww_hfas/items/soul_chest_boat.json | 6 - .../assets/ww_hfas/items/soul_door.json | 6 - .../assets/ww_hfas/items/soul_fence.json | 6 - .../assets/ww_hfas/items/soul_fence_gate.json | 6 - .../ww_hfas/items/soul_hanging_sign.json | 6 - .../assets/ww_hfas/items/soul_log.json | 6 - .../assets/ww_hfas/items/soul_planks.json | 6 - .../ww_hfas/items/soul_pressure_plate.json | 6 - .../assets/ww_hfas/items/soul_sapling.json | 6 - .../assets/ww_hfas/items/soul_slab.json | 6 - .../assets/ww_hfas/items/soul_stairs.json | 6 - .../assets/ww_hfas/items/soul_trapdoor.json | 6 - .../assets/ww_hfas/items/soul_wood.json | 6 - .../ww_hfas/items/stripped_azalea_log.json | 6 - .../ww_hfas/items/stripped_azalea_wood.json | 6 - .../ww_hfas/items/stripped_blaze_log.json | 6 - .../ww_hfas/items/stripped_blaze_wood.json | 6 - .../ww_hfas/items/stripped_soul_log.json | 6 - .../ww_hfas/items/stripped_soul_wood.json | 6 - .../assets/ww_hfas/items/tiny_cactus.json | 6 - .../resources/assets/ww_hfas/lang/en_us.json | 97 ------ .../resources/assets/ww_hfas/lang/zh_cn.json | 97 ------ .../models/block/azalea_door_bottom_left.json | 7 - .../block/azalea_door_bottom_left_open.json | 7 - .../block/azalea_door_bottom_right.json | 7 - .../block/azalea_door_bottom_right_open.json | 7 - .../models/block/azalea_door_top_left.json | 7 - .../block/azalea_door_top_left_open.json | 7 - .../models/block/azalea_door_top_right.json | 7 - .../block/azalea_door_top_right_open.json | 7 - .../azalea_hanging_sign_attached_rot_0.json | 7 - .../azalea_hanging_sign_attached_rot_1.json | 7 - .../azalea_hanging_sign_attached_rot_2.json | 7 - .../azalea_hanging_sign_attached_rot_3.json | 7 - .../block/azalea_hanging_sign_rot_0.json | 7 - .../block/azalea_hanging_sign_rot_1.json | 7 - .../block/azalea_hanging_sign_rot_2.json | 7 - .../block/azalea_hanging_sign_rot_3.json | 7 - .../ww_hfas/models/block/azalea_log.json | 7 - .../models/block/azalea_log_horizontal.json | 7 - .../ww_hfas/models/block/azalea_shelf.json | 7 - .../models/block/azalea_shelf_center.json | 7 - .../models/block/azalea_shelf_inventory.json | 7 - .../models/block/azalea_shelf_left.json | 7 - .../models/block/azalea_shelf_right.json | 7 - .../block/azalea_shelf_unconnected.json | 7 - .../models/block/azalea_shelf_unpowered.json | 7 - .../models/block/azalea_sign_rot_0.json | 7 - .../models/block/azalea_sign_rot_1.json | 7 - .../models/block/azalea_sign_rot_2.json | 7 - .../models/block/azalea_sign_rot_3.json | 7 - .../ww_hfas/models/block/azalea_slab.json | 8 - .../ww_hfas/models/block/azalea_slab_top.json | 8 - .../ww_hfas/models/block/azalea_stairs.json | 8 - .../models/block/azalea_stairs_inner.json | 8 - .../models/block/azalea_stairs_outer.json | 8 - .../models/block/azalea_trapdoor_bottom.json | 6 - .../models/block/azalea_trapdoor_open.json | 6 - .../models/block/azalea_trapdoor_top.json | 6 - .../block/azalea_wall_hanging_sign.json | 7 - .../models/block/azalea_wall_sign.json | 7 - .../ww_hfas/models/block/azalea_wood.json | 7 - .../models/block/blaze_door_bottom_left.json | 7 - .../block/blaze_door_bottom_left_open.json | 7 - .../models/block/blaze_door_bottom_right.json | 7 - .../block/blaze_door_bottom_right_open.json | 7 - .../models/block/blaze_door_top_left.json | 7 - .../block/blaze_door_top_left_open.json | 7 - .../models/block/blaze_door_top_right.json | 7 - .../block/blaze_door_top_right_open.json | 7 - .../blaze_hanging_sign_attached_rot_0.json | 7 - .../blaze_hanging_sign_attached_rot_1.json | 7 - .../blaze_hanging_sign_attached_rot_2.json | 7 - .../blaze_hanging_sign_attached_rot_3.json | 7 - .../block/blaze_hanging_sign_rot_0.json | 7 - .../block/blaze_hanging_sign_rot_1.json | 7 - .../block/blaze_hanging_sign_rot_2.json | 7 - .../block/blaze_hanging_sign_rot_3.json | 7 - .../ww_hfas/models/block/blaze_log.json | 7 - .../models/block/blaze_log_horizontal.json | 7 - .../models/block/blaze_sign_rot_0.json | 7 - .../models/block/blaze_sign_rot_1.json | 7 - .../models/block/blaze_sign_rot_2.json | 7 - .../models/block/blaze_sign_rot_3.json | 7 - .../ww_hfas/models/block/blaze_slab.json | 8 - .../ww_hfas/models/block/blaze_slab_top.json | 8 - .../ww_hfas/models/block/blaze_stairs.json | 8 - .../models/block/blaze_stairs_inner.json | 8 - .../models/block/blaze_stairs_outer.json | 8 - .../models/block/blaze_trapdoor_bottom.json | 6 - .../models/block/blaze_trapdoor_open.json | 6 - .../models/block/blaze_trapdoor_top.json | 6 - .../models/block/blaze_wall_hanging_sign.json | 7 - .../ww_hfas/models/block/blaze_wall_sign.json | 7 - .../ww_hfas/models/block/blaze_wood.json | 7 - .../ww_hfas/models/block/fletching_table.json | 6 - .../models/block/scorched_grass_block.json | 6 - .../models/block/soul_door_bottom_left.json | 7 - .../block/soul_door_bottom_left_open.json | 7 - .../models/block/soul_door_bottom_right.json | 7 - .../block/soul_door_bottom_right_open.json | 7 - .../models/block/soul_door_top_left.json | 7 - .../models/block/soul_door_top_left_open.json | 7 - .../models/block/soul_door_top_right.json | 7 - .../block/soul_door_top_right_open.json | 7 - .../soul_hanging_sign_attached_rot_0.json | 7 - .../soul_hanging_sign_attached_rot_1.json | 7 - .../soul_hanging_sign_attached_rot_2.json | 7 - .../soul_hanging_sign_attached_rot_3.json | 7 - .../models/block/soul_hanging_sign_rot_0.json | 7 - .../models/block/soul_hanging_sign_rot_1.json | 7 - .../models/block/soul_hanging_sign_rot_2.json | 7 - .../models/block/soul_hanging_sign_rot_3.json | 7 - .../assets/ww_hfas/models/block/soul_log.json | 7 - .../models/block/soul_log_horizontal.json | 7 - .../ww_hfas/models/block/soul_sign_rot_0.json | 7 - .../ww_hfas/models/block/soul_sign_rot_1.json | 7 - .../ww_hfas/models/block/soul_sign_rot_2.json | 7 - .../ww_hfas/models/block/soul_sign_rot_3.json | 7 - .../ww_hfas/models/block/soul_slab.json | 8 - .../ww_hfas/models/block/soul_slab_top.json | 8 - .../ww_hfas/models/block/soul_stairs.json | 8 - .../models/block/soul_stairs_inner.json | 8 - .../models/block/soul_stairs_outer.json | 8 - .../models/block/soul_trapdoor_bottom.json | 6 - .../models/block/soul_trapdoor_open.json | 6 - .../models/block/soul_trapdoor_top.json | 6 - .../models/block/soul_wall_hanging_sign.json | 7 - .../ww_hfas/models/block/soul_wall_sign.json | 7 - .../ww_hfas/models/block/soul_wood.json | 7 - .../models/block/stripped_azalea_log.json | 7 - .../block/stripped_azalea_log_horizontal.json | 7 - .../models/block/stripped_azalea_wood.json | 7 - .../models/block/stripped_blaze_log.json | 7 - .../block/stripped_blaze_log_horizontal.json | 7 - .../models/block/stripped_blaze_wood.json | 7 - .../models/block/stripped_soul_log.json | 7 - .../block/stripped_soul_log_horizontal.json | 7 - .../models/block/stripped_soul_wood.json | 7 - .../ww_hfas/models/item/azalea_door.json | 6 - .../models/item/azalea_hanging_sign.json | 6 - .../ww_hfas/models/item/azalea_sign.json | 6 - .../ww_hfas/models/item/blaze_door.json | 6 - .../assets/ww_hfas/models/item/soul_door.json | 6 - .../data/c/tags/block/fence_gates/wooden.json | 7 - .../resources/data/c/tags/block/fences.json | 7 - .../data/c/tags/block/fences/wooden.json | 7 - .../data/c/tags/block/stripped_logs.json | 7 - .../data/c/tags/block/stripped_woods.json | 7 - .../data/c/tags/item/fence_gates/wooden.json | 7 - .../data/c/tags/item/fences/wooden.json | 7 - .../data/c/tags/item/stripped_logs.json | 7 - .../data/c/tags/item/stripped_woods.json | 7 - .../tags/block/all_hanging_signs.json | 28 -- .../data/minecraft/tags/block/all_signs.json | 28 -- .../tags/block/ceiling_hanging_signs.json | 5 - .../data/minecraft/tags/block/dirt.json | 6 - .../data/minecraft/tags/block/doors.json | 7 - .../minecraft/tags/block/fence_gates.json | 7 - .../data/minecraft/tags/block/fences.json | 7 - .../data/minecraft/tags/block/leaves.json | 6 - .../data/minecraft/tags/block/logs.json | 16 - .../minecraft/tags/block/logs_that_burn.json | 16 - .../minecraft/tags/block/mineable/axe.json | 49 --- .../tags/block/mineable/pickaxe.json | 5 - .../tags/block/overworld_natural_logs.json | 6 - .../data/minecraft/tags/block/planks.json | 7 - .../data/minecraft/tags/block/saplings.json | 6 - .../minecraft/tags/block/standing_signs.json | 5 - .../data/minecraft/tags/block/trapdoors.json | 7 - .../tags/block/wall_hanging_signs.json | 5 - .../data/minecraft/tags/block/wall_signs.json | 5 - .../minecraft/tags/block/wooden_buttons.json | 7 - .../minecraft/tags/block/wooden_doors.json | 7 - .../minecraft/tags/block/wooden_fences.json | 7 - .../tags/block/wooden_pressure_plates.json | 7 - .../minecraft/tags/block/wooden_shelves.json | 5 - .../minecraft/tags/block/wooden_slabs.json | 7 - .../minecraft/tags/block/wooden_stairs.json | 7 - .../tags/block/wooden_trapdoors.json | 7 - .../entity_type/can_breathe_under_water.json | 6 - .../data/minecraft/tags/item/arrows.json | 5 - .../data/minecraft/tags/item/boats.json | 16 - .../data/minecraft/tags/item/buttons.json | 7 - .../data/minecraft/tags/item/chest_boats.json | 16 - .../data/minecraft/tags/item/doors.json | 7 - .../data/minecraft/tags/item/fence_gates.json | 7 - .../minecraft/tags/item/hanging_signs.json | 5 - .../data/minecraft/tags/item/leaves.json | 6 - .../data/minecraft/tags/item/logs.json | 16 - .../minecraft/tags/item/logs_that_burn.json | 16 - .../data/minecraft/tags/item/planks.json | 7 - .../data/minecraft/tags/item/saplings.json | 6 - .../data/minecraft/tags/item/signs.json | 5 - .../data/minecraft/tags/item/trapdoors.json | 7 - .../minecraft/tags/item/wooden_buttons.json | 7 - .../minecraft/tags/item/wooden_doors.json | 7 - .../minecraft/tags/item/wooden_fences.json | 7 - .../tags/item/wooden_pressure_plates.json | 7 - .../minecraft/tags/item/wooden_shelves.json | 5 - .../minecraft/tags/item/wooden_slabs.json | 7 - .../minecraft/tags/item/wooden_stairs.json | 7 - .../minecraft/tags/item/wooden_trapdoors.json | 7 - .../data/minecraft/tags/potion/tradeable.json | 7 - .../neoforge/data_maps/block/strippables.json | 22 -- .../decorations/blaze_hanging_sign.json | 32 -- .../recipes/decorations/blaze_sign.json | 32 -- .../decorations/soul_hanging_sign.json | 32 -- .../recipes/decorations/soul_sign.json | 32 -- .../recipes/transportation/azalea_boat.json | 32 -- .../transportation/azalea_chest_boat.json | 32 -- .../recipes/transportation/blaze_boat.json | 32 -- .../transportation/blaze_chest_boat.json | 32 -- .../recipes/transportation/soul_boat.json | 32 -- .../transportation/soul_chest_boat.json | 32 -- .../loot_table/blocks/blaze_hanging_sign.json | 20 -- .../ww_hfas/loot_table/blocks/blaze_sign.json | 20 -- .../blocks/blaze_wall_hanging_sign.json | 20 -- .../loot_table/blocks/blaze_wall_sign.json | 20 -- .../loot_table/blocks/fletching_table.json | 20 -- .../blocks/potted_blaze_sapling.json | 34 --- .../blocks/potted_soul_sapling.json | 34 --- .../loot_table/blocks/soul_hanging_sign.json | 20 -- .../ww_hfas/loot_table/blocks/soul_sign.json | 20 -- .../blocks/soul_wall_hanging_sign.json | 20 -- .../loot_table/blocks/soul_wall_sign.json | 20 -- .../data/ww_hfas/recipe/azalea_boat.json | 14 - .../ww_hfas/recipe/azalea_chest_boat.json | 11 - .../data/ww_hfas/recipe/blaze_boat.json | 14 - .../data/ww_hfas/recipe/blaze_chest_boat.json | 11 - .../ww_hfas/recipe/blaze_hanging_sign.json | 17 -- .../data/ww_hfas/recipe/blaze_sign.json | 17 -- .../data/ww_hfas/recipe/soul_boat.json | 14 - .../data/ww_hfas/recipe/soul_chest_boat.json | 11 - .../ww_hfas/recipe/soul_hanging_sign.json | 17 -- .../data/ww_hfas/recipe/soul_sign.json | 17 -- .../data/ww_hfas/recipe/wool_to_string.json | 3 - .../data/ww_hfas/tags/block/azalea_logs.json | 8 - .../data/ww_hfas/tags/block/blaze_logs.json | 8 - .../data/ww_hfas/tags/block/soul_logs.json | 8 - .../data/ww_hfas/tags/item/azalea_logs.json | 8 - .../data/ww_hfas/tags/item/blaze_logs.json | 8 - .../data/ww_hfas/tags/item/soul_logs.json | 8 - .../placed_feature/blaze_tree_placed.json | 4 - .../placed_feature/soul_tree_placed.json | 4 - .../smoke/ClientInstallationTests.java | 37 +++ .../wildwind/smoke/InstallationTests.java | 53 ++++ .../data/wild_wind_smoke}/structure/empty.nbt | Bin .../test_instance/installation.json | 7 + src/templates/META-INF/neoforge.mods.toml | 124 ++------ .../ww_structures/definitions/blocked.json | 0 .../ww_structures/definitions/disabled.json | 0 .../ww_structures/definitions/smoke.json | 0 .../ww_structures/templates/wide_ruins.nbt | Bin .../hfas/test/AzaleaAndArrowGameTests.java | 50 ++- .../hfas/test/FluidEntityRulesGameTests.java | 8 +- .../wildwind/hfas/test/GameplayGameTests.java | 10 +- .../wildwind/hfas/test/KilnGameTests.java | 27 +- .../wildwind/hfas/test/MuddyPigGameTests.java | 10 +- .../test/SkeletonAndFarmlandGameTests.java | 20 +- .../test/UpstreamIntegrationGameTests.java | 22 +- .../structures/test/StructureGameTests.java | 8 +- .../test/mixin/GameTestServerMixin.java | 0 .../minecraft/worldgen/world_preset/flat.json | 0 .../data/wild_wind_tests/structure/empty.nbt | Bin 0 -> 113 bytes .../test_instance/azalea_shelf.json | 4 +- .../test_instance/azalea_shelf_chain.json | 4 +- .../test_instance/azalea_signs.json | 4 +- .../test_instance/cobweb_tick_event.json | 4 +- .../test_instance/cobweb_timers.json | 4 +- .../test_instance/crafter_shears.json | 4 +- .../test_instance/creative_tab.json | 4 +- .../test_instance/entity.json | 4 +- .../test_instance/farmland_protection.json | 4 +- .../test_instance/fluid_effects.json | 4 +- .../test_instance/fluid_entity_rules.json | 4 +- .../test_instance/generation.json | 2 +- .../wild_wind_tests}/test_instance/kiln.json | 4 +- .../test_instance/kiln_inventory.json | 4 +- .../test_instance/kiln_villages.json | 4 +- .../test_instance/land_choke.json | 4 +- .../test_instance/melting.json | 4 +- .../reach_arrow_acquisition.json | 7 + .../test_instance/reach_arrows.json | 4 +- .../test_instance/skeleton_melee.json | 4 +- .../test_instance/skeleton_spawns.json | 4 +- .../test_instance/spawning.json | 4 +- .../test_instance/upstream_integration.json | 7 + .../test_instance/wool_recipe.json | 4 +- .../resources/wild_wind_tests.mixins.json} | 0 .../wildwind/wilderness/WildernessMod.java | 29 ++ .../wilderness}/arrow/ReachArrows.java | 7 +- .../wildwind/wilderness}/block/ModBlocks.java | 265 +--------------- .../wilderness}/client/ModClientHooks.java | 18 +- .../client/ModEntityRenderers.java | 8 +- .../wilderness}/client/MuddyPigModel.java | 2 +- .../wilderness}/client/MuddyPigRenderer.java | 10 +- .../client/entity/model/MudcrabModel.java | 10 +- .../client/entity/model/PiranhaModel.java | 12 +- .../entity/renderer/MudcrabRenderer.java | 8 +- .../entity/renderer/PiranhaRenderer.java | 10 +- .../renderstate/MudcrabRenderState.java | 6 +- .../renderstate/PiranhaRenderState.java | 4 +- .../eventsub/EntitiesClientHandler.java | 10 +- .../client/tooltip/ClientOmniClawTooltip.java | 6 +- .../wilderness}/component/OmniClawTools.java | 4 +- .../wilderness}/effect/FluidEffects.java | 8 +- .../wilderness}/effect/ModEffects.java | 6 +- .../wilderness}/effect/WildWindMobEffect.java | 4 +- .../wilderness}/entity/ModEntityTypeTags.java | 6 +- .../entity/ModSpawnPlacementTypes.java | 2 +- .../wildwind/wilderness}/entity/MuddyPig.java | 8 +- .../wilderness}/entity/ReachArrow.java | 8 +- .../wilderness}/entity/WindupAttackMob.java | 2 +- ...lertOthersNearestAttackableTargetGoal.java | 4 +- .../ai/goal/ChargingMeleeAttackGoal.java | 4 +- .../wilderness}/entity/animal/Mudcrab.java | 18 +- .../entity/animal/MudcrabVariant.java | 14 +- .../wilderness}/entity/animal/Piranha.java | 15 +- .../event/AzaleaAndArrowEvents.java | 17 +- .../wilderness/event/CreativeContents.java | 27 ++ .../wilderness}/event/EntitiesHandler.java | 10 +- .../wilderness/event/FuelHandler.java | 71 +++++ .../wildwind/wilderness}/item/ModFoods.java | 2 +- .../wilderness}/item/OmniClawItem.java | 18 +- .../wilderness}/item/ReachArrowItem.java | 6 +- .../mixin/AbstractArrowAccessor.java | 2 +- .../mixin/EnchantmentHelperMixin.java | 6 +- .../mixin/EntityFluidMovementMixin.java | 4 +- .../mixin/IronGolemAirSupplyMixin.java | 6 +- .../wilderness}/mixin/ItemStackMixin.java | 10 +- .../mixin/LootPoolEntriesAccessor.java | 2 +- .../mixin/LootTablePoolsAccessor.java | 2 +- .../wildwind/wilderness}/mixin/MobMixin.java | 11 +- .../wilderness}/mixin/PlayerMixin.java | 6 +- .../mixin/ReachArrowCraftingMixin.java | 4 +- .../mixin/ReachArrowLootMixin.java | 4 +- .../mixin/ServerPlayerGameModeMixin.java | 6 +- .../mixin/WaterAnimalAirSupplyMixin.java | 4 +- .../wilderness}/network/HFASNetwork.java | 10 +- .../ServerBoundSelectOmniClawItemPayload.java | 12 +- .../registry/DatadrivenRegistryKey.java | 8 +- .../wilderness}/registry/ModAttributes.java | 12 +- .../registry/ModDataComponents.java | 16 +- .../wilderness}/registry/ModEntities.java | 20 +- .../registry/ModEntityDataSerializers.java | 8 +- .../wilderness}/registry/ModItems.java | 45 +-- .../wilderness}/registry/ModMobEffects.java | 18 +- .../wilderness}/registry/ModPotions.java | 12 +- .../wilderness}/registry/ModSoundEvents.java | 8 +- .../wilderness}/tag/ModBiomeTags.java | 6 +- .../wilderness}/tag/ModBlockTags.java | 12 +- .../wildwind/wilderness}/tag/ModItemTags.java | 6 +- .../wilderness/worldgen/ModTreeGrowers.java | 10 + .../resources/META-INF/accesstransformer.cfg | 0 .../blockstates/blaze_button.json | 50 +-- .../blockstates/blaze_door.json | 66 ++-- .../blockstates/blaze_fence.json | 12 +- .../blockstates/blaze_fence_gate.json | 34 +-- .../blockstates/blaze_leaves.json | 7 + .../blockstates/blaze_log.json | 16 + .../blockstates/blaze_planks.json | 7 + .../blockstates/blaze_pressure_plate.json | 10 + .../blockstates/blaze_sapling.json | 7 + .../blockstates/blaze_slab.json | 13 + .../blockstates/blaze_stairs.json | 82 ++--- .../blockstates/blaze_trapdoor.json | 58 ++++ .../blockstates/blaze_wood.json | 16 + .../blockstates/scorched_dirt.json | 7 + .../blockstates/scorched_grass.json | 7 + .../blockstates/scorched_grass_block.json | 7 + .../blockstates/scorched_twig.json | 7 + .../blockstates/soul_button.json | 50 +-- .../blockstates/soul_door.json | 66 ++-- .../blockstates/soul_fence.json | 12 +- .../blockstates/soul_fence_gate.json | 34 +-- .../blockstates/soul_leaves.json | 7 + .../blockstates/soul_log.json | 16 + .../blockstates/soul_planks.json | 7 + .../blockstates/soul_pressure_plate.json | 10 + .../blockstates/soul_sapling.json | 7 + .../blockstates/soul_slab.json | 13 + .../blockstates/soul_stairs.json | 82 ++--- .../blockstates/soul_trapdoor.json | 58 ++++ .../blockstates/soul_wood.json | 16 + .../blockstates/stripped_blaze_log.json | 16 + .../blockstates/stripped_blaze_wood.json | 16 + .../blockstates/stripped_soul_log.json | 16 + .../blockstates/stripped_soul_wood.json | 16 + .../animations/entity/mudcrab.animation.json | 0 .../animations/entity/piranha.animation.json | 0 .../geckolib/models/entity/mudcrab.geo.json | 0 .../geckolib/models/entity/piranha.geo.json | 0 .../items/blaze_boat.json | 6 + .../items/blaze_button.json | 6 + .../items/blaze_chest_boat.json | 6 + .../items/blaze_door.json | 6 + .../items/blaze_fence.json | 6 + .../items/blaze_fence_gate.json | 6 + .../items/blaze_hanging_sign.json | 6 + .../items/blaze_leaves.json | 4 +- .../wild_wind_wilderness/items/blaze_log.json | 6 + .../items/blaze_planks.json | 6 + .../items/blaze_pressure_plate.json | 6 + .../items/blaze_sapling.json | 6 + .../items/blaze_sign.json | 6 + .../items/blaze_slab.json | 6 + .../items/blaze_stairs.json | 6 + .../items/blaze_trapdoor.json | 6 + .../items/blaze_wood.json | 6 + .../items/cooked_piranha.json | 6 + .../wild_wind_wilderness/items/crab_claw.json | 6 + .../wild_wind_wilderness/items/fang.json} | 2 +- .../items/mudcrab_bucket.json | 6 + .../items/mudcrab_spawn_egg.json | 6 + .../items/muddy_pig_spawn_egg.json | 0 .../wild_wind_wilderness/items/omni_claw.json | 6 + .../wild_wind_wilderness/items/piranha.json | 6 + .../items/piranha_bucket.json | 6 + .../items/piranha_spawn_egg.json | 6 + .../items/scorched_dirt.json | 6 + .../items/scorched_grass.json | 6 + .../items/scorched_grass_block.json | 6 + .../items/scorched_twig.json | 6 + .../items/soul_boat.json | 2 +- .../items/soul_button.json | 6 + .../items/soul_chest_boat.json | 6 + .../wild_wind_wilderness/items/soul_door.json | 6 + .../items/soul_fence.json | 6 + .../items/soul_fence_gate.json | 6 + .../items/soul_hanging_sign.json | 6 + .../items/soul_leaves.json | 4 +- .../wild_wind_wilderness/items/soul_log.json | 6 + .../items/soul_planks.json | 6 + .../items/soul_pressure_plate.json | 6 + .../items/soul_sapling.json | 6 + .../items/soul_sign.json | 2 +- .../wild_wind_wilderness/items/soul_slab.json | 6 + .../items/soul_stairs.json | 6 + .../items/soul_trapdoor.json | 6 + .../wild_wind_wilderness/items/soul_wood.json | 6 + .../items/stripped_blaze_log.json | 6 + .../items/stripped_blaze_wood.json | 6 + .../items/stripped_soul_log.json | 6 + .../items/stripped_soul_wood.json | 6 + .../items/tipped_arrow.json | 2 +- .../wild_wind_wilderness/lang/en_us.json | 68 +++++ .../wild_wind_wilderness/lang/zh_cn.json | 68 +++++ .../models/block/blaze_button.json | 4 +- .../models/block/blaze_button_inventory.json | 4 +- .../models/block/blaze_button_pressed.json | 4 +- .../models/block/blaze_door_bottom_left.json | 7 + .../block/blaze_door_bottom_left_open.json | 7 + .../models/block/blaze_door_bottom_right.json | 7 + .../block/blaze_door_bottom_right_open.json | 7 + .../models/block/blaze_door_top_left.json | 7 + .../block/blaze_door_top_left_open.json | 7 + .../models/block/blaze_door_top_right.json | 7 + .../block/blaze_door_top_right_open.json | 7 + .../models/block/blaze_fence_gate.json | 4 +- .../models/block/blaze_fence_gate_open.json | 4 +- .../models/block/blaze_fence_gate_wall.json | 4 +- .../block/blaze_fence_gate_wall_open.json | 4 +- .../models/block/blaze_fence_inventory.json | 4 +- .../models/block/blaze_fence_post.json | 4 +- .../models/block/blaze_fence_side.json | 4 +- .../blaze_hanging_sign_attached_rot_0.json | 7 + .../blaze_hanging_sign_attached_rot_1.json | 7 + .../blaze_hanging_sign_attached_rot_2.json | 7 + .../blaze_hanging_sign_attached_rot_3.json | 7 + .../block/blaze_hanging_sign_rot_0.json | 7 + .../block/blaze_hanging_sign_rot_1.json | 7 + .../block/blaze_hanging_sign_rot_2.json | 7 + .../block/blaze_hanging_sign_rot_3.json | 7 + .../models/block/blaze_leaves.json | 4 +- .../models/block/blaze_log.json | 7 + .../models/block/blaze_log_horizontal.json | 7 + .../models/block/blaze_planks.json | 4 +- .../models/block/blaze_pressure_plate.json | 4 +- .../block/blaze_pressure_plate_down.json | 4 +- .../models/block/blaze_sapling.json | 4 +- .../models/block/blaze_sign_rot_0.json | 7 + .../models/block/blaze_sign_rot_1.json | 7 + .../models/block/blaze_sign_rot_2.json | 7 + .../models/block/blaze_sign_rot_3.json | 7 + .../models/block/blaze_slab.json | 8 + .../models/block/blaze_slab_top.json | 8 + .../models/block/blaze_stairs.json | 8 + .../models/block/blaze_stairs_inner.json | 8 + .../models/block/blaze_stairs_outer.json | 8 + .../models/block/blaze_trapdoor_bottom.json | 6 + .../models/block/blaze_trapdoor_open.json | 6 + .../models/block/blaze_trapdoor_top.json | 6 + .../models/block/blaze_wall_hanging_sign.json | 7 + .../models/block/blaze_wall_sign.json | 7 + .../models/block/blaze_wood.json | 7 + .../models/block/potted_blaze_sapling.json | 2 +- .../models/block/potted_soul_sapling.json | 2 +- .../models/block/scorched_dirt.json | 4 +- .../models/block/scorched_grass.json | 4 +- .../models/block/scorched_grass_block.json | 6 + .../models/block/scorched_twig.json | 4 +- .../models/block/soul_button.json | 4 +- .../models/block/soul_button_inventory.json | 4 +- .../models/block/soul_button_pressed.json | 4 +- .../models/block/soul_door_bottom_left.json | 7 + .../block/soul_door_bottom_left_open.json | 7 + .../models/block/soul_door_bottom_right.json | 7 + .../block/soul_door_bottom_right_open.json | 7 + .../models/block/soul_door_top_left.json | 7 + .../models/block/soul_door_top_left_open.json | 7 + .../models/block/soul_door_top_right.json | 7 + .../block/soul_door_top_right_open.json | 7 + .../models/block/soul_fence_gate.json | 4 +- .../models/block/soul_fence_gate_open.json | 4 +- .../models/block/soul_fence_gate_wall.json | 4 +- .../block/soul_fence_gate_wall_open.json | 4 +- .../models/block/soul_fence_inventory.json | 4 +- .../models/block/soul_fence_post.json | 4 +- .../models/block/soul_fence_side.json | 4 +- .../soul_hanging_sign_attached_rot_0.json | 7 + .../soul_hanging_sign_attached_rot_1.json | 7 + .../soul_hanging_sign_attached_rot_2.json | 7 + .../soul_hanging_sign_attached_rot_3.json | 7 + .../models/block/soul_hanging_sign_rot_0.json | 7 + .../models/block/soul_hanging_sign_rot_1.json | 7 + .../models/block/soul_hanging_sign_rot_2.json | 7 + .../models/block/soul_hanging_sign_rot_3.json | 7 + .../models/block/soul_leaves.json | 4 +- .../models/block/soul_log.json | 7 + .../models/block/soul_log_horizontal.json | 7 + .../models/block/soul_planks.json | 4 +- .../models/block/soul_pressure_plate.json | 4 +- .../block/soul_pressure_plate_down.json | 4 +- .../models/block/soul_sapling.json | 4 +- .../models/block/soul_sign_rot_0.json | 7 + .../models/block/soul_sign_rot_1.json | 7 + .../models/block/soul_sign_rot_2.json | 7 + .../models/block/soul_sign_rot_3.json | 7 + .../models/block/soul_slab.json | 8 + .../models/block/soul_slab_top.json | 8 + .../models/block/soul_stairs.json | 8 + .../models/block/soul_stairs_inner.json | 8 + .../models/block/soul_stairs_outer.json | 8 + .../models/block/soul_trapdoor_bottom.json | 6 + .../models/block/soul_trapdoor_open.json | 6 + .../models/block/soul_trapdoor_top.json | 6 + .../models/block/soul_wall_hanging_sign.json | 7 + .../models/block/soul_wall_sign.json | 7 + .../models/block/soul_wood.json | 7 + .../models/block/stripped_blaze_log.json | 7 + .../block/stripped_blaze_log_horizontal.json | 7 + .../models/block/stripped_blaze_wood.json | 7 + .../models/block/stripped_soul_log.json | 7 + .../block/stripped_soul_log_horizontal.json | 7 + .../models/block/stripped_soul_wood.json | 7 + .../models/entity/pig/pig_muddy.bbmodel | 0 .../models/entity/pig/pig_muddy_baby.bbmodel | 0 .../models/item/blaze_boat.json | 2 +- .../models/item/blaze_chest_boat.json | 2 +- .../models/item/blaze_door.json | 6 + .../models/item/blaze_hanging_sign.json | 2 +- .../models/item/blaze_sapling.json | 2 +- .../models/item/blaze_sign.json | 2 +- .../models/item/cooked_piranha.json | 6 + .../models/item/crab_claw.json | 6 + .../models/item/fang.json} | 2 +- .../models/item/mudcrab_bucket.json | 6 + .../models/item/mudcrab_spawn_egg.json | 6 + .../models/item/omni_claw.json | 4 +- .../models/item/piranha.json | 6 + .../models/item/piranha_bucket.json | 6 + .../models/item/piranha_spawn_egg.json | 6 + .../models/item/soul_boat.json | 2 +- .../models/item/soul_chest_boat.json | 2 +- .../models/item/soul_door.json | 6 + .../models/item/soul_hanging_sign.json | 2 +- .../models/item/soul_sapling.json | 2 +- .../models/item/soul_sign.json | 2 +- .../assets/wild_wind_wilderness}/sounds.json | 8 +- .../sounds/entity_piranha_attack_1.ogg | Bin .../sounds/entity_piranha_attack_2.ogg | Bin .../sounds/entity_piranha_attack_3.ogg | Bin .../sounds/entity_piranha_death.ogg | Bin .../textures/block/blaze_door_bottom.png | Bin .../textures/block/blaze_door_top.png | Bin .../textures/block/blaze_leaves.png | Bin .../textures/block/blaze_log.png | Bin .../textures/block/blaze_log.png.mcmeta | 0 .../textures/block/blaze_log_top.png | Bin .../textures/block/blaze_log_top.png.mcmeta | 0 .../textures/block/blaze_planks.png | Bin .../textures/block/blaze_sapling.png | Bin .../textures/block/blaze_trapdoor.png | Bin .../textures/block/cinder_door_bottom.png | Bin .../textures/block/cinder_door_top.png | Bin .../textures/block/cinder_leaves.png | Bin .../textures/block/cinder_log.png | Bin .../textures/block/cinder_log.png.mcmeta | 0 .../textures/block/cinder_log_top.png | Bin .../textures/block/cinder_log_top.png.mcmeta | 0 .../textures/block/cinder_planks.png | Bin .../textures/block/cinder_sapling.png | Bin .../textures/block/cinder_trapdoor.png | Bin .../textures/block/ember_door_bottom.png | Bin .../textures/block/ember_door_top.png | Bin .../textures/block/ember_leaves.png | Bin .../textures/block/ember_log.png | Bin .../textures/block/ember_log.png.mcmeta | 0 .../textures/block/ember_log_top.png | Bin .../textures/block/ember_log_top.png.mcmeta | 0 .../textures/block/ember_planks.png | Bin .../textures/block/ember_sapling.png | Bin .../textures/block/ember_trapdoor.png | Bin .../textures/block/scorched_dirt.png | Bin .../textures/block/scorched_grass.png | Bin .../block/scorched_grass_block_side.png | Bin .../block/scorched_grass_block_top.png | Bin .../textures/block/scorched_twig.png | Bin .../textures/block/scorched_twig_wall.png | Bin .../textures/block/soul_door_bottom.png | Bin .../textures/block/soul_door_top.png | Bin .../textures/block/soul_leaves.png | Bin .../textures/block/soul_log.png | Bin .../textures/block/soul_log.png.mcmeta | 0 .../textures/block/soul_log_top.png | Bin .../textures/block/soul_log_top.png.mcmeta | 0 .../textures/block/soul_planks.png | Bin .../textures/block/soul_sapling.png | Bin .../textures/block/soul_trapdoor.png | Bin .../textures/block/stripped_blaze_log.png | Bin .../textures/block/stripped_blaze_log_top.png | Bin .../textures/block/stripped_cinder_log.png | Bin .../block/stripped_cinder_log_top.png | Bin .../textures/block/stripped_ember_log.png | Bin .../textures/block/stripped_ember_log_top.png | Bin .../textures/block/stripped_soul_log.png | Bin .../textures/block/stripped_soul_log_top.png | Bin .../textures/entity/boat/cinder.png | Bin .../textures/entity/boat/cinder_boat.png | Bin .../textures/entity/boat/ember.png | Bin .../textures/entity/boat/ember_boat.png | Bin .../textures/entity/chest_boat/cinder.png | Bin .../entity/chest_boat/cinder_chest_boat.png | Bin .../textures/entity/chest_boat/ember.png | Bin .../entity/chest_boat/ember_chest_boat.png | Bin .../textures/entity/mudcrab/cold.png | Bin .../textures/entity/mudcrab/temperate.png | Bin .../textures/entity/mudcrab/warm.png | Bin .../textures/entity/pig/pig_muddy.png | Bin .../textures/entity/pig/pig_muddy_baby.png | Bin .../textures/entity/piranha.png | Bin .../textures/entity/signs/cinder.png | Bin .../textures/entity/signs/cinder_sign.png | Bin .../textures/entity/signs/ember.png | Bin .../textures/entity/signs/ember_sign.png | Bin .../textures/entity/signs/hanging/cinder.png | Bin .../signs/hanging/cinder_hanging_sign.png | Bin .../textures/entity/signs/hanging/ember.png | Bin .../signs/hanging/ember_hanging_sign.png | Bin .../textures/gui/hanging_signs/cinder.png | Bin .../textures/gui/hanging_signs/ember.png | Bin .../textures/item/blaze_door.png | Bin .../textures/item/cinder_boat.png | Bin .../textures/item/cinder_chest_boat.png | Bin .../textures/item/cinder_door.png | Bin .../textures/item/cinder_hanging_sign.png | Bin .../textures/item/cinder_sign.png | Bin .../textures/item/cooked_piranha.png | Bin .../textures/item/crab_claw.png | Bin .../textures/item/ember_boat.png | Bin .../textures/item/ember_chest_boat.png | Bin .../textures/item/ember_door.png | Bin .../textures/item/ember_hanging_sign.png | Bin .../textures/item/ember_sign.png | Bin .../textures/item/fang.png | Bin .../textures/item/mudcrab_bucket.png | Bin .../textures/item/mudcrab_spawn_egg.png | Bin .../textures/item/omni_claw.png | Bin .../textures/item/piranha.png | Bin .../textures/item/piranha_bucket.png | Bin .../textures/item/piranha_spawn_egg.png | Bin .../textures/item/soul_door.png | Bin .../textures/mob_effect/choke.png | Bin .../textures/mob_effect/sink.png | Bin .../textures/screens/cinder_hanging_sign.png | Bin .../textures/screens/ember_hanging_sign.png | Bin .../data/c/tags/block/fence_gates/wooden.json | 6 + .../resources/data/c/tags/block/fences.json | 6 + .../data/c/tags/block/fences/wooden.json | 6 + .../data/c/tags/block/stripped_logs.json | 6 + .../data/c/tags/block/stripped_woods.json | 6 + .../data/c/tags/item/animal_foods.json | 5 + .../data/c/tags/item/fence_gates/wooden.json | 6 + .../data/c/tags/item/fences/wooden.json | 6 + .../data/c/tags/item/foods/cooked_fish.json | 5 + .../data/c/tags/item/stripped_logs.json | 6 + .../data/c/tags/item/stripped_woods.json | 6 + .../tags/block/all_hanging_signs.json | 20 ++ .../data/minecraft/tags/block/all_signs.json | 20 ++ .../data/minecraft/tags/block/dirt.json | 6 + .../data/minecraft/tags/block/doors.json | 6 + .../minecraft/tags/block/fence_gates.json | 6 + .../data/minecraft/tags/block/fences.json | 6 + .../minecraft/tags/block/flower_pots.json | 12 + .../data/minecraft/tags/block/leaves.json | 6 + .../data/minecraft/tags/block/logs.json | 12 + .../minecraft/tags/block/logs_that_burn.json | 12 + .../minecraft/tags/block/mineable/axe.json | 30 ++ .../tags/block/needs_stone_tool.json | 30 ++ .../tags/block/overworld_natural_logs.json | 6 + .../data/minecraft/tags/block/planks.json | 6 + .../data/minecraft/tags/block/saplings.json | 6 + .../data/minecraft/tags/block/trapdoors.json | 6 + .../minecraft/tags/block/wooden_buttons.json | 6 + .../minecraft/tags/block/wooden_doors.json | 6 + .../minecraft/tags/block/wooden_fences.json | 6 + .../tags/block/wooden_pressure_plates.json | 6 + .../minecraft/tags/block/wooden_slabs.json | 6 + .../minecraft/tags/block/wooden_stairs.json | 6 + .../tags/block/wooden_trapdoors.json | 6 + .../minecraft/tags/entity_type/aquatic.json | 6 + .../minecraft/tags/entity_type/arrows.json | 2 +- .../entity_type/axolotl_hunt_targets.json | 5 + .../entity_type/can_breathe_under_water.json | 10 + .../tags/entity_type/can_equip_saddle.json | 2 +- .../entity_type/not_scary_for_pufferfish.json | 6 + .../data/minecraft/tags/item/arrows.json | 5 + .../data/minecraft/tags/item/boats.json | 12 + .../data/minecraft/tags/item/buttons.json | 6 + .../data/minecraft/tags/item/cat_food.json | 5 + .../data/minecraft/tags/item/chest_boats.json | 12 + .../data/minecraft/tags/item/doors.json | 6 + .../data/minecraft/tags/item/fence_gates.json | 6 + .../data/minecraft/tags/item/fishes.json | 6 + .../data/minecraft/tags/item/leaves.json | 6 + .../data/minecraft/tags/item/logs.json | 12 + .../minecraft/tags/item/logs_that_burn.json | 12 + .../data/minecraft/tags/item/ocelot_food.json | 5 + .../data/minecraft/tags/item/planks.json | 6 + .../data/minecraft/tags/item/saplings.json | 6 + .../data/minecraft/tags/item/trapdoors.json | 6 + .../data/minecraft/tags/item/wolf_food.json | 6 + .../minecraft/tags/item/wooden_buttons.json | 6 + .../minecraft/tags/item/wooden_doors.json | 6 + .../minecraft/tags/item/wooden_fences.json | 6 + .../tags/item/wooden_pressure_plates.json | 6 + .../minecraft/tags/item/wooden_slabs.json | 6 + .../minecraft/tags/item/wooden_stairs.json | 6 + .../minecraft/tags/item/wooden_trapdoors.json | 6 + .../data/minecraft/tags/potion/tradeable.json | 7 + .../entity_variant/mudcrab/cold.json | 12 + .../entity_variant/mudcrab/temperate.json | 8 + .../entity_variant/mudcrab/warm.json | 12 + .../neoforge/data_maps/block/strippables.json | 16 + .../recipes/building_blocks/blaze_planks.json | 6 +- .../recipes/building_blocks/blaze_slab.json | 6 +- .../recipes/building_blocks/blaze_stairs.json | 6 +- .../recipes/building_blocks/blaze_wood.json | 6 +- .../recipes/building_blocks/soul_planks.json | 6 +- .../recipes/building_blocks/soul_slab.json | 6 +- .../recipes/building_blocks/soul_stairs.json | 6 +- .../recipes/building_blocks/soul_wood.json | 6 +- .../recipes/decorations/blaze_fence.json | 6 +- .../recipes/decorations/soul_fence.json | 6 +- .../recipes/food/cooked_piranha.json | 32 ++ .../recipes/redstone/blaze_button.json | 6 +- .../recipes/redstone/blaze_door.json | 6 +- .../recipes/redstone/blaze_fence_gate.json | 6 +- .../redstone/blaze_pressure_plate.json | 6 +- .../recipes/redstone/blaze_trapdoor.json | 6 +- .../recipes/redstone/soul_button.json | 6 +- .../recipes/redstone/soul_door.json | 6 +- .../recipes/redstone/soul_fence_gate.json | 6 +- .../recipes/redstone/soul_pressure_plate.json | 6 +- .../recipes/redstone/soul_trapdoor.json | 6 +- .../advancement/recipes/tools/omni_claw.json | 32 ++ .../loot_table/blocks/blaze_button.json | 6 +- .../loot_table/blocks/blaze_door.json | 8 +- .../loot_table/blocks/blaze_fence.json | 6 +- .../loot_table/blocks/blaze_fence_gate.json | 6 +- .../loot_table/blocks/blaze_leaves.json | 8 +- .../loot_table/blocks/blaze_log.json | 6 +- .../loot_table/blocks/blaze_planks.json | 6 +- .../blocks/blaze_pressure_plate.json | 6 +- .../loot_table/blocks/blaze_sapling.json | 6 +- .../loot_table/blocks/blaze_slab.json | 6 +- .../loot_table/blocks/blaze_stairs.json | 6 +- .../loot_table/blocks/blaze_trapdoor.json | 6 +- .../loot_table/blocks/blaze_wood.json | 6 +- .../loot_table/blocks/scorched_dirt.json | 6 +- .../loot_table/blocks/scorched_grass.json | 6 +- .../blocks/scorched_grass_block.json | 6 +- .../loot_table/blocks/scorched_twig.json | 6 +- .../loot_table/blocks/soul_button.json | 6 +- .../loot_table/blocks/soul_door.json | 8 +- .../loot_table/blocks/soul_fence.json | 6 +- .../loot_table/blocks/soul_fence_gate.json | 6 +- .../loot_table/blocks/soul_leaves.json | 8 +- .../loot_table/blocks/soul_log.json | 6 +- .../loot_table/blocks/soul_planks.json | 6 +- .../blocks/soul_pressure_plate.json | 6 +- .../loot_table/blocks/soul_sapling.json | 6 +- .../loot_table/blocks/soul_slab.json | 6 +- .../loot_table/blocks/soul_stairs.json | 6 +- .../loot_table/blocks/soul_trapdoor.json | 6 +- .../loot_table/blocks/soul_wood.json | 6 +- .../loot_table/blocks/stripped_blaze_log.json | 6 +- .../blocks/stripped_blaze_wood.json | 6 +- .../loot_table/blocks/stripped_soul_log.json | 6 +- .../loot_table/blocks/stripped_soul_wood.json | 6 +- .../loot_table/entities/mudcrab.json | 4 + .../loot_table/entities/muddy_pig.json | 0 .../loot_table/entities/piranha.json | 83 +++++ .../biome_modifier/add_blaze_tree.json | 4 +- .../biome_modifier/add_mudcrab_spawns.json | 10 + .../biome_modifier/add_muddy_pig.json | 4 +- .../biome_modifier/add_piranha_spawns.json | 10 + .../biome_modifier/add_soul_tree.json | 4 +- .../recipe/blaze_button.json | 4 +- .../recipe/blaze_door.json | 4 +- .../recipe/blaze_fence.json | 4 +- .../recipe/blaze_fence_gate.json | 4 +- .../recipe/blaze_planks.json | 4 +- .../recipe/blaze_pressure_plate.json | 4 +- .../recipe/blaze_slab.json | 4 +- .../recipe/blaze_stairs.json | 4 +- .../recipe/blaze_trapdoor.json | 4 +- .../recipe/blaze_wood.json | 4 +- .../recipe/cooked_piranha.json | 9 + .../recipe/omni_claw.json | 16 + .../recipe/soul_button.json | 4 +- .../recipe/soul_door.json | 4 +- .../recipe/soul_fence.json | 4 +- .../recipe/soul_fence_gate.json | 4 +- .../recipe/soul_planks.json | 4 +- .../recipe/soul_pressure_plate.json | 4 +- .../recipe/soul_slab.json | 4 +- .../recipe/soul_stairs.json | 4 +- .../recipe/soul_trapdoor.json | 4 +- .../recipe/soul_wood.json | 4 +- .../tags/block/blaze_logs.json | 8 + .../mudcrab/preferred_wander_blocks.json | 7 + .../mudcrab/spawnable_in_water_ground.json | 10 + .../block/entity/mudcrab/spawnable_on.json | 6 + .../tags/block/muddy_pig_spawnable_on.json | 0 .../tags/block/soul_logs.json | 8 + .../tags/entity_type/choke_affected.json | 2 +- .../tags/entity_type/sink_affected.json | 2 +- .../tags/entity_type/water_breathing.json | 6 +- .../tags/item/blaze_logs.json | 8 + .../tags/item/mudcrab_food.json | 5 + .../tags/item/soul_logs.json | 8 + .../biome/entity_spawn/mudcrab/cold.json | 17 ++ .../biome/entity_spawn/mudcrab/warm.json | 11 + .../worldgen/biome/entity_spawn/piranha.json | 6 + .../tags/worldgen/biome/spawns_muddy_pig.json | 0 .../configured_feature/blaze_tree.json | 6 +- .../configured_feature/soul_tree.json | 6 +- .../placed_feature/blaze_tree_placed.json | 4 + .../placed_feature/soul_tree_placed.json | 4 + .../wild_wind_wilderness.mixins.json} | 12 +- .../wilderness}/client/MuddyPigModelTest.java | 2 +- 1312 files changed, 6750 insertions(+), 8208 deletions(-) delete mode 100644 modules/hfas/build.gradle.kts create mode 100644 scripts/sync_generated_resources.py create mode 100644 src/barren/java/org/polaris2023/wildwind/barren/BarrenMod.java create mode 100644 src/barren/java/org/polaris2023/wildwind/barren/block/ModBlocks.java create mode 100644 src/barren/java/org/polaris2023/wildwind/barren/event/CreativeContents.java create mode 100644 src/barren/resources/assets/wild_wind_barren/blockstates/tiny_cactus.json create mode 100644 src/barren/resources/assets/wild_wind_barren/items/tiny_cactus.json create mode 100644 src/barren/resources/assets/wild_wind_barren/lang/en_us.json create mode 100644 src/barren/resources/assets/wild_wind_barren/lang/zh_cn.json rename src/{hfas/resources/assets/ww_hfas => barren/resources/assets/wild_wind_barren}/models/block/tiny_cactus.json (53%) rename src/{hfas/resources/assets/ww_hfas => barren/resources/assets/wild_wind_barren}/textures/block/tiny_cactus.png (100%) rename src/{hfas/resources/data/ww_hfas => barren/resources/data/wild_wind_barren}/loot_table/blocks/tiny_cactus.json (70%) create mode 100644 src/barren/resources/wild_wind_barren.mixins.json create mode 100644 src/core/java/org/polaris2023/wildwind/core/CoreMod.java create mode 100644 src/core/java/org/polaris2023/wildwind/core/api/WildWindModules.java rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/block/AzaleaShelfBlock.java (94%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/block/KilnBlock.java (93%) create mode 100644 src/core/java/org/polaris2023/wildwind/core/block/ModBlocks.java rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/block/entity/KilnBlockEntity.java (94%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/block/entity/ModBlockEntities.java (64%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/client/AzaleaSignState.java (71%) create mode 100644 src/core/java/org/polaris2023/wildwind/core/client/CoreScreens.java rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/client/KilnScreen.java (95%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/enchantment/MeltingEnchantment.java (95%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/event/CobwebBreaking.java (96%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/event/FarmlandProtection.java (90%) create mode 100644 src/core/java/org/polaris2023/wildwind/core/event/FuelHandler.java rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/event/SkeletonBehavior.java (96%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/menu/KilnMenu.java (97%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/menu/ModMenus.java (64%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/mixin/AbstractSkeletonMixin.java (91%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/mixin/AzaleaBlockMixin.java (91%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/mixin/AzaleaSignRendererMixin.java (87%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/mixin/CrafterBlockMixin.java (92%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/mixin/FurnaceFuelAccessor.java (90%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/mixin/SignRenderStateMixin.java (81%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/mixin/SinglePoolElementMixin.java (92%) create mode 100644 src/core/java/org/polaris2023/wildwind/core/mixin/SkeletonMeleeMixin.java rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/recipe/KilnRecipes.java (89%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/recipe/ModRecipes.java (89%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/recipe/WoolToStringRecipe.java (98%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/registry/ModCreativeTabs.java (70%) create mode 100644 src/core/java/org/polaris2023/wildwind/core/registry/ModItems.java rename src/{hfas/java/org/polaris2023/wildwind/hfas => core/java/org/polaris2023/wildwind/core}/worldgen/MasonKilnProcessor.java (91%) create mode 100644 src/core/java/org/polaris2023/wildwind/core/worldgen/ModTreeGrowers.java rename src/{structures => core}/java/org/polaris2023/wildwind/structures/StructureModule.java (100%) rename src/{structures => core}/java/org/polaris2023/wildwind/structures/command/StructureCommands.java (100%) rename src/{structures => core}/java/org/polaris2023/wildwind/structures/config/ConfigStructurePack.java (100%) rename src/{structures => core}/java/org/polaris2023/wildwind/structures/config/StructureDefinition.java (100%) rename src/{structures => core}/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredStructure.java (100%) rename src/{structures => core}/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredTemplatePiece.java (100%) rename src/{structures => core}/java/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndex.java (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/blockstates/azalea_button.json (59%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/blockstates/azalea_door.json (53%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/blockstates/azalea_fence.json (65%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/blockstates/azalea_fence_gate.json (58%) create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_hanging_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_log.json create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_planks.json create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_pressure_plate.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/blockstates/azalea_shelf.json (79%) create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_slab.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/blockstates/azalea_stairs.json (62%) create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_trapdoor.json create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_wall_hanging_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_wall_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/azalea_wood.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/blockstates/kiln.json (99%) create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/stripped_azalea_log.json create mode 100644 src/core/resources/assets/wild_wind_core/blockstates/stripped_azalea_wood.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/items/azalea_boat.json (52%) create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_button.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_chest_boat.json rename src/{hfas/resources/assets/ww_hfas/items/cooked_calamari.json => core/resources/assets/wild_wind_core/items/azalea_door.json} (52%) create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_fence.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_fence_gate.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_hanging_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_log.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_planks.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_pressure_plate.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_shelf.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_slab.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_stairs.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_trapdoor.json create mode 100644 src/core/resources/assets/wild_wind_core/items/azalea_wood.json create mode 100644 src/core/resources/assets/wild_wind_core/items/baked_seeds.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/items/calamari.json (54%) create mode 100644 src/core/resources/assets/wild_wind_core/items/cooked_calamari.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/items/cooked_egg.json (53%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/items/cooked_frog_legs.json (50%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/items/duckweed.json (54%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/items/frog_legs.json (53%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/items/kiln.json (97%) create mode 100644 src/core/resources/assets/wild_wind_core/items/stripped_azalea_log.json create mode 100644 src/core/resources/assets/wild_wind_core/items/stripped_azalea_wood.json create mode 100644 src/core/resources/assets/wild_wind_core/lang/en_us.json create mode 100644 src/core/resources/assets/wild_wind_core/lang/zh_cn.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_button.json (52%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_button_inventory.json (56%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_button_pressed.json (55%) create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_left.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_left_open.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_right.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_right_open.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_left.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_left_open.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_right.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_right_open.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_fence_gate.json (57%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_fence_gate_open.json (59%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_fence_gate_wall.json (59%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_fence_gate_wall_open.json (60%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_fence_inventory.json (56%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_fence_post.json (54%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_fence_side.json (54%) create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_0.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_1.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_2.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_3.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_0.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_1.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_2.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_3.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_log.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_log_horizontal.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_planks.json (55%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_pressure_plate.json (56%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/block/azalea_pressure_plate_down.json (57%) create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_shelf.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_center.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_inventory.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_left.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_right.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_unconnected.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_unpowered.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_0.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_1.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_2.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_3.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_slab.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_slab_top.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_stairs.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_stairs_inner.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_stairs_outer.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_bottom.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_open.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_top.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_wall_hanging_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_wall_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/azalea_wood.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_log.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_log_horizontal.json create mode 100644 src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_wood.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/item/azalea_boat.json (56%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/item/azalea_chest_boat.json (53%) rename src/{hfas/resources/assets/ww_hfas/models/item/cooked_calamari.json => core/resources/assets/wild_wind_core/models/item/azalea_door.json} (57%) create mode 100644 src/core/resources/assets/wild_wind_core/models/item/azalea_hanging_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/models/item/azalea_sign.json create mode 100644 src/core/resources/assets/wild_wind_core/models/item/baked_seeds.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/item/calamari.json (58%) create mode 100644 src/core/resources/assets/wild_wind_core/models/item/cooked_calamari.json rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/item/cooked_egg.json (57%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/item/cooked_frog_legs.json (54%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/item/duckweed.json (58%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/models/item/frog_legs.json (58%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/azalea_door_bottom.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/azalea_door_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/azalea_hanging_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/azalea_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/azalea_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/azalea_planks.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/azalea_shelf.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/azalea_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/azalea_trapdoor.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/stripped_azalea_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/block/stripped_azalea_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/entity/boat/azalea.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/entity/chest_boat/azalea.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/entity/signs/azalea.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/entity/signs/hanging/azalea.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/gui/hanging_signs/azalea.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/gui/signs/azalea.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/azalea_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/azalea_chest_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/azalea_door.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/azalea_hanging_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/azalea_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/baked_seeds.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/calamari.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/cooked_calamari.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/cooked_egg.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/cooked_frog_legs.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/duckweed.png (100%) rename src/{hfas/resources/assets/ww_hfas => core/resources/assets/wild_wind_core}/textures/item/frog_legs.png (100%) create mode 100644 src/core/resources/data/c/tags/block/fence_gates/wooden.json create mode 100644 src/core/resources/data/c/tags/block/fences.json create mode 100644 src/core/resources/data/c/tags/block/fences/wooden.json create mode 100644 src/core/resources/data/c/tags/block/stripped_logs.json create mode 100644 src/core/resources/data/c/tags/block/stripped_woods.json create mode 100644 src/core/resources/data/c/tags/item/fence_gates/wooden.json create mode 100644 src/core/resources/data/c/tags/item/fences/wooden.json create mode 100644 src/core/resources/data/c/tags/item/stripped_logs.json create mode 100644 src/core/resources/data/c/tags/item/stripped_woods.json create mode 100644 src/core/resources/data/minecraft/tags/block/all_hanging_signs.json rename src/{hfas/resources/data/minecraft/tags/block/flower_pots.json => core/resources/data/minecraft/tags/block/all_signs.json} (52%) create mode 100644 src/core/resources/data/minecraft/tags/block/ceiling_hanging_signs.json create mode 100644 src/core/resources/data/minecraft/tags/block/doors.json create mode 100644 src/core/resources/data/minecraft/tags/block/fence_gates.json create mode 100644 src/core/resources/data/minecraft/tags/block/fences.json create mode 100644 src/core/resources/data/minecraft/tags/block/logs.json create mode 100644 src/core/resources/data/minecraft/tags/block/logs_that_burn.json create mode 100644 src/core/resources/data/minecraft/tags/block/mineable/axe.json create mode 100644 src/core/resources/data/minecraft/tags/block/mineable/pickaxe.json create mode 100644 src/core/resources/data/minecraft/tags/block/needs_stone_tool.json create mode 100644 src/core/resources/data/minecraft/tags/block/overworld_natural_logs.json create mode 100644 src/core/resources/data/minecraft/tags/block/planks.json create mode 100644 src/core/resources/data/minecraft/tags/block/standing_signs.json create mode 100644 src/core/resources/data/minecraft/tags/block/trapdoors.json create mode 100644 src/core/resources/data/minecraft/tags/block/wall_hanging_signs.json create mode 100644 src/core/resources/data/minecraft/tags/block/wall_signs.json create mode 100644 src/core/resources/data/minecraft/tags/block/wooden_buttons.json create mode 100644 src/core/resources/data/minecraft/tags/block/wooden_doors.json create mode 100644 src/core/resources/data/minecraft/tags/block/wooden_fences.json create mode 100644 src/core/resources/data/minecraft/tags/block/wooden_pressure_plates.json create mode 100644 src/core/resources/data/minecraft/tags/block/wooden_shelves.json create mode 100644 src/core/resources/data/minecraft/tags/block/wooden_slabs.json create mode 100644 src/core/resources/data/minecraft/tags/block/wooden_stairs.json create mode 100644 src/core/resources/data/minecraft/tags/block/wooden_trapdoors.json rename src/{hfas => core}/resources/data/minecraft/tags/enchantment/non_treasure.json (59%) create mode 100644 src/core/resources/data/minecraft/tags/item/boats.json create mode 100644 src/core/resources/data/minecraft/tags/item/buttons.json create mode 100644 src/core/resources/data/minecraft/tags/item/chest_boats.json create mode 100644 src/core/resources/data/minecraft/tags/item/doors.json create mode 100644 src/core/resources/data/minecraft/tags/item/fence_gates.json create mode 100644 src/core/resources/data/minecraft/tags/item/hanging_signs.json create mode 100644 src/core/resources/data/minecraft/tags/item/logs.json create mode 100644 src/core/resources/data/minecraft/tags/item/logs_that_burn.json create mode 100644 src/core/resources/data/minecraft/tags/item/planks.json create mode 100644 src/core/resources/data/minecraft/tags/item/signs.json create mode 100644 src/core/resources/data/minecraft/tags/item/trapdoors.json create mode 100644 src/core/resources/data/minecraft/tags/item/wooden_buttons.json create mode 100644 src/core/resources/data/minecraft/tags/item/wooden_doors.json create mode 100644 src/core/resources/data/minecraft/tags/item/wooden_fences.json create mode 100644 src/core/resources/data/minecraft/tags/item/wooden_pressure_plates.json create mode 100644 src/core/resources/data/minecraft/tags/item/wooden_shelves.json create mode 100644 src/core/resources/data/minecraft/tags/item/wooden_slabs.json create mode 100644 src/core/resources/data/minecraft/tags/item/wooden_stairs.json create mode 100644 src/core/resources/data/minecraft/tags/item/wooden_trapdoors.json create mode 100644 src/core/resources/data/neoforge/data_maps/block/strippables.json rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/building_blocks/azalea_planks.json (77%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/building_blocks/azalea_slab.json (77%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/building_blocks/azalea_stairs.json (77%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/building_blocks/azalea_wood.json (77%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/decorations/azalea_fence.json (77%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/decorations/azalea_hanging_sign.json (74%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/decorations/azalea_shelf.json (76%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/decorations/azalea_sign.json (77%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/decorations/kiln.json (87%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/redstone/azalea_button.json (77%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/redstone/azalea_door.json (77%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/redstone/azalea_fence_gate.json (75%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/redstone/azalea_pressure_plate.json (75%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/advancement/recipes/redstone/azalea_trapdoor.json (76%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/enchantment/melting.json (85%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_button.json (70%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_door.json (74%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_fence.json (71%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_fence_gate.json (69%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_hanging_sign.json (68%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_log.json (72%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_planks.json (70%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_pressure_plate.json (68%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_shelf.json (71%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_sign.json (71%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_slab.json (71%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_stairs.json (70%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_trapdoor.json (70%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_wall_hanging_sign.json (68%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_wall_sign.json (71%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/azalea_wood.json (71%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/kiln.json (84%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/stripped_azalea_log.json (68%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/loot_table/blocks/stripped_azalea_wood.json (68%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/neoforge/biome_modifier/add_azalea_tree.json (66%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/neoforge/biome_modifier/remove_vanilla_azalea_tree.json (98%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_button.json (59%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_door.json (67%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_fence.json (66%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_fence_gate.json (66%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_hanging_sign.json (64%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_planks.json (67%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_pressure_plate.json (59%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_shelf.json (61%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_sign.json (67%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_slab.json (65%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_stairs.json (67%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_trapdoor.json (65%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/azalea_wood.json (67%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/recipe/kiln.json (86%) create mode 100644 src/core/resources/data/wild_wind_core/recipe/wool_to_string.json create mode 100644 src/core/resources/data/wild_wind_core/tags/block/azalea_logs.json create mode 100644 src/core/resources/data/wild_wind_core/tags/item/azalea_logs.json rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/tags/item/kiln_excluded.json (100%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/tags/item/kiln_metal_outputs.json (100%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/worldgen/configured_feature/azalea_tree.json (97%) rename src/{hfas/resources/data/ww_hfas => core/resources/data/wild_wind_core}/worldgen/placed_feature/azalea_tree_placed.json (95%) rename src/{structures => core}/resources/examples/example_ruins.json (100%) rename src/{structures => core}/resources/examples/example_ruins.nbt (100%) create mode 100644 src/core/resources/wild_wind_core.mixins.json rename src/{structures => core}/test/org/polaris2023/wildwind/structures/config/StructureConfigTest.java (100%) rename src/{structures => core}/test/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndexTest.java (100%) create mode 100644 src/datagen/java/org/polaris2023/wildwind/hfas/HFASMod.java rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/datagen/HFASDatagen.java (100%) create mode 100644 src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java (84%) rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/datagen/provider/ModLootProvider.java (94%) create mode 100644 src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java (72%) create mode 100644 src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java create mode 100644 src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java (67%) create mode 100644 src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java (97%) rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java (53%) rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModEntityTypeTagsProvider.java (89%) rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModItemTagsProvider.java (52%) rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java (97%) rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java (87%) rename src/{hfas => datagen}/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java (92%) delete mode 100644 src/hfas/gametest/config/ww_hfas-common.toml delete mode 100644 src/hfas/gametest/resources/META-INF/neoforge.mods.toml delete mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/reach_arrow_acquisition.json delete mode 100644 src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/upstream_integration.json delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/HFASMod.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowFletching.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowHead.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowShaft.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/block/FletchingTableBlock.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/FletchingTableBlockEntity.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/component/ArrowComponent.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/config/ModCommonConfig.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/event/FletchingTableReplaceHandler.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/event/FuelHandler.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/menu/FletchingTableMenu.java delete mode 100644 src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModTreeGrowers.java delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_planks.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_pressure_plate.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_slab.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_trapdoor.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/azalea_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_leaves.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_planks.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_pressure_plate.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_sapling.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_slab.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_trapdoor.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/blaze_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/fletching_table.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/potted_blaze_sapling.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/potted_soul_sapling.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/scorched_dirt.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass_block.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/scorched_twig.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_leaves.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_planks.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_pressure_plate.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_sapling.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_slab.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_trapdoor.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/soul_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/blockstates/tiny_cactus.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_button.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_chest_boat.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_door.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_fence.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_fence_gate.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_planks.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_pressure_plate.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_shelf.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_slab.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_stairs.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_trapdoor.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/azalea_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_boat.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_button.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_chest_boat.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_door.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_fence.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_fence_gate.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_planks.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_pressure_plate.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_sapling.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_slab.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_stairs.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_trapdoor.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/blaze_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/scorched_dirt.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/scorched_grass.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/scorched_grass_block.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/scorched_twig.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_button.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_chest_boat.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_door.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_fence.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_fence_gate.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_planks.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_pressure_plate.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_sapling.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_slab.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_stairs.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_trapdoor.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/soul_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_azalea_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_azalea_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_blaze_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_blaze_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_soul_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/stripped_soul_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/items/tiny_cactus.json delete mode 100644 src/hfas/resources/assets/ww_hfas/lang/en_us.json delete mode 100644 src/hfas/resources/assets/ww_hfas/lang/zh_cn.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_0.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_1.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_2.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_3.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_0.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_1.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_2.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_3.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_log_horizontal.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_center.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_inventory.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_left.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_right.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unconnected.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unpowered.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_0.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_1.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_2.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_3.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_slab.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_slab_top.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_inner.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_outer.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_bottom.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_top.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/azalea_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_0.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_1.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_2.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_3.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_0.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_1.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_2.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_3.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_log_horizontal.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_0.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_1.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_2.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_3.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_slab.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_slab_top.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_inner.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_outer.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_bottom.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_top.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/blaze_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/fletching_table.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/scorched_grass_block.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_0.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_1.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_2.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_3.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_0.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_1.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_2.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_3.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_log_horizontal.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_0.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_1.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_2.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_3.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_slab.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_slab_top.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_stairs.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_inner.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_outer.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_bottom.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_open.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_top.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_wall_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_wall_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/soul_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log_horizontal.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log_horizontal.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log_horizontal.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_wood.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/item/azalea_door.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/item/azalea_hanging_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/item/azalea_sign.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/item/blaze_door.json delete mode 100644 src/hfas/resources/assets/ww_hfas/models/item/soul_door.json delete mode 100644 src/hfas/resources/data/c/tags/block/fence_gates/wooden.json delete mode 100644 src/hfas/resources/data/c/tags/block/fences.json delete mode 100644 src/hfas/resources/data/c/tags/block/fences/wooden.json delete mode 100644 src/hfas/resources/data/c/tags/block/stripped_logs.json delete mode 100644 src/hfas/resources/data/c/tags/block/stripped_woods.json delete mode 100644 src/hfas/resources/data/c/tags/item/fence_gates/wooden.json delete mode 100644 src/hfas/resources/data/c/tags/item/fences/wooden.json delete mode 100644 src/hfas/resources/data/c/tags/item/stripped_logs.json delete mode 100644 src/hfas/resources/data/c/tags/item/stripped_woods.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/all_hanging_signs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/all_signs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/ceiling_hanging_signs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/dirt.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/doors.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/fence_gates.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/fences.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/leaves.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/logs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/logs_that_burn.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/mineable/axe.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/mineable/pickaxe.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/overworld_natural_logs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/planks.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/saplings.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/standing_signs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/trapdoors.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wall_hanging_signs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wall_signs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_buttons.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_doors.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_fences.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_pressure_plates.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_shelves.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_slabs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_stairs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/block/wooden_trapdoors.json delete mode 100644 src/hfas/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/arrows.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/boats.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/buttons.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/chest_boats.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/doors.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/fence_gates.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/hanging_signs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/leaves.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/logs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/logs_that_burn.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/planks.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/saplings.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/signs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/trapdoors.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_buttons.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_doors.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_fences.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_pressure_plates.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_shelves.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_slabs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_stairs.json delete mode 100644 src/hfas/resources/data/minecraft/tags/item/wooden_trapdoors.json delete mode 100644 src/hfas/resources/data/minecraft/tags/potion/tradeable.json delete mode 100644 src/hfas/resources/data/neoforge/data_maps/block/strippables.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_hanging_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_hanging_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_chest_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_chest_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_chest_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_hanging_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_hanging_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/fletching_table.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_blaze_sapling.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_soul_sapling.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_hanging_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_hanging_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/azalea_chest_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_chest_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_hanging_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/blaze_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_chest_boat.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_hanging_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/soul_sign.json delete mode 100644 src/hfas/resources/data/ww_hfas/recipe/wool_to_string.json delete mode 100644 src/hfas/resources/data/ww_hfas/tags/block/azalea_logs.json delete mode 100644 src/hfas/resources/data/ww_hfas/tags/block/blaze_logs.json delete mode 100644 src/hfas/resources/data/ww_hfas/tags/block/soul_logs.json delete mode 100644 src/hfas/resources/data/ww_hfas/tags/item/azalea_logs.json delete mode 100644 src/hfas/resources/data/ww_hfas/tags/item/blaze_logs.json delete mode 100644 src/hfas/resources/data/ww_hfas/tags/item/soul_logs.json delete mode 100644 src/hfas/resources/data/ww_hfas/worldgen/placed_feature/blaze_tree_placed.json delete mode 100644 src/hfas/resources/data/ww_hfas/worldgen/placed_feature/soul_tree_placed.json create mode 100644 src/smoke/java/org/polaris2023/wildwind/smoke/ClientInstallationTests.java create mode 100644 src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java rename src/{hfas/gametest/resources/data/ww_hfas_tests => smoke/resources/data/wild_wind_smoke}/structure/empty.nbt (100%) create mode 100644 src/smoke/resources/data/wild_wind_smoke/test_instance/installation.json rename src/{structures/gametest => verification}/config/ww_structures/definitions/blocked.json (100%) rename src/{structures/gametest => verification}/config/ww_structures/definitions/disabled.json (100%) rename src/{structures/gametest => verification}/config/ww_structures/definitions/smoke.json (100%) rename src/{structures/gametest => verification}/config/ww_structures/templates/wide_ruins.nbt (100%) rename src/{hfas/gametest => verification}/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java (81%) rename src/{hfas/gametest => verification}/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java (98%) rename src/{hfas/gametest => verification}/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java (98%) rename src/{hfas/gametest => verification}/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java (92%) rename src/{hfas/gametest => verification}/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java (95%) rename src/{hfas/gametest => verification}/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java (87%) rename src/{hfas/gametest => verification}/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java (78%) rename src/{structures/gametest => verification}/java/org/polaris2023/wildwind/structures/test/StructureGameTests.java (97%) rename src/{structures/gametest => verification}/java/org/polaris2023/wildwind/structures/test/mixin/GameTestServerMixin.java (100%) rename src/{structures/gametest => verification}/resources/data/minecraft/worldgen/world_preset/flat.json (100%) create mode 100644 src/verification/resources/data/wild_wind_tests/structure/empty.nbt rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/azalea_shelf.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/azalea_shelf_chain.json (50%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/azalea_signs.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/cobweb_tick_event.json (50%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/cobweb_timers.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/crafter_shears.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/creative_tab.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/entity.json (53%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/farmland_protection.json (50%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/fluid_effects.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/fluid_entity_rules.json (50%) rename src/{structures/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/generation.json (74%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/kiln.json (54%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/kiln_inventory.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/kiln_villages.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/land_choke.json (52%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/melting.json (53%) create mode 100644 src/verification/resources/data/wild_wind_tests/test_instance/reach_arrow_acquisition.json rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/reach_arrows.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/skeleton_melee.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/skeleton_spawns.json (51%) rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/spawning.json (53%) create mode 100644 src/verification/resources/data/wild_wind_tests/test_instance/upstream_integration.json rename src/{hfas/gametest/resources/data/ww_hfas_tests => verification/resources/data/wild_wind_tests}/test_instance/wool_recipe.json (52%) rename src/{structures/gametest/resources/ww_hfas_tests.mixins.json => verification/resources/wild_wind_tests.mixins.json} (100%) create mode 100644 src/wilderness/java/org/polaris2023/wildwind/wilderness/WildernessMod.java rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/arrow/ReachArrows.java (75%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/block/ModBlocks.java (56%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/ModClientHooks.java (77%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/ModEntityRenderers.java (80%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/MuddyPigModel.java (98%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/MuddyPigRenderer.java (88%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/entity/model/MudcrabModel.java (66%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/entity/model/PiranhaModel.java (62%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/entity/renderer/MudcrabRenderer.java (92%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/entity/renderer/PiranhaRenderer.java (64%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/entity/renderstate/MudcrabRenderState.java (69%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/entity/renderstate/PiranhaRenderState.java (71%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/eventsub/EntitiesClientHandler.java (65%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/client/tooltip/ClientOmniClawTooltip.java (96%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/component/OmniClawTools.java (99%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/effect/FluidEffects.java (94%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/effect/ModEffects.java (83%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/effect/WildWindMobEffect.java (93%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/ModEntityTypeTags.java (82%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/ModSpawnPlacementTypes.java (97%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/MuddyPig.java (84%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/ReachArrow.java (85%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/WindupAttackMob.java (97%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java (98%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/ai/goal/ChargingMeleeAttackGoal.java (90%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/animal/Mudcrab.java (98%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/animal/MudcrabVariant.java (80%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/entity/animal/Piranha.java (91%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/event/AzaleaAndArrowEvents.java (68%) create mode 100644 src/wilderness/java/org/polaris2023/wildwind/wilderness/event/CreativeContents.java rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/event/EntitiesHandler.java (84%) create mode 100644 src/wilderness/java/org/polaris2023/wildwind/wilderness/event/FuelHandler.java rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/item/ModFoods.java (96%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/item/OmniClawItem.java (95%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/item/ReachArrowItem.java (89%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/AbstractArrowAccessor.java (90%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/EnchantmentHelperMixin.java (89%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/EntityFluidMovementMixin.java (84%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/IronGolemAirSupplyMixin.java (85%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/ItemStackMixin.java (88%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/LootPoolEntriesAccessor.java (91%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/LootTablePoolsAccessor.java (87%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/MobMixin.java (72%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/PlayerMixin.java (92%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/ReachArrowCraftingMixin.java (86%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/ReachArrowLootMixin.java (87%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/ServerPlayerGameModeMixin.java (96%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/mixin/WaterAnimalAirSupplyMixin.java (85%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/network/HFASNetwork.java (71%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/network/payload/ServerBoundSelectOmniClawItemPayload.java (86%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/registry/DatadrivenRegistryKey.java (63%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/registry/ModAttributes.java (84%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/registry/ModDataComponents.java (68%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/registry/ModEntities.java (71%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/registry/ModEntityDataSerializers.java (82%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/registry/ModItems.java (66%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/registry/ModMobEffects.java (76%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/registry/ModPotions.java (85%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/registry/ModSoundEvents.java (87%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/tag/ModBiomeTags.java (81%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/tag/ModBlockTags.java (54%) rename src/{hfas/java/org/polaris2023/wildwind/hfas => wilderness/java/org/polaris2023/wildwind/wilderness}/tag/ModItemTags.java (55%) create mode 100644 src/wilderness/java/org/polaris2023/wildwind/wilderness/worldgen/ModTreeGrowers.java rename src/{hfas => wilderness}/resources/META-INF/accesstransformer.cfg (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/blaze_button.json (57%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/blaze_door.json (51%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/blaze_fence.json (63%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/blaze_fence_gate.json (56%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_leaves.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_planks.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_pressure_plate.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_sapling.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_slab.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/blaze_stairs.json (60%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_trapdoor.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_wood.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_dirt.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_grass.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_grass_block.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_twig.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/soul_button.json (57%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/soul_door.json (51%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/soul_fence.json (63%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/soul_fence_gate.json (56%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_leaves.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_planks.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_pressure_plate.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_sapling.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_slab.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/blockstates/soul_stairs.json (60%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_trapdoor.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_wood.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_blaze_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_blaze_wood.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_soul_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_soul_wood.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/geckolib/animations/entity/mudcrab.animation.json (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/geckolib/animations/entity/piranha.animation.json (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/geckolib/models/entity/mudcrab.geo.json (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/geckolib/models/entity/piranha.geo.json (100%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_boat.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_button.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_chest_boat.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_door.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_fence.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_fence_gate.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_hanging_sign.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/items/blaze_leaves.json (71%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_planks.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_pressure_plate.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_sapling.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_sign.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_slab.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_stairs.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_trapdoor.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_wood.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/cooked_piranha.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/crab_claw.json rename src/{hfas/resources/assets/ww_hfas/items/baked_seeds.json => wilderness/resources/assets/wild_wind_wilderness/items/fang.json} (53%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/mudcrab_bucket.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/mudcrab_spawn_egg.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/items/muddy_pig_spawn_egg.json (100%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/omni_claw.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/piranha.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/piranha_bucket.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/piranha_spawn_egg.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_dirt.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_grass.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_grass_block.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_twig.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/items/soul_boat.json (50%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_button.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_chest_boat.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_door.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_fence.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_fence_gate.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_hanging_sign.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/items/soul_leaves.json (72%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_planks.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_pressure_plate.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_sapling.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/items/soul_sign.json (50%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_slab.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_stairs.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_trapdoor.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/soul_wood.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_blaze_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_blaze_wood.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_soul_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_soul_wood.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/items/tipped_arrow.json (98%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/lang/en_us.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/lang/zh_cn.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_button.json (50%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_button_inventory.json (54%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_button_pressed.json (53%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_left.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_left_open.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_right.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_right_open.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_left.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_left_open.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_right.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_right_open.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_fence_gate.json (55%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_fence_gate_open.json (56%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_fence_gate_wall.json (56%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_fence_gate_wall_open.json (58%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_fence_inventory.json (53%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_fence_post.json (52%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_fence_side.json (52%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_0.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_1.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_2.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_3.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_0.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_1.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_2.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_3.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_leaves.json (52%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_log_horizontal.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_planks.json (52%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_pressure_plate.json (54%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_pressure_plate_down.json (55%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/blaze_sapling.json (50%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_0.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_1.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_2.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_3.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_slab.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_slab_top.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs_inner.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs_outer.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_bottom.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_open.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_top.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wall_hanging_sign.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wall_sign.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wood.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/potted_blaze_sapling.json (55%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/potted_soul_sapling.json (56%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/scorched_dirt.json (52%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/scorched_grass.json (50%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_grass_block.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/scorched_twig.json (50%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_button.json (50%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_button_inventory.json (54%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_button_pressed.json (53%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_left.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_left_open.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_right.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_right_open.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_left.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_left_open.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_right.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_right_open.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_fence_gate.json (55%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_fence_gate_open.json (57%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_fence_gate_wall.json (57%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_fence_gate_wall_open.json (58%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_fence_inventory.json (54%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_fence_post.json (52%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_fence_side.json (52%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_0.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_1.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_2.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_3.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_0.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_1.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_2.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_3.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_leaves.json (52%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_log_horizontal.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_planks.json (53%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_pressure_plate.json (55%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_pressure_plate_down.json (55%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/block/soul_sapling.json (50%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_0.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_1.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_2.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_3.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_slab.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_slab_top.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs_inner.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs_outer.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_bottom.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_open.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_top.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wall_hanging_sign.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wall_sign.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wood.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_log_horizontal.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_wood.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_log.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_log_horizontal.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_wood.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/entity/pig/pig_muddy.bbmodel (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/entity/pig/pig_muddy_baby.bbmodel (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/blaze_boat.json (54%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/blaze_chest_boat.json (51%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_door.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/blaze_hanging_sign.json (50%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/blaze_sapling.json (52%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/blaze_sign.json (54%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/item/cooked_piranha.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/item/crab_claw.json rename src/{hfas/resources/assets/ww_hfas/models/item/baked_seeds.json => wilderness/resources/assets/wild_wind_wilderness/models/item/fang.json} (57%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/item/mudcrab_bucket.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/item/mudcrab_spawn_egg.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/omni_claw.json (96%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha_bucket.json create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha_spawn_egg.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/soul_boat.json (54%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/soul_chest_boat.json (52%) create mode 100644 src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_door.json rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/soul_hanging_sign.json (51%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/soul_sapling.json (52%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/models/item/soul_sign.json (54%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/sounds.json (50%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/sounds/entity_piranha_attack_1.ogg (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/sounds/entity_piranha_attack_2.ogg (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/sounds/entity_piranha_attack_3.ogg (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/sounds/entity_piranha_death.ogg (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_door_bottom.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_door_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_leaves.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_log.png.mcmeta (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_log_top.png.mcmeta (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_planks.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_sapling.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/blaze_trapdoor.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_door_bottom.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_door_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_leaves.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_log.png.mcmeta (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_log_top.png.mcmeta (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_planks.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_sapling.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/cinder_trapdoor.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_door_bottom.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_door_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_leaves.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_log.png.mcmeta (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_log_top.png.mcmeta (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_planks.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_sapling.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/ember_trapdoor.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/scorched_dirt.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/scorched_grass.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/scorched_grass_block_side.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/scorched_grass_block_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/scorched_twig.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/scorched_twig_wall.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_door_bottom.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_door_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_leaves.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_log.png.mcmeta (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_log_top.png.mcmeta (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_planks.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_sapling.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/soul_trapdoor.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/stripped_blaze_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/stripped_blaze_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/stripped_cinder_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/stripped_cinder_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/stripped_ember_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/stripped_ember_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/stripped_soul_log.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/block/stripped_soul_log_top.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/boat/cinder.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/boat/cinder_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/boat/ember.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/boat/ember_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/chest_boat/cinder.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/chest_boat/cinder_chest_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/chest_boat/ember.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/chest_boat/ember_chest_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/mudcrab/cold.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/mudcrab/temperate.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/mudcrab/warm.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/pig/pig_muddy.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/pig/pig_muddy_baby.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/piranha.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/signs/cinder.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/signs/cinder_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/signs/ember.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/signs/ember_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/signs/hanging/cinder.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/signs/hanging/cinder_hanging_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/signs/hanging/ember.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/entity/signs/hanging/ember_hanging_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/gui/hanging_signs/cinder.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/gui/hanging_signs/ember.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/blaze_door.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/cinder_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/cinder_chest_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/cinder_door.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/cinder_hanging_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/cinder_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/cooked_piranha.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/crab_claw.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/ember_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/ember_chest_boat.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/ember_door.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/ember_hanging_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/ember_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/fang.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/mudcrab_bucket.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/mudcrab_spawn_egg.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/omni_claw.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/piranha.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/piranha_bucket.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/piranha_spawn_egg.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/item/soul_door.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/mob_effect/choke.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/mob_effect/sink.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/screens/cinder_hanging_sign.png (100%) rename src/{hfas/resources/assets/ww_hfas => wilderness/resources/assets/wild_wind_wilderness}/textures/screens/ember_hanging_sign.png (100%) create mode 100644 src/wilderness/resources/data/c/tags/block/fence_gates/wooden.json create mode 100644 src/wilderness/resources/data/c/tags/block/fences.json create mode 100644 src/wilderness/resources/data/c/tags/block/fences/wooden.json create mode 100644 src/wilderness/resources/data/c/tags/block/stripped_logs.json create mode 100644 src/wilderness/resources/data/c/tags/block/stripped_woods.json create mode 100644 src/wilderness/resources/data/c/tags/item/animal_foods.json create mode 100644 src/wilderness/resources/data/c/tags/item/fence_gates/wooden.json create mode 100644 src/wilderness/resources/data/c/tags/item/fences/wooden.json create mode 100644 src/wilderness/resources/data/c/tags/item/foods/cooked_fish.json create mode 100644 src/wilderness/resources/data/c/tags/item/stripped_logs.json create mode 100644 src/wilderness/resources/data/c/tags/item/stripped_woods.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/all_hanging_signs.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/all_signs.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/dirt.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/doors.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/fence_gates.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/fences.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/flower_pots.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/leaves.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/logs.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/logs_that_burn.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/mineable/axe.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/needs_stone_tool.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/overworld_natural_logs.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/planks.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/saplings.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/trapdoors.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/wooden_buttons.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/wooden_doors.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/wooden_fences.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/wooden_pressure_plates.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/wooden_slabs.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/wooden_stairs.json create mode 100644 src/wilderness/resources/data/minecraft/tags/block/wooden_trapdoors.json create mode 100644 src/wilderness/resources/data/minecraft/tags/entity_type/aquatic.json rename src/{hfas => wilderness}/resources/data/minecraft/tags/entity_type/arrows.json (56%) create mode 100644 src/wilderness/resources/data/minecraft/tags/entity_type/axolotl_hunt_targets.json create mode 100644 src/wilderness/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json rename src/{hfas => wilderness}/resources/data/minecraft/tags/entity_type/can_equip_saddle.json (53%) create mode 100644 src/wilderness/resources/data/minecraft/tags/entity_type/not_scary_for_pufferfish.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/arrows.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/boats.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/buttons.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/cat_food.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/chest_boats.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/doors.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/fence_gates.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/fishes.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/leaves.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/logs.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/logs_that_burn.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/ocelot_food.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/planks.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/saplings.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/trapdoors.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/wolf_food.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/wooden_buttons.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/wooden_doors.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/wooden_fences.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/wooden_pressure_plates.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/wooden_slabs.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/wooden_stairs.json create mode 100644 src/wilderness/resources/data/minecraft/tags/item/wooden_trapdoors.json create mode 100644 src/wilderness/resources/data/minecraft/tags/potion/tradeable.json create mode 100644 src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/cold.json create mode 100644 src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/temperate.json create mode 100644 src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/warm.json create mode 100644 src/wilderness/resources/data/neoforge/data_maps/block/strippables.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/building_blocks/blaze_planks.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/building_blocks/blaze_slab.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/building_blocks/blaze_stairs.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/building_blocks/blaze_wood.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/building_blocks/soul_planks.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/building_blocks/soul_slab.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/building_blocks/soul_stairs.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/building_blocks/soul_wood.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/decorations/blaze_fence.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/decorations/soul_fence.json (75%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/food/cooked_piranha.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/blaze_button.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/blaze_door.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/blaze_fence_gate.json (74%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/blaze_pressure_plate.json (73%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/blaze_trapdoor.json (74%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/soul_button.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/soul_door.json (75%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/soul_fence_gate.json (74%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/soul_pressure_plate.json (73%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/advancement/recipes/redstone/soul_trapdoor.json (74%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/tools/omni_claw.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_button.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_door.json (73%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_fence.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_fence_gate.json (67%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_leaves.json (94%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_log.json (70%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_planks.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_pressure_plate.json (66%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_sapling.json (68%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_slab.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_stairs.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_trapdoor.json (68%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/blaze_wood.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/scorched_dirt.json (68%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/scorched_grass.json (68%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/scorched_grass_block.json (66%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/scorched_twig.json (68%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_button.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_door.json (73%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_fence.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_fence_gate.json (68%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_leaves.json (94%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_log.json (70%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_planks.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_pressure_plate.json (66%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_sapling.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_slab.json (70%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_stairs.json (69%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_trapdoor.json (68%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/soul_wood.json (70%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/stripped_blaze_log.json (67%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/stripped_blaze_wood.json (66%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/stripped_soul_log.json (67%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/blocks/stripped_soul_wood.json (67%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/mudcrab.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/loot_table/entities/muddy_pig.json (100%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/piranha.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/neoforge/biome_modifier/add_blaze_tree.json (64%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_mudcrab_spawns.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/neoforge/biome_modifier/add_muddy_pig.json (52%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_piranha_spawns.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/neoforge/biome_modifier/add_soul_tree.json (65%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_button.json (56%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_door.json (65%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_fence.json (64%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_fence_gate.json (64%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_planks.json (64%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_pressure_plate.json (56%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_slab.json (62%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_stairs.json (65%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_trapdoor.json (63%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/blaze_wood.json (64%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/recipe/cooked_piranha.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/recipe/omni_claw.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_button.json (57%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_door.json (65%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_fence.json (64%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_fence_gate.json (64%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_planks.json (64%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_pressure_plate.json (57%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_slab.json (62%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_stairs.json (65%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_trapdoor.json (63%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/recipe/soul_wood.json (65%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/block/blaze_logs.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/preferred_wander_blocks.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/spawnable_in_water_ground.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/spawnable_on.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/tags/block/muddy_pig_spawnable_on.json (100%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/block/soul_logs.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/tags/entity_type/choke_affected.json (96%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/tags/entity_type/sink_affected.json (96%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/tags/entity_type/water_breathing.json (78%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/item/blaze_logs.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/item/mudcrab_food.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/item/soul_logs.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/mudcrab/cold.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/mudcrab/warm.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/piranha.json rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/tags/worldgen/biome/spawns_muddy_pig.json (100%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/worldgen/configured_feature/blaze_tree.json (92%) rename src/{hfas/resources/data/ww_hfas => wilderness/resources/data/wild_wind_wilderness}/worldgen/configured_feature/soul_tree.json (93%) create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/worldgen/placed_feature/blaze_tree_placed.json create mode 100644 src/wilderness/resources/data/wild_wind_wilderness/worldgen/placed_feature/soul_tree_placed.json rename src/{hfas/resources/ww_hfas.mixins.json => wilderness/resources/wild_wind_wilderness.mixins.json} (67%) rename src/{hfas/test/org/polaris2023/wildwind/hfas => wilderness/test/org/polaris2023/wildwind/wilderness}/client/MuddyPigModelTest.java (98%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ba3c772..ddfb6ab 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,10 +27,27 @@ jobs: run: chmod +x ./gradlew - name: Generate client resources - run: ./gradlew :hfas:runClientData + run: ./gradlew :datagen:runClientData - name: Generate server resources - run: ./gradlew :hfas:runServerData + run: ./gradlew :datagen:runServerData + + - name: Verify generated resource snapshots + run: | + python3 scripts/sync_generated_resources.py + git diff --exit-code -- src/core/resources src/wilderness/resources src/barren/resources - name: Build and run integration tests - run: ./gradlew build :hfas:runGameTest + run: ./gradlew build collectMods :verification:runGameTest + + - name: Verify supported installations + run: | + for modules in core core,wilderness core,barren core,wilderness,barren; do + ./gradlew :smoke:runGameTest -PtestModules="$modules" + done + + - name: Upload distributable mods + uses: actions/upload-artifact@v4 + with: + name: WildWind-mc26.2 + path: build/distributions/mods/*.jar diff --git a/CHANGE_LOG.MD b/CHANGE_LOG.MD index e2262ac..28b5ec0 100644 --- a/CHANGE_LOG.MD +++ b/CHANGE_LOG.MD @@ -1,3 +1,15 @@ +# 2026-10-23 · 三模组拆分 + +- 按最新归属拆分 `wild_wind_core`、`wild_wind_wilderness`、`wild_wind_barren`,各有入口、注册代码、资源与发行 JAR。 +- 荒野/瘠土分别依赖核心;只有荒野需要 GeckoLib。保留共享创造分页和蟹钳/熔炼联动。 +- 杜鹃木、窑炉及通用玩法归核心;两种下界木材、生物、状态效果与焦灰植物归荒野;仙人球归瘠土。 +- 暂时移除自定义部件制箭系统及原版制箭台替换行为,保留已完成的延展药水箭。 +- 数据生成快照随源码保存;更新 README、进度、开发指南和 CI。 +- 本地验证:11 项单元测试、24 组 GameTest、四种服务端安装组合,核心/完整组合客户端资源加载通过。 +- 旧 `ww_hfas:*` 注册 ID 无自动存档迁移;升级前备份并用新世界验证。结构配置与结构资源兼容命名空间保留。 + +--- + # Changelog All notable changes to the Wild Wind Module project will be documented in this file. diff --git a/PROGRESS.md b/PROGRESS.md index cbdcda1..0380764 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -18,25 +18,25 @@ > 功能进度条只统计下面列出的 18 项已交付内容,包含本次开发及已合并的上游功能;不代表整个模组、未来规划或人工验收全部完成。测试进度表示已有测试的通过比例,不代表代码覆盖率。完整项目的最终范围尚未确定,因此不估算总完成百分比。 -## 模块规划 +## 已落实的模块划分 -| 编号 | 中文名称 | 英文名称 | 规划模组 ID | -| --- | --- | --- | --- | -| 0 | 原野之风:核心 | Wild Wind:Core | `wild_wind_core` | -| 1 | 原野之风:荒野更新 | Wild Wind:Wilderness Update | `wild_wind_wilderness` | -| 2 | 原野之风:瘠土更新 | Wild Wind:Barren Update | `wild_wind_barren` | +| 编号 | 模组 ID | 功能归属 | +| --- | --- | --- | +| 0 核心 | `wild_wind_core` | 杜鹃木及功能方块、羊毛拆线、挣脱蜘蛛网、骷髅近战、耕地保护、窑炉、熔炼;另保留结构生成与七种材料 | +| 1 荒野更新 | `wild_wind_wilderness` | 灵焰木、焚烬木、泥猪、泥沼蟹、恐鱼、窒息、沉溺、焦灰草方块/焦土/焦灰草丛/焦灰枝条;保留延展药水箭 | +| 2 瘠土更新 | `wild_wind_barren` | 仙人球 | -此表记录模块规划;现有已完成功能仍由 `ww_hfas` 统一提供,尚未按这三个模块拆分。编号不表示开发完成顺序。 +已拆分入口、代码、注册器、Mixin、资源、元数据与发行 JAR。荒野、瘠土分别依赖核心;只有荒野需要 GeckoLib。自定义部件制箭系统暂时移除。 ## 已完成功能 | 编号 | 状态 | 功能 | 已实现内容 | | --- | --- | --- | --- | -| 01 | ✅ | 版本升级与统一模组 | 适配 Minecraft 26.2 / NeoForge;结构、生物、物品和玩法统一打入 `ww_hfas`,保留旧结构配置命名空间。 | +| 01 | ✅ | 版本升级与模块拆分 | 适配 Minecraft 26.2 / NeoForge;按最新归属输出三个独立模组,保留结构配置命名空间。 | | 02 | ✅ | 可配置结构生成 | JSON 定义结构,独立 NBT 模板目录;支持群系、间距、概率、高度、旋转和地形条件;提供列表、已生成结构最近坐标查询与生成位置搜索。 | | 03 | ✅ | 木材与植物基础内容 | 焚烬木、灵焰木、杜鹃木基础方块套件;树木配置、去皮、配方及部分燃料;已有植物方块注册。其他木材配套及视觉整理见下方待办。 | -| 04 | ✅ | 泥猪 | 成年/幼年模型和贴图,原版猪动画与音效,繁殖与刷怪蛋,沼泽和红树林沼泽自然生成。ID:`ww_hfas:muddy_pig`。 | -| 05 | ✅ | 上游生物与道具整合 | 合并泥沼蟹、恐鱼、生物桶、刷怪蛋、万用蟹钳及延展药水;食人鱼显示名改为恐鱼,保留 `piranha` ID 兼容存档。 | +| 04 | ✅ | 泥猪 | 成年/幼年模型和贴图,原版猪动画与音效,繁殖与刷怪蛋,沼泽和红树林沼泽自然生成。ID:`wild_wind_wilderness:muddy_pig`。 | +| 05 | ✅ | 上游生物与道具整合 | 合并泥沼蟹、恐鱼、生物桶、刷怪蛋、万用蟹钳及延展药水;食人鱼显示名改为恐鱼,保留 `piranha` 路径,但新命名空间不自动兼容旧存档。 | | 06 | ✅ | 七种普通物品 | 浮萍、鱿鱼须、熟鱿鱼须、煎蛋、烤种子、熟蛙腿、生蛙腿;图标与翻译齐备,按当前要求全部作为普通材料注册。 | | 07 | ✅ | 羊毛拆线 | 任意颜色羊毛 + 剪刀无序合成 2 个线;返还剪刀,损耗 1 点耐久并受耐久附魔影响;支持自动合成器。 | | 08 | ✅ | 蜘蛛网挣脱 | 通常连续移动 30 刻、下坠进入后 160 刻破网;停止移动或离开重置;排除蜘蛛、洞穴蜘蛛、旁观玩家与飞行中的创造玩家。 | @@ -49,33 +49,31 @@ | 15 | ✅ | 杜鹃木告示牌 | 站立/墙面放置,双面文字、染色、发光、涂蜡、含水与数据保护;配方、掉落和燃料;补齐 26.2 贴图布局。 | | 16 | ✅ | 悬挂式杜鹃木告示牌 | 吊顶/墙面放置、链条及横杆行为,双面编辑、染色、发光、涂蜡;配方、掉落和燃料。 | | 17 | ✅ | 杜鹃木展示架 | 三槽整组交换;红石连接交换快捷栏 3/6/9 格;比较器输出 0–7;漏斗、存档和底部对齐设置。 | -| 18 | ✅ | 延展之箭与实体 | `ww_hfas:tipped_arrow` / `ww_hfas:arrow`;普通 450 刻、长效 1200 刻;合成、交易、英雄礼物、弓弩与发射器;落地 600 刻后退化为普通箭。 | +| 18 | ✅ | 延展之箭与实体 | `wild_wind_wilderness:tipped_arrow` / `wild_wind_wilderness:arrow`;普通 450 刻、长效 1200 刻;合成、交易、英雄礼物、弓弩与发射器;落地 600 刻后退化为普通箭。 | ## 工程与验证记录 -- [x] 创建独立私有仓库 `cuccuc377-dev/WildWindMod`,已上传至 `main`。 -- [x] 保留源码、测试、贴图、模型源文件、构建脚本、需求说明及许可证。 -- [x] 排除 IDE 文件、生成缓存、构建产物、运行日志、本地工具和无关抓取文件。 -- [x] 完成客户端和服务端数据生成。 -- [x] 在整理后的独立目录构建成功;11 项单元测试、24 组游戏测试通过。 -- [x] 开发客户端完成资源加载并正常退出;本次杜鹃木与延展箭资源未报告缺失。 -- [x] GitHub Actions 首次构建成功,验证基线为 `aeccc22`,见 [构建记录](https://github.com/cuccuc377-dev/WildWindMod/actions/runs/39822689750)。 -- [ ] 逐项人工验收告示牌编辑界面、荧光文字、展示架物品显示等视觉效果。 -- [ ] 完成多人联机、长期存档及发布前兼容性验收。 +- [x] 私有仓库 `cuccuc377-dev/WildWindMod` 保留来源、代码、资源、测试及构建流程。 +- [x] 三个发行模块分别编译,开发生成器与测试模组不进入发行集合。 +- [x] 11 项单元测试、24 组综合 GameTest 通过。 +- [x] 核心、核心+荒野、核心+瘠土、全部模块四种服务端安装组合通过。 +- [x] 核心单独安装与全模块客户端完成资源加载,自动检查告示牌及已安装生物资源。 +- [x] 数据生成与快照同步流程已建立,普通构建无需预先生成资源。 +- [x] 移除自定义制箭台、菜单、方块实体、部件组件及旧区块替换逻辑。 +- [ ] 人工验收告示牌编辑、荧光文字、展示架物品显示,以及多人联机与长期存档。 -以上测试结果记录最近一次已完成的验证,不表示本文件会自动刷新。既有客户端日志仍有制箭台、焦灰草方块和未注册木材资源的材质警告,尚未作为全部资源验收通过。 +测试统计为本次本地验证结果,不代表覆盖率。历史 CI 构建基线为 `aeccc22`;新拆分版本的远端状态以 GitHub Actions 为准。 -## 开发中与后续事项 +## 后续事项与已知限制 -| 状态 | 项目 | 当前情况 / 下一步 | +| 状态 | 项目 | 当前情况 | | --- | --- | --- | -| 🟡 开发中 | 自定义部件制箭系统 | 已有制箭台、方块实体、菜单、箭羽/箭杆/箭头和数据组件;需补客户端界面、实际合成和配方生成。它与已完成的延展药水箭是不同功能。 | -| ⬜ 待完成 | 其他木材配套 | 船、焚烬木/灵焰木告示牌、盆栽树苗尚未注册;现有占位资源不视为完成。 | -| ⬜ 待验证 | 制箭台替换存档行为 | 检查旧区块替换范围、性能及升级体验;现有配置关闭后不会自动恢复已替换方块。 | -| ⬜ 待整理 | 资源与视觉验收 | 核对现存材质警告、纹理引用及新方块实际显示,完成手动验收。 | -| ⬜ 待完善 | 本地构建流程 | 本地 `build` 尚不自动执行数据生成,仍需按开发指南分步运行;CI 已按顺序执行。 | -| ⬜ 待统一 | 许可证元数据 | `gradle.properties` 的许可标识与仓库分项许可证声明仍有差异,待维护者统一。 | -| ⬜ 规划中 | 模块划分与稳定版发布 | 按编号 0 核心、1 荒野更新、2 瘠土更新推进模块规划;功能归属、代码拆分和稳定版验收范围及发布日期尚未确定。 | +| 暂时移除 | 自定义部件制箭系统 | 恢复时需重新设计并验证完整流程;延展药水箭保留。 | +| 待完成 | 其他木材配套 | 船、焚烬木/灵焰木告示牌、盆栽树苗未注册,不能作为已完成内容。 | +| 待整理 | 既有材质警告 | 客户端仍报告未注册木材占位模型、焦灰草方块的旧纹理缺失;本次未重绘材质。 | +| 待验证 | 存档迁移 | 新 `wild_wind_*` ID 未自动映射旧 `ww_hfas:*`,需备份并优先用新测试世界。 | +| 待统一 | 许可证元数据 | 构建属性中的许可标识与仓库分项声明有差异,待维护者决定。 | +| 待验收 | 稳定发布 | 多人联机、人工视觉及长期存档测试尚未完成。 | ## 功能文档索引 @@ -93,7 +91,9 @@ | 日期 | 进度变更 | | --- | --- | | 2026-10-23 | 建立进度文档,汇总当前 18 项已交付功能、测试结果、GitHub 构建状态及未完成事项。 | -| 2026-10-23 | 模块规划更新为 0「核心」、1「荒野更新」、2「瘠土更新」,同步中英文名称;现有代码与统一打包方式不变。 | -| 2026-10-23 | 三个规划模组 ID 统一采用 `wild_wind_` 前缀:`wild_wind_core`、`wild_wind_wilderness`、`wild_wind_barren`;运行时 ID 迁移尚未实施。 | +| 2026-10-23 | 模块规划更新为 0「核心」、1「荒野更新」、2「瘠土更新」,同步中英文名称(当时为规划,现已落实)。 | +| 2026-10-23 | 三个规划模组 ID 统一采用 `wild_wind_` 前缀:`wild_wind_core`、`wild_wind_wilderness`、`wild_wind_barren`(当时为规划,现已落实)。 | + +| 2026-10-23 | 按最新清单完成三模组拆分及四种安装组合验证,移除自定义制箭系统,更新资源快照与 CI。 | 维护约定:每次交付功能后更新对应条目、统计分母、进度条和日期;测试结果注明已验证的提交或构建记录;仅完成注册或占位资源的功能继续标为开发中。 diff --git a/README.md b/README.md index 01fdc14..53ada93 100644 --- a/README.md +++ b/README.md @@ -1,181 +1,82 @@ -# WildWindMod · 原野之风 +# 原野之风 · Wild Wind -面向 Minecraft NeoForge 的模块化模组项目,围绕木材、植物、生物、世界生成和制箭玩法扩展原版内容。 +Minecraft **26.2 / NeoForge 26.2.0.93 / Java 25** 模组项目。当前已按功能拆成三个可独立打包的模组,模组版本为 `1.0.1`。 -本仓库由 [Polari-Stars-MC/WildWindModule](https://github.com/Polari-Stars-MC/WildWindModule) 的当前开发版本整理而来,包含本地已实现的新功能。上游来源、贡献者与整理范围见 [来源说明](docs/PROVENANCE.md)。 +[项目进度](PROGRESS.md) · [开发指南](docs/DEVELOPMENT.md) · [来源说明](docs/PROVENANCE.md) · [历史变更](CHANGE_LOG.MD) -> 当前说明对应 Minecraft `26.2` 适配代码,已合并远端 `26.2` 分支的 `26ad2da`。**结构、新物品、泥猪、泥沼蟹、恐鱼及新增玩法均在同一个 `ww_hfas` 模组中;另需安装 GeckoLib 依赖库。** +## 模块与安装 -[项目进度](PROGRESS.md) · [开发指南](docs/DEVELOPMENT.md) · [历史变更](CHANGE_LOG.MD) · [问题反馈](https://github.com/cuccuc377-dev/WildWindMod/issues) · [许可证](LICENSE) - -## 版本与环境 - -| 项目 | 当前配置 | -| --- | --- | -| Minecraft | `26.2`(依赖范围为精确版本 `[26.2]`) | -| 模组加载器 | NeoForge `26.2.0.93` | -| Java 开发工具链 | JDK `25` | -| Gradle Wrapper | `9.4.1` | -| ModDevGradle | `2.0.148` | -| GeckoLib(必需,客户端与服务端) | `5.5.4`,Minecraft 26.2 NeoForge 版本 | -| 模组版本 | `1.0.1`(构建配置值) | -| 统一模组 ID / 主资源命名空间 | `ww_hfas` | -| 结构资源兼容命名空间(不是独立模组) | `ww_structures` | - -版本以 [gradle.properties](gradle.properties) 和 [构建脚本](build.gradle.kts) 为准。`1.0.1` 是源码中的版本号,不代表已经发布稳定版。 - -## 模块规划 - -| 编号 | 中文名称 | 英文名称 | 规划模组 ID | +| 编号 | 模组 | 模组 ID | 当前功能 | | --- | --- | --- | --- | -| 0 | 原野之风:核心 | Wild Wind:Core | `wild_wind_core` | -| 1 | 原野之风:荒野更新 | Wild Wind:Wilderness Update | `wild_wind_wilderness` | -| 2 | 原野之风:瘠土更新 | Wild Wind:Barren Update | `wild_wind_barren` | - -以上为当前模块编号与命名规划,各模块的功能归属和代码拆分待进一步落实。当前实际启用的 Gradle 子项目仍为 `hfas`,以 `ww_hfas` 统一打包;`src/structures/` 仍是其中的内部结构生成功能,不单独安装。模块启用列表见 [settings.gradle.kts](settings.gradle.kts)。 - -## HFAS 内容 - -### 木材与植物 +| 0 | 原野之风:核心 / Wild Wind:Core | `wild_wind_core` | 杜鹃木及告示牌、悬挂告示牌、展示架;羊毛拆线;挣脱蜘蛛网;骷髅近战;耕地保护;窑炉;熔炼魔咒;结构生成;七种普通材料 | +| 1 | 原野之风:荒野更新 / Wild Wind:Wilderness Update | `wild_wind_wilderness` | 灵焰木、焚烬木;泥猪、泥沼蟹、恐鱼及相关道具;窒息、沉溺及呼吸规则;焦灰草方块、焦土、焦灰草丛、焦灰枝条;已有延展药水与延展之箭 | +| 2 | 原野之风:瘠土更新 / Wild Wind:Barren Update | `wild_wind_barren` | 仙人球 | -源码已注册三组木质方块: +- 核心可单独安装。荒野、瘠土分别依赖同版本核心,可以任选一个,也可以一起安装。 +- 安装荒野时,还需要 **GeckoLib 5.5.4 的 Minecraft 26.2 NeoForge 版本**;仅安装核心或核心+瘠土不需要 GeckoLib。 +- 客户端和服务端安装相同组合。所有已安装模块的物品汇入核心的「原野之风」创造分页,保留全局搜索。荒野的万用蟹钳与核心熔炼附魔可以联动。 +- 结构生成和七种普通材料暂归核心;结构配置路径、指令和 `ww_structures` 结构资源命名空间继续保留。 -| 木材 | 注册内容 | 树木相关实现 | -| --- | --- | --- | -| 焚烬木 `blaze` | 15 种方块 | 独立树叶、树苗;配置在下界废土生成 | -| 灵焰木 `soul` | 15 种方块 | 独立树叶、树苗;配置在灵魂沙峡谷生成 | -| 杜鹃木 `azalea` | 13 种方块 | 复用原版杜鹃植物与树叶;配置替换繁茂洞穴的原版杜鹃树生成 | +**自定义部件制箭系统暂时移除**:制箭台、方块实体、菜单、箭头/箭杆/箭羽数据组件、原版制箭台替换事件及配置均已移除。原版制箭台保持原版行为。已经完成的延展药水与延展之箭仍在荒野更新中。 -三组木材均包含原木、木头、去皮原木、去皮木头、木板、楼梯、台阶、栅栏、栅栏门、门、活板门、压力板和按钮。焚烬木、灵焰木另有树叶和树苗。 +### 更新旧版本 -此外已注册焦灰草方块、焦土、焦灰草丛、焦灰枝条、仙人球,并实现木材去皮映射和部分木质物品的燃料处理。方块物品统一放入创造模式「原野之风」分页。杜鹃施加骨粉的行为通过 Mixin 接入自定义树木生成。 +移除旧 `ww_hfas` 和独立 `ww_structures` JAR,再按需要安装新模块。加载器会阻止新旧模组同时加载。 -### 泥猪 +**此次更换了方块、物品、实体等注册 ID 的命名空间,没有实现旧 `ww_hfas:*` 存档自动迁移。请先备份旧存档,优先在新测试世界验证;旧内容、NBT 模板和数据包中的旧 ID 需要按模块改写。** 恐鱼的路径仍为 `piranha`,完整新 ID 为 `wild_wind_wilderness:piranha`。删除的自定义制箭台也不会自动恢复为原版方块。 -泥猪 `ww_hfas:muddy_pig` 使用项目提供的成年/幼年 Blockbench 模型与贴图,沿用原版猪的行走、转头动画、成年/幼年音效、食物与基础行为。两只泥猪可繁殖出泥猪幼崽,不与普通猪混种;掉落复用原版猪的掉落表。 +## 获取与测试 -- **自然生成**:沼泽 `minecraft:swamp`、红树林沼泽 `minecraft:mangrove_swamp`,生成权重 `10`,每群 `2–4` 只。 -- **生成条件**:允许原版动物生成地面、泥巴和沾泥的红树根;使用原版动物亮度条件(大于 `8`)与陆地空间检查,不在水中或实体碰撞空间内生成。仍受原版被动生物数量上限等自然生成规则约束。 -- **刷怪蛋**:`ww_hfas:muddy_pig_spawn_egg`,位于创造模式「原野之风」分页;图标复用原版猪刷怪蛋。对成年泥猪使用可生成泥猪幼崽。 +开启作弊或具备管理员权限后,在创造模式「原野之风」分页获取物品,也可以使用命令: ```mcfunction -/summon ww_hfas:muddy_pig ~ ~ ~ -/summon ww_hfas:muddy_pig ~ ~ ~ {Age:-24000} -/give @s ww_hfas:muddy_pig_spawn_egg +/give @s wild_wind_core:azalea_planks +/give @s wild_wind_core:azalea_sign +/give @s wild_wind_core:azalea_hanging_sign +/give @s wild_wind_core:azalea_shelf +/give @s wild_wind_core:kiln +/give @s wild_wind_core:duckweed 64 +/enchant @s wild_wind_core:melting 1 +/give @s wild_wind_wilderness:blaze_planks +/give @s wild_wind_wilderness:soul_planks +/give @s wild_wind_wilderness:muddy_pig_spawn_egg +/summon wild_wind_wilderness:muddy_pig ~ ~ ~ +/summon wild_wind_wilderness:mudcrab ~ ~ ~ +/summon wild_wind_wilderness:piranha ~ ~ ~ +/effect give @s wild_wind_wilderness:sink 60 +/effect give @s wild_wind_wilderness:choke 60 +/give @s wild_wind_wilderness:tipped_arrow 64 +/give @s wild_wind_barren:tiny_cactus ``` -资源与数据包调整方法、构建和测试说明见 [泥猪开发说明](docs/MUDDY_PIG.md)。 - -### 普通物品 - -以下七个物品均为普通材料,最大堆叠数量为 64,位于创造模式「原野之风」分页,使用提供的 16×16 图标。当前不附加食用、方块放置、合成或掉落行为。 - -| 中文名称 | 物品 ID | -| --- | --- | -| 浮萍 | `ww_hfas:duckweed` | -| 鱿鱼须 | `ww_hfas:calamari` | -| 熟鱿鱼须 | `ww_hfas:cooked_calamari` | -| 煎蛋 | `ww_hfas:cooked_egg` | -| 烤种子 | `ww_hfas:baked_seeds` | -| 熟蛙腿 | `ww_hfas:cooked_frog_legs` | -| 生蛙腿 | `ww_hfas:frog_legs` | - -例如 `/give @s ww_hfas:duckweed 64`。物品注册位于 `registry/ModItems.java`,图标保存在 `assets/ww_hfas/textures/item/`;模型与中英文翻译同时接入数据生成器。 - -### 杜鹃木告示牌、展示架与延展之箭 - -杜鹃木新增普通/悬挂式告示牌与展示架,提供原版双面文字、涂蜡、红石联动、快捷栏交换和漏斗交互。延展之箭注册为独立物品与实体,支持合成、制箭师随机交易及村庄英雄礼物。 - -```mcfunction -/give @s ww_hfas:azalea_sign -/give @s ww_hfas:azalea_hanging_sign -/give @s ww_hfas:azalea_shelf -/give @s ww_hfas:tipped_arrow 64 -/give @s ww_hfas:tipped_arrow[potion_contents={potion:"ww_hfas:long_reach"}] 64 -``` - -全部放入「原野之风」分页。配方、两种箭的时长、红石规则与测试说明见 [杜鹃木功能方块与延展之箭](docs/AZALEA_AND_REACH_ARROWS.md)。 - -### 窑炉 - -新增功能方块 **窑炉 `ww_hfas:kiln`**,暂时复用原版熔炉的模型、贴图、火焰粒子、声音和界面贴图,位于创造模式「原野之风」分页。 - -- 红砖按 `空/砖/空`、`砖/熔炉/砖`、`泥坯/泥坯/泥坯` 合成一个窑炉。 -- 每 **100 游戏刻(5 秒)** 烧炼一件;兼容符合条件的熔炉配方,排除矿物及金属装备。砂子、黏土球、圆石、仙人掌、木头、湿海绵等可用。 -- 支持上下/侧面漏斗、燃料容器返还、经验存储与领取、比较器、铁砧命名及物品谓词锁。燃烧时亮度 13,需要木镐或更好的镐采集,不能被活塞移动。 -- 新生成村庄的六种原版石匠屋模板会在切石机旁增加窑炉,原有石匠工作站保留;已生成的房屋不自动修改。 - -```mcfunction -/give @s ww_hfas:kiln -``` - -完整规则、燃料用量和测试命令见 [窑炉说明](docs/KILN.md)。 - -### 从远端合并的内容 - -`1.0.1` 在保留本地结构与玩法功能的基础上,合并了远端 `26.2` 分支(提交 `26ad2da`,2026 年 10 月 17 日)。包含泥沼蟹 `ww_hfas:mudcrab`、恐鱼 `ww_hfas:piranha`、对应刷怪蛋/生物桶、万用蟹钳、延展效果与药水,以及木材资源和配方更新。生物动画使用 GeckoLib。 - -泥沼蟹有温带、暖地、寒地三种数据驱动变种,恐鱼沿用远端丛林与沼泽生成设置。两种生物均已接入水下免缺氧名单。原食人鱼现统一显示为「恐鱼(Direfish)」,生鱼、熟鱼、刷怪蛋、鱼桶和音效字幕同步更名;为兼容已有存档,实体与相关物品继续使用原有的 `piranha` 注册 ID。召唤恐鱼使用 `/summon ww_hfas:piranha`。 - -远端附带的船、焚烬木/灵焰木告示牌和盆栽树苗仍未注册(杜鹃木告示牌已实现),其资源保留在源码中,对应无效配方、掉落表和进度不会打包。合并细节与验证范围见 [合并记录](docs/UPSTREAM_MERGE.md)。 +带有对应模块命名空间的命令需要先安装该模块。熔炼命令需手持可附魔工具。 -### 合成、蜘蛛网与状态效果 +七种普通材料均在核心,暂不具有食用行为:`duckweed` 浮萍、`calamari` 鱿鱼须、`cooked_calamari` 熟鱿鱼须、`cooked_egg` 煎蛋、`baked_seeds` 烤种子、`cooked_frog_legs` 熟蛙腿、`frog_legs` 生蛙腿。 -- **羊毛拆线**:任意颜色的一个羊毛与剪刀无序合成两个线。返还原剪刀,每次使用消耗一点耐久,受耐久附魔影响;最后一点耐久耗尽时剪刀损坏。支持背包、工作台与自动合成器。 -- **挣脱蜘蛛网**:实体在接触的蜘蛛网中持续移动 `30` 游戏刻后破坏该蜘蛛网;下坠接触时需 `160` 游戏刻。停止移动或离开会重置计时。蜘蛛、洞穴蜘蛛、旁观玩家和正在飞行的创造玩家不会触发。 -- **沉溺 `ww_hfas:sink`**:仅对设定名单中的 41 种原版实体及泥猪生效,阻止它们在流体中向上移动,保留水平与向下移动。 -- **窒息 `ww_hfas:choke`**:对名单中的 43 种原版实体及泥猪加快水下氧气消耗,I 级为 `2` 倍、II 级为 `3` 倍;保留水下呼吸药水与水下呼吸附魔的保护。蝌蚪、美西螈不加入该标签,单独在离水后加快缺氧;入水后无效。 -- **水下免缺氧名单**:按设定为 25 种原版生物提供水下呼吸保护,包括海豚、沼骸和指定亡灵等;即使获得窒息也不会因水下缺氧受伤。完整名单及泥沼蟹/恐鱼的兼容状态见 [生物适用名单](docs/GAMEPLAY.md#生物适用名单)。水下免缺氧与效果适用名单独立;幻翼现在不受沉溺和窒息影响。 +### 主要玩法 -### 骷髅近战与耕地保护 +- 任意羊毛+剪刀无序合成 2 个线;返还剪刀,扣 1 点耐久并受耐久附魔影响,支持自动合成器。 +- 非蜘蛛/洞穴蜘蛛实体连续移动 30 刻挣脱接触的蜘蛛网,下坠进入需要 160 刻;停止移动或离开重置。旁观玩家与飞行中的创造玩家不触发。 +- 骷髅、流浪者、沼骸、焦骸生成时有 10% 概率换石剑;后三者近战分别造成 30 秒缓慢 I、4 秒中毒 I、30 秒虚弱 I。 +- 穿戴摔落缓冲盔甲或具有缓降效果时,落到耕地不会踩坏耕地。 +- 窑炉使用原版熔炉外观,每 100 刻烧炼一件符合条件的材料,支持漏斗、比较器、经验、命名及锁定,新生成石匠屋增加窑炉。 +- 熔炼按实际掉落先结算时运;精准采集优先,不进行熔炼。每件消耗 1 点经验,整次经验不足则不触发。 +- 泥猪在沼泽与红树林沼泽自然生成,权重 10、每群 2–4 只;使用原版猪的动画、声音与基础行为,支持繁殖。 +- 沉溺限制名单内生物在流体中上浮;窒息加快名单内生物水下缺氧,蝌蚪/美西螈仅离水时生效。完整名单见玩法文档。 -- 骷髅、流浪者、沼骸、焦骸(`minecraft:parched`)生成装备时,有 **10%** 概率使用石剑并切换为近战 AI;读档不会重新判定。 -- 流浪者近战命中造成 **30 秒缓慢 I**,沼骸造成 **4 秒中毒 I**,焦骸造成 **30 秒虚弱 I**;普通骷髅没有额外近战效果。 -- 穿戴具有「摔落缓冲」附魔的盔甲,或具有「缓降」效果的实体,落到耕地上不会踩坏耕地。只保护耕地,伤害继续遵循原版规则;手持附魔盔甲无效。 +## 配置结构生成 -### 创造模式分页 - -所有已注册的模组方块物品、材料、食物、生物桶、刷怪蛋和万用蟹钳统一放入「原野之风」分页,同时收录延展药水各形态、延展药箭及熔炼附魔书。原版分类不再重复显示这些内容,全局搜索仍可找到它们。 - -### 熔炼附魔 - -**熔炼 `ww_hfas:melting`** 为最高 I 级的工具附魔。玩家用附魔工具挖掘时,按熔炉配方转换掉落物,每熔炼一个输入物品消耗 **1 点经验值(不是 1 级)**。 - -精准采集优先:工具有精准采集时不熔炼、不扣经验;有时运时先计算掉落数量,再判断熔炼。当前经验不足以处理本次全部可熔炼掉落时,整次保留原掉落且不扣经验。无熔炉配方的物品不受影响。 - -```mcfunction -/effect give @s ww_hfas:sink 60 -/effect give @s ww_hfas:choke 60 -/enchant @s ww_hfas:melting 1 -``` - -效果、附魔获取方式、完整规则及测试覆盖见 [新增玩法说明](docs/GAMEPLAY.md)。这些功能与结构、新物品、泥猪一起打包在同一个 `ww_hfas` 模组中。 - -### 制箭系统(开发中) - -目前包含自定义制箭台方块、方块实体、菜单、箭羽/箭杆/箭头枚举和箭矢数据组件。客户端界面与实际合成流程尚未完成,箭矢配方生成方法仍为空;当前不能视作完整可玩的制箭系统。 - -模型、语言、标签、掉落表和世界生成数据由数据生成器输出;从源码构建前请阅读[开发指南](docs/DEVELOPMENT.md)。纹理与注册 ID 的一致性也仍需整理。 - -## 安装与配置 - -### 结构生成模块 - -安装统一的 `ww_hfas-mc26.2-1.0.1.jar`,并同时安装 `geckolib-neoforge-26.2-5.5.4.jar`。客户端与服务端均需要匹配版本。构建命令为 `./gradlew :hfas:build`(Windows 使用 `.\gradlew.bat`),从源码构建前先完成下方两类数据生成。 - -从之前的双 JAR 版本更新时,将旧 HFAS JAR 替换为此文件,并移除旧的 `ww_structures` JAR,避免重复注册。已有 `config/ww_structures/`、`ww_structures:<结构名称>` ID 和存档中的坐标记录继续使用,无需改名。 - -首次创建或打开世界后,会在游戏/服务端实例目录创建: +启动世界后,在实例目录创建 `config/ww_structures/`: ```text config/ww_structures/ -├── definitions/ # 每个结构一个 JSON 配置 -├── templates/ # 原版结构方块导出的压缩 .nbt 文件 -│ └── example_ruins.nbt # 随附 7 × 4 × 7 遗迹示例 -└── example_ruins.json.disabled # 配置示例,默认不参与生成 +├── definitions/ # 每个结构一个 JSON +├── templates/ # 压缩 .nbt 结构模板,支持子目录 +│ └── example_ruins.nbt +└── example_ruins.json.disabled ``` -把示例配置复制为 `definitions/example_ruins.json`,将 `enabled` 改为 `true`,重启世界/服务器后即可在符合条件的新区块生成。可以配置模板文件名、群系与群系标签、生成间距、概率、随机盐、高度、旋转、地形起伏、流体与基础地形方块条件。 +把示例复制为 `definitions/example_ruins.json`,设置 `enabled: true`,重启世界/服务器。配置可指定模板文件、群系、间距、概率、高度、旋转和地形条件;只在符合条件的新区块生成。 ```mcfunction /wwstructure list @@ -183,79 +84,40 @@ config/ww_structures/ /wwstructure search example_ruins 16 ``` -`locate` 返回当前维度已记录的生成结构中,水平距离最近的一处坐标;记录随存档保存。`search` 使用原版结构搜索,可以查找尚未探索区域中的生成位置。命令需要管理员权限(与原版 `/locate` 一致)。 - -完整配置、条件含义、结构导出方法、停用规则和测试命令见 **[结构生成模块指南](docs/STRUCTURES.md)**。配置变更需要重启;不会给已生成区块补生成结构。 - -### HFAS 模块 - -取得经过验证、与上述 Minecraft / NeoForge 版本匹配的模组 JAR 后,将其放入对应实例的 `mods/` 目录。从源码生成 JAR 的步骤见下方。当前开发状态与待完善项见[开发指南](docs/DEVELOPMENT.md#待完善事项)。 - -HFAS 注册了一个 COMMON 配置项: - -| 配置键 | 默认值 | 作用 | -| --- | --- | --- | -| `worldgen.replaceVanillaFletchingTable` | `true` | 启用服务端原版制箭台替换逻辑 | +`locate` 查当前维度已记录生成结构的最近坐标;`search` 搜索可能尚未探索的生成位置。详细配置见 [结构生成指南](docs/STRUCTURES.md)。 -替换发生在方块放置事件及区块加载时。**已有存档中加载的区块也会受影响**:当前区块扫描从世界最低建造高度至固定 `Y=200`,将其中的原版制箭台替换为模组制箭台。关闭配置只会停止后续替换,不会自动恢复已经替换的方块。由于制箭流程尚未完成,测试前请结合这一行为选择配置。 +## 从源码构建 -## 从源码开始 - -准备 JDK 25,取得包含本次 26.2 适配的源码后,在仓库根目录执行。首次运行需要联网下载 Gradle、插件与游戏依赖。模组自身版本仍为 `1.0.1`,目标游戏版本为 `26.2`,JAR 文件名包含游戏版本以便区分。 +资源快照已随源码保存,普通构建不必先运行数据生成。在仓库根目录执行: ```powershell -# Windows PowerShell -.\gradlew.bat :hfas:runClientData -.\gradlew.bat :hfas:runServerData -.\gradlew.bat build +.\gradlew.bat build collectMods ``` -```bash -# Linux / macOS -chmod +x gradlew -./gradlew :hfas:runClientData -./gradlew :hfas:runServerData -./gradlew build -``` +Linux / macOS 使用 `./gradlew`。三个发行 JAR 收集在 `build/distributions/mods/`: -数据生成成功后再构建;若生成任务报错,请先处理报错,不要把缺少生成资源的 JAR 当作完整发行包。当前构建脚本未将数据生成任务自动接入 `build`。 +```text +wild_wind_core-mc26.2-1.0.1.jar +wild_wind_wilderness-mc26.2-1.0.1.jar +wild_wind_barren-mc26.2-1.0.1.jar +``` -HFAS 构建产物位于 `modules/hfas/build/libs/`,按当前配置命名为 `ww_hfas-mc26.2-1.0.1.jar`。开发客户端可通过 `:hfas:runClient` 启动。 +`datagen`、`verification`、`smoke` 是开发辅助项目,不安装到玩家实例,也不包含在上述发行目录。代码、资源分别位于 `src/core/`、`src/wilderness/`、`src/barren/`。 -## 项目结构 +修改生成器后运行两类数据生成,再将结果同步回模块资源目录: -```text -WildWindMod/ -├── src/ -│ ├── hfas/ -│ │ ├── java/ # HFAS 注册、玩法、配置与数据生成代码 -│ │ └── resources/ # 纹理、Blockbench 源文件、Mixin 配置等 -│ ├── structures/ -│ │ ├── java/ # 配置数据包、结构生成、坐标记录与指令 -│ │ ├── resources/ # 随统一 JAR 打包的示例配置、NBT 模板 -│ │ ├── test/ # JUnit 配置与持久化测试 -│ │ └── gametest/ # 接入 HFAS 的结构游戏测试与配置 -│ └── templates/ # 各模块共用的模组元数据模板 -├── modules/hfas/ # Gradle 配置时创建的子项目目录 -│ └── build/ # HFAS JAR、生成元数据和开发运行目录 -├── build/generated/hfas/ # 数据生成输出(client/、server/) -├── docs/DEVELOPMENT.md # 开发命令、源码导航与待完善项 -├── docs/STRUCTURES.md # 结构配置与坐标查询指南 -├── .github/workflows/build.yml # GitHub Actions 构建流程 -├── build.gradle.kts # 共用构建配置与模块任务 -├── settings.gradle.kts # 模块启用列表与项目目录映射 -├── gradle.properties # 版本、工具与模组属性 -└── CHANGE_LOG.MD # 历史变更记录 +```powershell +.\gradlew.bat :datagen:runClientData :datagen:runServerData +python scripts/sync_generated_resources.py +.\gradlew.bat build collectMods :verification:runGameTest ``` -`modules/hfas/` 是 Gradle 子项目目录,实际源码位于 `src/hfas/` 和 `src/structures/`,共同编译进一个模组。生成目录不纳入 Git;不要直接修改其中的文件,修改对应的数据生成器后重新生成。 - -## 参与开发 +完整命令、四种安装组合测试与工程约定见 [开发指南](docs/DEVELOPMENT.md)。 -欢迎通过 Issue 反馈问题、讨论功能,并通过 Pull Request 提交修改。提交前请阅读[开发指南](docs/DEVELOPMENT.md),注明目标分支、对应 Minecraft / NeoForge 版本、复现步骤及验证结果。历史记录见 [CHANGE_LOG.MD](CHANGE_LOG.MD),当前实现状态以本分支源码为准。 +## 功能文档 -## 许可证 +[结构生成](docs/STRUCTURES.md) · [泥猪](docs/MUDDY_PIG.md) · [玩法/效果/附魔](docs/GAMEPLAY.md) · [窑炉](docs/KILN.md) · [杜鹃木功能方块与延展之箭](docs/AZALEA_AND_REACH_ARROWS.md) -仓库 [LICENSE](LICENSE) 声明采用分项许可:源码使用 [GPL-3.0-only](LICENSE_CODE),资源、文档和配置等非代码内容使用 [CC-BY-SA-4.0](LICENSE_ASSETS)。具体条款请阅读对应文件。 +## 来源与许可 -当前 `gradle.properties` 中的 `modLicense` 仍为 `All Rights Reserved`,与上述仓库声明存在差异,需维护者统一元数据。 +本项目整理自 `Polari-Stars-MC/WildWindModule`,保留上游来源和贡献者信息,详见 [来源说明](docs/PROVENANCE.md)。仓库分项许可为 [GPL-3.0-only 代码许可](LICENSE_CODE) 与 [CC-BY-SA-4.0 资源许可](LICENSE_ASSETS),总说明见 [LICENSE](LICENSE)。`gradle.properties` 的 `modLicense` 仍为 `All Rights Reserved`,与仓库声明的差异留待维护者统一。 diff --git a/build.gradle.kts b/build.gradle.kts index acda0fe..57b59c9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,180 +1,151 @@ import org.slf4j.event.Level.INFO -import java.util.Locale plugins { `java-library` - `maven-publish` id("net.neoforged.moddev") version("2.0.148") - idea base } - - -//tasks.named("wrapper").configure { -// distributionType = Wrapper.DistributionType.BIN -//} - -val minecraftVersion: String by rootProject -val minecraftVersionRange: String by rootProject -val modName: String by rootProject -val modLicense: String by rootProject - -val geocklibVersion: String by rootProject - -allprojects { +val minecraftVersion: String by project +val minecraftVersionRange: String by project +val neoVersion: String by project +val modVersion: String by project +val modLicense: String by project +val modGroupId: String by project +val geocklibVersion: String by project +val releaseModules = listOf("core", "wilderness", "barren") +val smokeModules = providers.gradleProperty("testModules").orElse("core").get().split(",") +require(smokeModules.contains("core") && smokeModules.all { it in releaseModules }) { + "testModules must include core and may include wilderness and/or barren" +} +subprojects { apply(plugin = "java-library") - apply(plugin = "maven-publish") - apply(plugin = "idea") apply(plugin = "net.neoforged.moddev") - apply(plugin = "base") - val modGroupId: String by project - val modId: String by project - var projectModId = rootProject.name + "_" + project.name.lowercase(Locale.ROOT) - val modVersion: String by project - val neoVersion: String by project - if (project == rootProject) return@allprojects group = modGroupId version = modVersion - configure { - archivesName = "$projectModId-mc$minecraftVersion" - + val module = name + val modId = if (module == "verification") "wild_wind_tests" else "wild_wind_$module" + val moduleDependencies = when (module) { + "core" -> emptyList() + "wilderness", "barren" -> listOf("core") + "smoke" -> smokeModules + else -> releaseModules } - - var generateModMetadata = tasks.register("generatedMetadata") { - val replaceProperties = mapOf( - "minecraft_version" to minecraftVersion, - "minecraft_version_range" to minecraftVersionRange, - "neo_version" to neoVersion, - "mod_id" to projectModId, - "mod_name" to modName, - "mod_description" to "Wild Wind: plants, materials, muddy pigs and configurable structure generation.", - "mod_license" to modLicense, - "mod_version" to modVersion, - "geocklib_version" to geocklibVersion - ) - inputs.properties(replaceProperties) - expand(replaceProperties) + val usesGecko = module in listOf("wilderness", "datagen", "verification") || (module == "smoke" && "wilderness" in smokeModules) + base { archivesName = "$modId-mc$minecraftVersion" } + java.toolchain.languageVersion = JavaLanguageVersion.of(25) + repositories { + mavenCentral() + exclusiveContent { + forRepository { maven { url = uri("https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/") } } + filter { includeGroupAndSubgroups("com.geckolib") } + } + } + dependencies { + moduleDependencies.forEach { implementation(project(":$it")) } + compileOnly("org.projectlombok:lombok:1.18.44") + annotationProcessor("org.projectlombok:lombok:1.18.44") + if (usesGecko) implementation("com.geckolib:geckolib-neoforge-$minecraftVersion:$geocklibVersion") + testImplementation(platform("org.junit:junit-bom:5.13.4")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + } + val metadata = tasks.register("generatedMetadata") { + val titles = mapOf("core" to "Wild Wind:Core", "wilderness" to "Wild Wind:Wilderness Update", "barren" to "Wild Wind:Barren Update", "datagen" to "Wild Wind Data Generators", "verification" to "Wild Wind Integration Tests", "smoke" to "Wild Wind Installation Tests") + val extraDependencies = buildString { + moduleDependencies.forEach { dependency -> + append(""" + [[dependencies.$modId]] + modId="wild_wind_$dependency" + type="required" + versionRange="[$modVersion]" + ordering="AFTER" + side="BOTH" + """.trimIndent()) + append('\n') + } + if (usesGecko) append(""" + [[dependencies.$modId]] + modId="geckolib" + type="required" + versionRange="[$geocklibVersion,)" + ordering="NONE" + side="BOTH" + """.trimIndent()) + } + val mixins = when { + module in releaseModules -> "[[mixins]]\nconfig=\"$modId.mixins.json\"" + module == "verification" -> "[[mixins]]\nconfig=\"wild_wind_tests.mixins.json\"" + module == "smoke" -> "" + else -> "" + } + val properties = mapOf("mod_id" to modId, "mod_name" to titles.getValue(module), "mod_version" to modVersion, "mod_license" to modLicense, "neo_version" to neoVersion, "minecraft_version_range" to minecraftVersionRange, "module_dependencies" to extraDependencies, "module_mixins" to mixins) + inputs.properties(properties) + expand(properties) from(rootProject.file("src/templates")) - into("build/generated/sources/modMetadata") + into(layout.buildDirectory.dir("generated/sources/modMetadata")) } - - sourceSets { - rootProject.file("src/${project.name}/java").resolve(modGroupId.replace('.', '/')).mkdirs() main { - java { - srcDir(rootProject.file("src/${project.name}/java")) - } - resources { - srcDir(generateModMetadata) - srcDir(rootProject.file("build/generated/${project.name}/server")) - srcDir(rootProject.file("build/generated/${project.name}/client")) - srcDir(rootProject.file("src/${project.name}/resources")) - - exclude("**/*.bbmodel") - exclude("build/generated/**/.cache") - exclude("**/.cache/**") - } + java.setSrcDirs(listOf(rootProject.file("src/$module/java"))) + resources.setSrcDirs(listOf(rootProject.file("src/$module/resources"))) + resources.srcDir(metadata) + resources.exclude("**/*.bbmodel", "**/.cache/**") } + test { java.srcDir(rootProject.file("src/$module/test")) } } - - repositories { - exclusiveContent { - forRepository { - maven { - name = "GeckoLib" - url = uri("https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/") - } - } - - filter { - includeGroupAndSubgroups("com.geckolib") - } - } + tasks.withType().configureEach { options.encoding = "UTF-8" } + tasks.test { + useJUnitPlatform() + val directory = layout.buildDirectory.dir("test-runtime") + workingDir(directory) + doFirst { directory.get().asFile.mkdirs() } } - - java.toolchain.languageVersion = JavaLanguageVersion.of(25) - neoForge { version = neoVersion - - accessTransformers.from(rootProject.file("src/${project.name}/resources/META-INF/accesstransformer.cfg")) - + if (usesGecko) accessTransformers.from(rootProject.file("src/wilderness/resources/META-INF/accesstransformer.cfg")) + addModdingDependenciesTo(sourceSets.test.get()) + mods { register(modId) { sourceSet(sourceSets.main.get()) } } runs { - register("client") { - client() - systemProperty("neoforge.enabledGameTestNamespaces", projectModId) - gameDirectory = layout.buildDirectory.dir("runs/${project.name}/client").get().asFile - } - register("server") { - server() - programArgument("--nogui") - systemProperty("neoforge.enabledGameTestNamespaces", projectModId) - gameDirectory = layout.buildDirectory.dir("runs/${project.name}/server").get().asFile - } - register("clientData") { - clientData() - gameDirectory = layout.buildDirectory.dir("runs/${project.name}/datagen").get().asFile - programArguments.addAll( - listOf( - "--mod", projectModId, - "--all", - "--output", rootProject.file("build/generated/${project.name}/client").absolutePath, - "--existing", rootProject.file("src/${project.name}/resources").absolutePath, - ) - ) + register("client") { client() } + register("server") { server(); programArgument("--nogui") } + if (module == "datagen") { + register("clientData") { + clientData() + programArguments.addAll("--mod", modId, "--all", "--output", rootProject.file("build/generated/datagen/client").absolutePath) + } + register("serverData") { + serverData() + programArguments.addAll("--mod", modId, "--all", "--output", rootProject.file("build/generated/datagen/server").absolutePath) + } } - register("serverData") { - serverData() - gameDirectory = layout.buildDirectory.dir("runs/${project.name}/datagen").get().asFile - programArguments.addAll( - listOf( - "--mod", projectModId, - "--all", - "--output", rootProject.file("build/generated/${project.name}/server").absolutePath, - "--existing", rootProject.file("src/${project.name}/resources").absolutePath, - ) - ) + if (module in listOf("verification", "smoke")) { + register("gameTest") { + type = "gameTestServer" + programArguments.addAll("--tests", "$modId:*", "--report", "results.xml") + if (module == "smoke") systemProperty("wildwind.testModules", smokeModules.joinToString(",")) + } } configureEach { - systemProperty("forge.logging.markers", "REGISTRIES") + if (module == "smoke" && providers.gradleProperty("clientSmoke").orElse("false").get() == "true") { + systemProperty("wildwind.clientSmoke", "true") + } + val variant = if (module == "smoke") "/${smokeModules.joinToString("-")}" else "" + gameDirectory = layout.buildDirectory.dir("runs/$name$variant") logLevel.set(INFO) } } - - mods { - register(projectModId) { - sourceSet(sourceSets["main"]) - } - } - - } - - neoForge.ideSyncTask(generateModMetadata) - - val localRuntime by configurations.registering - - configurations { - runtimeClasspath { - extendsFrom(localRuntime.get()) - } - } - - dependencies { - compileOnly("org.projectlombok:lombok:1.18.44") - annotationProcessor("org.projectlombok:lombok:1.18.44") - implementation("com.geckolib:geckolib-neoforge-$minecraftVersion:$geocklibVersion") - } - - tasks.withType().configureEach { - options.encoding = "UTF-8" - } - - idea { - module { - isDownloadJavadoc = true - isDownloadSources = true + if (module == "verification") { + val prepare by tasks.registering(Sync::class) { + from(rootProject.file("src/verification/config")) + from(rootProject.file("src/core/resources/examples/example_ruins.nbt")) { into("ww_structures/templates") } + into(layout.buildDirectory.dir("runs/gameTest/config")) } + neoForge.runs.named("gameTest") { taskBefore(prepare) } } } +tasks.register("collectMods") { + description = "Collect only the three distributable mod JARs (no development tools)." + releaseModules.forEach { module -> from(project(":$module").tasks.named("jar")) } + into(layout.buildDirectory.dir("distributions/mods")) +} diff --git a/docs/AZALEA_AND_REACH_ARROWS.md b/docs/AZALEA_AND_REACH_ARROWS.md index 483f965..6e99790 100644 --- a/docs/AZALEA_AND_REACH_ARROWS.md +++ b/docs/AZALEA_AND_REACH_ARROWS.md @@ -1,31 +1,33 @@ +> 模块归属:杜鹃木告示牌、悬挂告示牌、展示架在核心;延展药水与延展之箭在荒野。自定义部件制箭系统已暂时移除。 + # 杜鹃木功能方块与延展之箭 -适用:Minecraft 26.2 / NeoForge 26.2.0.93,统一模组 `ww_hfas`。所有新增物品在创造模式「原野之风」分页,也可以全局搜索。本文档中的 ID 使用项目实际命名空间 `ww_hfas`;需求稿中的 `wwhfas` 统一为该命名空间。 +适用:Minecraft 26.2 / NeoForge 26.2.0.93。物品集中在创造模式「原野之风」分页,支持全局搜索。本文命令使用拆分后的模块命名空间。 ## 获取与配方 | 内容 | 物品 ID | 配方 | 数量 | | --- | --- | --- | --- | -| 杜鹃木告示牌 | `ww_hfas:azalea_sign` | 前两行各 3 块杜鹃木板,第三行中间 1 根木棍 | 3 | -| 悬挂式杜鹃木告示牌 | `ww_hfas:azalea_hanging_sign` | 第一行左右各 1 根铁链,后两行各 3 根去皮杜鹃原木 | 6 | -| 杜鹃木展示架 | `ww_hfas:azalea_shelf` | 第一、三行各 3 根去皮杜鹃原木,中间一行留空 | 6 | -| 延展之箭 | `ww_hfas:tipped_arrow` | 中央滞留型延展药水,周围 8 支原版箭 | 8 | +| 杜鹃木告示牌 | `wild_wind_core:azalea_sign` | 前两行各 3 块杜鹃木板,第三行中间 1 根木棍 | 3 | +| 悬挂式杜鹃木告示牌 | `wild_wind_core:azalea_hanging_sign` | 第一行左右各 1 根铁链,后两行各 3 根去皮杜鹃原木 | 6 | +| 杜鹃木展示架 | `wild_wind_core:azalea_shelf` | 第一、三行各 3 根去皮杜鹃原木,中间一行留空 | 6 | +| 延展之箭 | `wild_wind_wilderness:tipped_arrow` | 中央滞留型延展药水,周围 8 支原版箭 | 8 | ```mcfunction -/give @s ww_hfas:azalea_sign 3 -/give @s ww_hfas:azalea_hanging_sign 6 -/give @s ww_hfas:azalea_shelf 6 -/give @s ww_hfas:tipped_arrow 64 -/give @s ww_hfas:tipped_arrow[potion_contents={potion:"ww_hfas:long_reach"}] 64 -/give @s minecraft:lingering_potion[potion_contents={potion:"ww_hfas:reach"}] -/give @s minecraft:lingering_potion[potion_contents={potion:"ww_hfas:long_reach"}] +/give @s wild_wind_core:azalea_sign 3 +/give @s wild_wind_core:azalea_hanging_sign 6 +/give @s wild_wind_core:azalea_shelf 6 +/give @s wild_wind_wilderness:tipped_arrow 64 +/give @s wild_wind_wilderness:tipped_arrow[potion_contents={potion:"wild_wind_wilderness:long_reach"}] 64 +/give @s minecraft:lingering_potion[potion_contents={potion:"wild_wind_wilderness:reach"}] +/give @s minecraft:lingering_potion[potion_contents={potion:"wild_wind_wilderness:long_reach"}] ``` 两种告示牌最大堆叠 16,展示架与箭最大堆叠 64。方块不添加自然生成。 ## 告示牌 -普通告示牌有站立和墙面两种方块,悬挂式有吊顶和墙面两种方块。墙面 ID 分别为 `ww_hfas:azalea_wall_sign`、`ww_hfas:azalea_wall_hanging_sign`,由同一对应物品根据放置位置选择。 +普通告示牌有站立和墙面两种方块,悬挂式有吊顶和墙面两种方块。墙面 ID 分别为 `wild_wind_core:azalea_wall_sign`、`wild_wind_core:azalea_wall_hanging_sign`,由同一对应物品根据放置位置选择。 - 继承原版朝向、支撑检查、含水、链条连接与碰撞行为。普通和吊顶告示牌无碰撞,墙面悬挂式仅上方横杆有碰撞。 - 正反面各四行文字,支持放置时编辑、再次编辑、染料、荧光墨囊、墨囊与蜜脾涂蜡。沿用原版编辑者锁定及服务器文本校验。 @@ -52,7 +54,7 @@ ## 延展之箭 -独立物品为 `ww_hfas:tipped_arrow`,射出的实体为 `ww_hfas:arrow`。直接给予该物品时默认带普通延展药水成分。 +独立物品为 `wild_wind_wilderness:tipped_arrow`,射出的实体为 `wild_wind_wilderness:arrow`。直接给予该物品时默认带普通延展药水成分。 | 中央药水 | 箭命中后效果 | | --- | --- | @@ -70,7 +72,7 @@ ## 已执行验证 -客户端/服务端数据生成、构建、11 项单元测试、24 组服务端 GameTest 均通过。另启动开发客户端完成资源加载并正常退出,未发现本次新增资源缺失或 Mixin 加载错误;日志仍有原项目制箭台、焦灰草方块及未注册木材资源的既有材质警告,本次未修改这些内容。新增五组测试覆盖: +模块拆分后的客户端/服务端数据生成、构建、11 项单元测试、24 组服务端 GameTest 均通过。核心单独安装及完整组合的客户端完成资源加载并自动退出。仍有焦灰草方块及未注册木材模型的既有材质警告。新增五组测试覆盖: 1. 四种告示牌的有效方块实体、双面文字/颜色/发光/蜡存档、管理员数据限制、掉落、含水属性、硬度、活塞和燃料。 2. 展示架所有 8 种比较器组合、主手整组交换、库存与对齐存档、漏斗抽取、物品能力、燃料和可燃性。 diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index c04f768..22133fd 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -1,98 +1,76 @@ # 开发指南 -本指南对应 Minecraft `26.2` 适配代码。项目介绍、版本与模块状态见 [README](../README.md)。 +本项目面向 Minecraft 26.2、NeoForge 26.2.0.93、JDK 25。使用仓库 Gradle Wrapper;首次下载依赖需要网络。 -## 环境与构建 +## 工程结构 -- 使用 JDK 25;`build.gradle.kts` 为模块设置了 Java 25 工具链。 -- 使用仓库自带的 Gradle Wrapper,无需单独安装 Gradle。 -- Gradle 配置了 Foojay 工具链解析器,但首次依赖下载仍需要可用网络。 -- 当前只启用 `hfas`(`ww_hfas`)一个子项目;新物品、泥猪与 `src/structures/` 中的结构功能统一编译和打包。 -- 远端生物依赖 GeckoLib 5.5.4;Gradle 从 GeckoLib 官方 Maven 仓库获取依赖,游戏客户端与服务端也需要安装对应 26.2 NeoForge JAR。 +| Gradle 项目 | 源码目录 | 用途与依赖 | +| --- | --- | --- | +| `core` | `src/core/` | 模块 0;无需 GeckoLib,不引用两个可选模块 | +| `wilderness` | `src/wilderness/` | 模块 1;依赖 Core 与 GeckoLib 5.5.4 | +| `barren` | `src/barren/` | 模块 2;只依赖 Core | +| `datagen` | `src/datagen/` | 开发用数据生成器;加载全部模块 | +| `verification` | `src/verification/` | 开发用 24 组综合 GameTest;加载全部模块 | +| `smoke` | `src/smoke/` | 开发用安装组合测试;由 `testModules` 选择依赖 | -以下命令均在仓库根目录执行,Windows 使用 `.\gradlew.bat`,Linux / macOS 使用 `./gradlew`: +发行模块有各自的入口、注册器、Mixin、资源、元数据与 JAR。`src/templates/` 是元数据模板。辅助项目不放入发行目录。 -| 操作 | Windows PowerShell 命令 | -| --- | --- | -| 查看模块任务 | `.\gradlew.bat :hfas:tasks --all` | -| 生成客户端数据 | `.\gradlew.bat :hfas:runClientData` | -| 生成服务端数据 | `.\gradlew.bat :hfas:runServerData` | -| 构建项目 | `.\gradlew.bat build` | -| 启动开发客户端 | `.\gradlew.bat :hfas:runClient` | -| 启动开发服务端 | `.\gradlew.bat :hfas:runServer` | -| 清理构建输出 | `.\gradlew.bat clean` | -| 全部单元测试(模型与结构) | `.\gradlew.bat :hfas:test` | -| 联合游戏测试(物品、泥猪、结构与新增玩法) | `.\gradlew.bat :hfas:runGameTest` | -| 构建统一模组 | `.\gradlew.bat :hfas:build` | +核心包 `org.polaris2023.wildwind.core` 包含杜鹃木、窑炉、通用玩法、熔炼和材料;`org.polaris2023.wildwind.structures` 同样位于核心源码中,保留结构兼容命名空间。荒野包为 `org.polaris2023.wildwind.wilderness`,瘠土包为 `org.polaris2023.wildwind.barren`。 -这些运行入口来自构建脚本中的 `client`、`server`、`clientData`、`serverData` 配置。依赖解析成功是运行任务的前提。 +核心提供创造分页和 `WildWindModules` 命名空间判断;扩展模块通过事件将自己的物品加入分页。荒野的蟹钳挖掘与核心熔炼事件协作,不要求核心反向引用荒野类型。 -### 数据生成顺序 +## 构建与开发运行 -HFAS 首次构建、清理后构建,或修改数据生成代码后,按顺序执行客户端数据生成、服务端数据生成、`build`。开发运行前也应先生成所需资源。任一步失败时,先解决失败原因再继续。结构功能的资源已直接包含在源码中并随 HFAS 打包,无需单独的数据生成,配置与测试说明见 [STRUCTURES.md](STRUCTURES.md)。 +Windows 在仓库根目录执行;其他系统把 `.\gradlew.bat` 改为 `./gradlew`。 -| 输出目录 | 来源与内容 | -| --- | --- | -| `build/generated/hfas/client/` | 模型、`en_us` / `zh_cn` 语言文件 | -| `build/generated/hfas/server/` | 方块与物品标签、掉落表、世界生成、数据映射、配方生成入口 | -| `modules/hfas/build/generated/sources/modMetadata/` | 从 `src/templates/` 展开的模组元数据 | -| `modules/hfas/build/libs/` | 构建的 JAR | -| `modules/hfas/build/runs/hfas/` | 开发客户端、服务端及数据生成的运行目录 | +```powershell +# 资源快照随源码保存,干净检出即可构建 +.\gradlew.bat build collectMods +# 核心 / 核心+荒野 / 核心+瘠土开发客户端 +.\gradlew.bat :core:runClient +.\gradlew.bat :wilderness:runClient +.\gradlew.bat :barren:runClient +# 全部模块开发客户端(加载仅供开发的测试模组) +.\gradlew.bat :smoke:runClient -PtestModules=core,wilderness,barren +``` -泥猪的实体贴图、刷怪蛋定义、七个普通物品的贴图与模型、最低限度的中英文翻译与生成/掉落数据直接保存在源码中,单独运行 `:hfas:build` 也能打包;数据生成后的完整翻译及物品模型优先于源码中的备用文件。其他 HFAS 内容仍应遵循上述数据生成顺序。 +单个模块产物在 `modules/<模块>/build/libs/`,发行集合在 `build/distributions/mods/`。开发世界、日志和测试报告在对应模块 `build/` 下,不纳入版本控制。 -生成资源被加入模块的资源集,但 `build` 不会自动先运行数据生成,`clean` 会删除生成结果。生成器是否输出了完整内容还取决于其具体实现,例如当前箭矢配方生成方法为空。 +## 数据生成 -CI 使用 JDK 25,按顺序执行客户端数据生成、服务端数据生成、构建及统一 GameTest。`.bbmodel` 文件作为建模源文件保存在源码资源目录中,打包时被排除。生成的 JSON 优先于源码备用资源;未注册的船、焚烬木/灵焰木告示牌、盆栽树苗相关资源过滤规则见 `modules/hfas/build.gradle.kts`。 +```powershell +.\gradlew.bat :datagen:runClientData :datagen:runServerData +python scripts/sync_generated_resources.py +.\gradlew.bat build collectMods +``` -## 源码导航 +需要 Python 3.9+。生成输出在 `build/generated/datagen/{client,server}/`;同步脚本按注册命名空间分配到三个模块资源目录,并拆分原版/公共标签、数据映射和语言文件。手工资源保留;修改生成器时应提交生成后的快照。删除某项生成内容时,同时删除其已提交的旧快照,避免旧资源残留。 -HFAS Java 包根目录为 `src/hfas/java/org/polaris2023/wildwind/hfas/`。 +模型 Provider 检查三个命名空间的所有已注册方块和物品。未注册的船、焚烬木/灵焰木告示牌等源素材保留,不应为它们新增有效配方。`.bbmodel` 源文件不打入发行 JAR。历史占位材质问题见进度文档。 -| 入口 / 目录 | 职责 | -| --- | --- | -| `HFASMod.java` | 模组入口,注册方块、物品、菜单、方块实体、组件与配置 | -| `block/`、`block/entity/` | 方块、制箭台及窑炉方块实体 | -| `registry/` | 统一物品、实体、属性、效果、药水、数据组件和创造物品栏注册 | -| `item/` | 万用蟹钳行为、恐鱼食物属性 | -| `entity/`、`client/` | 泥猪、泥沼蟹、恐鱼行为及模型渲染,呼吸/沉溺/窒息实体标签 | -| `menu/` | 制箭台与窑炉菜单、槽位逻辑 | -| `arrow/`、`component/` | 箭矢部件定义与数据组件序列化 | -| `config/` | COMMON 配置规范 | -| `event/` | 制箭台替换、燃料事件、蜘蛛网计时、骷髅近战与耕地保护 | -| `recipe/` | 羊毛与剪刀的无序合成、剪刀返还及耐久 | -| `effect/`、`enchantment/` | 沉溺、窒息效果与消耗经验的熔炼附魔 | -| `worldgen/` | 树木、放置特征、生物群系修改器及石匠屋窑炉处理器 | -| `mixin/` | 杜鹃骨粉生长、自动合成器剪刀耐久、流体中上浮限制、蝌蚪/美西螈离水窒息、铁傀儡窒息耗氧 | -| `datagen/` | 客户端 / 服务端数据生成入口和各类 Provider | +`build` 不会启动游戏数据生成器,避免构建循环;CI 会显式重新生成、同步并检查快照一致性。 -修改资源时注意命名空间 `ww_hfas`,同时核对注册 ID、模型纹理引用、语言键、标签与配方。`gradle.properties` 中的 `modId=wild_wind` 没有直接作为 HFAS 的最终 ID;当前构建脚本通过根项目名 `ww` 与模块名 `hfas` 组合得到 `ww_hfas`。 +## 验证 -## 模块维护 +```powershell +.\gradlew.bat :core:test :wilderness:test +.\gradlew.bat :verification:runGameTest +.\gradlew.bat :smoke:runGameTest -PtestModules=core +.\gradlew.bat :smoke:runGameTest -PtestModules=core,wilderness +.\gradlew.bat :smoke:runGameTest -PtestModules=core,barren +.\gradlew.bat :smoke:runGameTest -PtestModules=core,wilderness,barren +# 可选本机客户端启动检查:进入标题画面并完成资源检查后自动退出 +.\gradlew.bat :smoke:runClient -PtestModules=core,wilderness,barren -PclientSmoke=true +``` -模块规划采用编号 **0:原野之风:核心(Wild Wind:Core)**、**1:原野之风:荒野更新(Wild Wind:Wilderness Update)**、**2:原野之风:瘠土更新(Wild Wind:Barren Update)**。对应的规划模组 ID 分别为 `wild_wind_core`、`wild_wind_wilderness`、`wild_wind_barren`,统一使用 `wild_wind_` 前缀。功能归属、代码拆分及运行时 ID 迁移尚待落实,当前构建仍使用 `hfas` 子项目与 `ww_hfas` 模组 ID。 +安装组合测试加载实际发行模块 JAR,核对依赖、GeckoLib、模块内容归属、创造分页及制箭台移除。各组合使用不同运行目录。综合 GameTest 覆盖结构生成/指令、泥猪、羊毛/剪刀、蜘蛛网、状态效果名单、窑炉、骷髅、耕地、创造分页、杜鹃木功能方块、延展箭及蟹钳联动。 -当前构建约定将 `src/<模块名>/java/` 和 `src/<模块名>/resources/` 接入相应子项目。`modules/hfas/build.gradle.kts` 额外接入 `src/structures/` 的代码、资源和测试,由 `HFASMod` 调用 `StructureModule.register`;结构功能没有独立 `@Mod` 入口。`modules/<模块名>/` 在配置阶段创建。新增模块需要同步修改 `settings.gradle.kts` 的启用列表,并核对模组入口、资源命名空间、Mixin 配置与共用元数据模板。仅在 README 增加模块名称不会生成可用模块。 +若中文 Windows 路径下 JUnit 出现类找不到,而 `.class` 确实存在,可加 `"-Dorg.gradle.jvmargs=-Xmx1G -Dfile.encoding=GBK"` 使 Gradle 参数文件编码匹配本机 Java 启动器;源码始终 UTF-8。 -## 待完善事项 +## ID 与存档 -以下项目根据当前源码整理,是后续开发清单,不代表已完成功能: +新注册内容使用各自 `wild_wind_*` 命名空间。旧 `ww_hfas:*` 内容没有自动存档映射,不要在唯一旧存档上直接升级。结构的 `ww_structures` 配置、结构 ID 和坐标索引保留,但 NBT 模板内引用旧模组方块时仍需更新。完整分配与安装要求见 [README](../README.md)。 -- **制箭交互**:补齐客户端 Screen 与注册,核对菜单和方块实体的容器连接、槽位数量及快捷移动索引;当前制箭台没有注册对应方块物品。 -- **箭矢玩法**:实现配方生成及实际合成流程,并验证部件数据的保存、网络同步与效果行为。 -- **未完成木材内容**:远端已补入 `blaze_*` / `soul_*` 纹理;船、焚烬木/灵焰木告示牌、盆栽树苗仍未注册;杜鹃木告示牌与展示架已实现,相关不可用数据暂不打包。 -- **数据生成与打包**:CI 已显式生成数据并运行测试;本地 `build` 仍不自动触发数据生成,须遵循本页顺序。 -- **存档行为**:验证制箭台对旧区块的替换逻辑、扫描范围与性能;README 已记录默认开启和不会自动回滚的行为。 -- **元数据**:由维护者统一 `modLicense` 与仓库许可证声明。 -- **模块划分**:按编号 0「核心」、1「荒野更新」、2「瘠土更新」明确功能归属,再落实对应的代码与构建调整;当前仍统一打包。 +自定义部件制箭台和旧替换配置已移除;历史代码可从 Git 历史查阅。已完成的延展药水箭在荒野中保留。 -## 提交前验证 - -新增合成、蜘蛛网、状态效果和熔炼的行为与游戏测试覆盖见 [GAMEPLAY.md](GAMEPLAY.md)。统一游戏测试共 24 组,包含骷髅生成与近战、耕地保护、创造分页、远端内容集成、生物适用名单、两栖生物离水窒息、窑炉烧炼/容器/村庄生成、杜鹃木告示牌/展示架及延展之箭获取与行为,以及原有的物品、泥猪与结构测试。 - -文档改动应核对相对链接、命令、版本和模块状态,并执行 `git diff --check`。 - -涉及代码或资源的改动,应按影响范围运行数据生成与构建,再进行对应客户端或服务端验证;世界生成与制箭台替换需要同时关注新世界及已有区块。Pull Request 中应写明实际执行的检查,以及尚未验证的部分。 - - -杜鹃木告示牌和展示架通过 `BlockEntityTypeAddBlocksEvent` 扩展原版方块实体支持,沿用原版网络包、渲染器和库存能力。告示牌文本的客户端 Mixin 仅修改杜鹃木颜色与亮度。`ReachArrowItem` / `ReachArrow` 沿用原版药箭行为;合成与药水掉落函数仅在延展药水时转换物品,村民交易继续使用原版数据池。详细设计与测试见 [AZALEA_AND_REACH_ARROWS.md](AZALEA_AND_REACH_ARROWS.md)。 +提交前运行 `git diff --check`,按改动范围执行上述测试;服务端自动测试不替代游戏内视觉、多人联机和长期存档验收。 diff --git a/docs/GAMEPLAY.md b/docs/GAMEPLAY.md index e550be1..192ee47 100644 --- a/docs/GAMEPLAY.md +++ b/docs/GAMEPLAY.md @@ -1,10 +1,10 @@ # 新增玩法说明 -适用于当前 Minecraft 26.2 / NeoForge 的统一模组 `ww_hfas`。安装文件为 `ww_hfas-mc26.2-1.0.1.jar`,同时包含结构生成、泥猪、七个普通物品及本页玩法。 +适用于 Minecraft 26.2 / NeoForge。羊毛、蜘蛛网、骷髅、耕地、窑炉和熔炼在核心;沉溺、窒息与呼吸规则在荒野,安装组合见 README。 ## 窑炉 -`ww_hfas:kiln` 是同一模组内的功能方块,使用原版熔炉外观,每 100 刻烧炼一件非矿物、非金属装备材料。完整获取方式、漏斗、经验、命名、锁定和村庄生成规则见 [窑炉说明](KILN.md)。 +`wild_wind_core:kiln` 是同一模组内的功能方块,使用原版熔炉外观,每 100 刻烧炼一件非矿物、非金属装备材料。完整获取方式、漏斗、经验、命名、锁定和村庄生成规则见 [窑炉说明](KILN.md)。 ## 羊毛拆线 @@ -14,7 +14,7 @@ - 每次合成尝试消耗剪刀 1 点耐久,调用原版耐久规则,因此耐久附魔有概率免除本次损耗。 - 剪刀的附魔、自定义名称等组件保留;耗尽最后一点耐久时剪刀消失。 - 每次实际合成都独立判定耐久,连续/Shift 合成同样适用。 -- 配方 ID 与序列化类型均为 `ww_hfas:wool_to_string`。这是自定义特殊配方,直接放入材料即可合成。 +- 配方 ID 与序列化类型均为 `wild_wind_core:wool_to_string`。这是自定义特殊配方,直接放入材料即可合成。 ## 蜘蛛网挣脱 @@ -37,8 +37,8 @@ | 效果 | ID | 行为 | | --- | --- | --- | -| 沉溺 | `ww_hfas:sink` | 只对下方沉溺名单生效。接触流体时限制向上位移与向上速度,包括水与熔岩;水平、向下移动仍可进行。更高等级不叠加额外限制。 | -| 窒息 | `ww_hfas:choke` | 对下方窒息名单中的实体,眼睛浸在水中时加速消耗氧气;I 级 2 倍、II 级 3 倍,依此类推。蝌蚪、美西螈单独在陆地处理。 | +| 沉溺 | `wild_wind_wilderness:sink` | 只对下方沉溺名单生效。接触流体时限制向上位移与向上速度,包括水与熔岩;水平、向下移动仍可进行。更高等级不叠加额外限制。 | +| 窒息 | `wild_wind_wilderness:choke` | 对下方窒息名单中的实体,眼睛浸在水中时加速消耗氧气;I 级 2 倍、II 级 3 倍,依此类推。蝌蚪、美西螈单独在陆地处理。 | 窒息名单中的青蛙、海龟、骆驼尸壳及铁傀儡也会消耗水下氧气。水下呼吸、潮涌能量、鹦鹉螺之息的药水效果及气泡柱仍提供呼吸保护,创造模式无敌玩家也不受影响;水下呼吸附魔跳过消耗的刻仍保持零消耗。普通名单内实体离水后正常恢复氧气。 @@ -54,7 +54,7 @@ **蝌蚪、美西螈的窒息特例**:不放入 `choke_affected` 标签。代码单独检查 `isInWater()`,在水中不触发;离水后将原版缺氧/干燥消耗提高至 I 级 2 倍、II 级 3 倍。氧气耗尽时继续使用原版伤害与重置规则。美西螈仍保留雨水补水及 NoAI 时不干燥的原版行为。入水后恢复原版补氧。 -**模组生物**:泥猪 `ww_hfas:muddy_pig` 继续同时受沉溺和水中窒息影响;泥沼蟹与恐鱼继续免于水下缺氧。 +**模组生物**:泥猪 `wild_wind_wilderness:muddy_pig` 继续同时受沉溺和水中窒息影响;泥沼蟹与恐鱼继续免于水下缺氧。 两份效果名单均按实体 ID 精确匹配。幻翼现不受这两个效果影响;哞菇、行商羊驼现已加入两份名单。所有其他未列入的实体不受相应效果的移动限制或额外氧气消耗,包括用户列出的不生效实体。窒息不生效不等于获得新的水下呼吸能力,未获免缺氧保护的生物仍可能正常溺水。哞兽 `moobloom` 和冻尸 `frosted_zombie` 当前未注册,也未添加任何必需标签引用。 @@ -62,18 +62,18 @@ | 生物 | 实体 ID | 状态 | | --- | --- | --- | -| 泥沼蟹 | `ww_hfas:mudcrab` | 已随远端 `26.2` 分支合并,当前版本实际注册并通过水下呼吸测试 | -| 恐鱼(Direfish,原食人鱼) | `ww_hfas:piranha` | 已实际注册并通过水下呼吸测试;更名后沿用原 ID,兼容已有存档 | +| 泥沼蟹 | `wild_wind_wilderness:mudcrab` | 已随远端 `26.2` 分支合并,当前版本实际注册并通过水下呼吸测试 | +| 恐鱼(Direfish,原食人鱼) | `wild_wind_wilderness:piranha` | 已实际注册并通过水下呼吸测试;更名后沿用原 ID,兼容已有存档 | -上述两个 ID 以 `required: false` 加入标签。`1.0.1` 已包含泥沼蟹和恐鱼的完整实现;恐鱼、生恐鱼、熟恐鱼、恐鱼刷怪蛋、恐鱼桶及音效字幕均使用新名称,英文为 Direfish。召唤恐鱼使用 `/summon ww_hfas:piranha`。标签中旧的可选预留项 `ww_hfas:direfish` 保留兼容,但它不是已注册的实体 ID,也不是召唤别名。安装时需要 GeckoLib 5.5.4 的 Minecraft 26.2 NeoForge 版本。 +上述两个 ID 以 `required: false` 加入标签。`1.0.1` 已包含泥沼蟹和恐鱼的完整实现;恐鱼、生恐鱼、熟恐鱼、恐鱼刷怪蛋、恐鱼桶及音效字幕均使用新名称,英文为 Direfish。召唤恐鱼使用 `/summon wild_wind_wilderness:piranha`。标签中旧的可选预留项 `wild_wind_core:direfish` 保留兼容,但它不是已注册的实体 ID,也不是召唤别名。安装时需要 GeckoLib 5.5.4 的 Minecraft 26.2 NeoForge 版本。 ### 用数据包调整名单 | 标签 | 数据包文件 | | --- | --- | -| `ww_hfas:water_breathing` | `data/ww_hfas/tags/entity_type/water_breathing.json` | -| `ww_hfas:sink_affected` | `data/ww_hfas/tags/entity_type/sink_affected.json` | -| `ww_hfas:choke_affected` | `data/ww_hfas/tags/entity_type/choke_affected.json` | +| `wild_wind_wilderness:water_breathing` | `data/wild_wind_wilderness/tags/entity_type/water_breathing.json` | +| `wild_wind_wilderness:sink_affected` | `data/wild_wind_wilderness/tags/entity_type/sink_affected.json` | +| `wild_wind_wilderness:choke_affected` | `data/wild_wind_wilderness/tags/entity_type/choke_affected.json` | 在数据包中使用同路径 JSON 即可扩展名单。例如,让自定义生物受到沉溺影响: @@ -90,20 +90,20 @@ ```mcfunction # 持续 60 秒,默认 I 级 -/effect give @s ww_hfas:sink 60 -/effect give @s ww_hfas:choke 60 +/effect give @s wild_wind_wilderness:sink 60 +/effect give @s wild_wind_wilderness:choke 60 # 窒息 II,指令中的等级参数从 0 开始 -/effect give @s ww_hfas:choke 60 1 -/effect clear @s ww_hfas:sink -/effect clear @s ww_hfas:choke +/effect give @s wild_wind_wilderness:choke 60 1 +/effect clear @s wild_wind_wilderness:sink +/effect clear @s wild_wind_wilderness:choke ``` ## 熔炼附魔 -- ID:`ww_hfas:melting`,中文「熔炼」,英文「Melting」,最高 I 级。 +- ID:`wild_wind_core:melting`,中文「熔炼」,英文「Melting」,最高 I 级。 - 支持 `minecraft:enchantable/mining` 标签中的工具,包括镐、斧、锹、锄与剪刀。 - 加入原版非宝藏附魔标签,沿用原版相应的附魔台、附魔书交易及随机附魔入口。 -- 手持工具执行 `/enchant @s ww_hfas:melting 1` 可直接添加。 +- 手持工具执行 `/enchant @s wild_wind_core:melting 1` 可直接添加。 处理顺序如下: @@ -150,11 +150,11 @@ ## 创造模式物品栏 -所有已注册的模组方块物品与普通物品集中在「原野之风」分页,ID 为 `ww_hfas:wild_wind`,图标使用泥沼蟹桶。另收录两种延展药水的普通/喷溅/滞留形态、对应药箭和熔炼 I 附魔书。原版分类中的重复入口已移除,全局搜索仍能找到模组内容。以后加入 `ModBlocks.ITEMS` 或 `ModItems.ITEMS` 的物品会自动收录。 +所有已注册的模组方块物品与普通物品集中在「原野之风」分页,ID 为 `wild_wind_core:wild_wind`,图标使用杜鹃木板。另收录两种延展药水的普通/喷溅/滞留形态、对应药箭和熔炼 I 附魔书。原版分类中的重复入口已移除,全局搜索仍能找到模组内容。以后加入 `ModBlocks.ITEMS` 或 `ModItems.ITEMS` 的物品会自动收录。 ## 开发与验证 -代码位于 `src/hfas/java/org/polaris2023/wildwind/hfas/`: +代码分别位于 `src/core/java/org/polaris2023/wildwind/core/` 与 `src/wilderness/java/org/polaris2023/wildwind/wilderness/`: | 路径 | 用途 | | --- | --- | @@ -168,14 +168,15 @@ | `event/FarmlandProtection.java` | 摔落缓冲/缓降的耕地踩踏保护 | | `registry/ModCreativeTabs.java` | 独立创造分页及原版重复内容移除 | -配方、附魔及附魔标签直接保存在 `src/hfas/resources/data/`;效果图标位于 `assets/ww_hfas/textures/mob_effect/`。中英文翻译同步维护源码备用资源与语言数据生成器。 +配方、附魔及附魔标签直接保存在 `src/core/resources/data/`;效果图标位于 `src/wilderness/resources/assets/wild_wind_wilderness/textures/mob_effect/`。中英文翻译同步维护源码备用资源与语言数据生成器。 在 JDK 25 环境执行: ```powershell -.\gradlew.bat :hfas:runClientData -.\gradlew.bat :hfas:runServerData -.\gradlew.bat :hfas:build :hfas:runGameTest +.\gradlew.bat :datagen:runClientData +.\gradlew.bat :datagen:runServerData +python scripts/sync_generated_resources.py +.\gradlew.bat build collectMods :verification:runGameTest ``` `GameplayGameTests` 注册 16 组游戏测试:所有颜色羊毛与槽位顺序、手动连续合成及 Shift 转移、剪刀损坏与耐久附魔、红石驱动的自动合成器、水/熔岩中的沉溺、窒息与呼吸保护、蜘蛛网 30/160 刻边界及豁免、实际实体刻事件、精准采集与时运优先级、经验不足、跨等级扣费及原版方块掉落路径。其中 `FluidEntityRulesGameTests` 核对两份效果名单的完整 ID 集合,逐类验证水下免缺氧名单(含泥沼蟹与恐鱼)、沉溺移动限制,以及所有窒息生效实体的实际水中耗氧、等级倍率和呼吸保护。另有 `land_choke` 测试蝌蚪与美西螈的真实陆地耗氧、伤害阈值、移除效果及返回水中的恢复,并确认共享基类中的鳕鱼不受影响。`UpstreamIntegrationGameTests` 检查泥沼蟹变种、生物桶、恐鱼熔炉配方、延展属性,以及万用蟹钳中的熔炼工具通过真实玩家挖掘路径扣费并产生铁锭。`SkeletonAndFarmlandGameTests` 新增四组测试:固定种子下四类骷髅各 200 次真实生成及武器 AI,三种近战效果的时长/等级和失败攻击,真实摔落路径的耕地保护与剩余伤害,以及模组分页完整性、药水去重与全局搜索。`KilnGameTests` 的三组测试验证窑炉的合成与方块属性、100 刻边界、原料排除、燃料及读档、输出阻塞、湿海绵装水、漏斗流向与取出顺序、经验领取、命名锁定、比较器、破坏掉落,以及六种石匠屋各四个旋转方向的真实结构池放置。另有原来的物品、泥猪与结构测试,加上杜鹃木告示牌、展示架、展示架红石联动、延展箭行为及获取途径五组测试,合计 24 组游戏测试。预留的 `direfish` 项只验证不阻断标签加载,无法执行实体行为测试。 @@ -183,4 +184,4 @@ ## 杜鹃木功能方块与延展之箭 -普通/悬挂式告示牌、三槽展示架及独立延展之箭已接入同一个模组,全部位于“原野之风”分页。获取命令、配方、红石交换、交易与英雄礼物规则见 [详细说明](AZALEA_AND_REACH_ARROWS.md)。 +普通/悬挂式告示牌和三槽展示架归核心,独立延展之箭归荒野,全部位于“原野之风”分页。获取命令、配方、红石交换、交易与英雄礼物规则见 [详细说明](AZALEA_AND_REACH_ARROWS.md)。 diff --git a/docs/KILN.md b/docs/KILN.md index 7dfb55c..c29165f 100644 --- a/docs/KILN.md +++ b/docs/KILN.md @@ -1,14 +1,14 @@ # 窑炉(Kiln) -窑炉是 Minecraft 26.2 / NeoForge 统一模组 `ww_hfas` 中的功能方块,方块和物品 ID 均为 `ww_hfas:kiln`。目前复用原版熔炉四向模型、点燃模型、界面贴图、烟雾/火焰粒子和燃烧声,显示名称为「窑炉」。后续可以独立替换模型。 +窑炉是 Minecraft 26.2 / NeoForge 核心模组 `wild_wind_core` 中的功能方块,方块和物品 ID 均为 `wild_wind_core:kiln`。目前复用原版熔炉四向模型、点燃模型、界面贴图、烟雾/火焰粒子和燃烧声,显示名称为「窑炉」。后续可以独立替换模型。 ## 获取与合成 位于创造模式「原野之风」分页,沿用本项目所有模组物品集中分页的设置。最大堆叠为 64。 ```mcfunction -/give @s ww_hfas:kiln -/setblock ~ ~ ~ ww_hfas:kiln[facing=north] +/give @s wild_wind_core:kiln +/setblock ~ ~ ~ wild_wind_core:kiln[facing=north] ``` 工作台配方如下,红砖使用 `minecraft:brick`,泥坯使用 `minecraft:packed_mud`: @@ -27,9 +27,9 @@ 原料限制由以下规则共同决定: -- `ww_hfas:kiln_excluded` 排除标签默认包含公共的矿石、粗金属、锭、粒、宝石标签。 +- `wild_wind_core:kiln_excluded` 排除标签默认包含公共的矿石、粗金属、锭、粒、宝石标签。 - 具有高炉配方的原料排除,覆盖原版矿物和金属装备回收。 -- 可损耗耐久的物品若烧炼产物属于 `ww_hfas:kiln_metal_outputs`(默认锭、粒),也会排除。 +- 可损耗耐久的物品若烧炼产物属于 `wild_wind_core:kiln_metal_outputs`(默认锭、粒),也会排除。 上方输入槽和顶部漏斗拒绝不符合条件的物品。即使使用指令强行写入不合格原料也不会烧炼或点火。数据包可扩展这两个物品标签;已有配方随世界配方加载/重载生效。 diff --git a/docs/MUDDY_PIG.md b/docs/MUDDY_PIG.md index 34e4a6b..a0236ed 100644 --- a/docs/MUDDY_PIG.md +++ b/docs/MUDDY_PIG.md @@ -1,13 +1,13 @@ # 泥猪 · Muddy Pig -泥猪加入 HFAS(`ww_hfas`),使用 Minecraft **26.2**、NeoForge **26.2.0.93**、Java **25**。与新物品及结构生成共用同一个模组和 JAR。 +泥猪属于荒野更新(`wild_wind_wilderness`),使用 Minecraft **26.2**、NeoForge **26.2.0.93**、Java **25**。需要核心与 GeckoLib;新材料和结构生成功能由核心提供。 ## 资源和动画 -- 实体 ID:`ww_hfas:muddy_pig`。 -- 刷怪蛋 ID:`ww_hfas:muddy_pig_spawn_egg`,复用原版猪刷怪蛋图标。 -- 提供的 `pig_muddy.bbmodel`、`pig_muddy_baby.bbmodel` 原样保留在 `src/hfas/resources/assets/ww_hfas/models/entity/pig/`,不会打入 JAR。 -- 成年 64×64、幼年 32×32 PNG 原样保留在 `src/hfas/resources/assets/ww_hfas/textures/entity/pig/`。 +- 实体 ID:`wild_wind_wilderness:muddy_pig`。 +- 刷怪蛋 ID:`wild_wind_wilderness:muddy_pig_spawn_egg`,复用原版猪刷怪蛋图标。 +- 提供的 `pig_muddy.bbmodel`、`pig_muddy_baby.bbmodel` 原样保留在 `src/wilderness/resources/assets/wild_wind_wilderness/models/entity/pig/`,不会打入 JAR。 +- 成年 64×64、幼年 32×32 PNG 原样保留在 `src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/pig/`。 - `MuddyPigModel` 将两个模型转换成 Java 模型层。Blockbench 坐标转换为 `(-x, 24-y, z)`,成年身体旋转后重新设置中心;腿部使用关节轴,头饰与头共用动画。 - 模型继承原版 `PigModel`,不引入 GeckoLib 或额外动画库;声音和 AI 继承原版 `Pig`。成年和幼年使用各自的模型/贴图,不重复缩放幼年模型。 - 属性为原版猪的 10 点生命和 0.25 移动速度;食物使用 `minecraft:pig_food` 标签。两只泥猪繁殖出泥猪,普通猪不会与泥猪交配。掉落表引用 `minecraft:entities/pig`。 @@ -18,14 +18,14 @@ 默认在沼泽和红树林沼泽生成,权重 10、每群 2–4 只。权重是群系生物列表内的相对权重,不代表百分比或每区块固定数量。沿用原版动物亮度大于 8 的条件,以及陆地空间、碰撞、距离和生物数量上限检查。 -以下源码资源可作为数据包覆盖目标,命名空间都是 `ww_hfas`: +以下源码资源可作为数据包覆盖目标,命名空间都是 `wild_wind_wilderness`: -| 路径(相对 `src/hfas/resources/`) | 用途 | +| 路径(相对 `src/wilderness/resources/`) | 用途 | | --- | --- | -| `data/ww_hfas/neoforge/biome_modifier/add_muddy_pig.json` | `neoforge:add_spawns`,调整权重和每群数量 | -| `data/ww_hfas/tags/worldgen/biome/spawns_muddy_pig.json` | 默认仅包含 `minecraft:swamp`、`minecraft:mangrove_swamp` | -| `data/ww_hfas/tags/block/muddy_pig_spawnable_on.json` | `#minecraft:animals_spawnable_on`、泥巴、沾泥的红树根 | -| `data/ww_hfas/loot_table/entities/muddy_pig.json` | 引用原版猪的掉落表 | +| `data/wild_wind_wilderness/neoforge/biome_modifier/add_muddy_pig.json` | `neoforge:add_spawns`,调整权重和每群数量 | +| `data/wild_wind_wilderness/tags/worldgen/biome/spawns_muddy_pig.json` | 默认仅包含 `minecraft:swamp`、`minecraft:mangrove_swamp` | +| `data/wild_wind_wilderness/tags/block/muddy_pig_spawnable_on.json` | `#minecraft:animals_spawnable_on`、泥巴、沾泥的红树根 | +| `data/wild_wind_wilderness/loot_table/entities/muddy_pig.json` | 引用原版猪的掉落表 | 自定义生成群系时,数据包可用 `replace: true` 覆盖群系标签。新增地面仍须满足原版陆地生成的承载与空间检查。更改群系修改器后重启世界/服务器;自然生成仍受原版规则限制,进入群系不保证立即看到泥猪。 @@ -34,22 +34,23 @@ 在仓库根目录使用 JDK 25 按顺序执行: ```powershell -.\gradlew.bat :hfas:runClientData -.\gradlew.bat :hfas:runServerData -.\gradlew.bat build -.\gradlew.bat :hfas:runGameTest +.\gradlew.bat :datagen:runClientData +.\gradlew.bat :datagen:runServerData +python scripts/sync_generated_resources.py +.\gradlew.bat build collectMods +.\gradlew.bat :verification:runGameTest ``` -输出 `modules/hfas/build/libs/ww_hfas-mc26.2-1.0.1.jar`。客户端与服务端都安装匹配版本的 HFAS JAR,并安装远端生物所需的 GeckoLib 5.5.4(26.2 NeoForge)。泥猪本身仍使用原版模型动画代码。不要将测试模组或 `.bbmodel` 作为游戏模组安装。 +发行 JAR 位于 `build/distributions/mods/`。泥猪需要客户端和服务端都安装匹配版本的核心、荒野 JAR,以及 GeckoLib 5.5.4(26.2 NeoForge)。泥猪本身仍使用原版模型动画代码。不要将测试模组或 `.bbmodel` 作为游戏模组安装。 -`build` 包含模型单元测试:检查成年/幼年模型边界和九个原始立方体,比较两种年龄的头部/四腿动画与原版猪。统一 GameTest 模组仅用于 `:hfas:runGameTest`,检查实体属性、食物、繁殖、生物蛋、掉落表加载、两个目标群系的实际生成列表,以及草地/泥地/沾泥红树根的生成条件和水/障碍拒绝条件。普通客户端和服务端运行不加载测试模组。 +`build` 包含模型单元测试:检查成年/幼年模型边界和九个原始立方体,比较两种年龄的头部/四腿动画与原版猪。统一 GameTest 模组仅用于 `:verification:runGameTest`,检查实体属性、食物、繁殖、生物蛋、掉落表加载、两个目标群系的实际生成列表,以及草地/泥地/沾泥红树根的生成条件和水/障碍拒绝条件。普通客户端和服务端运行不加载测试模组。 手动检查命令: ```mcfunction -/summon ww_hfas:muddy_pig ~ ~ ~ -/summon ww_hfas:muddy_pig ~ ~ ~ {Age:-24000} -/give @s ww_hfas:muddy_pig_spawn_egg +/summon wild_wind_wilderness:muddy_pig ~ ~ ~ +/summon wild_wind_wilderness:muddy_pig ~ ~ ~ {Age:-24000} +/give @s wild_wind_wilderness:muddy_pig_spawn_egg /locate biome minecraft:swamp /locate biome minecraft:mangrove_swamp ``` diff --git a/docs/STRUCTURES.md b/docs/STRUCTURES.md index 817b96c..2645a84 100644 --- a/docs/STRUCTURES.md +++ b/docs/STRUCTURES.md @@ -1,10 +1,10 @@ -# 结构生成功能 · 内置于 ww_hfas +# 结构生成功能 · 内置于 wild_wind_core -为 Minecraft **26.2 / NeoForge 26.2.0.93 / Java 25** 添加可配置的世界结构。本功能与新物品、泥猪共用 `ww_hfas` 模组和同一个 JAR;`ww_structures` 仅作为兼容旧配置与存档的资源命名空间保留。每个结构由一个 JSON 配置与一个原版压缩 NBT 模板组成,无需编写 Java 或手工创建数据包。 +为 Minecraft **26.2 / NeoForge 26.2.0.93 / Java 25** 添加可配置的世界结构。本功能与七种普通材料归入核心 `wild_wind_core`,无需荒野模块;`ww_structures` 仅作为兼容旧配置与存档的资源命名空间保留。每个结构由一个 JSON 配置与一个原版压缩 NBT 模板组成,无需编写 Java 或手工创建数据包。 ## 1. 创建第一个结构 -1. 安装统一的 `ww_hfas-mc26.2-1.0.1.jar`(更新旧版时移除原来的独立 `ww_structures` JAR),创建或打开世界,使配置目录初始化,然后关闭世界/服务器。 +1. 安装核心 `wild_wind_core-mc26.2-1.0.1.jar`(更新旧版时移除原来的独立 `ww_structures` JAR),创建或打开世界,使配置目录初始化,然后关闭世界/服务器。 2. 在实例目录中找到 `config/ww_structures/`。专用服务器使用服务器自己的目录;客户端加入服务器时,以服务器配置为准。 3. 将 `example_ruins.json.disabled` 复制到 `definitions/example_ruins.json`,把 `enabled` 改为 `true`。 4. 保留随附的 `templates/example_ruins.nbt`,或换成自己的结构方块模板。 @@ -142,9 +142,9 @@ config/ww_structures/ Windows PowerShell: ```powershell -.\gradlew.bat :hfas:test -.\gradlew.bat :hfas:runGameTest -.\gradlew.bat :hfas:build +.\gradlew.bat :core:test :wilderness:test +.\gradlew.bat :verification:runGameTest +.\gradlew.bat build collectMods ``` Linux / macOS 将 `.\gradlew.bat` 换成 `./gradlew`。单元测试覆盖配置边界、路径越界、关闭生成时保留定义、资源输出、模板尺寸与坐标索引序列化。统一 GameTest 模组联合加载新物品、泥猪与结构功能,检查配置数据包加载、原版搜索、实际区块生成、模板方块、片段 NBT 保存恢复和指令执行;不会打包进发行 JAR。 @@ -153,6 +153,6 @@ GameTest 使用 `modules/hfas/build/runs/hfas/gameTest/` 下的专用临时世 测试模组在专用 GameTest 世界启用原版默认关闭的结构生成,并为超平坦预设添加测试结构集合。这些改动只存在于测试资源中。普通超平坦世界若指定了 `structure_overrides`,也需将自己的结构集合加入允许列表;常规默认地形世界没有这项超平坦限制。 -若中文 Windows 路径下 JUnit 报 `ClassNotFoundException`,但对应 `.class` 已存在,可临时使用 `.\gradlew.bat :hfas:test "-Dorg.gradle.jvmargs=-Xmx1G -Dfile.encoding=GBK"`,使 Gradle 参数文件与本机 Java 启动器编码一致。源码仍以 UTF-8 编译;此参数无需写入仓库配置。 +若中文 Windows 路径下 JUnit 报 `ClassNotFoundException`,但对应 `.class` 已存在,可临时使用 `.\gradlew.bat :core:test :wilderness:test "-Dorg.gradle.jvmargs=-Xmx1G -Dfile.encoding=GBK"`,使 Gradle 参数文件与本机 Java 启动器编码一致。源码仍以 UTF-8 编译;此参数无需写入仓库配置。 -实际代码在 `src/structures/java/`,直接编入 HFAS,由 `StructureModule.register` 初始化:`config` 负责配置和不可变资源快照,`worldgen` 注册结构类型/模板片段及坐标索引,`command` 注册查询指令。配置资源通过强制启用的服务器数据包 `ww_structures/config` 接入原版世界生成。 +实际代码在 `src/core/java/org/polaris2023/wildwind/structures/`,直接编入 Core,由 `StructureModule.register` 初始化:`config` 负责配置和不可变资源快照,`worldgen` 注册结构类型/模板片段及坐标索引,`command` 注册查询指令。配置资源通过强制启用的服务器数据包 `ww_structures/config` 接入原版世界生成。 diff --git a/gradle.properties b/gradle.properties index 814ac06..dea6ccc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,11 +18,7 @@ neoVersion=26.2.0.93 ## Mod Properties -# The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} -# Must match the String constant located in the main mod class annotated with @Mod. -modId=wild_wind -# The human-readable display name for the mod. -modName=Wild Wind +# Module IDs and titles are defined per project in build.gradle.kts. # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. modLicense=All Rights Reserved # The mod version. See https://semver.org/ diff --git a/modules/hfas/build.gradle.kts b/modules/hfas/build.gradle.kts deleted file mode 100644 index 8c3204c..0000000 --- a/modules/hfas/build.gradle.kts +++ /dev/null @@ -1,76 +0,0 @@ -// Structure generation is an internal feature of HFAS and shares its mod entry point. -sourceSets.main { - java.srcDir(rootProject.file("src/structures/java")) - resources.srcDir(rootProject.file("src/structures/resources")) -} - -// Generated files take precedence over checked-in fallbacks for builds without datagen. -tasks.processResources { - filesMatching(listOf("assets/**/*.json", "data/**/*.json")) { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - } - // Keep filtering unfinished boats, non-azalea signs and potted saplings. - // Keep the source assets, but do not load recipes/loot/advancements for absent content. - listOf("azalea", "blaze", "soul").forEach { wood -> - val unfinished = if (wood == "azalea") listOf("boat", "chest_boat") - else listOf("boat", "chest_boat", "sign", "hanging_sign", "wall_sign", "wall_hanging_sign") - unfinished.forEach { kind -> - exclude("data/ww_hfas/recipe/${wood}_${kind}.json") - exclude("data/ww_hfas/loot_table/blocks/${wood}_${kind}.json") - exclude("data/ww_hfas/advancement/recipes/**/${wood}_${kind}.json") - exclude("assets/ww_hfas/blockstates/${wood}_${kind}.json") - } - exclude("data/ww_hfas/loot_table/blocks/potted_${wood}_sapling.json") - exclude("assets/ww_hfas/blockstates/potted_${wood}_sapling.json") - } -} - -sourceSets.test { - java.srcDir(rootProject.file("src/hfas/test")) - java.srcDir(rootProject.file("src/structures/test")) -} -repositories { mavenCentral() } -dependencies { - testImplementation(platform("org.junit:junit-bom:5.13.4")) - testImplementation("org.junit.jupiter:junit-jupiter") - testRuntimeOnly("org.junit.platform:junit-platform-launcher") -} -tasks.test { - useJUnitPlatform() - val runtimeDirectory = layout.buildDirectory.dir("test-runtime") - workingDir(runtimeDirectory) - doFirst { runtimeDirectory.get().asFile.mkdirs() } -} -val gameTest by sourceSets.creating { - java.srcDir(rootProject.file("src/hfas/gametest/java")) - java.srcDir(rootProject.file("src/structures/gametest/java")) - resources.srcDir(rootProject.file("src/hfas/gametest/resources")) - resources.srcDir(rootProject.file("src/structures/gametest/resources")) - compileClasspath += sourceSets.main.get().output - runtimeClasspath += sourceSets.main.get().output -} -configurations[gameTest.implementationConfigurationName].extendsFrom(configurations.implementation.get()) -configurations[gameTest.runtimeOnlyConfigurationName].extendsFrom(configurations.runtimeOnly.get()) -val prepareGameTest by tasks.registering(Sync::class) { - from(rootProject.file("src/hfas/gametest/config")) - from(rootProject.file("src/structures/gametest/config")) - from(rootProject.file("src/structures/resources/examples/example_ruins.nbt")) { - into("ww_structures/templates") - } - into(layout.buildDirectory.dir("runs/hfas/gameTest/config")) -} -neoForge { - addModdingDependenciesTo(sourceSets.test.get()) - addModdingDependenciesTo(gameTest) - val mainMod = mods.getByName("ww_hfas") - val testMod = mods.create("ww_hfas_tests") { sourceSet(gameTest) } - runs.configureEach { loadedMods.set(setOf(mainMod)) } - runs.register("gameTest") { - type = "gameTestServer" - sourceSet = gameTest - loadedMods.set(setOf(mainMod, testMod)) - gameDirectory = layout.buildDirectory.dir("runs/hfas/gameTest") - programArguments.addAll("--tests", "ww_hfas_tests:*", "--report", "results.xml") - taskBefore(prepareGameTest) - } -} diff --git a/scripts/sync_generated_resources.py b/scripts/sync_generated_resources.py new file mode 100644 index 0000000..f83eddf --- /dev/null +++ b/scripts/sync_generated_resources.py @@ -0,0 +1,70 @@ +"""Copy datagen output into its owning release module; split shared tags/maps/languages. + +Run after :datagen:runClientData and :datagen:runServerData. Hand-authored +resources not emitted by datagen are preserved. No local paths or dependencies. +""" +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +MODULES = ("core", "wilderness", "barren") + + +def owner(value): + for module in MODULES: + if "wild_wind_" + module in value: + return module + # Vanilla potion translation keys and sound subtitles have no mod namespace. + if any(token in value for token in ("reach", "piranha", "mudcrab")): + return "wilderness" + return "core" + + +def save(module, relative, value, merge=False): + path = ROOT / "src" / module / "resources" / relative + path.parent.mkdir(parents=True, exist_ok=True) + if merge and path.exists(): + value = json.loads(path.read_text(encoding="utf-8")) | value + path.write_text(json.dumps(value, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + + +def main(): + count = 0 + for side in ("client", "server"): + directory = ROOT / "build/generated/datagen" / side + if not directory.is_dir(): + raise SystemExit(f"Missing {directory}; run both datagen tasks first.") + for path in sorted(directory.rglob("*.json")): + relative = path.relative_to(directory) + if relative.parts[0] not in ("assets", "data"): + continue + data = json.loads(path.read_text(encoding="utf-8")) + if "lang" in relative.parts: + groups = {module: {} for module in MODULES} + for key, value in data.items(): + if "fletching_table" not in key and "arrow_component" not in key: + groups[owner(key)][key] = value + for module, entries in groups.items(): + save(module, f"assets/wild_wind_{module}/lang/{path.name}", entries, merge=True) + elif relative.parts[1] in ("minecraft", "neoforge", "c") and ("tags" in relative.parts or "data_maps" in relative.parts): + maps = "data_maps" in relative.parts + groups = {module: {} if maps else [] for module in MODULES} + if maps: + for key, value in data["values"].items(): + groups[owner(key)][key] = value + else: + for value in data["values"]: + groups[owner(value if isinstance(value, str) else value["id"])].append(value) + for module, values in groups.items(): + if values: + save(module, relative, data | {"values": values}) + else: + (ROOT / "src" / module / "resources" / relative).unlink(missing_ok=True) + else: + save(owner(str(relative)), relative, data) + count += 1 + print(f"Synced {count} generated resources into three release modules.") + + +if __name__ == "__main__": + main() diff --git a/settings.gradle.kts b/settings.gradle.kts index 247830d..4f0ce04 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,14 +8,14 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version("1.0.0") } -val let = listOf("hfas") -let.forEach { +val modules = listOf("core", "wilderness", "barren", "datagen", "verification", "smoke") +modules.forEach { include(it) - var f = file("modules/$it") + val f = file("modules/$it") f.mkdirs() project(":$it").projectDir = f } -rootProject.name = "ww" +rootProject.name = "wild_wind" diff --git a/src/barren/java/org/polaris2023/wildwind/barren/BarrenMod.java b/src/barren/java/org/polaris2023/wildwind/barren/BarrenMod.java new file mode 100644 index 0000000..7576681 --- /dev/null +++ b/src/barren/java/org/polaris2023/wildwind/barren/BarrenMod.java @@ -0,0 +1,14 @@ +package org.polaris2023.wildwind.barren; +import net.minecraft.resources.Identifier; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; +import org.polaris2023.wildwind.barren.block.ModBlocks; + +@Mod(BarrenMod.MOD_ID) +public final class BarrenMod { + public static final String MOD_ID = "wild_wind_barren"; + public BarrenMod(IEventBus bus) { + ModBlocks.register(bus); + } + public static Identifier id(String path) { return Identifier.fromNamespaceAndPath(MOD_ID, path); } +} diff --git a/src/barren/java/org/polaris2023/wildwind/barren/block/ModBlocks.java b/src/barren/java/org/polaris2023/wildwind/barren/block/ModBlocks.java new file mode 100644 index 0000000..0adf67f --- /dev/null +++ b/src/barren/java/org/polaris2023/wildwind/barren/block/ModBlocks.java @@ -0,0 +1,47 @@ +package org.polaris2023.wildwind.barren.block; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.barren.BarrenMod; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +/** + * 方块注册类 + * 使用NeoForge 26.1的DeferredRegister方式注册方块 + * 注意:方块和物品分开注册,避免延迟注册bug + * + * @author baka4n + * @since 2026/04/15 + */ +//TODO 考虑迁移至registry目录下,或将registry目录下的注册条目分散到各目录下 +public class ModBlocks { + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(BarrenMod.MOD_ID); + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(BarrenMod.MOD_ID); + public static final DeferredBlock TINY_CACTUS = BLOCKS.registerBlock( + "tiny_cactus", + p -> new Block(p + .mapColor(MapColor.PLANT) + .noCollision() + .instabreak() + .sound(SoundType.WOOL) + .pushReaction(PushReaction.DESTROY)) + ); + + private static void blockItems() { + ITEMS.registerSimpleBlockItem(TINY_CACTUS); + } + public static void register(IEventBus bus) { BLOCKS.register(bus); blockItems(); ITEMS.register(bus); } +} diff --git a/src/barren/java/org/polaris2023/wildwind/barren/event/CreativeContents.java b/src/barren/java/org/polaris2023/wildwind/barren/event/CreativeContents.java new file mode 100644 index 0000000..e096518 --- /dev/null +++ b/src/barren/java/org/polaris2023/wildwind/barren/event/CreativeContents.java @@ -0,0 +1,18 @@ +package org.polaris2023.wildwind.barren.event; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; +import org.polaris2023.wildwind.core.registry.ModCreativeTabs; +import org.polaris2023.wildwind.barren.BarrenMod; +import org.polaris2023.wildwind.barren.block.ModBlocks; + +@EventBusSubscriber(modid = BarrenMod.MOD_ID) +public final class CreativeContents { + @SubscribeEvent public static void populate(BuildCreativeModeTabContentsEvent event) { + if (!event.getTabKey().equals(ModCreativeTabs.WILD_WIND.getKey())) return; + ModBlocks.ITEMS.getEntries().forEach(item -> event.accept(item.get())); + + } +} diff --git a/src/barren/resources/assets/wild_wind_barren/blockstates/tiny_cactus.json b/src/barren/resources/assets/wild_wind_barren/blockstates/tiny_cactus.json new file mode 100644 index 0000000..fac7424 --- /dev/null +++ b/src/barren/resources/assets/wild_wind_barren/blockstates/tiny_cactus.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_barren:block/tiny_cactus" + } + } +} diff --git a/src/barren/resources/assets/wild_wind_barren/items/tiny_cactus.json b/src/barren/resources/assets/wild_wind_barren/items/tiny_cactus.json new file mode 100644 index 0000000..d93d51a --- /dev/null +++ b/src/barren/resources/assets/wild_wind_barren/items/tiny_cactus.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_barren:block/tiny_cactus" + } +} diff --git a/src/barren/resources/assets/wild_wind_barren/lang/en_us.json b/src/barren/resources/assets/wild_wind_barren/lang/en_us.json new file mode 100644 index 0000000..6e03346 --- /dev/null +++ b/src/barren/resources/assets/wild_wind_barren/lang/en_us.json @@ -0,0 +1,4 @@ +{ + "block.wild_wind_barren.tiny_cactus": "Tiny Cactus", + "mod.wild_wind.barren": "Wild Wind:Barren Update" +} diff --git a/src/barren/resources/assets/wild_wind_barren/lang/zh_cn.json b/src/barren/resources/assets/wild_wind_barren/lang/zh_cn.json new file mode 100644 index 0000000..de6f87a --- /dev/null +++ b/src/barren/resources/assets/wild_wind_barren/lang/zh_cn.json @@ -0,0 +1,4 @@ +{ + "block.wild_wind_barren.tiny_cactus": "仙人球", + "mod.wild_wind.barren": "原野之风:瘠土更新" +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/tiny_cactus.json b/src/barren/resources/assets/wild_wind_barren/models/block/tiny_cactus.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/models/block/tiny_cactus.json rename to src/barren/resources/assets/wild_wind_barren/models/block/tiny_cactus.json index f9c70b5..6c0ef84 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/tiny_cactus.json +++ b/src/barren/resources/assets/wild_wind_barren/models/block/tiny_cactus.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cross", "textures": { - "cross": "ww_hfas:block/tiny_cactus" + "cross": "wild_wind_barren:block/tiny_cactus" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/tiny_cactus.png b/src/barren/resources/assets/wild_wind_barren/textures/block/tiny_cactus.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/tiny_cactus.png rename to src/barren/resources/assets/wild_wind_barren/textures/block/tiny_cactus.png diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/tiny_cactus.json b/src/barren/resources/data/wild_wind_barren/loot_table/blocks/tiny_cactus.json similarity index 70% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/tiny_cactus.json rename to src/barren/resources/data/wild_wind_barren/loot_table/blocks/tiny_cactus.json index 318ad19..d50b20e 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/tiny_cactus.json +++ b/src/barren/resources/data/wild_wind_barren/loot_table/blocks/tiny_cactus.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:tiny_cactus" + "name": "wild_wind_barren:tiny_cactus" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/tiny_cactus" -} \ No newline at end of file + "random_sequence": "wild_wind_barren:blocks/tiny_cactus" +} diff --git a/src/barren/resources/wild_wind_barren.mixins.json b/src/barren/resources/wild_wind_barren.mixins.json new file mode 100644 index 0000000..bfa6625 --- /dev/null +++ b/src/barren/resources/wild_wind_barren.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "org.polaris2023.wildwind.barren.mixin", + "compatibilityLevel": "JAVA_25", + "mixins": [], + "injectors": { + "defaultRequire": 1 + }, + "overwrites": { + "requireAnnotations": true + }, + "client": [] +} diff --git a/src/core/java/org/polaris2023/wildwind/core/CoreMod.java b/src/core/java/org/polaris2023/wildwind/core/CoreMod.java new file mode 100644 index 0000000..3035f17 --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/CoreMod.java @@ -0,0 +1,23 @@ +package org.polaris2023.wildwind.core; +import net.minecraft.resources.Identifier; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; +import org.polaris2023.wildwind.core.block.ModBlocks; +import org.polaris2023.wildwind.core.registry.*; + +@Mod(CoreMod.MOD_ID) +public final class CoreMod { + public static final String MOD_ID = "wild_wind_core"; + public CoreMod(IEventBus bus) { + ModBlocks.register(bus); + ModItems.register(bus); + org.polaris2023.wildwind.core.recipe.ModRecipes.register(bus); + org.polaris2023.wildwind.core.block.entity.ModBlockEntities.register(bus); + org.polaris2023.wildwind.core.menu.ModMenus.register(bus); + org.polaris2023.wildwind.core.worldgen.MasonKilnProcessor.PROCESSORS.register(bus); + org.polaris2023.wildwind.core.registry.ModCreativeTabs.register(bus); + org.polaris2023.wildwind.structures.StructureModule.register(bus); + + } + public static Identifier id(String path) { return Identifier.fromNamespaceAndPath(MOD_ID, path); } +} diff --git a/src/core/java/org/polaris2023/wildwind/core/api/WildWindModules.java b/src/core/java/org/polaris2023/wildwind/core/api/WildWindModules.java new file mode 100644 index 0000000..9de278d --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/api/WildWindModules.java @@ -0,0 +1,7 @@ +package org.polaris2023.wildwind.core.api; +import java.util.Set; +public final class WildWindModules { + private static final Set IDS = Set.of("wild_wind_core", "wild_wind_wilderness", "wild_wind_barren"); + private WildWindModules() {} + public static boolean owns(String namespace) { return IDS.contains(namespace); } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/AzaleaShelfBlock.java b/src/core/java/org/polaris2023/wildwind/core/block/AzaleaShelfBlock.java similarity index 94% rename from src/hfas/java/org/polaris2023/wildwind/hfas/block/AzaleaShelfBlock.java rename to src/core/java/org/polaris2023/wildwind/core/block/AzaleaShelfBlock.java index 30a0d1a..c0732d0 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/block/AzaleaShelfBlock.java +++ b/src/core/java/org/polaris2023/wildwind/core/block/AzaleaShelfBlock.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.block; +package org.polaris2023.wildwind.core.block; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/KilnBlock.java b/src/core/java/org/polaris2023/wildwind/core/block/KilnBlock.java similarity index 93% rename from src/hfas/java/org/polaris2023/wildwind/hfas/block/KilnBlock.java rename to src/core/java/org/polaris2023/wildwind/core/block/KilnBlock.java index 7f7768e..e0aaa89 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/block/KilnBlock.java +++ b/src/core/java/org/polaris2023/wildwind/core/block/KilnBlock.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.block; +package org.polaris2023.wildwind.core.block; import com.mojang.serialization.MapCodec; import net.minecraft.core.BlockPos; @@ -16,8 +16,8 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; import org.jspecify.annotations.Nullable; -import org.polaris2023.wildwind.hfas.block.entity.KilnBlockEntity; -import org.polaris2023.wildwind.hfas.block.entity.ModBlockEntities; +import org.polaris2023.wildwind.core.block.entity.KilnBlockEntity; +import org.polaris2023.wildwind.core.block.entity.ModBlockEntities; public class KilnBlock extends AbstractFurnaceBlock { public static final MapCodec CODEC = simpleCodec(KilnBlock::new); diff --git a/src/core/java/org/polaris2023/wildwind/core/block/ModBlocks.java b/src/core/java/org/polaris2023/wildwind/core/block/ModBlocks.java new file mode 100644 index 0000000..33ae80c --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/block/ModBlocks.java @@ -0,0 +1,188 @@ +package org.polaris2023.wildwind.core.block; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.material.PushReaction; +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.core.CoreMod; +import org.polaris2023.wildwind.core.worldgen.ModTreeGrowers; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +/** + * 方块注册类 + * 使用NeoForge 26.1的DeferredRegister方式注册方块 + * 注意:方块和物品分开注册,避免延迟注册bug + * + * @author baka4n + * @since 2026/04/15 + */ +//TODO 考虑迁移至registry目录下,或将registry目录下的注册条目分散到各目录下 +public class ModBlocks { + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(CoreMod.MOD_ID); + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(CoreMod.MOD_ID); + public static final DeferredBlock KILN = BLOCKS.registerBlock("kiln", p -> new KilnBlock(p + .mapColor(MapColor.STONE).instrument(net.minecraft.world.level.block.state.properties.NoteBlockInstrument.BASEDRUM) + .requiresCorrectToolForDrops().strength(3.5F, 3.5F).sound(SoundType.STONE) + .lightLevel(state -> state.getValue(KilnBlock.LIT) ? 13 : 0).pushReaction(PushReaction.BLOCK))); + + public static final BlockSetType AZALEA_BLOCK_SET = BlockSetType.register(new BlockSetType("azalea")); + + public static final WoodType AZALEA_WOOD_TYPE = WoodType.register(new WoodType("wild_wind_core:azalea", AZALEA_BLOCK_SET)); + + public static final DeferredBlock AZALEA_LOG = BLOCKS.registerBlock( + "azalea_log", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_WOOD = BLOCKS.registerBlock( + "azalea_wood", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock STRIPPED_AZALEA_LOG = BLOCKS.registerBlock( + "stripped_azalea_log", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock STRIPPED_AZALEA_WOOD = BLOCKS.registerBlock( + "stripped_azalea_wood", + p -> new RotatedPillarBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_PLANKS = BLOCKS.registerBlock( + "azalea_planks", + p -> new Block(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_STAIRS = BLOCKS.registerBlock( + "azalea_stairs", + p -> new StairBlock(AZALEA_PLANKS.get().defaultBlockState(), p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_SLAB = BLOCKS.registerBlock( + "azalea_slab", + p -> new SlabBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_FENCE = BLOCKS.registerBlock( + "azalea_fence", + p -> new FenceBlock(p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_FENCE_GATE = BLOCKS.registerBlock( + "azalea_fence_gate", + p -> new FenceGateBlock(AZALEA_WOOD_TYPE, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_DOOR = BLOCKS.registerBlock( + "azalea_door", + p -> new DoorBlock(AZALEA_BLOCK_SET, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_TRAPDOOR = BLOCKS.registerBlock( + "azalea_trapdoor", + p -> new TrapDoorBlock(AZALEA_BLOCK_SET, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(2.0F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_PRESSURE_PLATE = BLOCKS.registerBlock( + "azalea_pressure_plate", + p -> new PressurePlateBlock(AZALEA_BLOCK_SET, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(0.5F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_BUTTON = BLOCKS.registerBlock( + "azalea_button", + p -> new ButtonBlock(AZALEA_BLOCK_SET, 30, p + .mapColor(MapColor.COLOR_LIGHT_GREEN) + .strength(0.5F) + .sound(SoundType.WOOD)) + ); + + public static final DeferredBlock AZALEA_SIGN = BLOCKS.registerBlock("azalea_sign", + p -> new StandingSignBlock(AZALEA_WOOD_TYPE, p), () -> signProperties(Blocks.OAK_SIGN)); + + public static final DeferredBlock AZALEA_WALL_SIGN = BLOCKS.registerBlock("azalea_wall_sign", + p -> new WallSignBlock(AZALEA_WOOD_TYPE, p.overrideLootTable(AZALEA_SIGN.get().getLootTable())), () -> signProperties(Blocks.OAK_WALL_SIGN)); + + public static final DeferredBlock AZALEA_HANGING_SIGN = BLOCKS.registerBlock("azalea_hanging_sign", + p -> new CeilingHangingSignBlock(AZALEA_WOOD_TYPE, p), () -> signProperties(Blocks.OAK_HANGING_SIGN)); + + public static final DeferredBlock AZALEA_WALL_HANGING_SIGN = BLOCKS.registerBlock("azalea_wall_hanging_sign", + p -> new WallHangingSignBlock(AZALEA_WOOD_TYPE, p.overrideLootTable(AZALEA_HANGING_SIGN.get().getLootTable())), () -> signProperties(Blocks.OAK_WALL_HANGING_SIGN)); + + public static final DeferredBlock AZALEA_SHELF = BLOCKS.registerBlock("azalea_shelf", + AzaleaShelfBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_SHELF) + .strength(2.0F, 3.0F).mapColor(MapColor.COLOR_LIGHT_GREEN).pushReaction(PushReaction.BLOCK)); + private static BlockBehaviour.Properties signProperties(Block template) { + return BlockBehaviour.Properties.ofFullCopy(template).strength(1.0F, 1.0F) + .mapColor(MapColor.COLOR_LIGHT_GREEN).pushReaction(PushReaction.BLOCK); + } + + + private static void blockItems() { + ITEMS.registerSimpleBlockItem(AZALEA_LOG); + ITEMS.registerSimpleBlockItem(AZALEA_WOOD); + ITEMS.registerSimpleBlockItem(STRIPPED_AZALEA_LOG); + ITEMS.registerSimpleBlockItem(STRIPPED_AZALEA_WOOD); + ITEMS.registerSimpleBlockItem(AZALEA_PLANKS); + ITEMS.registerSimpleBlockItem(AZALEA_STAIRS); + ITEMS.registerSimpleBlockItem(AZALEA_SLAB); + ITEMS.registerSimpleBlockItem(AZALEA_FENCE); + ITEMS.registerSimpleBlockItem(AZALEA_FENCE_GATE); + ITEMS.registerSimpleBlockItem(AZALEA_DOOR); + ITEMS.registerSimpleBlockItem(AZALEA_TRAPDOOR); + ITEMS.registerSimpleBlockItem(AZALEA_PRESSURE_PLATE); + ITEMS.registerSimpleBlockItem(AZALEA_BUTTON); + ITEMS.registerItem("azalea_sign", p -> new net.minecraft.world.item.SignItem(AZALEA_SIGN.get(), AZALEA_WALL_SIGN.get(), p.stacksTo(16).useBlockDescriptionPrefix())); + ITEMS.registerItem("azalea_hanging_sign", p -> new net.minecraft.world.item.HangingSignItem(AZALEA_HANGING_SIGN.get(), AZALEA_WALL_HANGING_SIGN.get(), p.stacksTo(16).useBlockDescriptionPrefix())); + ITEMS.registerSimpleBlockItem(AZALEA_SHELF, () -> new Item.Properties().component(net.minecraft.core.component.DataComponents.CONTAINER, net.minecraft.world.item.component.ItemContainerContents.EMPTY)); + ITEMS.registerSimpleBlockItem(KILN); + } + public static void register(IEventBus bus) { BLOCKS.register(bus); blockItems(); ITEMS.register(bus); } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/KilnBlockEntity.java b/src/core/java/org/polaris2023/wildwind/core/block/entity/KilnBlockEntity.java similarity index 94% rename from src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/KilnBlockEntity.java rename to src/core/java/org/polaris2023/wildwind/core/block/entity/KilnBlockEntity.java index 3d8ca69..922a97b 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/KilnBlockEntity.java +++ b/src/core/java/org/polaris2023/wildwind/core/block/entity/KilnBlockEntity.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.block.entity; +package org.polaris2023.wildwind.core.block.entity; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; @@ -12,9 +12,9 @@ import net.minecraft.world.level.block.AbstractFurnaceBlock; import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import net.minecraft.world.level.block.state.BlockState; -import org.polaris2023.wildwind.hfas.menu.KilnMenu; -import org.polaris2023.wildwind.hfas.recipe.KilnRecipes; -import org.polaris2023.wildwind.hfas.mixin.FurnaceFuelAccessor; +import org.polaris2023.wildwind.core.menu.KilnMenu; +import org.polaris2023.wildwind.core.recipe.KilnRecipes; +import org.polaris2023.wildwind.core.mixin.FurnaceFuelAccessor; /** Vanilla inventory, sided transfer, persistence, locking and experience accounting; kiln-specific cooking. */ public class KilnBlockEntity extends AbstractFurnaceBlockEntity { @@ -23,7 +23,7 @@ public KilnBlockEntity(BlockPos pos, BlockState state) { } @Override - protected Component getDefaultName() { return Component.translatable("block.ww_hfas.kiln"); } + protected Component getDefaultName() { return Component.translatable("block.wild_wind_core.kiln"); } @Override protected AbstractContainerMenu createMenu(int id, Inventory inventory) { diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/ModBlockEntities.java b/src/core/java/org/polaris2023/wildwind/core/block/entity/ModBlockEntities.java similarity index 64% rename from src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/ModBlockEntities.java rename to src/core/java/org/polaris2023/wildwind/core/block/entity/ModBlockEntities.java index 86650d9..0cf849c 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/ModBlockEntities.java +++ b/src/core/java/org/polaris2023/wildwind/core/block/entity/ModBlockEntities.java @@ -1,12 +1,11 @@ -package org.polaris2023.wildwind.hfas.block.entity; +package org.polaris2023.wildwind.core.block.entity; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.block.entity.BlockEntityType; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.core.CoreMod; /** * 方块实体注册类 @@ -16,17 +15,10 @@ */ public class ModBlockEntities { public static final DeferredRegister> BLOCK_ENTITIES = - DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, HFASMod.MOD_ID); + DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, CoreMod.MOD_ID); // 制箭台方块实体 - public static final DeferredHolder, BlockEntityType> FLETCHING_TABLE = - BLOCK_ENTITIES.register( - "fletching_table", - () -> new BlockEntityType<>( - FletchingTableBlockEntity::new, - ModBlocks.FLETCHING_TABLE.get() - ) - ); + public static void register(IEventBus bus) { BLOCK_ENTITIES.register(bus); @@ -35,9 +27,9 @@ public static void register(IEventBus bus) { } private static void addVanillaBlocks(net.neoforged.neoforge.event.BlockEntityTypeAddBlocksEvent event) { - event.modify(net.minecraft.world.level.block.entity.BlockEntityTypes.SIGN, ModBlocks.AZALEA_SIGN.get(), ModBlocks.AZALEA_WALL_SIGN.get()); - event.modify(net.minecraft.world.level.block.entity.BlockEntityTypes.HANGING_SIGN, ModBlocks.AZALEA_HANGING_SIGN.get(), ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); - event.modify(net.minecraft.world.level.block.entity.BlockEntityTypes.SHELF, ModBlocks.AZALEA_SHELF.get()); + event.modify(net.minecraft.world.level.block.entity.BlockEntityTypes.SIGN, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get(), org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_SIGN.get()); + event.modify(net.minecraft.world.level.block.entity.BlockEntityTypes.HANGING_SIGN, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get(), org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); + event.modify(net.minecraft.world.level.block.entity.BlockEntityTypes.SHELF, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF.get()); } private static void registerCapabilities(net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent event) { @@ -46,5 +38,5 @@ private static void registerCapabilities(net.neoforged.neoforge.capabilities.Reg } public static final DeferredHolder, BlockEntityType> KILN = - BLOCK_ENTITIES.register("kiln", () -> new BlockEntityType<>(KilnBlockEntity::new, ModBlocks.KILN.get())); + BLOCK_ENTITIES.register("kiln", () -> new BlockEntityType<>(KilnBlockEntity::new, org.polaris2023.wildwind.core.block.ModBlocks.KILN.get())); } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/AzaleaSignState.java b/src/core/java/org/polaris2023/wildwind/core/client/AzaleaSignState.java similarity index 71% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/AzaleaSignState.java rename to src/core/java/org/polaris2023/wildwind/core/client/AzaleaSignState.java index 4e7d941..c6bdb8a 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/AzaleaSignState.java +++ b/src/core/java/org/polaris2023/wildwind/core/client/AzaleaSignState.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.client; +package org.polaris2023.wildwind.core.client; public interface AzaleaSignState { boolean wildwind$isAzalea(); diff --git a/src/core/java/org/polaris2023/wildwind/core/client/CoreScreens.java b/src/core/java/org/polaris2023/wildwind/core/client/CoreScreens.java new file mode 100644 index 0000000..aac65d9 --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/client/CoreScreens.java @@ -0,0 +1,11 @@ +package org.polaris2023.wildwind.core.client; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; +import org.polaris2023.wildwind.core.CoreMod; +import org.polaris2023.wildwind.core.menu.ModMenus; +@EventBusSubscriber(modid = CoreMod.MOD_ID, value = Dist.CLIENT) +public final class CoreScreens { + @SubscribeEvent public static void screens(RegisterMenuScreensEvent event) { event.register(ModMenus.KILN.get(), KilnScreen::new); } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/KilnScreen.java b/src/core/java/org/polaris2023/wildwind/core/client/KilnScreen.java similarity index 95% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/KilnScreen.java rename to src/core/java/org/polaris2023/wildwind/core/client/KilnScreen.java index 497eb48..5df1ff8 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/KilnScreen.java +++ b/src/core/java/org/polaris2023/wildwind/core/client/KilnScreen.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.client; +package org.polaris2023.wildwind.core.client; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -7,7 +7,7 @@ import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Inventory; -import org.polaris2023.wildwind.hfas.menu.KilnMenu; +import org.polaris2023.wildwind.core.menu.KilnMenu; /** Uses Minecraft's furnace artwork while keeping the kiln's server-side input rules. */ public class KilnScreen extends AbstractContainerScreen { diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/enchantment/MeltingEnchantment.java b/src/core/java/org/polaris2023/wildwind/core/enchantment/MeltingEnchantment.java similarity index 95% rename from src/hfas/java/org/polaris2023/wildwind/hfas/enchantment/MeltingEnchantment.java rename to src/core/java/org/polaris2023/wildwind/core/enchantment/MeltingEnchantment.java index a10545b..a69ff62 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/enchantment/MeltingEnchantment.java +++ b/src/core/java/org/polaris2023/wildwind/core/enchantment/MeltingEnchantment.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.enchantment; +package org.polaris2023.wildwind.core.enchantment; import java.util.ArrayList; import java.util.List; @@ -17,12 +17,12 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.level.BlockDropsEvent; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.core.CoreMod; -@EventBusSubscriber(modid = HFASMod.MOD_ID) +@EventBusSubscriber(modid = CoreMod.MOD_ID) public final class MeltingEnchantment { public static final ResourceKey MELTING = ResourceKey.create(Registries.ENCHANTMENT, - Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "melting")); + Identifier.fromNamespaceAndPath(CoreMod.MOD_ID, "melting")); private MeltingEnchantment() {} @SubscribeEvent(priority = EventPriority.LOWEST) diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/CobwebBreaking.java b/src/core/java/org/polaris2023/wildwind/core/event/CobwebBreaking.java similarity index 96% rename from src/hfas/java/org/polaris2023/wildwind/hfas/event/CobwebBreaking.java rename to src/core/java/org/polaris2023/wildwind/core/event/CobwebBreaking.java index 7ea8495..9c85113 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/event/CobwebBreaking.java +++ b/src/core/java/org/polaris2023/wildwind/core/event/CobwebBreaking.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.event; +package org.polaris2023.wildwind.core.event; import java.util.HashMap; import java.util.HashSet; @@ -15,9 +15,9 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.tick.EntityTickEvent; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.core.CoreMod; -@EventBusSubscriber(modid = HFASMod.MOD_ID) +@EventBusSubscriber(modid = CoreMod.MOD_ID) public final class CobwebBreaking { private static final double EPSILON = 1.0E-7; private static final Map STATES = new WeakHashMap<>(); diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/FarmlandProtection.java b/src/core/java/org/polaris2023/wildwind/core/event/FarmlandProtection.java similarity index 90% rename from src/hfas/java/org/polaris2023/wildwind/hfas/event/FarmlandProtection.java rename to src/core/java/org/polaris2023/wildwind/core/event/FarmlandProtection.java index 8688c11..3fb001e 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/event/FarmlandProtection.java +++ b/src/core/java/org/polaris2023/wildwind/core/event/FarmlandProtection.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.event; +package org.polaris2023.wildwind.core.event; import net.minecraft.core.registries.Registries; import net.minecraft.world.effect.MobEffects; @@ -9,9 +9,9 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.level.BlockEvent; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.core.CoreMod; -@EventBusSubscriber(modid = HFASMod.MOD_ID) +@EventBusSubscriber(modid = CoreMod.MOD_ID) public final class FarmlandProtection { private FarmlandProtection() {} diff --git a/src/core/java/org/polaris2023/wildwind/core/event/FuelHandler.java b/src/core/java/org/polaris2023/wildwind/core/event/FuelHandler.java new file mode 100644 index 0000000..35b1cac --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/event/FuelHandler.java @@ -0,0 +1,63 @@ +package org.polaris2023.wildwind.core.event; + +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.neoforge.event.furnace.FurnaceFuelBurnTimeEvent; +import org.polaris2023.wildwind.core.CoreMod; + +/** + * 燃料事件处理器 + * 为木质方块添加燃料功能 + * + * @author baka4n + * @since 2026/04/15 + */ +@EventBusSubscriber(modid = CoreMod.MOD_ID) +public class FuelHandler { + + /** + * 燃料燃烧时间事件 + * 木质方块可作为燃料,燃烧300 tick(与原版木板相同) + */ + @SubscribeEvent + public static void onFuelBurnTime(FurnaceFuelBurnTimeEvent event) { + Item item = event.getItemStack().getItem(); + + // 检查是否是木质方块物品 + int burnTime = getWoodBurnTime(item); + if (burnTime > 0) { + event.setBurnTime(burnTime); + } + } + + /** + * 获取木质方块的燃烧时间 + */ + private static int getWoodBurnTime(Item item) { + if (item == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get().asItem()) return 200; + if (item == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get().asItem()) return 800; + if (item == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF.get().asItem()) return 300; + // 焚烬木 - 300 tick(15秒) + // 灵焰木 - 300 tick + // 杜鹃木 - 300 tick + if (isAzaleaWoodItem(item)) return 300; + + return 0; + } + + + + private static boolean isAzaleaWoodItem(Item item) { + return item == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_LOG.get().asItem() + || item == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WOOD.get().asItem() + || item == org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_LOG.get().asItem() + || item == org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_WOOD.get().asItem() + || item == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PLANKS.get().asItem() + || item == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SLAB.get().asItem() + || item == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE.get().asItem() + || item == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE_GATE.get().asItem(); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/SkeletonBehavior.java b/src/core/java/org/polaris2023/wildwind/core/event/SkeletonBehavior.java similarity index 96% rename from src/hfas/java/org/polaris2023/wildwind/hfas/event/SkeletonBehavior.java rename to src/core/java/org/polaris2023/wildwind/core/event/SkeletonBehavior.java index c63b30d..bae181f 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/event/SkeletonBehavior.java +++ b/src/core/java/org/polaris2023/wildwind/core/event/SkeletonBehavior.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.event; +package org.polaris2023.wildwind.core.event; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/menu/KilnMenu.java b/src/core/java/org/polaris2023/wildwind/core/menu/KilnMenu.java similarity index 97% rename from src/hfas/java/org/polaris2023/wildwind/hfas/menu/KilnMenu.java rename to src/core/java/org/polaris2023/wildwind/core/menu/KilnMenu.java index 31c5c8c..0d896ff 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/menu/KilnMenu.java +++ b/src/core/java/org/polaris2023/wildwind/core/menu/KilnMenu.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.menu; +package org.polaris2023.wildwind.core.menu; import net.minecraft.util.Mth; import net.minecraft.world.Container; @@ -14,7 +14,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; -import org.polaris2023.wildwind.hfas.recipe.KilnRecipes; +import org.polaris2023.wildwind.core.recipe.KilnRecipes; public class KilnMenu extends AbstractContainerMenu { private final Container container; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/menu/ModMenus.java b/src/core/java/org/polaris2023/wildwind/core/menu/ModMenus.java similarity index 64% rename from src/hfas/java/org/polaris2023/wildwind/hfas/menu/ModMenus.java rename to src/core/java/org/polaris2023/wildwind/core/menu/ModMenus.java index 56c5bed..873ee4d 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/menu/ModMenus.java +++ b/src/core/java/org/polaris2023/wildwind/core/menu/ModMenus.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.menu; +package org.polaris2023.wildwind.core.menu; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.flag.FeatureFlags; @@ -6,7 +6,7 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.core.CoreMod; /** * 菜单类型注册类 @@ -16,14 +16,10 @@ */ public class ModMenus { public static final DeferredRegister> MENUS = - DeferredRegister.create(BuiltInRegistries.MENU, HFASMod.MOD_ID); + DeferredRegister.create(BuiltInRegistries.MENU, CoreMod.MOD_ID); // 制箭台菜单 - public static final DeferredHolder, MenuType> FLETCHING_TABLE = - MENUS.register( - "fletching_table", - () -> new MenuType<>(FletchingTableMenu::new, FeatureFlags.DEFAULT_FLAGS) - ); + public static void register(IEventBus bus) { MENUS.register(bus); diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractSkeletonMixin.java b/src/core/java/org/polaris2023/wildwind/core/mixin/AbstractSkeletonMixin.java similarity index 91% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractSkeletonMixin.java rename to src/core/java/org/polaris2023/wildwind/core/mixin/AbstractSkeletonMixin.java index 832e9a2..118119d 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractSkeletonMixin.java +++ b/src/core/java/org/polaris2023/wildwind/core/mixin/AbstractSkeletonMixin.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.core.mixin; import net.minecraft.util.RandomSource; import net.minecraft.world.DifficultyInstance; @@ -6,7 +6,7 @@ import net.minecraft.world.entity.monster.skeleton.AbstractSkeleton; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import org.polaris2023.wildwind.hfas.event.SkeletonBehavior; +import org.polaris2023.wildwind.core.event.SkeletonBehavior; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaBlockMixin.java b/src/core/java/org/polaris2023/wildwind/core/mixin/AzaleaBlockMixin.java similarity index 91% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaBlockMixin.java rename to src/core/java/org/polaris2023/wildwind/core/mixin/AzaleaBlockMixin.java index da8943e..820790f 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaBlockMixin.java +++ b/src/core/java/org/polaris2023/wildwind/core/mixin/AzaleaBlockMixin.java @@ -1,11 +1,11 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.core.mixin; import net.minecraft.core.BlockPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.AzaleaBlock; import net.minecraft.world.level.block.state.BlockState; -import org.polaris2023.wildwind.hfas.worldgen.ModTreeGrowers; +import org.polaris2023.wildwind.core.worldgen.ModTreeGrowers; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaSignRendererMixin.java b/src/core/java/org/polaris2023/wildwind/core/mixin/AzaleaSignRendererMixin.java similarity index 87% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaSignRendererMixin.java rename to src/core/java/org/polaris2023/wildwind/core/mixin/AzaleaSignRendererMixin.java index 4b65b63..55e66dd 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AzaleaSignRendererMixin.java +++ b/src/core/java/org/polaris2023/wildwind/core/mixin/AzaleaSignRendererMixin.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.core.mixin; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.Font; @@ -12,8 +12,7 @@ import net.minecraft.world.level.block.entity.SignText; import net.minecraft.world.phys.Vec3; import org.jspecify.annotations.Nullable; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.client.AzaleaSignState; +import org.polaris2023.wildwind.core.client.AzaleaSignState; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -30,9 +29,9 @@ public abstract class AzaleaSignRendererMixin { private void wildwind$mark(SignBlockEntity entity, SignRenderState state, float partialTick, Vec3 camera, ModelFeatureRenderer.@Nullable CrumblingOverlay overlay, CallbackInfo ci) { var block = entity.getBlockState().getBlock(); - ((AzaleaSignState) state).wildwind$setAzalea(block == ModBlocks.AZALEA_SIGN.get() - || block == ModBlocks.AZALEA_WALL_SIGN.get() || block == ModBlocks.AZALEA_HANGING_SIGN.get() - || block == ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); + ((AzaleaSignState) state).wildwind$setAzalea(block == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get() + || block == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_SIGN.get() || block == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get() + || block == org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); } @Inject(method = "submitSignText", at = @At("HEAD"), cancellable = true) diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/CrafterBlockMixin.java b/src/core/java/org/polaris2023/wildwind/core/mixin/CrafterBlockMixin.java similarity index 92% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/CrafterBlockMixin.java rename to src/core/java/org/polaris2023/wildwind/core/mixin/CrafterBlockMixin.java index 827feee..12b2817 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/CrafterBlockMixin.java +++ b/src/core/java/org/polaris2023/wildwind/core/mixin/CrafterBlockMixin.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.core.mixin; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; @@ -10,7 +10,7 @@ import net.minecraft.world.item.crafting.CraftingRecipe; import net.minecraft.world.level.block.CrafterBlock; import net.minecraft.world.level.block.state.BlockState; -import org.polaris2023.wildwind.hfas.recipe.WoolToStringRecipe; +import org.polaris2023.wildwind.core.recipe.WoolToStringRecipe; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/FurnaceFuelAccessor.java b/src/core/java/org/polaris2023/wildwind/core/mixin/FurnaceFuelAccessor.java similarity index 90% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/FurnaceFuelAccessor.java rename to src/core/java/org/polaris2023/wildwind/core/mixin/FurnaceFuelAccessor.java index 6983340..fedfdd8 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/FurnaceFuelAccessor.java +++ b/src/core/java/org/polaris2023/wildwind/core/mixin/FurnaceFuelAccessor.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.core.mixin; import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SignRenderStateMixin.java b/src/core/java/org/polaris2023/wildwind/core/mixin/SignRenderStateMixin.java similarity index 81% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SignRenderStateMixin.java rename to src/core/java/org/polaris2023/wildwind/core/mixin/SignRenderStateMixin.java index f5e5c7e..a1e0de4 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SignRenderStateMixin.java +++ b/src/core/java/org/polaris2023/wildwind/core/mixin/SignRenderStateMixin.java @@ -1,7 +1,7 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.core.mixin; import net.minecraft.client.renderer.blockentity.state.SignRenderState; -import org.polaris2023.wildwind.hfas.client.AzaleaSignState; +import org.polaris2023.wildwind.core.client.AzaleaSignState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SinglePoolElementMixin.java b/src/core/java/org/polaris2023/wildwind/core/mixin/SinglePoolElementMixin.java similarity index 92% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SinglePoolElementMixin.java rename to src/core/java/org/polaris2023/wildwind/core/mixin/SinglePoolElementMixin.java index 568ee50..e2cd299 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/SinglePoolElementMixin.java +++ b/src/core/java/org/polaris2023/wildwind/core/mixin/SinglePoolElementMixin.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.core.mixin; import com.mojang.datafixers.util.Either; import net.minecraft.resources.Identifier; @@ -8,7 +8,7 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.LiquidSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; -import org.polaris2023.wildwind.hfas.worldgen.MasonKilnProcessor; +import org.polaris2023.wildwind.core.worldgen.MasonKilnProcessor; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/src/core/java/org/polaris2023/wildwind/core/mixin/SkeletonMeleeMixin.java b/src/core/java/org/polaris2023/wildwind/core/mixin/SkeletonMeleeMixin.java new file mode 100644 index 0000000..f3a6fc2 --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/mixin/SkeletonMeleeMixin.java @@ -0,0 +1,18 @@ +package org.polaris2023.wildwind.core.mixin; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import org.polaris2023.wildwind.core.event.SkeletonBehavior; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +@Mixin(Mob.class) +public abstract class SkeletonMeleeMixin { + @Inject(method = "doHurtTarget", at = @At("RETURN")) + private void wildWind$meleeEffects(ServerLevel level, Entity target, CallbackInfoReturnable cir) { + if (cir.getReturnValueZ() && target instanceof LivingEntity living) + SkeletonBehavior.afterMeleeHit((Mob)(Object)this, living); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/KilnRecipes.java b/src/core/java/org/polaris2023/wildwind/core/recipe/KilnRecipes.java similarity index 89% rename from src/hfas/java/org/polaris2023/wildwind/hfas/recipe/KilnRecipes.java rename to src/core/java/org/polaris2023/wildwind/core/recipe/KilnRecipes.java index 09c9d1c..40b63a2 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/KilnRecipes.java +++ b/src/core/java/org/polaris2023/wildwind/core/recipe/KilnRecipes.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.recipe; +package org.polaris2023.wildwind.core.recipe; import java.util.Optional; import net.minecraft.core.registries.Registries; @@ -11,13 +11,13 @@ import net.minecraft.world.item.crafting.SmeltingRecipe; import net.minecraft.world.level.Level; import net.minecraft.server.level.ServerLevel; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.core.CoreMod; /** Reuses the current world's smelting recipes, including data-pack recipes and their experience. */ public final class KilnRecipes { public static final int COOK_TIME = 100; - public static final TagKey EXCLUDED = TagKey.create(Registries.ITEM, HFASMod.id("kiln_excluded")); - private static final TagKey METAL_OUTPUTS = TagKey.create(Registries.ITEM, HFASMod.id("kiln_metal_outputs")); + public static final TagKey EXCLUDED = TagKey.create(Registries.ITEM, CoreMod.id("kiln_excluded")); + private static final TagKey METAL_OUTPUTS = TagKey.create(Registries.ITEM, CoreMod.id("kiln_metal_outputs")); private KilnRecipes() {} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/ModRecipes.java b/src/core/java/org/polaris2023/wildwind/core/recipe/ModRecipes.java similarity index 89% rename from src/hfas/java/org/polaris2023/wildwind/hfas/recipe/ModRecipes.java rename to src/core/java/org/polaris2023/wildwind/core/recipe/ModRecipes.java index 2915b79..aa9fb33 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/ModRecipes.java +++ b/src/core/java/org/polaris2023/wildwind/core/recipe/ModRecipes.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.recipe; +package org.polaris2023.wildwind.core.recipe; import com.mojang.serialization.MapCodec; import net.minecraft.core.registries.Registries; @@ -7,10 +7,10 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.core.CoreMod; public final class ModRecipes { - private static final DeferredRegister> SERIALIZERS = DeferredRegister.create(Registries.RECIPE_SERIALIZER, HFASMod.MOD_ID); + private static final DeferredRegister> SERIALIZERS = DeferredRegister.create(Registries.RECIPE_SERIALIZER, CoreMod.MOD_ID); public static final DeferredHolder, RecipeSerializer> WOOL_TO_STRING = SERIALIZERS.register("wool_to_string", () -> new RecipeSerializer<>( MapCodec.unit(WoolToStringRecipe.INSTANCE), StreamCodec.unit(WoolToStringRecipe.INSTANCE))); diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/WoolToStringRecipe.java b/src/core/java/org/polaris2023/wildwind/core/recipe/WoolToStringRecipe.java similarity index 98% rename from src/hfas/java/org/polaris2023/wildwind/hfas/recipe/WoolToStringRecipe.java rename to src/core/java/org/polaris2023/wildwind/core/recipe/WoolToStringRecipe.java index a7dc6eb..fad8e6d 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/recipe/WoolToStringRecipe.java +++ b/src/core/java/org/polaris2023/wildwind/core/recipe/WoolToStringRecipe.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.recipe; +package org.polaris2023.wildwind.core.recipe; import java.util.List; import net.minecraft.core.NonNullList; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModCreativeTabs.java b/src/core/java/org/polaris2023/wildwind/core/registry/ModCreativeTabs.java similarity index 70% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModCreativeTabs.java rename to src/core/java/org/polaris2023/wildwind/core/registry/ModCreativeTabs.java index 87b4f2d..4f4de35 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModCreativeTabs.java +++ b/src/core/java/org/polaris2023/wildwind/core/registry/ModCreativeTabs.java @@ -1,5 +1,7 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.core.registry; +import org.polaris2023.wildwind.core.registry.ModItems; +import org.polaris2023.wildwind.core.block.ModBlocks; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; @@ -12,24 +14,23 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; -import org.polaris2023.wildwind.hfas.enchantment.MeltingEnchantment; -import org.polaris2023.wildwind.hfas.block.ModBlocks; +import org.polaris2023.wildwind.core.enchantment.MeltingEnchantment; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.core.CoreMod; -@EventBusSubscriber(modid = HFASMod.MOD_ID) +@EventBusSubscriber(modid = CoreMod.MOD_ID) public class ModCreativeTabs { public static final DeferredRegister CREATIVE_TABS = - DeferredRegister.create(Registries.CREATIVE_MODE_TAB, HFASMod.MOD_ID); + DeferredRegister.create(Registries.CREATIVE_MODE_TAB, CoreMod.MOD_ID); /** * 模组专用创造模式物品栏喵~ */ public static final DeferredHolder WILD_WIND = CREATIVE_TABS.register("wild_wind", () -> CreativeModeTab.builder() .title(Component.translatable("mod.wild_wind.name")) - .icon(() -> ModItems.MUDCRAB_BUCKET.get().getDefaultInstance()) + .icon(() -> org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PLANKS.get().asItem().getDefaultInstance()) .displayItems((params, output) -> { addStacks(output); output.accept(EnchantmentHelper.createBook(new EnchantmentInstance( @@ -53,23 +54,17 @@ public static void keepModContentsInOwnTab(BuildCreativeModeTabContentsEvent eve || !event.getTabKey().identifier().getNamespace().equals("minecraft")) return; // Vanilla generators also discover mod potions and enchanted books automatically. event.removeIf(stack -> { - if (BuiltInRegistries.ITEM.getKey(stack.getItem()).getNamespace().equals(HFASMod.MOD_ID)) return true; + if (org.polaris2023.wildwind.core.api.WildWindModules.owns(BuiltInRegistries.ITEM.getKey(stack.getItem()).getNamespace())) return true; var potion = stack.get(DataComponents.POTION_CONTENTS); if (potion != null && potion.potion().isPresent() - && potion.potion().get().unwrapKey().orElseThrow().identifier().getNamespace().equals(HFASMod.MOD_ID)) return true; + && org.polaris2023.wildwind.core.api.WildWindModules.owns(potion.potion().get().unwrapKey().orElseThrow().identifier().getNamespace())) return true; var enchantments = stack.get(DataComponents.STORED_ENCHANTMENTS); return enchantments != null && enchantments.keySet().stream().anyMatch(holder -> holder.is(MeltingEnchantment.MELTING)); }, CreativeModeTab.TabVisibility.PARENT_AND_SEARCH_TABS); } - private static void addStacks(CreativeModeTab.Output output){ + private static void addStacks(CreativeModeTab.Output output) { ModBlocks.ITEMS.getEntries().forEach(item -> output.accept(item.get())); - ModItems.ITEMS.getEntries().stream().filter(item -> item != ModItems.TIPPED_ARROW).forEach(item -> output.accept(item.get())); - ModPotions.POTIONS.getEntries().forEach(potion -> { - output.accept(PotionContents.createItemStack(Items.POTION, potion)); - output.accept(PotionContents.createItemStack(Items.SPLASH_POTION, potion)); - output.accept(PotionContents.createItemStack(Items.LINGERING_POTION, potion)); - output.accept(org.polaris2023.wildwind.hfas.arrow.ReachArrows.convert(PotionContents.createItemStack(Items.TIPPED_ARROW, potion))); - }); + ModItems.ITEMS.getEntries().forEach(item -> output.accept(item.get())); } } diff --git a/src/core/java/org/polaris2023/wildwind/core/registry/ModItems.java b/src/core/java/org/polaris2023/wildwind/core/registry/ModItems.java new file mode 100644 index 0000000..a4b6b9b --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/registry/ModItems.java @@ -0,0 +1,49 @@ +package org.polaris2023.wildwind.core.registry; + +import net.minecraft.core.Holder; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.MobBucketItem; +import net.minecraft.world.item.SpawnEggItem; +import net.minecraft.world.level.material.Fluids; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.core.CoreMod; + +import java.util.function.Function; +import java.util.List; + +public class ModItems { + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(CoreMod.MOD_ID); + public static final DeferredItem DUCKWEED = register("duckweed"); + public static final DeferredItem CALAMARI = register("calamari"); + public static final DeferredItem COOKED_CALAMARI = register("cooked_calamari"); + public static final DeferredItem COOKED_EGG = register("cooked_egg"); + public static final DeferredItem BAKED_SEEDS = register("baked_seeds"); + public static final DeferredItem COOKED_FROG_LEGS = register("cooked_frog_legs"); + public static final DeferredItem FROG_LEGS = register("frog_legs"); + public static final List> MATERIALS = List.of( + DUCKWEED, CALAMARI, COOKED_CALAMARI, COOKED_EGG, BAKED_SEEDS, COOKED_FROG_LEGS, FROG_LEGS); + public static void register(IEventBus modBus) { + ITEMS.register(modBus); + } + + + public static DeferredItem registerMobEgg(String id, Holder> type){ + return ITEMS.registerItem(id, p -> new SpawnEggItem(p.spawnEgg(type.value()))); + } + + public static DeferredItem register(String id){ + return ITEMS.registerItem(id, Item::new); + } + + public static DeferredItem register(String id, Function builder){ + return ITEMS.registerItem(id, builder); + } + + public static DeferredItem register(String id, Function builder, Function property){ + return ITEMS.registerItem(id, p -> builder.apply(property.apply(p))); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/MasonKilnProcessor.java b/src/core/java/org/polaris2023/wildwind/core/worldgen/MasonKilnProcessor.java similarity index 91% rename from src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/MasonKilnProcessor.java rename to src/core/java/org/polaris2023/wildwind/core/worldgen/MasonKilnProcessor.java index 80249af..87d0f64 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/MasonKilnProcessor.java +++ b/src/core/java/org/polaris2023/wildwind/core/worldgen/MasonKilnProcessor.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.worldgen; +package org.polaris2023.wildwind.core.worldgen; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -16,9 +16,8 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import net.neoforged.neoforge.registries.DeferredRegister; import org.jspecify.annotations.Nullable; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.block.KilnBlock; +import org.polaris2023.wildwind.core.CoreMod; +import org.polaris2023.wildwind.core.block.KilnBlock; /** Inserts a kiln beside the workstation in each of the six vanilla mason-house templates. */ public record MasonKilnProcessor(BlockPos target, Direction facing, Block replacedBlock) implements StructureProcessor { @@ -28,7 +27,7 @@ public record MasonKilnProcessor(BlockPos target, Direction facing, Block replac BuiltInRegistries.BLOCK.byNameCodec().fieldOf("replace").forGetter(MasonKilnProcessor::replacedBlock) ).apply(instance, MasonKilnProcessor::new)); public static final DeferredRegister> PROCESSORS = - DeferredRegister.create(Registries.STRUCTURE_PROCESSOR, HFASMod.MOD_ID); + DeferredRegister.create(Registries.STRUCTURE_PROCESSOR, CoreMod.MOD_ID); static { PROCESSORS.register("mason_kiln", () -> CODEC); } public static final Map HOUSES = Map.of( @@ -52,6 +51,6 @@ public record MasonKilnProcessor(BlockPos target, Direction facing, Block replac if (!original.pos().equals(target) || !original.state().is(replacedBlock) || !processed.state().is(replacedBlock)) return processed; // StructureTemplate applies mirror/rotation to the state after processing; position is already transformed. return new StructureTemplate.StructureBlockInfo(processed.pos(), - ModBlocks.KILN.get().defaultBlockState().setValue(KilnBlock.FACING, facing), null); + org.polaris2023.wildwind.core.block.ModBlocks.KILN.get().defaultBlockState().setValue(KilnBlock.FACING, facing), null); } } diff --git a/src/core/java/org/polaris2023/wildwind/core/worldgen/ModTreeGrowers.java b/src/core/java/org/polaris2023/wildwind/core/worldgen/ModTreeGrowers.java new file mode 100644 index 0000000..a922dfc --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/worldgen/ModTreeGrowers.java @@ -0,0 +1,9 @@ +package org.polaris2023.wildwind.core.worldgen; +import net.minecraft.world.level.block.grower.TreeGrower; +import net.minecraft.resources.ResourceKey; +import net.minecraft.core.registries.Registries; +import java.util.Optional; +import org.polaris2023.wildwind.core.CoreMod; +public final class ModTreeGrowers { + public static final TreeGrower AZALEA = new TreeGrower("wild_wind_core:azalea", Optional.empty(), Optional.of(ResourceKey.create(Registries.CONFIGURED_FEATURE, CoreMod.id("azalea_tree"))), Optional.empty()); +} diff --git a/src/structures/java/org/polaris2023/wildwind/structures/StructureModule.java b/src/core/java/org/polaris2023/wildwind/structures/StructureModule.java similarity index 100% rename from src/structures/java/org/polaris2023/wildwind/structures/StructureModule.java rename to src/core/java/org/polaris2023/wildwind/structures/StructureModule.java diff --git a/src/structures/java/org/polaris2023/wildwind/structures/command/StructureCommands.java b/src/core/java/org/polaris2023/wildwind/structures/command/StructureCommands.java similarity index 100% rename from src/structures/java/org/polaris2023/wildwind/structures/command/StructureCommands.java rename to src/core/java/org/polaris2023/wildwind/structures/command/StructureCommands.java diff --git a/src/structures/java/org/polaris2023/wildwind/structures/config/ConfigStructurePack.java b/src/core/java/org/polaris2023/wildwind/structures/config/ConfigStructurePack.java similarity index 100% rename from src/structures/java/org/polaris2023/wildwind/structures/config/ConfigStructurePack.java rename to src/core/java/org/polaris2023/wildwind/structures/config/ConfigStructurePack.java diff --git a/src/structures/java/org/polaris2023/wildwind/structures/config/StructureDefinition.java b/src/core/java/org/polaris2023/wildwind/structures/config/StructureDefinition.java similarity index 100% rename from src/structures/java/org/polaris2023/wildwind/structures/config/StructureDefinition.java rename to src/core/java/org/polaris2023/wildwind/structures/config/StructureDefinition.java diff --git a/src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredStructure.java b/src/core/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredStructure.java similarity index 100% rename from src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredStructure.java rename to src/core/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredStructure.java diff --git a/src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredTemplatePiece.java b/src/core/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredTemplatePiece.java similarity index 100% rename from src/structures/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredTemplatePiece.java rename to src/core/java/org/polaris2023/wildwind/structures/worldgen/ConfiguredTemplatePiece.java diff --git a/src/structures/java/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndex.java b/src/core/java/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndex.java similarity index 100% rename from src/structures/java/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndex.java rename to src/core/java/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndex.java diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_button.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_button.json similarity index 59% rename from src/hfas/resources/assets/ww_hfas/blockstates/azalea_button.json rename to src/core/resources/assets/wild_wind_core/blockstates/azalea_button.json index 3ab9b3b..187fabd 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_button.json +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_button.json @@ -1,118 +1,118 @@ { "variants": { "face=ceiling,facing=east,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "x": 180, "y": 270 }, "face=ceiling,facing=east,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "x": 180, "y": 270 }, "face=ceiling,facing=north,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "x": 180, "y": 180 }, "face=ceiling,facing=north,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "x": 180, "y": 180 }, "face=ceiling,facing=south,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "x": 180 }, "face=ceiling,facing=south,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "x": 180 }, "face=ceiling,facing=west,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "x": 180, "y": 90 }, "face=ceiling,facing=west,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "x": 180, "y": 90 }, "face=floor,facing=east,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "y": 90 }, "face=floor,facing=east,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "y": 90 }, "face=floor,facing=north,powered=false": { - "model": "ww_hfas:block/azalea_button" + "model": "wild_wind_core:block/azalea_button" }, "face=floor,facing=north,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed" + "model": "wild_wind_core:block/azalea_button_pressed" }, "face=floor,facing=south,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "y": 180 }, "face=floor,facing=south,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "y": 180 }, "face=floor,facing=west,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "y": 270 }, "face=floor,facing=west,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "y": 270 }, "face=wall,facing=east,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "uvlock": true, "x": 90, "y": 90 }, "face=wall,facing=east,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "uvlock": true, "x": 90, "y": 90 }, "face=wall,facing=north,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "uvlock": true, "x": 90 }, "face=wall,facing=north,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "uvlock": true, "x": 90 }, "face=wall,facing=south,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "uvlock": true, "x": 90, "y": 180 }, "face=wall,facing=south,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "uvlock": true, "x": 90, "y": 180 }, "face=wall,facing=west,powered=false": { - "model": "ww_hfas:block/azalea_button", + "model": "wild_wind_core:block/azalea_button", "uvlock": true, "x": 90, "y": 270 }, "face=wall,facing=west,powered=true": { - "model": "ww_hfas:block/azalea_button_pressed", + "model": "wild_wind_core:block/azalea_button_pressed", "uvlock": true, "x": 90, "y": 270 } } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_door.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_door.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/blockstates/azalea_door.json rename to src/core/resources/assets/wild_wind_core/blockstates/azalea_door.json index 4450267..ff3e170 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_door.json +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_door.json @@ -1,124 +1,124 @@ { "variants": { "facing=east,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/azalea_door_bottom_left" + "model": "wild_wind_core:block/azalea_door_bottom_left" }, "facing=east,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/azalea_door_bottom_left_open", + "model": "wild_wind_core:block/azalea_door_bottom_left_open", "y": 90 }, "facing=east,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/azalea_door_bottom_right" + "model": "wild_wind_core:block/azalea_door_bottom_right" }, "facing=east,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/azalea_door_bottom_right_open", + "model": "wild_wind_core:block/azalea_door_bottom_right_open", "y": 270 }, "facing=east,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/azalea_door_top_left" + "model": "wild_wind_core:block/azalea_door_top_left" }, "facing=east,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/azalea_door_top_left_open", + "model": "wild_wind_core:block/azalea_door_top_left_open", "y": 90 }, "facing=east,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/azalea_door_top_right" + "model": "wild_wind_core:block/azalea_door_top_right" }, "facing=east,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/azalea_door_top_right_open", + "model": "wild_wind_core:block/azalea_door_top_right_open", "y": 270 }, "facing=north,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/azalea_door_bottom_left", + "model": "wild_wind_core:block/azalea_door_bottom_left", "y": 270 }, "facing=north,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/azalea_door_bottom_left_open" + "model": "wild_wind_core:block/azalea_door_bottom_left_open" }, "facing=north,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/azalea_door_bottom_right", + "model": "wild_wind_core:block/azalea_door_bottom_right", "y": 270 }, "facing=north,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/azalea_door_bottom_right_open", + "model": "wild_wind_core:block/azalea_door_bottom_right_open", "y": 180 }, "facing=north,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/azalea_door_top_left", + "model": "wild_wind_core:block/azalea_door_top_left", "y": 270 }, "facing=north,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/azalea_door_top_left_open" + "model": "wild_wind_core:block/azalea_door_top_left_open" }, "facing=north,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/azalea_door_top_right", + "model": "wild_wind_core:block/azalea_door_top_right", "y": 270 }, "facing=north,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/azalea_door_top_right_open", + "model": "wild_wind_core:block/azalea_door_top_right_open", "y": 180 }, "facing=south,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/azalea_door_bottom_left", + "model": "wild_wind_core:block/azalea_door_bottom_left", "y": 90 }, "facing=south,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/azalea_door_bottom_left_open", + "model": "wild_wind_core:block/azalea_door_bottom_left_open", "y": 180 }, "facing=south,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/azalea_door_bottom_right", + "model": "wild_wind_core:block/azalea_door_bottom_right", "y": 90 }, "facing=south,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/azalea_door_bottom_right_open" + "model": "wild_wind_core:block/azalea_door_bottom_right_open" }, "facing=south,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/azalea_door_top_left", + "model": "wild_wind_core:block/azalea_door_top_left", "y": 90 }, "facing=south,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/azalea_door_top_left_open", + "model": "wild_wind_core:block/azalea_door_top_left_open", "y": 180 }, "facing=south,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/azalea_door_top_right", + "model": "wild_wind_core:block/azalea_door_top_right", "y": 90 }, "facing=south,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/azalea_door_top_right_open" + "model": "wild_wind_core:block/azalea_door_top_right_open" }, "facing=west,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/azalea_door_bottom_left", + "model": "wild_wind_core:block/azalea_door_bottom_left", "y": 180 }, "facing=west,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/azalea_door_bottom_left_open", + "model": "wild_wind_core:block/azalea_door_bottom_left_open", "y": 270 }, "facing=west,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/azalea_door_bottom_right", + "model": "wild_wind_core:block/azalea_door_bottom_right", "y": 180 }, "facing=west,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/azalea_door_bottom_right_open", + "model": "wild_wind_core:block/azalea_door_bottom_right_open", "y": 90 }, "facing=west,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/azalea_door_top_left", + "model": "wild_wind_core:block/azalea_door_top_left", "y": 180 }, "facing=west,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/azalea_door_top_left_open", + "model": "wild_wind_core:block/azalea_door_top_left_open", "y": 270 }, "facing=west,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/azalea_door_top_right", + "model": "wild_wind_core:block/azalea_door_top_right", "y": 180 }, "facing=west,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/azalea_door_top_right_open", + "model": "wild_wind_core:block/azalea_door_top_right_open", "y": 90 } } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_fence.json similarity index 65% rename from src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence.json rename to src/core/resources/assets/wild_wind_core/blockstates/azalea_fence.json index bc802fe..0df415f 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence.json +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_fence.json @@ -2,12 +2,12 @@ "multipart": [ { "apply": { - "model": "ww_hfas:block/azalea_fence_post" + "model": "wild_wind_core:block/azalea_fence_post" } }, { "apply": { - "model": "ww_hfas:block/azalea_fence_side", + "model": "wild_wind_core:block/azalea_fence_side", "uvlock": true }, "when": { @@ -16,7 +16,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_fence_side", + "model": "wild_wind_core:block/azalea_fence_side", "uvlock": true, "y": 90 }, @@ -26,7 +26,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_fence_side", + "model": "wild_wind_core:block/azalea_fence_side", "uvlock": true, "y": 180 }, @@ -36,7 +36,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_fence_side", + "model": "wild_wind_core:block/azalea_fence_side", "uvlock": true, "y": 270 }, @@ -45,4 +45,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence_gate.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_fence_gate.json similarity index 58% rename from src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence_gate.json rename to src/core/resources/assets/wild_wind_core/blockstates/azalea_fence_gate.json index b834ead..9d38076 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_fence_gate.json +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_fence_gate.json @@ -1,80 +1,80 @@ { "variants": { "facing=east,in_wall=false,open=false": { - "model": "ww_hfas:block/azalea_fence_gate", + "model": "wild_wind_core:block/azalea_fence_gate", "uvlock": true, "y": 270 }, "facing=east,in_wall=false,open=true": { - "model": "ww_hfas:block/azalea_fence_gate_open", + "model": "wild_wind_core:block/azalea_fence_gate_open", "uvlock": true, "y": 270 }, "facing=east,in_wall=true,open=false": { - "model": "ww_hfas:block/azalea_fence_gate_wall", + "model": "wild_wind_core:block/azalea_fence_gate_wall", "uvlock": true, "y": 270 }, "facing=east,in_wall=true,open=true": { - "model": "ww_hfas:block/azalea_fence_gate_wall_open", + "model": "wild_wind_core:block/azalea_fence_gate_wall_open", "uvlock": true, "y": 270 }, "facing=north,in_wall=false,open=false": { - "model": "ww_hfas:block/azalea_fence_gate", + "model": "wild_wind_core:block/azalea_fence_gate", "uvlock": true, "y": 180 }, "facing=north,in_wall=false,open=true": { - "model": "ww_hfas:block/azalea_fence_gate_open", + "model": "wild_wind_core:block/azalea_fence_gate_open", "uvlock": true, "y": 180 }, "facing=north,in_wall=true,open=false": { - "model": "ww_hfas:block/azalea_fence_gate_wall", + "model": "wild_wind_core:block/azalea_fence_gate_wall", "uvlock": true, "y": 180 }, "facing=north,in_wall=true,open=true": { - "model": "ww_hfas:block/azalea_fence_gate_wall_open", + "model": "wild_wind_core:block/azalea_fence_gate_wall_open", "uvlock": true, "y": 180 }, "facing=south,in_wall=false,open=false": { - "model": "ww_hfas:block/azalea_fence_gate", + "model": "wild_wind_core:block/azalea_fence_gate", "uvlock": true }, "facing=south,in_wall=false,open=true": { - "model": "ww_hfas:block/azalea_fence_gate_open", + "model": "wild_wind_core:block/azalea_fence_gate_open", "uvlock": true }, "facing=south,in_wall=true,open=false": { - "model": "ww_hfas:block/azalea_fence_gate_wall", + "model": "wild_wind_core:block/azalea_fence_gate_wall", "uvlock": true }, "facing=south,in_wall=true,open=true": { - "model": "ww_hfas:block/azalea_fence_gate_wall_open", + "model": "wild_wind_core:block/azalea_fence_gate_wall_open", "uvlock": true }, "facing=west,in_wall=false,open=false": { - "model": "ww_hfas:block/azalea_fence_gate", + "model": "wild_wind_core:block/azalea_fence_gate", "uvlock": true, "y": 90 }, "facing=west,in_wall=false,open=true": { - "model": "ww_hfas:block/azalea_fence_gate_open", + "model": "wild_wind_core:block/azalea_fence_gate_open", "uvlock": true, "y": 90 }, "facing=west,in_wall=true,open=false": { - "model": "ww_hfas:block/azalea_fence_gate_wall", + "model": "wild_wind_core:block/azalea_fence_gate_wall", "uvlock": true, "y": 90 }, "facing=west,in_wall=true,open=true": { - "model": "ww_hfas:block/azalea_fence_gate_wall_open", + "model": "wild_wind_core:block/azalea_fence_gate_wall_open", "uvlock": true, "y": 90 } } -} \ No newline at end of file +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_hanging_sign.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_hanging_sign.json new file mode 100644 index 0000000..8ca8732 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_hanging_sign.json @@ -0,0 +1,124 @@ +{ + "variants": { + "attached=false,rotation=0": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_0" + }, + "attached=false,rotation=1": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_1" + }, + "attached=false,rotation=10": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_2", + "y": 180 + }, + "attached=false,rotation=11": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_3", + "y": 180 + }, + "attached=false,rotation=12": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_0", + "y": 270 + }, + "attached=false,rotation=13": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_1", + "y": 270 + }, + "attached=false,rotation=14": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_2", + "y": 270 + }, + "attached=false,rotation=15": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_3", + "y": 270 + }, + "attached=false,rotation=2": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_2" + }, + "attached=false,rotation=3": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_3" + }, + "attached=false,rotation=4": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_0", + "y": 90 + }, + "attached=false,rotation=5": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_1", + "y": 90 + }, + "attached=false,rotation=6": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_2", + "y": 90 + }, + "attached=false,rotation=7": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_3", + "y": 90 + }, + "attached=false,rotation=8": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_0", + "y": 180 + }, + "attached=false,rotation=9": { + "model": "wild_wind_core:block/azalea_hanging_sign_rot_1", + "y": 180 + }, + "attached=true,rotation=0": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_0" + }, + "attached=true,rotation=1": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_1" + }, + "attached=true,rotation=10": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_2", + "y": 180 + }, + "attached=true,rotation=11": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_3", + "y": 180 + }, + "attached=true,rotation=12": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_0", + "y": 270 + }, + "attached=true,rotation=13": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_1", + "y": 270 + }, + "attached=true,rotation=14": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_2", + "y": 270 + }, + "attached=true,rotation=15": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_3", + "y": 270 + }, + "attached=true,rotation=2": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_2" + }, + "attached=true,rotation=3": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_3" + }, + "attached=true,rotation=4": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_0", + "y": 90 + }, + "attached=true,rotation=5": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_1", + "y": 90 + }, + "attached=true,rotation=6": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_2", + "y": 90 + }, + "attached=true,rotation=7": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_3", + "y": 90 + }, + "attached=true,rotation=8": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_0", + "y": 180 + }, + "attached=true,rotation=9": { + "model": "wild_wind_core:block/azalea_hanging_sign_attached_rot_1", + "y": 180 + } + } +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_log.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_log.json new file mode 100644 index 0000000..d946e87 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_core:block/azalea_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_core:block/azalea_log" + }, + "axis=z": { + "model": "wild_wind_core:block/azalea_log_horizontal", + "x": 90 + } + } +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_planks.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_planks.json new file mode 100644 index 0000000..7ea3199 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_planks.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_core:block/azalea_planks" + } + } +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_pressure_plate.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_pressure_plate.json new file mode 100644 index 0000000..549d59b --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_pressure_plate.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "wild_wind_core:block/azalea_pressure_plate" + }, + "powered=true": { + "model": "wild_wind_core:block/azalea_pressure_plate_down" + } + } +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_shelf.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_shelf.json similarity index 79% rename from src/hfas/resources/assets/ww_hfas/blockstates/azalea_shelf.json rename to src/core/resources/assets/wild_wind_core/blockstates/azalea_shelf.json index 7af1f23..13e87e8 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_shelf.json +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_shelf.json @@ -2,7 +2,7 @@ "multipart": [ { "apply": { - "model": "ww_hfas:block/azalea_shelf" + "model": "wild_wind_core:block/azalea_shelf" }, "when": { "facing": "north" @@ -10,7 +10,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf", + "model": "wild_wind_core:block/azalea_shelf", "y": 90 }, "when": { @@ -19,7 +19,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf", + "model": "wild_wind_core:block/azalea_shelf", "y": 180 }, "when": { @@ -28,7 +28,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf", + "model": "wild_wind_core:block/azalea_shelf", "y": 270 }, "when": { @@ -37,7 +37,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_unpowered" + "model": "wild_wind_core:block/azalea_shelf_unpowered" }, "when": { "AND": [ @@ -52,7 +52,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_unpowered", + "model": "wild_wind_core:block/azalea_shelf_unpowered", "y": 90 }, "when": { @@ -68,7 +68,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_unpowered", + "model": "wild_wind_core:block/azalea_shelf_unpowered", "y": 180 }, "when": { @@ -84,7 +84,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_unpowered", + "model": "wild_wind_core:block/azalea_shelf_unpowered", "y": 270 }, "when": { @@ -100,7 +100,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_unconnected" + "model": "wild_wind_core:block/azalea_shelf_unconnected" }, "when": { "AND": [ @@ -118,7 +118,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_unconnected", + "model": "wild_wind_core:block/azalea_shelf_unconnected", "y": 90 }, "when": { @@ -137,7 +137,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_unconnected", + "model": "wild_wind_core:block/azalea_shelf_unconnected", "y": 180 }, "when": { @@ -156,7 +156,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_unconnected", + "model": "wild_wind_core:block/azalea_shelf_unconnected", "y": 270 }, "when": { @@ -175,7 +175,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_left" + "model": "wild_wind_core:block/azalea_shelf_left" }, "when": { "AND": [ @@ -193,7 +193,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_left", + "model": "wild_wind_core:block/azalea_shelf_left", "y": 90 }, "when": { @@ -212,7 +212,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_left", + "model": "wild_wind_core:block/azalea_shelf_left", "y": 180 }, "when": { @@ -231,7 +231,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_left", + "model": "wild_wind_core:block/azalea_shelf_left", "y": 270 }, "when": { @@ -250,7 +250,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_center" + "model": "wild_wind_core:block/azalea_shelf_center" }, "when": { "AND": [ @@ -268,7 +268,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_center", + "model": "wild_wind_core:block/azalea_shelf_center", "y": 90 }, "when": { @@ -287,7 +287,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_center", + "model": "wild_wind_core:block/azalea_shelf_center", "y": 180 }, "when": { @@ -306,7 +306,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_center", + "model": "wild_wind_core:block/azalea_shelf_center", "y": 270 }, "when": { @@ -325,7 +325,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_right" + "model": "wild_wind_core:block/azalea_shelf_right" }, "when": { "AND": [ @@ -343,7 +343,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_right", + "model": "wild_wind_core:block/azalea_shelf_right", "y": 90 }, "when": { @@ -362,7 +362,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_right", + "model": "wild_wind_core:block/azalea_shelf_right", "y": 180 }, "when": { @@ -381,7 +381,7 @@ }, { "apply": { - "model": "ww_hfas:block/azalea_shelf_right", + "model": "wild_wind_core:block/azalea_shelf_right", "y": 270 }, "when": { @@ -399,4 +399,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_sign.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_sign.json new file mode 100644 index 0000000..86b676a --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_sign.json @@ -0,0 +1,64 @@ +{ + "variants": { + "rotation=0": { + "model": "wild_wind_core:block/azalea_sign_rot_0" + }, + "rotation=1": { + "model": "wild_wind_core:block/azalea_sign_rot_1" + }, + "rotation=10": { + "model": "wild_wind_core:block/azalea_sign_rot_2", + "y": 180 + }, + "rotation=11": { + "model": "wild_wind_core:block/azalea_sign_rot_3", + "y": 180 + }, + "rotation=12": { + "model": "wild_wind_core:block/azalea_sign_rot_0", + "y": 270 + }, + "rotation=13": { + "model": "wild_wind_core:block/azalea_sign_rot_1", + "y": 270 + }, + "rotation=14": { + "model": "wild_wind_core:block/azalea_sign_rot_2", + "y": 270 + }, + "rotation=15": { + "model": "wild_wind_core:block/azalea_sign_rot_3", + "y": 270 + }, + "rotation=2": { + "model": "wild_wind_core:block/azalea_sign_rot_2" + }, + "rotation=3": { + "model": "wild_wind_core:block/azalea_sign_rot_3" + }, + "rotation=4": { + "model": "wild_wind_core:block/azalea_sign_rot_0", + "y": 90 + }, + "rotation=5": { + "model": "wild_wind_core:block/azalea_sign_rot_1", + "y": 90 + }, + "rotation=6": { + "model": "wild_wind_core:block/azalea_sign_rot_2", + "y": 90 + }, + "rotation=7": { + "model": "wild_wind_core:block/azalea_sign_rot_3", + "y": 90 + }, + "rotation=8": { + "model": "wild_wind_core:block/azalea_sign_rot_0", + "y": 180 + }, + "rotation=9": { + "model": "wild_wind_core:block/azalea_sign_rot_1", + "y": 180 + } + } +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_slab.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_slab.json new file mode 100644 index 0000000..93e7436 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "wild_wind_core:block/azalea_slab" + }, + "type=double": { + "model": "wild_wind_core:block/azalea_planks" + }, + "type=top": { + "model": "wild_wind_core:block/azalea_slab_top" + } + } +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_stairs.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_stairs.json similarity index 62% rename from src/hfas/resources/assets/ww_hfas/blockstates/azalea_stairs.json rename to src/core/resources/assets/wild_wind_core/blockstates/azalea_stairs.json index 47d615b..8575030 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_stairs.json +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_stairs.json @@ -1,209 +1,209 @@ { "variants": { "facing=east,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "y": 270 }, "facing=east,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/azalea_stairs_inner" + "model": "wild_wind_core:block/azalea_stairs_inner" }, "facing=east,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "y": 270 }, "facing=east,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/azalea_stairs_outer" + "model": "wild_wind_core:block/azalea_stairs_outer" }, "facing=east,half=bottom,shape=straight": { - "model": "ww_hfas:block/azalea_stairs" + "model": "wild_wind_core:block/azalea_stairs" }, "facing=east,half=top,shape=inner_left": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "x": 180 }, "facing=east,half=top,shape=inner_right": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "x": 180, "y": 90 }, "facing=east,half=top,shape=outer_left": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "x": 180 }, "facing=east,half=top,shape=outer_right": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "x": 180, "y": 90 }, "facing=east,half=top,shape=straight": { - "model": "ww_hfas:block/azalea_stairs", + "model": "wild_wind_core:block/azalea_stairs", "uvlock": true, "x": 180 }, "facing=north,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "y": 180 }, "facing=north,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "y": 270 }, "facing=north,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "y": 180 }, "facing=north,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "y": 270 }, "facing=north,half=bottom,shape=straight": { - "model": "ww_hfas:block/azalea_stairs", + "model": "wild_wind_core:block/azalea_stairs", "uvlock": true, "y": 270 }, "facing=north,half=top,shape=inner_left": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "x": 180, "y": 270 }, "facing=north,half=top,shape=inner_right": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "x": 180 }, "facing=north,half=top,shape=outer_left": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "x": 180, "y": 270 }, "facing=north,half=top,shape=outer_right": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "x": 180 }, "facing=north,half=top,shape=straight": { - "model": "ww_hfas:block/azalea_stairs", + "model": "wild_wind_core:block/azalea_stairs", "uvlock": true, "x": 180, "y": 270 }, "facing=south,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/azalea_stairs_inner" + "model": "wild_wind_core:block/azalea_stairs_inner" }, "facing=south,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "y": 90 }, "facing=south,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/azalea_stairs_outer" + "model": "wild_wind_core:block/azalea_stairs_outer" }, "facing=south,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "y": 90 }, "facing=south,half=bottom,shape=straight": { - "model": "ww_hfas:block/azalea_stairs", + "model": "wild_wind_core:block/azalea_stairs", "uvlock": true, "y": 90 }, "facing=south,half=top,shape=inner_left": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "x": 180, "y": 90 }, "facing=south,half=top,shape=inner_right": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "x": 180, "y": 180 }, "facing=south,half=top,shape=outer_left": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "x": 180, "y": 90 }, "facing=south,half=top,shape=outer_right": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "x": 180, "y": 180 }, "facing=south,half=top,shape=straight": { - "model": "ww_hfas:block/azalea_stairs", + "model": "wild_wind_core:block/azalea_stairs", "uvlock": true, "x": 180, "y": 90 }, "facing=west,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "y": 90 }, "facing=west,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "y": 180 }, "facing=west,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "y": 90 }, "facing=west,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "y": 180 }, "facing=west,half=bottom,shape=straight": { - "model": "ww_hfas:block/azalea_stairs", + "model": "wild_wind_core:block/azalea_stairs", "uvlock": true, "y": 180 }, "facing=west,half=top,shape=inner_left": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "x": 180, "y": 180 }, "facing=west,half=top,shape=inner_right": { - "model": "ww_hfas:block/azalea_stairs_inner", + "model": "wild_wind_core:block/azalea_stairs_inner", "uvlock": true, "x": 180, "y": 270 }, "facing=west,half=top,shape=outer_left": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "x": 180, "y": 180 }, "facing=west,half=top,shape=outer_right": { - "model": "ww_hfas:block/azalea_stairs_outer", + "model": "wild_wind_core:block/azalea_stairs_outer", "uvlock": true, "x": 180, "y": 270 }, "facing=west,half=top,shape=straight": { - "model": "ww_hfas:block/azalea_stairs", + "model": "wild_wind_core:block/azalea_stairs", "uvlock": true, "x": 180, "y": 180 } } -} \ No newline at end of file +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_trapdoor.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_trapdoor.json new file mode 100644 index 0000000..eee8566 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_trapdoor.json @@ -0,0 +1,58 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "wild_wind_core:block/azalea_trapdoor_bottom" + }, + "facing=east,half=bottom,open=true": { + "model": "wild_wind_core:block/azalea_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "wild_wind_core:block/azalea_trapdoor_top" + }, + "facing=east,half=top,open=true": { + "model": "wild_wind_core:block/azalea_trapdoor_open", + "y": 90 + }, + "facing=north,half=bottom,open=false": { + "model": "wild_wind_core:block/azalea_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "wild_wind_core:block/azalea_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "wild_wind_core:block/azalea_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "wild_wind_core:block/azalea_trapdoor_open" + }, + "facing=south,half=bottom,open=false": { + "model": "wild_wind_core:block/azalea_trapdoor_bottom" + }, + "facing=south,half=bottom,open=true": { + "model": "wild_wind_core:block/azalea_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "wild_wind_core:block/azalea_trapdoor_top" + }, + "facing=south,half=top,open=true": { + "model": "wild_wind_core:block/azalea_trapdoor_open", + "y": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "wild_wind_core:block/azalea_trapdoor_bottom" + }, + "facing=west,half=bottom,open=true": { + "model": "wild_wind_core:block/azalea_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "wild_wind_core:block/azalea_trapdoor_top" + }, + "facing=west,half=top,open=true": { + "model": "wild_wind_core:block/azalea_trapdoor_open", + "y": 270 + } + } +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_wall_hanging_sign.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_wall_hanging_sign.json new file mode 100644 index 0000000..35ac0f4 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_wall_hanging_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "wild_wind_core:block/azalea_wall_hanging_sign", + "y": 270 + }, + "facing=north": { + "model": "wild_wind_core:block/azalea_wall_hanging_sign", + "y": 180 + }, + "facing=south": { + "model": "wild_wind_core:block/azalea_wall_hanging_sign" + }, + "facing=west": { + "model": "wild_wind_core:block/azalea_wall_hanging_sign", + "y": 90 + } + } +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_wall_sign.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_wall_sign.json new file mode 100644 index 0000000..232cc2b --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_wall_sign.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "wild_wind_core:block/azalea_wall_sign", + "y": 270 + }, + "facing=north": { + "model": "wild_wind_core:block/azalea_wall_sign", + "y": 180 + }, + "facing=south": { + "model": "wild_wind_core:block/azalea_wall_sign" + }, + "facing=west": { + "model": "wild_wind_core:block/azalea_wall_sign", + "y": 90 + } + } +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/azalea_wood.json b/src/core/resources/assets/wild_wind_core/blockstates/azalea_wood.json new file mode 100644 index 0000000..a53c859 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/azalea_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_core:block/azalea_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_core:block/azalea_wood" + }, + "axis=z": { + "model": "wild_wind_core:block/azalea_wood", + "x": 90 + } + } +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/kiln.json b/src/core/resources/assets/wild_wind_core/blockstates/kiln.json similarity index 99% rename from src/hfas/resources/assets/ww_hfas/blockstates/kiln.json rename to src/core/resources/assets/wild_wind_core/blockstates/kiln.json index 9c31d91..b86d059 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/kiln.json +++ b/src/core/resources/assets/wild_wind_core/blockstates/kiln.json @@ -31,4 +31,4 @@ "y": 270 } } -} \ No newline at end of file +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/stripped_azalea_log.json b/src/core/resources/assets/wild_wind_core/blockstates/stripped_azalea_log.json new file mode 100644 index 0000000..4dbdb64 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/stripped_azalea_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_core:block/stripped_azalea_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_core:block/stripped_azalea_log" + }, + "axis=z": { + "model": "wild_wind_core:block/stripped_azalea_log_horizontal", + "x": 90 + } + } +} diff --git a/src/core/resources/assets/wild_wind_core/blockstates/stripped_azalea_wood.json b/src/core/resources/assets/wild_wind_core/blockstates/stripped_azalea_wood.json new file mode 100644 index 0000000..bf07c6e --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/blockstates/stripped_azalea_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_core:block/stripped_azalea_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_core:block/stripped_azalea_wood" + }, + "axis=z": { + "model": "wild_wind_core:block/stripped_azalea_wood", + "x": 90 + } + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_boat.json b/src/core/resources/assets/wild_wind_core/items/azalea_boat.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/items/azalea_boat.json rename to src/core/resources/assets/wild_wind_core/items/azalea_boat.json index 5f09a27..37a486e 100644 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_boat.json +++ b/src/core/resources/assets/wild_wind_core/items/azalea_boat.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/azalea_boat" + "model": "wild_wind_core:item/azalea_boat" } } \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_button.json b/src/core/resources/assets/wild_wind_core/items/azalea_button.json new file mode 100644 index 0000000..07890a1 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_button_inventory" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_chest_boat.json b/src/core/resources/assets/wild_wind_core/items/azalea_chest_boat.json new file mode 100644 index 0000000..1dd4332 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:item/azalea_chest_boat" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/cooked_calamari.json b/src/core/resources/assets/wild_wind_core/items/azalea_door.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/items/cooked_calamari.json rename to src/core/resources/assets/wild_wind_core/items/azalea_door.json index e88c204..b99b76a 100644 --- a/src/hfas/resources/assets/ww_hfas/items/cooked_calamari.json +++ b/src/core/resources/assets/wild_wind_core/items/azalea_door.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/cooked_calamari" + "model": "wild_wind_core:item/azalea_door" } } diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_fence.json b/src/core/resources/assets/wild_wind_core/items/azalea_fence.json new file mode 100644 index 0000000..5a0e2f3 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_fence_inventory" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_fence_gate.json b/src/core/resources/assets/wild_wind_core/items/azalea_fence_gate.json new file mode 100644 index 0000000..4a186c6 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_fence_gate" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_hanging_sign.json b/src/core/resources/assets/wild_wind_core/items/azalea_hanging_sign.json new file mode 100644 index 0000000..1412d39 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:item/azalea_hanging_sign" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_log.json b/src/core/resources/assets/wild_wind_core/items/azalea_log.json new file mode 100644 index 0000000..3100539 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_planks.json b/src/core/resources/assets/wild_wind_core/items/azalea_planks.json new file mode 100644 index 0000000..79f251b --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_planks" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_pressure_plate.json b/src/core/resources/assets/wild_wind_core/items/azalea_pressure_plate.json new file mode 100644 index 0000000..523f757 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_pressure_plate" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_shelf.json b/src/core/resources/assets/wild_wind_core/items/azalea_shelf.json new file mode 100644 index 0000000..63d07d8 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_shelf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_shelf_inventory" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_sign.json b/src/core/resources/assets/wild_wind_core/items/azalea_sign.json new file mode 100644 index 0000000..677fc1c --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:item/azalea_sign" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_slab.json b/src/core/resources/assets/wild_wind_core/items/azalea_slab.json new file mode 100644 index 0000000..3e9e0be --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_slab" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_stairs.json b/src/core/resources/assets/wild_wind_core/items/azalea_stairs.json new file mode 100644 index 0000000..09499e0 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_stairs" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_trapdoor.json b/src/core/resources/assets/wild_wind_core/items/azalea_trapdoor.json new file mode 100644 index 0000000..1471053 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_trapdoor_bottom" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/azalea_wood.json b/src/core/resources/assets/wild_wind_core/items/azalea_wood.json new file mode 100644 index 0000000..08feb64 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/azalea_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/azalea_wood" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/baked_seeds.json b/src/core/resources/assets/wild_wind_core/items/baked_seeds.json new file mode 100644 index 0000000..91da65f --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/baked_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:item/baked_seeds" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/calamari.json b/src/core/resources/assets/wild_wind_core/items/calamari.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/items/calamari.json rename to src/core/resources/assets/wild_wind_core/items/calamari.json index 7e204b9..dd3b15e 100644 --- a/src/hfas/resources/assets/ww_hfas/items/calamari.json +++ b/src/core/resources/assets/wild_wind_core/items/calamari.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/calamari" + "model": "wild_wind_core:item/calamari" } } diff --git a/src/core/resources/assets/wild_wind_core/items/cooked_calamari.json b/src/core/resources/assets/wild_wind_core/items/cooked_calamari.json new file mode 100644 index 0000000..1d94739 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/cooked_calamari.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:item/cooked_calamari" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/cooked_egg.json b/src/core/resources/assets/wild_wind_core/items/cooked_egg.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/items/cooked_egg.json rename to src/core/resources/assets/wild_wind_core/items/cooked_egg.json index c09c695..c092562 100644 --- a/src/hfas/resources/assets/ww_hfas/items/cooked_egg.json +++ b/src/core/resources/assets/wild_wind_core/items/cooked_egg.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/cooked_egg" + "model": "wild_wind_core:item/cooked_egg" } } diff --git a/src/hfas/resources/assets/ww_hfas/items/cooked_frog_legs.json b/src/core/resources/assets/wild_wind_core/items/cooked_frog_legs.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/items/cooked_frog_legs.json rename to src/core/resources/assets/wild_wind_core/items/cooked_frog_legs.json index a24db76..facfc88 100644 --- a/src/hfas/resources/assets/ww_hfas/items/cooked_frog_legs.json +++ b/src/core/resources/assets/wild_wind_core/items/cooked_frog_legs.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/cooked_frog_legs" + "model": "wild_wind_core:item/cooked_frog_legs" } } diff --git a/src/hfas/resources/assets/ww_hfas/items/duckweed.json b/src/core/resources/assets/wild_wind_core/items/duckweed.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/items/duckweed.json rename to src/core/resources/assets/wild_wind_core/items/duckweed.json index 9f57dcf..1f73aa0 100644 --- a/src/hfas/resources/assets/ww_hfas/items/duckweed.json +++ b/src/core/resources/assets/wild_wind_core/items/duckweed.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/duckweed" + "model": "wild_wind_core:item/duckweed" } } diff --git a/src/hfas/resources/assets/ww_hfas/items/frog_legs.json b/src/core/resources/assets/wild_wind_core/items/frog_legs.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/items/frog_legs.json rename to src/core/resources/assets/wild_wind_core/items/frog_legs.json index 6953e72..0794c66 100644 --- a/src/hfas/resources/assets/ww_hfas/items/frog_legs.json +++ b/src/core/resources/assets/wild_wind_core/items/frog_legs.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/frog_legs" + "model": "wild_wind_core:item/frog_legs" } } diff --git a/src/hfas/resources/assets/ww_hfas/items/kiln.json b/src/core/resources/assets/wild_wind_core/items/kiln.json similarity index 97% rename from src/hfas/resources/assets/ww_hfas/items/kiln.json rename to src/core/resources/assets/wild_wind_core/items/kiln.json index 6449afc..0e832fb 100644 --- a/src/hfas/resources/assets/ww_hfas/items/kiln.json +++ b/src/core/resources/assets/wild_wind_core/items/kiln.json @@ -3,4 +3,4 @@ "type": "minecraft:model", "model": "minecraft:block/furnace" } -} \ No newline at end of file +} diff --git a/src/core/resources/assets/wild_wind_core/items/stripped_azalea_log.json b/src/core/resources/assets/wild_wind_core/items/stripped_azalea_log.json new file mode 100644 index 0000000..25189fd --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/stripped_azalea_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/items/stripped_azalea_wood.json b/src/core/resources/assets/wild_wind_core/items/stripped_azalea_wood.json new file mode 100644 index 0000000..2236039 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/items/stripped_azalea_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_core:block/stripped_azalea_wood" + } +} diff --git a/src/core/resources/assets/wild_wind_core/lang/en_us.json b/src/core/resources/assets/wild_wind_core/lang/en_us.json new file mode 100644 index 0000000..7715a7d --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/lang/en_us.json @@ -0,0 +1,31 @@ +{ + "block.minecraft.oak_hanging_sign": "Azalea Wall Hanging Sign", + "block.minecraft.oak_sign": "Azalea Wall Sign", + "block.wild_wind_core.azalea_button": "Azalea Button", + "block.wild_wind_core.azalea_door": "Azalea Door", + "block.wild_wind_core.azalea_fence": "Azalea Fence", + "block.wild_wind_core.azalea_fence_gate": "Azalea Fence Gate", + "block.wild_wind_core.azalea_hanging_sign": "Azalea Hanging Sign", + "block.wild_wind_core.azalea_log": "Azalea Log", + "block.wild_wind_core.azalea_planks": "Azalea Planks", + "block.wild_wind_core.azalea_pressure_plate": "Azalea Pressure Plate", + "block.wild_wind_core.azalea_shelf": "Azalea Shelf", + "block.wild_wind_core.azalea_sign": "Azalea Sign", + "block.wild_wind_core.azalea_slab": "Azalea Slab", + "block.wild_wind_core.azalea_stairs": "Azalea Stairs", + "block.wild_wind_core.azalea_trapdoor": "Azalea Trapdoor", + "block.wild_wind_core.azalea_wood": "Azalea Wood", + "block.wild_wind_core.kiln": "Kiln", + "block.wild_wind_core.stripped_azalea_log": "Stripped Azalea Log", + "block.wild_wind_core.stripped_azalea_wood": "Stripped Azalea Wood", + "enchantment.wild_wind_core.melting": "Melting", + "item.wild_wind_core.baked_seeds": "Baked Seeds", + "item.wild_wind_core.calamari": "Calamari", + "item.wild_wind_core.cooked_calamari": "Cooked Calamari", + "item.wild_wind_core.cooked_egg": "Fried Egg", + "item.wild_wind_core.cooked_frog_legs": "Cooked Frog Legs", + "item.wild_wind_core.duckweed": "Duckweed", + "item.wild_wind_core.frog_legs": "Raw Frog Legs", + "mod.wild_wind.name": "Wild Wind", + "mod.wild_wind.core": "Wild Wind:Core" +} diff --git a/src/core/resources/assets/wild_wind_core/lang/zh_cn.json b/src/core/resources/assets/wild_wind_core/lang/zh_cn.json new file mode 100644 index 0000000..43671cd --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/lang/zh_cn.json @@ -0,0 +1,31 @@ +{ + "block.minecraft.oak_hanging_sign": "墙上的悬挂式杜鹃木告示牌", + "block.minecraft.oak_sign": "墙上的杜鹃木告示牌", + "block.wild_wind_core.azalea_button": "杜鹃木按钮", + "block.wild_wind_core.azalea_door": "杜鹃木门", + "block.wild_wind_core.azalea_fence": "杜鹃木栅栏", + "block.wild_wind_core.azalea_fence_gate": "杜鹃木栅栏门", + "block.wild_wind_core.azalea_hanging_sign": "悬挂式杜鹃木告示牌", + "block.wild_wind_core.azalea_log": "杜鹃木原木", + "block.wild_wind_core.azalea_planks": "杜鹃木木板", + "block.wild_wind_core.azalea_pressure_plate": "杜鹃木压力板", + "block.wild_wind_core.azalea_shelf": "杜鹃木展示架", + "block.wild_wind_core.azalea_sign": "杜鹃木告示牌", + "block.wild_wind_core.azalea_slab": "杜鹃木台阶", + "block.wild_wind_core.azalea_stairs": "杜鹃木楼梯", + "block.wild_wind_core.azalea_trapdoor": "杜鹃木活板门", + "block.wild_wind_core.azalea_wood": "杜鹃木", + "block.wild_wind_core.kiln": "窑炉", + "block.wild_wind_core.stripped_azalea_log": "去皮杜鹃木原木", + "block.wild_wind_core.stripped_azalea_wood": "去皮杜鹃木", + "enchantment.wild_wind_core.melting": "熔炼", + "item.wild_wind_core.baked_seeds": "烤种子", + "item.wild_wind_core.calamari": "鱿鱼须", + "item.wild_wind_core.cooked_calamari": "熟鱿鱼须", + "item.wild_wind_core.cooked_egg": "煎蛋", + "item.wild_wind_core.cooked_frog_legs": "熟蛙腿", + "item.wild_wind_core.duckweed": "浮萍", + "item.wild_wind_core.frog_legs": "生蛙腿", + "mod.wild_wind.name": "原野之风", + "mod.wild_wind.core": "原野之风:核心" +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_button.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_button.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_button.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_button.json index fe81559..f997e2a 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_button.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_button.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/button", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_inventory.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_button_inventory.json similarity index 56% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_button_inventory.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_button_inventory.json index 7c19fd1..d18c28d 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_inventory.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_button_inventory.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/button_inventory", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_pressed.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_button_pressed.json similarity index 55% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_button_pressed.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_button_pressed.json index 87e701c..7f213bb 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_button_pressed.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_button_pressed.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/button_pressed", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_left.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_left.json new file mode 100644 index 0000000..2f1052e --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "wild_wind_core:block/azalea_door_bottom", + "top": "wild_wind_core:block/azalea_door_top" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_left_open.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_left_open.json new file mode 100644 index 0000000..f093f9e --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "wild_wind_core:block/azalea_door_bottom", + "top": "wild_wind_core:block/azalea_door_top" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_right.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_right.json new file mode 100644 index 0000000..2111cc8 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "wild_wind_core:block/azalea_door_bottom", + "top": "wild_wind_core:block/azalea_door_top" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_right_open.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_right_open.json new file mode 100644 index 0000000..cf96a04 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "wild_wind_core:block/azalea_door_bottom", + "top": "wild_wind_core:block/azalea_door_top" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_left.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_left.json new file mode 100644 index 0000000..eb067da --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "wild_wind_core:block/azalea_door_bottom", + "top": "wild_wind_core:block/azalea_door_top" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_left_open.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_left_open.json new file mode 100644 index 0000000..dc23983 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "wild_wind_core:block/azalea_door_bottom", + "top": "wild_wind_core:block/azalea_door_top" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_right.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_right.json new file mode 100644 index 0000000..87064cf --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "wild_wind_core:block/azalea_door_bottom", + "top": "wild_wind_core:block/azalea_door_top" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_right_open.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_right_open.json new file mode 100644 index 0000000..f54028b --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "wild_wind_core:block/azalea_door_bottom", + "top": "wild_wind_core:block/azalea_door_top" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate.json similarity index 57% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate.json index 009cc3f..8412e16 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_open.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate_open.json similarity index 59% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_open.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate_open.json index 7c4347f..67d573e 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_open.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate_open.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate_open", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate_wall.json similarity index 59% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate_wall.json index 8bb6743..c34ea72 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate_wall.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate_wall", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall_open.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate_wall_open.json similarity index 60% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall_open.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate_wall_open.json index aa7f1ce..5e353ff 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_gate_wall_open.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_gate_wall_open.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate_wall_open", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_inventory.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_inventory.json similarity index 56% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_inventory.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_fence_inventory.json index 0840399..fc7db85 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_inventory.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_inventory.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/fence_inventory", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_post.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_post.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_post.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_fence_post.json index fbb34a0..80526bb 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_post.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_post.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/fence_post", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_side.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_side.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_side.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_fence_side.json index 1c4fcbe..d7d2f71 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_fence_side.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_fence_side.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/fence_side", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_0.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_0.json new file mode 100644 index 0000000..bd50e99 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_0", + "textures": { + "all": "wild_wind_core:block/azalea_hanging_sign", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_1.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_1.json new file mode 100644 index 0000000..defad0f --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_1", + "textures": { + "all": "wild_wind_core:block/azalea_hanging_sign", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_2.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_2.json new file mode 100644 index 0000000..68faae4 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_2", + "textures": { + "all": "wild_wind_core:block/azalea_hanging_sign", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_3.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_3.json new file mode 100644 index 0000000..96ddfef --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_attached_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_3", + "textures": { + "all": "wild_wind_core:block/azalea_hanging_sign", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_0.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_0.json new file mode 100644 index 0000000..57441d8 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_0", + "textures": { + "all": "wild_wind_core:block/azalea_hanging_sign", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_1.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_1.json new file mode 100644 index 0000000..ceb03ee --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_1", + "textures": { + "all": "wild_wind_core:block/azalea_hanging_sign", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_2.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_2.json new file mode 100644 index 0000000..439fec8 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_2", + "textures": { + "all": "wild_wind_core:block/azalea_hanging_sign", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_3.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_3.json new file mode 100644 index 0000000..4053d81 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_hanging_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_3", + "textures": { + "all": "wild_wind_core:block/azalea_hanging_sign", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_log.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_log.json new file mode 100644 index 0000000..da4f5ff --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_core:block/azalea_log_top", + "side": "wild_wind_core:block/azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_log_horizontal.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_log_horizontal.json new file mode 100644 index 0000000..64c5bc0 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "wild_wind_core:block/azalea_log_top", + "side": "wild_wind_core:block/azalea_log" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_planks.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_planks.json similarity index 55% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_planks.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_planks.json index 1637503..a98b278 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_planks.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_planks.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cube_all", "textures": { - "all": "ww_hfas:block/azalea_planks" + "all": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_pressure_plate.json similarity index 56% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_pressure_plate.json index 8fc98fd..37648c4 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_pressure_plate.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/pressure_plate_up", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate_down.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_pressure_plate_down.json similarity index 57% rename from src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate_down.json rename to src/core/resources/assets/wild_wind_core/models/block/azalea_pressure_plate_down.json index b8664e4..b0a2470 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_pressure_plate_down.json +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_pressure_plate_down.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/pressure_plate_down", "textures": { - "texture": "ww_hfas:block/azalea_planks" + "texture": "wild_wind_core:block/azalea_planks" } -} \ No newline at end of file +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf.json new file mode 100644 index 0000000..de4caf8 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_body", + "textures": { + "all": "wild_wind_core:block/azalea_shelf", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_center.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_center.json new file mode 100644 index 0000000..6c25513 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_center.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_center", + "textures": { + "all": "wild_wind_core:block/azalea_shelf", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_inventory.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_inventory.json new file mode 100644 index 0000000..cdef7ed --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_inventory.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_inventory", + "textures": { + "all": "wild_wind_core:block/azalea_shelf", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_left.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_left.json new file mode 100644 index 0000000..efd9d35 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_left", + "textures": { + "all": "wild_wind_core:block/azalea_shelf", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_right.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_right.json new file mode 100644 index 0000000..4e24539 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_right", + "textures": { + "all": "wild_wind_core:block/azalea_shelf", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_unconnected.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_unconnected.json new file mode 100644 index 0000000..48cec4c --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_unconnected.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_unconnected", + "textures": { + "all": "wild_wind_core:block/azalea_shelf", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_unpowered.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_unpowered.json new file mode 100644 index 0000000..8dc9612 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_shelf_unpowered.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_shelf_unpowered", + "textures": { + "all": "wild_wind_core:block/azalea_shelf", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_0.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_0.json new file mode 100644 index 0000000..cd0f20f --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_0", + "textures": { + "all": "wild_wind_core:block/azalea_sign", + "particle": "wild_wind_core:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_1.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_1.json new file mode 100644 index 0000000..d9662fa --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_1", + "textures": { + "all": "wild_wind_core:block/azalea_sign", + "particle": "wild_wind_core:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_2.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_2.json new file mode 100644 index 0000000..1405e83 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_2", + "textures": { + "all": "wild_wind_core:block/azalea_sign", + "particle": "wild_wind_core:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_3.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_3.json new file mode 100644 index 0000000..a469dd6 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_3", + "textures": { + "all": "wild_wind_core:block/azalea_sign", + "particle": "wild_wind_core:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_slab.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_slab.json new file mode 100644 index 0000000..7e09f48 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "wild_wind_core:block/azalea_planks", + "side": "wild_wind_core:block/azalea_planks", + "top": "wild_wind_core:block/azalea_planks" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_slab_top.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_slab_top.json new file mode 100644 index 0000000..ba35d83 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "wild_wind_core:block/azalea_planks", + "side": "wild_wind_core:block/azalea_planks", + "top": "wild_wind_core:block/azalea_planks" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_stairs.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_stairs.json new file mode 100644 index 0000000..e3e7594 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "wild_wind_core:block/azalea_planks", + "side": "wild_wind_core:block/azalea_planks", + "top": "wild_wind_core:block/azalea_planks" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_stairs_inner.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_stairs_inner.json new file mode 100644 index 0000000..bed78d8 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "wild_wind_core:block/azalea_planks", + "side": "wild_wind_core:block/azalea_planks", + "top": "wild_wind_core:block/azalea_planks" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_stairs_outer.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_stairs_outer.json new file mode 100644 index 0000000..a3ffb2c --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "wild_wind_core:block/azalea_planks", + "side": "wild_wind_core:block/azalea_planks", + "top": "wild_wind_core:block/azalea_planks" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_bottom.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_bottom.json new file mode 100644 index 0000000..b521700 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_trapdoor_bottom", + "textures": { + "texture": "wild_wind_core:block/azalea_trapdoor" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_open.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_open.json new file mode 100644 index 0000000..9da8355 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_trapdoor_open", + "textures": { + "texture": "wild_wind_core:block/azalea_trapdoor" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_top.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_top.json new file mode 100644 index 0000000..06065f3 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_trapdoor_top", + "textures": { + "texture": "wild_wind_core:block/azalea_trapdoor" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_wall_hanging_sign.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_wall_hanging_sign.json new file mode 100644 index 0000000..5a663e0 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_wall_hanging_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_hanging_sign", + "textures": { + "all": "wild_wind_core:block/azalea_hanging_sign", + "particle": "wild_wind_core:block/stripped_azalea_log" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_wall_sign.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_wall_sign.json new file mode 100644 index 0000000..39d0827 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_wall_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_sign", + "textures": { + "all": "wild_wind_core:block/azalea_sign", + "particle": "wild_wind_core:block/azalea_planks" + } +} \ No newline at end of file diff --git a/src/core/resources/assets/wild_wind_core/models/block/azalea_wood.json b/src/core/resources/assets/wild_wind_core/models/block/azalea_wood.json new file mode 100644 index 0000000..671ae85 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/azalea_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_core:block/azalea_log", + "side": "wild_wind_core:block/azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_log.json b/src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_log.json new file mode 100644 index 0000000..f58edb9 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_core:block/stripped_azalea_log_top", + "side": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_log_horizontal.json b/src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_log_horizontal.json new file mode 100644 index 0000000..47fb80a --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "wild_wind_core:block/stripped_azalea_log_top", + "side": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_wood.json b/src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_wood.json new file mode 100644 index 0000000..e853fe1 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/block/stripped_azalea_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_core:block/stripped_azalea_log", + "side": "wild_wind_core:block/stripped_azalea_log" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_boat.json b/src/core/resources/assets/wild_wind_core/models/item/azalea_boat.json similarity index 56% rename from src/hfas/resources/assets/ww_hfas/models/item/azalea_boat.json rename to src/core/resources/assets/wild_wind_core/models/item/azalea_boat.json index 64aca35..32c784e 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/azalea_boat.json +++ b/src/core/resources/assets/wild_wind_core/models/item/azalea_boat.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/azalea_boat" + "layer0": "wild_wind_core:item/azalea_boat" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_chest_boat.json b/src/core/resources/assets/wild_wind_core/models/item/azalea_chest_boat.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/models/item/azalea_chest_boat.json rename to src/core/resources/assets/wild_wind_core/models/item/azalea_chest_boat.json index 05ec872..ef113c3 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/azalea_chest_boat.json +++ b/src/core/resources/assets/wild_wind_core/models/item/azalea_chest_boat.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/azalea_chest_boat" + "layer0": "wild_wind_core:item/azalea_chest_boat" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/cooked_calamari.json b/src/core/resources/assets/wild_wind_core/models/item/azalea_door.json similarity index 57% rename from src/hfas/resources/assets/ww_hfas/models/item/cooked_calamari.json rename to src/core/resources/assets/wild_wind_core/models/item/azalea_door.json index 5283aa1..49c9a93 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/cooked_calamari.json +++ b/src/core/resources/assets/wild_wind_core/models/item/azalea_door.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/cooked_calamari" + "layer0": "wild_wind_core:item/azalea_door" } } diff --git a/src/core/resources/assets/wild_wind_core/models/item/azalea_hanging_sign.json b/src/core/resources/assets/wild_wind_core/models/item/azalea_hanging_sign.json new file mode 100644 index 0000000..946de22 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/item/azalea_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_core:item/azalea_hanging_sign" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/item/azalea_sign.json b/src/core/resources/assets/wild_wind_core/models/item/azalea_sign.json new file mode 100644 index 0000000..e2765b9 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/item/azalea_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_core:item/azalea_sign" + } +} diff --git a/src/core/resources/assets/wild_wind_core/models/item/baked_seeds.json b/src/core/resources/assets/wild_wind_core/models/item/baked_seeds.json new file mode 100644 index 0000000..56944af --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/item/baked_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_core:item/baked_seeds" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/calamari.json b/src/core/resources/assets/wild_wind_core/models/item/calamari.json similarity index 58% rename from src/hfas/resources/assets/ww_hfas/models/item/calamari.json rename to src/core/resources/assets/wild_wind_core/models/item/calamari.json index 1612bf4..1bda34a 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/calamari.json +++ b/src/core/resources/assets/wild_wind_core/models/item/calamari.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/calamari" + "layer0": "wild_wind_core:item/calamari" } } diff --git a/src/core/resources/assets/wild_wind_core/models/item/cooked_calamari.json b/src/core/resources/assets/wild_wind_core/models/item/cooked_calamari.json new file mode 100644 index 0000000..30b5120 --- /dev/null +++ b/src/core/resources/assets/wild_wind_core/models/item/cooked_calamari.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_core:item/cooked_calamari" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/cooked_egg.json b/src/core/resources/assets/wild_wind_core/models/item/cooked_egg.json similarity index 57% rename from src/hfas/resources/assets/ww_hfas/models/item/cooked_egg.json rename to src/core/resources/assets/wild_wind_core/models/item/cooked_egg.json index 08419b6..f70f905 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/cooked_egg.json +++ b/src/core/resources/assets/wild_wind_core/models/item/cooked_egg.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/cooked_egg" + "layer0": "wild_wind_core:item/cooked_egg" } } diff --git a/src/hfas/resources/assets/ww_hfas/models/item/cooked_frog_legs.json b/src/core/resources/assets/wild_wind_core/models/item/cooked_frog_legs.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/item/cooked_frog_legs.json rename to src/core/resources/assets/wild_wind_core/models/item/cooked_frog_legs.json index 60745ac..fe636a0 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/cooked_frog_legs.json +++ b/src/core/resources/assets/wild_wind_core/models/item/cooked_frog_legs.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/cooked_frog_legs" + "layer0": "wild_wind_core:item/cooked_frog_legs" } } diff --git a/src/hfas/resources/assets/ww_hfas/models/item/duckweed.json b/src/core/resources/assets/wild_wind_core/models/item/duckweed.json similarity index 58% rename from src/hfas/resources/assets/ww_hfas/models/item/duckweed.json rename to src/core/resources/assets/wild_wind_core/models/item/duckweed.json index 8a1bd01..579676d 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/duckweed.json +++ b/src/core/resources/assets/wild_wind_core/models/item/duckweed.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/duckweed" + "layer0": "wild_wind_core:item/duckweed" } } diff --git a/src/hfas/resources/assets/ww_hfas/models/item/frog_legs.json b/src/core/resources/assets/wild_wind_core/models/item/frog_legs.json similarity index 58% rename from src/hfas/resources/assets/ww_hfas/models/item/frog_legs.json rename to src/core/resources/assets/wild_wind_core/models/item/frog_legs.json index 79d5eab..f64eaf7 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/frog_legs.json +++ b/src/core/resources/assets/wild_wind_core/models/item/frog_legs.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/frog_legs" + "layer0": "wild_wind_core:item/frog_legs" } } diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_door_bottom.png b/src/core/resources/assets/wild_wind_core/textures/block/azalea_door_bottom.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/azalea_door_bottom.png rename to src/core/resources/assets/wild_wind_core/textures/block/azalea_door_bottom.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_door_top.png b/src/core/resources/assets/wild_wind_core/textures/block/azalea_door_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/azalea_door_top.png rename to src/core/resources/assets/wild_wind_core/textures/block/azalea_door_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_hanging_sign.png b/src/core/resources/assets/wild_wind_core/textures/block/azalea_hanging_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/azalea_hanging_sign.png rename to src/core/resources/assets/wild_wind_core/textures/block/azalea_hanging_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_log.png b/src/core/resources/assets/wild_wind_core/textures/block/azalea_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/azalea_log.png rename to src/core/resources/assets/wild_wind_core/textures/block/azalea_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_log_top.png b/src/core/resources/assets/wild_wind_core/textures/block/azalea_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/azalea_log_top.png rename to src/core/resources/assets/wild_wind_core/textures/block/azalea_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_planks.png b/src/core/resources/assets/wild_wind_core/textures/block/azalea_planks.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/azalea_planks.png rename to src/core/resources/assets/wild_wind_core/textures/block/azalea_planks.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_shelf.png b/src/core/resources/assets/wild_wind_core/textures/block/azalea_shelf.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/azalea_shelf.png rename to src/core/resources/assets/wild_wind_core/textures/block/azalea_shelf.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_sign.png b/src/core/resources/assets/wild_wind_core/textures/block/azalea_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/azalea_sign.png rename to src/core/resources/assets/wild_wind_core/textures/block/azalea_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/azalea_trapdoor.png b/src/core/resources/assets/wild_wind_core/textures/block/azalea_trapdoor.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/azalea_trapdoor.png rename to src/core/resources/assets/wild_wind_core/textures/block/azalea_trapdoor.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_azalea_log.png b/src/core/resources/assets/wild_wind_core/textures/block/stripped_azalea_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_azalea_log.png rename to src/core/resources/assets/wild_wind_core/textures/block/stripped_azalea_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_azalea_log_top.png b/src/core/resources/assets/wild_wind_core/textures/block/stripped_azalea_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_azalea_log_top.png rename to src/core/resources/assets/wild_wind_core/textures/block/stripped_azalea_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/boat/azalea.png b/src/core/resources/assets/wild_wind_core/textures/entity/boat/azalea.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/boat/azalea.png rename to src/core/resources/assets/wild_wind_core/textures/entity/boat/azalea.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/azalea.png b/src/core/resources/assets/wild_wind_core/textures/entity/chest_boat/azalea.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/azalea.png rename to src/core/resources/assets/wild_wind_core/textures/entity/chest_boat/azalea.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/azalea.png b/src/core/resources/assets/wild_wind_core/textures/entity/signs/azalea.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/azalea.png rename to src/core/resources/assets/wild_wind_core/textures/entity/signs/azalea.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/azalea.png b/src/core/resources/assets/wild_wind_core/textures/entity/signs/hanging/azalea.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/azalea.png rename to src/core/resources/assets/wild_wind_core/textures/entity/signs/hanging/azalea.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/azalea.png b/src/core/resources/assets/wild_wind_core/textures/gui/hanging_signs/azalea.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/azalea.png rename to src/core/resources/assets/wild_wind_core/textures/gui/hanging_signs/azalea.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/gui/signs/azalea.png b/src/core/resources/assets/wild_wind_core/textures/gui/signs/azalea.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/gui/signs/azalea.png rename to src/core/resources/assets/wild_wind_core/textures/gui/signs/azalea.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/azalea_boat.png b/src/core/resources/assets/wild_wind_core/textures/item/azalea_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/azalea_boat.png rename to src/core/resources/assets/wild_wind_core/textures/item/azalea_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/azalea_chest_boat.png b/src/core/resources/assets/wild_wind_core/textures/item/azalea_chest_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/azalea_chest_boat.png rename to src/core/resources/assets/wild_wind_core/textures/item/azalea_chest_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/azalea_door.png b/src/core/resources/assets/wild_wind_core/textures/item/azalea_door.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/azalea_door.png rename to src/core/resources/assets/wild_wind_core/textures/item/azalea_door.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/azalea_hanging_sign.png b/src/core/resources/assets/wild_wind_core/textures/item/azalea_hanging_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/azalea_hanging_sign.png rename to src/core/resources/assets/wild_wind_core/textures/item/azalea_hanging_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/azalea_sign.png b/src/core/resources/assets/wild_wind_core/textures/item/azalea_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/azalea_sign.png rename to src/core/resources/assets/wild_wind_core/textures/item/azalea_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/baked_seeds.png b/src/core/resources/assets/wild_wind_core/textures/item/baked_seeds.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/baked_seeds.png rename to src/core/resources/assets/wild_wind_core/textures/item/baked_seeds.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/calamari.png b/src/core/resources/assets/wild_wind_core/textures/item/calamari.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/calamari.png rename to src/core/resources/assets/wild_wind_core/textures/item/calamari.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cooked_calamari.png b/src/core/resources/assets/wild_wind_core/textures/item/cooked_calamari.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/cooked_calamari.png rename to src/core/resources/assets/wild_wind_core/textures/item/cooked_calamari.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cooked_egg.png b/src/core/resources/assets/wild_wind_core/textures/item/cooked_egg.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/cooked_egg.png rename to src/core/resources/assets/wild_wind_core/textures/item/cooked_egg.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cooked_frog_legs.png b/src/core/resources/assets/wild_wind_core/textures/item/cooked_frog_legs.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/cooked_frog_legs.png rename to src/core/resources/assets/wild_wind_core/textures/item/cooked_frog_legs.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/duckweed.png b/src/core/resources/assets/wild_wind_core/textures/item/duckweed.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/duckweed.png rename to src/core/resources/assets/wild_wind_core/textures/item/duckweed.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/frog_legs.png b/src/core/resources/assets/wild_wind_core/textures/item/frog_legs.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/frog_legs.png rename to src/core/resources/assets/wild_wind_core/textures/item/frog_legs.png diff --git a/src/core/resources/data/c/tags/block/fence_gates/wooden.json b/src/core/resources/data/c/tags/block/fence_gates/wooden.json new file mode 100644 index 0000000..5cecd6d --- /dev/null +++ b/src/core/resources/data/c/tags/block/fence_gates/wooden.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence_gate" + ] +} diff --git a/src/core/resources/data/c/tags/block/fences.json b/src/core/resources/data/c/tags/block/fences.json new file mode 100644 index 0000000..6115af8 --- /dev/null +++ b/src/core/resources/data/c/tags/block/fences.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence" + ] +} diff --git a/src/core/resources/data/c/tags/block/fences/wooden.json b/src/core/resources/data/c/tags/block/fences/wooden.json new file mode 100644 index 0000000..6115af8 --- /dev/null +++ b/src/core/resources/data/c/tags/block/fences/wooden.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence" + ] +} diff --git a/src/core/resources/data/c/tags/block/stripped_logs.json b/src/core/resources/data/c/tags/block/stripped_logs.json new file mode 100644 index 0000000..107a4aa --- /dev/null +++ b/src/core/resources/data/c/tags/block/stripped_logs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:stripped_azalea_log" + ] +} diff --git a/src/core/resources/data/c/tags/block/stripped_woods.json b/src/core/resources/data/c/tags/block/stripped_woods.json new file mode 100644 index 0000000..cafecb7 --- /dev/null +++ b/src/core/resources/data/c/tags/block/stripped_woods.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:stripped_azalea_wood" + ] +} diff --git a/src/core/resources/data/c/tags/item/fence_gates/wooden.json b/src/core/resources/data/c/tags/item/fence_gates/wooden.json new file mode 100644 index 0000000..5cecd6d --- /dev/null +++ b/src/core/resources/data/c/tags/item/fence_gates/wooden.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence_gate" + ] +} diff --git a/src/core/resources/data/c/tags/item/fences/wooden.json b/src/core/resources/data/c/tags/item/fences/wooden.json new file mode 100644 index 0000000..6115af8 --- /dev/null +++ b/src/core/resources/data/c/tags/item/fences/wooden.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence" + ] +} diff --git a/src/core/resources/data/c/tags/item/stripped_logs.json b/src/core/resources/data/c/tags/item/stripped_logs.json new file mode 100644 index 0000000..107a4aa --- /dev/null +++ b/src/core/resources/data/c/tags/item/stripped_logs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:stripped_azalea_log" + ] +} diff --git a/src/core/resources/data/c/tags/item/stripped_woods.json b/src/core/resources/data/c/tags/item/stripped_woods.json new file mode 100644 index 0000000..cafecb7 --- /dev/null +++ b/src/core/resources/data/c/tags/item/stripped_woods.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:stripped_azalea_wood" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/all_hanging_signs.json b/src/core/resources/data/minecraft/tags/block/all_hanging_signs.json new file mode 100644 index 0000000..102b637 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/all_hanging_signs.json @@ -0,0 +1,12 @@ +{ + "values": [ + { + "required": false, + "id": "wild_wind_core:azalea_hanging_sign" + }, + { + "required": false, + "id": "wild_wind_core:azalea_wall_hanging_sign" + } + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/block/flower_pots.json b/src/core/resources/data/minecraft/tags/block/all_signs.json similarity index 52% rename from src/hfas/resources/data/minecraft/tags/block/flower_pots.json rename to src/core/resources/data/minecraft/tags/block/all_signs.json index 79b5c75..802bbd4 100644 --- a/src/hfas/resources/data/minecraft/tags/block/flower_pots.json +++ b/src/core/resources/data/minecraft/tags/block/all_signs.json @@ -2,11 +2,11 @@ "values": [ { "required": false, - "id": "ww_hfas:potted_blaze_sapling" + "id": "wild_wind_core:azalea_sign" }, { "required": false, - "id": "ww_hfas:potted_soul_sapling" + "id": "wild_wind_core:azalea_wall_sign" } ] } diff --git a/src/core/resources/data/minecraft/tags/block/ceiling_hanging_signs.json b/src/core/resources/data/minecraft/tags/block/ceiling_hanging_signs.json new file mode 100644 index 0000000..b114ed6 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/ceiling_hanging_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_hanging_sign" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/doors.json b/src/core/resources/data/minecraft/tags/block/doors.json new file mode 100644 index 0000000..ec33762 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/doors.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_door" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/fence_gates.json b/src/core/resources/data/minecraft/tags/block/fence_gates.json new file mode 100644 index 0000000..5cecd6d --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/fence_gates.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence_gate" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/fences.json b/src/core/resources/data/minecraft/tags/block/fences.json new file mode 100644 index 0000000..6115af8 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/fences.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/logs.json b/src/core/resources/data/minecraft/tags/block/logs.json new file mode 100644 index 0000000..8d968e5 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_core:azalea_log", + "wild_wind_core:azalea_wood", + "wild_wind_core:stripped_azalea_log", + "wild_wind_core:stripped_azalea_wood" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/logs_that_burn.json b/src/core/resources/data/minecraft/tags/block/logs_that_burn.json new file mode 100644 index 0000000..8d968e5 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/logs_that_burn.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_core:azalea_log", + "wild_wind_core:azalea_wood", + "wild_wind_core:stripped_azalea_log", + "wild_wind_core:stripped_azalea_wood" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/mineable/axe.json b/src/core/resources/data/minecraft/tags/block/mineable/axe.json new file mode 100644 index 0000000..3a14d79 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/mineable/axe.json @@ -0,0 +1,22 @@ +{ + "values": [ + "wild_wind_core:azalea_sign", + "wild_wind_core:azalea_wall_sign", + "wild_wind_core:azalea_hanging_sign", + "wild_wind_core:azalea_wall_hanging_sign", + "wild_wind_core:azalea_shelf", + "wild_wind_core:azalea_log", + "wild_wind_core:azalea_wood", + "wild_wind_core:stripped_azalea_log", + "wild_wind_core:stripped_azalea_wood", + "wild_wind_core:azalea_planks", + "wild_wind_core:azalea_stairs", + "wild_wind_core:azalea_slab", + "wild_wind_core:azalea_fence", + "wild_wind_core:azalea_fence_gate", + "wild_wind_core:azalea_door", + "wild_wind_core:azalea_trapdoor", + "wild_wind_core:azalea_pressure_plate", + "wild_wind_core:azalea_button" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/core/resources/data/minecraft/tags/block/mineable/pickaxe.json new file mode 100644 index 0000000..fdcdae0 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:kiln" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/needs_stone_tool.json b/src/core/resources/data/minecraft/tags/block/needs_stone_tool.json new file mode 100644 index 0000000..490112d --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/needs_stone_tool.json @@ -0,0 +1,17 @@ +{ + "values": [ + "wild_wind_core:azalea_log", + "wild_wind_core:azalea_wood", + "wild_wind_core:stripped_azalea_log", + "wild_wind_core:stripped_azalea_wood", + "wild_wind_core:azalea_planks", + "wild_wind_core:azalea_stairs", + "wild_wind_core:azalea_slab", + "wild_wind_core:azalea_fence", + "wild_wind_core:azalea_fence_gate", + "wild_wind_core:azalea_door", + "wild_wind_core:azalea_trapdoor", + "wild_wind_core:azalea_pressure_plate", + "wild_wind_core:azalea_button" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/overworld_natural_logs.json b/src/core/resources/data/minecraft/tags/block/overworld_natural_logs.json new file mode 100644 index 0000000..c73ac3a --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/overworld_natural_logs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_log" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/planks.json b/src/core/resources/data/minecraft/tags/block/planks.json new file mode 100644 index 0000000..3a64f8f --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/planks.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_planks" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/standing_signs.json b/src/core/resources/data/minecraft/tags/block/standing_signs.json new file mode 100644 index 0000000..3d85148 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/standing_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_sign" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/trapdoors.json b/src/core/resources/data/minecraft/tags/block/trapdoors.json new file mode 100644 index 0000000..3758f81 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/trapdoors.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_trapdoor" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wall_hanging_signs.json b/src/core/resources/data/minecraft/tags/block/wall_hanging_signs.json new file mode 100644 index 0000000..927dd44 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wall_hanging_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_wall_hanging_sign" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wall_signs.json b/src/core/resources/data/minecraft/tags/block/wall_signs.json new file mode 100644 index 0000000..3a80830 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wall_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_wall_sign" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wooden_buttons.json b/src/core/resources/data/minecraft/tags/block/wooden_buttons.json new file mode 100644 index 0000000..e116c67 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wooden_buttons.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_button" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wooden_doors.json b/src/core/resources/data/minecraft/tags/block/wooden_doors.json new file mode 100644 index 0000000..ec33762 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wooden_doors.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_door" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wooden_fences.json b/src/core/resources/data/minecraft/tags/block/wooden_fences.json new file mode 100644 index 0000000..6115af8 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wooden_fences.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wooden_pressure_plates.json b/src/core/resources/data/minecraft/tags/block/wooden_pressure_plates.json new file mode 100644 index 0000000..4cae1b8 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wooden_pressure_plates.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_pressure_plate" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wooden_shelves.json b/src/core/resources/data/minecraft/tags/block/wooden_shelves.json new file mode 100644 index 0000000..83fd298 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wooden_shelves.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_shelf" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wooden_slabs.json b/src/core/resources/data/minecraft/tags/block/wooden_slabs.json new file mode 100644 index 0000000..a1c4e5b --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wooden_slabs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_slab" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wooden_stairs.json b/src/core/resources/data/minecraft/tags/block/wooden_stairs.json new file mode 100644 index 0000000..193f12f --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wooden_stairs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_stairs" + ] +} diff --git a/src/core/resources/data/minecraft/tags/block/wooden_trapdoors.json b/src/core/resources/data/minecraft/tags/block/wooden_trapdoors.json new file mode 100644 index 0000000..3758f81 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/block/wooden_trapdoors.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_trapdoor" + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/enchantment/non_treasure.json b/src/core/resources/data/minecraft/tags/enchantment/non_treasure.json similarity index 59% rename from src/hfas/resources/data/minecraft/tags/enchantment/non_treasure.json rename to src/core/resources/data/minecraft/tags/enchantment/non_treasure.json index 38f5c62..f02fbef 100644 --- a/src/hfas/resources/data/minecraft/tags/enchantment/non_treasure.json +++ b/src/core/resources/data/minecraft/tags/enchantment/non_treasure.json @@ -1,6 +1,6 @@ { "replace": false, "values": [ - "ww_hfas:melting" + "wild_wind_core:melting" ] } diff --git a/src/core/resources/data/minecraft/tags/item/boats.json b/src/core/resources/data/minecraft/tags/item/boats.json new file mode 100644 index 0000000..8fbcbc0 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/boats.json @@ -0,0 +1,8 @@ +{ + "values": [ + { + "required": false, + "id": "wild_wind_core:azalea_boat" + } + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/buttons.json b/src/core/resources/data/minecraft/tags/item/buttons.json new file mode 100644 index 0000000..e116c67 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/buttons.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_button" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/chest_boats.json b/src/core/resources/data/minecraft/tags/item/chest_boats.json new file mode 100644 index 0000000..1b61632 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/chest_boats.json @@ -0,0 +1,8 @@ +{ + "values": [ + { + "required": false, + "id": "wild_wind_core:azalea_chest_boat" + } + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/doors.json b/src/core/resources/data/minecraft/tags/item/doors.json new file mode 100644 index 0000000..ec33762 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/doors.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_door" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/fence_gates.json b/src/core/resources/data/minecraft/tags/item/fence_gates.json new file mode 100644 index 0000000..5cecd6d --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/fence_gates.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence_gate" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/hanging_signs.json b/src/core/resources/data/minecraft/tags/item/hanging_signs.json new file mode 100644 index 0000000..b114ed6 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/hanging_signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_hanging_sign" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/logs.json b/src/core/resources/data/minecraft/tags/item/logs.json new file mode 100644 index 0000000..8d968e5 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_core:azalea_log", + "wild_wind_core:azalea_wood", + "wild_wind_core:stripped_azalea_log", + "wild_wind_core:stripped_azalea_wood" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/logs_that_burn.json b/src/core/resources/data/minecraft/tags/item/logs_that_burn.json new file mode 100644 index 0000000..8d968e5 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/logs_that_burn.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_core:azalea_log", + "wild_wind_core:azalea_wood", + "wild_wind_core:stripped_azalea_log", + "wild_wind_core:stripped_azalea_wood" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/planks.json b/src/core/resources/data/minecraft/tags/item/planks.json new file mode 100644 index 0000000..3a64f8f --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/planks.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_planks" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/signs.json b/src/core/resources/data/minecraft/tags/item/signs.json new file mode 100644 index 0000000..3d85148 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/signs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_sign" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/trapdoors.json b/src/core/resources/data/minecraft/tags/item/trapdoors.json new file mode 100644 index 0000000..3758f81 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/trapdoors.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_trapdoor" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/wooden_buttons.json b/src/core/resources/data/minecraft/tags/item/wooden_buttons.json new file mode 100644 index 0000000..e116c67 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/wooden_buttons.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_button" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/wooden_doors.json b/src/core/resources/data/minecraft/tags/item/wooden_doors.json new file mode 100644 index 0000000..ec33762 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/wooden_doors.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_door" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/wooden_fences.json b/src/core/resources/data/minecraft/tags/item/wooden_fences.json new file mode 100644 index 0000000..6115af8 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/wooden_fences.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_fence" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/wooden_pressure_plates.json b/src/core/resources/data/minecraft/tags/item/wooden_pressure_plates.json new file mode 100644 index 0000000..4cae1b8 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/wooden_pressure_plates.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_pressure_plate" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/wooden_shelves.json b/src/core/resources/data/minecraft/tags/item/wooden_shelves.json new file mode 100644 index 0000000..83fd298 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/wooden_shelves.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_shelf" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/wooden_slabs.json b/src/core/resources/data/minecraft/tags/item/wooden_slabs.json new file mode 100644 index 0000000..a1c4e5b --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/wooden_slabs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_slab" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/wooden_stairs.json b/src/core/resources/data/minecraft/tags/item/wooden_stairs.json new file mode 100644 index 0000000..193f12f --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/wooden_stairs.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_stairs" + ] +} diff --git a/src/core/resources/data/minecraft/tags/item/wooden_trapdoors.json b/src/core/resources/data/minecraft/tags/item/wooden_trapdoors.json new file mode 100644 index 0000000..3758f81 --- /dev/null +++ b/src/core/resources/data/minecraft/tags/item/wooden_trapdoors.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_core:azalea_trapdoor" + ] +} diff --git a/src/core/resources/data/neoforge/data_maps/block/strippables.json b/src/core/resources/data/neoforge/data_maps/block/strippables.json new file mode 100644 index 0000000..1b86c5c --- /dev/null +++ b/src/core/resources/data/neoforge/data_maps/block/strippables.json @@ -0,0 +1,10 @@ +{ + "values": { + "wild_wind_core:azalea_log": { + "stripped_block": "wild_wind_core:stripped_azalea_log" + }, + "wild_wind_core:azalea_wood": { + "stripped_block": "wild_wind_core:stripped_azalea_wood" + } + } +} diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_planks.json b/src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_planks.json similarity index 77% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_planks.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_planks.json index da67a8e..9e331cd 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_planks.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_planks.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_log" + "items": "wild_wind_core:azalea_log" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_planks" + "recipe": "wild_wind_core:azalea_planks" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_planks" + "wild_wind_core:azalea_planks" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_slab.json b/src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_slab.json similarity index 77% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_slab.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_slab.json index ab61f14..2fec6ed 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_slab.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_slab.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_planks" + "items": "wild_wind_core:azalea_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_slab" + "recipe": "wild_wind_core:azalea_slab" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_slab" + "wild_wind_core:azalea_slab" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_stairs.json b/src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_stairs.json similarity index 77% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_stairs.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_stairs.json index 531589f..3454d42 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_stairs.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_stairs.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_planks" + "items": "wild_wind_core:azalea_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_stairs" + "recipe": "wild_wind_core:azalea_stairs" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_stairs" + "wild_wind_core:azalea_stairs" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_wood.json b/src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_wood.json similarity index 77% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_wood.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_wood.json index 803e1ce..22ac123 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/azalea_wood.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/building_blocks/azalea_wood.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_log" + "items": "wild_wind_core:azalea_log" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_wood" + "recipe": "wild_wind_core:azalea_wood" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_wood" + "wild_wind_core:azalea_wood" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_fence.json b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_fence.json similarity index 77% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_fence.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_fence.json index 735c7d1..46f2182 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_fence.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_fence.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_planks" + "items": "wild_wind_core:azalea_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_fence" + "recipe": "wild_wind_core:azalea_fence" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_fence" + "wild_wind_core:azalea_fence" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_hanging_sign.json b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_hanging_sign.json similarity index 74% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_hanging_sign.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_hanging_sign.json index cd4637a..00af81b 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_hanging_sign.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_hanging_sign.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:stripped_azalea_log" + "items": "wild_wind_core:stripped_azalea_log" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_hanging_sign" + "recipe": "wild_wind_core:azalea_hanging_sign" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_hanging_sign" + "wild_wind_core:azalea_hanging_sign" ] } -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_shelf.json b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_shelf.json similarity index 76% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_shelf.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_shelf.json index 0246bf9..2996a00 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_shelf.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_shelf.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:stripped_azalea_log" + "items": "wild_wind_core:stripped_azalea_log" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_shelf" + "recipe": "wild_wind_core:azalea_shelf" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_shelf" + "wild_wind_core:azalea_shelf" ] } -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_sign.json b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_sign.json similarity index 77% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_sign.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_sign.json index 13e958b..b5037e3 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/azalea_sign.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/azalea_sign.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_planks" + "items": "wild_wind_core:azalea_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_sign" + "recipe": "wild_wind_core:azalea_sign" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_sign" + "wild_wind_core:azalea_sign" ] } -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/kiln.json b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/kiln.json similarity index 87% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/kiln.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/decorations/kiln.json index dcd20fa..b53190d 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/kiln.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/decorations/kiln.json @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:kiln" + "recipe": "wild_wind_core:kiln" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:kiln" + "wild_wind_core:kiln" ] } -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_button.json b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_button.json similarity index 77% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_button.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_button.json index d9905e1..2b99cbc 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_button.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_button.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_planks" + "items": "wild_wind_core:azalea_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_button" + "recipe": "wild_wind_core:azalea_button" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_button" + "wild_wind_core:azalea_button" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_door.json b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_door.json similarity index 77% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_door.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_door.json index eef4172..9af57b1 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_door.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_door.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_planks" + "items": "wild_wind_core:azalea_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_door" + "recipe": "wild_wind_core:azalea_door" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_door" + "wild_wind_core:azalea_door" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_fence_gate.json b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_fence_gate.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_fence_gate.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_fence_gate.json index c8f2e7f..93d4965 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_fence_gate.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_fence_gate.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_planks" + "items": "wild_wind_core:azalea_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_fence_gate" + "recipe": "wild_wind_core:azalea_fence_gate" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_fence_gate" + "wild_wind_core:azalea_fence_gate" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_pressure_plate.json b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_pressure_plate.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_pressure_plate.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_pressure_plate.json index a65b524..d96e129 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_pressure_plate.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_pressure_plate.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_planks" + "items": "wild_wind_core:azalea_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_pressure_plate" + "recipe": "wild_wind_core:azalea_pressure_plate" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_pressure_plate" + "wild_wind_core:azalea_pressure_plate" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_trapdoor.json b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_trapdoor.json similarity index 76% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_trapdoor.json rename to src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_trapdoor.json index 916dba0..ea50938 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/azalea_trapdoor.json +++ b/src/core/resources/data/wild_wind_core/advancement/recipes/redstone/azalea_trapdoor.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:azalea_planks" + "items": "wild_wind_core:azalea_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:azalea_trapdoor" + "recipe": "wild_wind_core:azalea_trapdoor" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:azalea_trapdoor" + "wild_wind_core:azalea_trapdoor" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/enchantment/melting.json b/src/core/resources/data/wild_wind_core/enchantment/melting.json similarity index 85% rename from src/hfas/resources/data/ww_hfas/enchantment/melting.json rename to src/core/resources/data/wild_wind_core/enchantment/melting.json index 76d9bf1..d361834 100644 --- a/src/hfas/resources/data/ww_hfas/enchantment/melting.json +++ b/src/core/resources/data/wild_wind_core/enchantment/melting.json @@ -1,6 +1,6 @@ { "description": { - "translate": "enchantment.ww_hfas.melting" + "translate": "enchantment.wild_wind_core.melting" }, "supported_items": "#minecraft:enchantable/mining", "weight": 2, diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_button.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_button.json similarity index 70% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_button.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_button.json index 03bcf0a..72f2930 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_button.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_button.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_button" + "name": "wild_wind_core:azalea_button" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_button" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_button" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_door.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_door.json similarity index 74% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_door.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_door.json index c7877c6..e10fcd4 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_door.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_door.json @@ -12,18 +12,18 @@ "type": "minecraft:item", "conditions": [ { - "block": "ww_hfas:azalea_door", + "block": "wild_wind_core:azalea_door", "condition": "minecraft:block_state_property", "properties": { "half": "lower" } } ], - "name": "ww_hfas:azalea_door" + "name": "wild_wind_core:azalea_door" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_door" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_door" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_fence.json similarity index 71% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_fence.json index a03a4c0..eeab666 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_fence.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_fence" + "name": "wild_wind_core:azalea_fence" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_fence" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_fence" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence_gate.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_fence_gate.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence_gate.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_fence_gate.json index 5ebe521..c0d7f71 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_fence_gate.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_fence_gate.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_fence_gate" + "name": "wild_wind_core:azalea_fence_gate" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_fence_gate" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_fence_gate" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_hanging_sign.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_hanging_sign.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_hanging_sign.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_hanging_sign.json index 6fc4f64..cf89a67 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_hanging_sign.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_hanging_sign.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_hanging_sign" + "name": "wild_wind_core:azalea_hanging_sign" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_hanging_sign" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_hanging_sign" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_log.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_log.json similarity index 72% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_log.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_log.json index 4ffbb47..d012fd2 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_log.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_log.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_log" + "name": "wild_wind_core:azalea_log" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_log" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_log" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_planks.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_planks.json similarity index 70% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_planks.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_planks.json index 588f0d4..f48ca12 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_planks.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_planks.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_planks" + "name": "wild_wind_core:azalea_planks" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_planks" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_planks" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_pressure_plate.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_pressure_plate.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_pressure_plate.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_pressure_plate.json index 0392b05..36185c4 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_pressure_plate.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_pressure_plate.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_pressure_plate" + "name": "wild_wind_core:azalea_pressure_plate" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_pressure_plate" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_pressure_plate" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_shelf.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_shelf.json similarity index 71% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_shelf.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_shelf.json index 5fc4d38..5f4bd82 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_shelf.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_shelf.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_shelf" + "name": "wild_wind_core:azalea_shelf" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_shelf" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_shelf" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_sign.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_sign.json similarity index 71% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_sign.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_sign.json index a43d569..2af5402 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_sign.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_sign.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_sign" + "name": "wild_wind_core:azalea_sign" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_sign" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_sign" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_slab.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_slab.json similarity index 71% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_slab.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_slab.json index 2911549..155514f 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_slab.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_slab.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_slab" + "name": "wild_wind_core:azalea_slab" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_slab" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_slab" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_stairs.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_stairs.json similarity index 70% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_stairs.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_stairs.json index 29b96f7..b60ecc2 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_stairs.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_stairs.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_stairs" + "name": "wild_wind_core:azalea_stairs" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_stairs" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_stairs" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_trapdoor.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_trapdoor.json similarity index 70% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_trapdoor.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_trapdoor.json index 21e1b86..2dbb149 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_trapdoor.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_trapdoor.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_trapdoor" + "name": "wild_wind_core:azalea_trapdoor" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_trapdoor" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_trapdoor" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_hanging_sign.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_wall_hanging_sign.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_hanging_sign.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_wall_hanging_sign.json index 883a76f..161609b 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_hanging_sign.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_wall_hanging_sign.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_hanging_sign" + "name": "wild_wind_core:azalea_hanging_sign" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_wall_hanging_sign" + "random_sequence": "wild_wind_core:blocks/azalea_wall_hanging_sign" } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_sign.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_wall_sign.json similarity index 71% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_sign.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_wall_sign.json index 57a8056..f513ec8 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wall_sign.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_wall_sign.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_sign" + "name": "wild_wind_core:azalea_sign" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_wall_sign" + "random_sequence": "wild_wind_core:blocks/azalea_wall_sign" } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wood.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_wood.json similarity index 71% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wood.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_wood.json index 26f3879..ca7cf42 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/azalea_wood.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/azalea_wood.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:azalea_wood" + "name": "wild_wind_core:azalea_wood" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/azalea_wood" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/azalea_wood" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/kiln.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/kiln.json similarity index 84% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/kiln.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/kiln.json index e747fbc..ade5c3d 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/kiln.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/kiln.json @@ -19,11 +19,11 @@ "source": "block_entity" } ], - "name": "ww_hfas:kiln" + "name": "wild_wind_core:kiln" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/kiln" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/kiln" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_log.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/stripped_azalea_log.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_log.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/stripped_azalea_log.json index 5049168..953ff6a 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_log.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/stripped_azalea_log.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:stripped_azalea_log" + "name": "wild_wind_core:stripped_azalea_log" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/stripped_azalea_log" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/stripped_azalea_log" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_wood.json b/src/core/resources/data/wild_wind_core/loot_table/blocks/stripped_azalea_wood.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_wood.json rename to src/core/resources/data/wild_wind_core/loot_table/blocks/stripped_azalea_wood.json index 97742ac..00e6538 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_azalea_wood.json +++ b/src/core/resources/data/wild_wind_core/loot_table/blocks/stripped_azalea_wood.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:stripped_azalea_wood" + "name": "wild_wind_core:stripped_azalea_wood" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/stripped_azalea_wood" -} \ No newline at end of file + "random_sequence": "wild_wind_core:blocks/stripped_azalea_wood" +} diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_azalea_tree.json b/src/core/resources/data/wild_wind_core/neoforge/biome_modifier/add_azalea_tree.json similarity index 66% rename from src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_azalea_tree.json rename to src/core/resources/data/wild_wind_core/neoforge/biome_modifier/add_azalea_tree.json index ac3385a..0f39991 100644 --- a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_azalea_tree.json +++ b/src/core/resources/data/wild_wind_core/neoforge/biome_modifier/add_azalea_tree.json @@ -1,6 +1,6 @@ { "type": "neoforge:add_features", "biomes": "minecraft:lush_caves", - "features": "ww_hfas:azalea_tree_placed", + "features": "wild_wind_core:azalea_tree_placed", "step": "vegetal_decoration" -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/remove_vanilla_azalea_tree.json b/src/core/resources/data/wild_wind_core/neoforge/biome_modifier/remove_vanilla_azalea_tree.json similarity index 98% rename from src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/remove_vanilla_azalea_tree.json rename to src/core/resources/data/wild_wind_core/neoforge/biome_modifier/remove_vanilla_azalea_tree.json index b7ceefe..362d5c6 100644 --- a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/remove_vanilla_azalea_tree.json +++ b/src/core/resources/data/wild_wind_core/neoforge/biome_modifier/remove_vanilla_azalea_tree.json @@ -3,4 +3,4 @@ "biomes": "minecraft:lush_caves", "features": "minecraft:rooted_azalea_tree", "steps": "vegetal_decoration" -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_button.json b/src/core/resources/data/wild_wind_core/recipe/azalea_button.json similarity index 59% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_button.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_button.json index cc6de8d..4ca3360 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_button.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_button.json @@ -2,9 +2,9 @@ "type": "minecraft:crafting_shapeless", "category": "redstone", "ingredients": [ - "ww_hfas:azalea_planks" + "wild_wind_core:azalea_planks" ], "result": { - "id": "ww_hfas:azalea_button" + "id": "wild_wind_core:azalea_button" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_door.json b/src/core/resources/data/wild_wind_core/recipe/azalea_door.json similarity index 67% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_door.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_door.json index 4e86a42..6c1ffe5 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_door.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_door.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "#": "ww_hfas:azalea_planks" + "#": "wild_wind_core:azalea_planks" }, "pattern": [ "##", @@ -11,6 +11,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:azalea_door" + "id": "wild_wind_core:azalea_door" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_fence.json b/src/core/resources/data/wild_wind_core/recipe/azalea_fence.json similarity index 66% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_fence.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_fence.json index bc4b764..9adb175 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_fence.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_fence.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "key": { "#": "minecraft:stick", - "W": "ww_hfas:azalea_planks" + "W": "wild_wind_core:azalea_planks" }, "pattern": [ "W#W", @@ -10,6 +10,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:azalea_fence" + "id": "wild_wind_core:azalea_fence" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_fence_gate.json b/src/core/resources/data/wild_wind_core/recipe/azalea_fence_gate.json similarity index 66% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_fence_gate.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_fence_gate.json index df68448..29851aa 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_fence_gate.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_fence_gate.json @@ -3,13 +3,13 @@ "category": "redstone", "key": { "#": "minecraft:stick", - "W": "ww_hfas:azalea_planks" + "W": "wild_wind_core:azalea_planks" }, "pattern": [ "#W#", "#W#" ], "result": { - "id": "ww_hfas:azalea_fence_gate" + "id": "wild_wind_core:azalea_fence_gate" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_hanging_sign.json b/src/core/resources/data/wild_wind_core/recipe/azalea_hanging_sign.json similarity index 64% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_hanging_sign.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_hanging_sign.json index e42a552..f9a26e7 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_hanging_sign.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_hanging_sign.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "key": { "C": "minecraft:iron_chain", - "L": "ww_hfas:stripped_azalea_log" + "L": "wild_wind_core:stripped_azalea_log" }, "pattern": [ "C C", @@ -11,6 +11,6 @@ ], "result": { "count": 6, - "id": "ww_hfas:azalea_hanging_sign" + "id": "wild_wind_core:azalea_hanging_sign" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_planks.json b/src/core/resources/data/wild_wind_core/recipe/azalea_planks.json similarity index 67% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_planks.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_planks.json index d155086..1f287ef 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_planks.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_planks.json @@ -3,10 +3,10 @@ "category": "building", "group": "planks", "ingredients": [ - "ww_hfas:azalea_log" + "wild_wind_core:azalea_log" ], "result": { "count": 4, - "id": "ww_hfas:azalea_planks" + "id": "wild_wind_core:azalea_planks" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_pressure_plate.json b/src/core/resources/data/wild_wind_core/recipe/azalea_pressure_plate.json similarity index 59% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_pressure_plate.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_pressure_plate.json index cf2bdf3..cefa0aa 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_pressure_plate.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_pressure_plate.json @@ -2,12 +2,12 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "#": "ww_hfas:azalea_planks" + "#": "wild_wind_core:azalea_planks" }, "pattern": [ "##" ], "result": { - "id": "ww_hfas:azalea_pressure_plate" + "id": "wild_wind_core:azalea_pressure_plate" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_shelf.json b/src/core/resources/data/wild_wind_core/recipe/azalea_shelf.json similarity index 61% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_shelf.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_shelf.json index fc7ca67..9cdbdfb 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_shelf.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_shelf.json @@ -1,7 +1,7 @@ { "type": "minecraft:crafting_shaped", "key": { - "L": "ww_hfas:stripped_azalea_log" + "L": "wild_wind_core:stripped_azalea_log" }, "pattern": [ "LLL", @@ -10,6 +10,6 @@ ], "result": { "count": 6, - "id": "ww_hfas:azalea_shelf" + "id": "wild_wind_core:azalea_shelf" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_sign.json b/src/core/resources/data/wild_wind_core/recipe/azalea_sign.json similarity index 67% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_sign.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_sign.json index a4317ab..d5ed29e 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_sign.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_sign.json @@ -1,7 +1,7 @@ { "type": "minecraft:crafting_shaped", "key": { - "P": "ww_hfas:azalea_planks", + "P": "wild_wind_core:azalea_planks", "S": "minecraft:stick" }, "pattern": [ @@ -11,6 +11,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:azalea_sign" + "id": "wild_wind_core:azalea_sign" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_slab.json b/src/core/resources/data/wild_wind_core/recipe/azalea_slab.json similarity index 65% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_slab.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_slab.json index 2d8e2cd..07e255f 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_slab.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_slab.json @@ -2,13 +2,13 @@ "type": "minecraft:crafting_shaped", "category": "building", "key": { - "#": "ww_hfas:azalea_planks" + "#": "wild_wind_core:azalea_planks" }, "pattern": [ "###" ], "result": { "count": 6, - "id": "ww_hfas:azalea_slab" + "id": "wild_wind_core:azalea_slab" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_stairs.json b/src/core/resources/data/wild_wind_core/recipe/azalea_stairs.json similarity index 67% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_stairs.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_stairs.json index 4d7f01b..04934ff 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_stairs.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_stairs.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "building", "key": { - "#": "ww_hfas:azalea_planks" + "#": "wild_wind_core:azalea_planks" }, "pattern": [ "# ", @@ -11,6 +11,6 @@ ], "result": { "count": 4, - "id": "ww_hfas:azalea_stairs" + "id": "wild_wind_core:azalea_stairs" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_trapdoor.json b/src/core/resources/data/wild_wind_core/recipe/azalea_trapdoor.json similarity index 65% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_trapdoor.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_trapdoor.json index ad70711..4462315 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_trapdoor.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_trapdoor.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "#": "ww_hfas:azalea_planks" + "#": "wild_wind_core:azalea_planks" }, "pattern": [ "###", @@ -10,6 +10,6 @@ ], "result": { "count": 2, - "id": "ww_hfas:azalea_trapdoor" + "id": "wild_wind_core:azalea_trapdoor" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_wood.json b/src/core/resources/data/wild_wind_core/recipe/azalea_wood.json similarity index 67% rename from src/hfas/resources/data/ww_hfas/recipe/azalea_wood.json rename to src/core/resources/data/wild_wind_core/recipe/azalea_wood.json index 61e1629..970cf09 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_wood.json +++ b/src/core/resources/data/wild_wind_core/recipe/azalea_wood.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "building", "key": { - "#": "ww_hfas:azalea_log" + "#": "wild_wind_core:azalea_log" }, "pattern": [ "##", @@ -10,6 +10,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:azalea_wood" + "id": "wild_wind_core:azalea_wood" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/kiln.json b/src/core/resources/data/wild_wind_core/recipe/kiln.json similarity index 86% rename from src/hfas/resources/data/ww_hfas/recipe/kiln.json rename to src/core/resources/data/wild_wind_core/recipe/kiln.json index 99e7195..b12ba71 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/kiln.json +++ b/src/core/resources/data/wild_wind_core/recipe/kiln.json @@ -11,6 +11,6 @@ "MMM" ], "result": { - "id": "ww_hfas:kiln" + "id": "wild_wind_core:kiln" } -} \ No newline at end of file +} diff --git a/src/core/resources/data/wild_wind_core/recipe/wool_to_string.json b/src/core/resources/data/wild_wind_core/recipe/wool_to_string.json new file mode 100644 index 0000000..3526fa2 --- /dev/null +++ b/src/core/resources/data/wild_wind_core/recipe/wool_to_string.json @@ -0,0 +1,3 @@ +{ + "type": "wild_wind_core:wool_to_string" +} diff --git a/src/core/resources/data/wild_wind_core/tags/block/azalea_logs.json b/src/core/resources/data/wild_wind_core/tags/block/azalea_logs.json new file mode 100644 index 0000000..ea58888 --- /dev/null +++ b/src/core/resources/data/wild_wind_core/tags/block/azalea_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_core:azalea_log", + "wild_wind_core:azalea_wood", + "wild_wind_core:stripped_azalea_log", + "wild_wind_core:stripped_azalea_wood" + ] +} \ No newline at end of file diff --git a/src/core/resources/data/wild_wind_core/tags/item/azalea_logs.json b/src/core/resources/data/wild_wind_core/tags/item/azalea_logs.json new file mode 100644 index 0000000..8d968e5 --- /dev/null +++ b/src/core/resources/data/wild_wind_core/tags/item/azalea_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_core:azalea_log", + "wild_wind_core:azalea_wood", + "wild_wind_core:stripped_azalea_log", + "wild_wind_core:stripped_azalea_wood" + ] +} diff --git a/src/hfas/resources/data/ww_hfas/tags/item/kiln_excluded.json b/src/core/resources/data/wild_wind_core/tags/item/kiln_excluded.json similarity index 100% rename from src/hfas/resources/data/ww_hfas/tags/item/kiln_excluded.json rename to src/core/resources/data/wild_wind_core/tags/item/kiln_excluded.json diff --git a/src/hfas/resources/data/ww_hfas/tags/item/kiln_metal_outputs.json b/src/core/resources/data/wild_wind_core/tags/item/kiln_metal_outputs.json similarity index 100% rename from src/hfas/resources/data/ww_hfas/tags/item/kiln_metal_outputs.json rename to src/core/resources/data/wild_wind_core/tags/item/kiln_metal_outputs.json diff --git a/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/azalea_tree.json b/src/core/resources/data/wild_wind_core/worldgen/configured_feature/azalea_tree.json similarity index 97% rename from src/hfas/resources/data/ww_hfas/worldgen/configured_feature/azalea_tree.json rename to src/core/resources/data/wild_wind_core/worldgen/configured_feature/azalea_tree.json index 2f599d6..d903ef3 100644 --- a/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/azalea_tree.json +++ b/src/core/resources/data/wild_wind_core/worldgen/configured_feature/azalea_tree.json @@ -61,11 +61,11 @@ "trunk_provider": { "type": "minecraft:simple_state_provider", "state": { - "Name": "ww_hfas:azalea_log", + "Name": "wild_wind_core:azalea_log", "Properties": { "axis": "y" } } } } -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/azalea_tree_placed.json b/src/core/resources/data/wild_wind_core/worldgen/placed_feature/azalea_tree_placed.json similarity index 95% rename from src/hfas/resources/data/ww_hfas/worldgen/placed_feature/azalea_tree_placed.json rename to src/core/resources/data/wild_wind_core/worldgen/placed_feature/azalea_tree_placed.json index 6e408d5..0332bff 100644 --- a/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/azalea_tree_placed.json +++ b/src/core/resources/data/wild_wind_core/worldgen/placed_feature/azalea_tree_placed.json @@ -1,5 +1,5 @@ { - "feature": "ww_hfas:azalea_tree", + "feature": "wild_wind_core:azalea_tree", "placement": [ { "type": "minecraft:count", @@ -45,4 +45,4 @@ "type": "minecraft:biome" } ] -} \ No newline at end of file +} diff --git a/src/structures/resources/examples/example_ruins.json b/src/core/resources/examples/example_ruins.json similarity index 100% rename from src/structures/resources/examples/example_ruins.json rename to src/core/resources/examples/example_ruins.json diff --git a/src/structures/resources/examples/example_ruins.nbt b/src/core/resources/examples/example_ruins.nbt similarity index 100% rename from src/structures/resources/examples/example_ruins.nbt rename to src/core/resources/examples/example_ruins.nbt diff --git a/src/core/resources/wild_wind_core.mixins.json b/src/core/resources/wild_wind_core.mixins.json new file mode 100644 index 0000000..39c2046 --- /dev/null +++ b/src/core/resources/wild_wind_core.mixins.json @@ -0,0 +1,23 @@ +{ + "required": true, + "package": "org.polaris2023.wildwind.core.mixin", + "compatibilityLevel": "JAVA_25", + "mixins": [ + "FurnaceFuelAccessor", + "SinglePoolElementMixin", + "AbstractSkeletonMixin", + "AzaleaBlockMixin", + "CrafterBlockMixin", + "SkeletonMeleeMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "overwrites": { + "requireAnnotations": true + }, + "client": [ + "SignRenderStateMixin", + "AzaleaSignRendererMixin" + ] +} diff --git a/src/structures/test/org/polaris2023/wildwind/structures/config/StructureConfigTest.java b/src/core/test/org/polaris2023/wildwind/structures/config/StructureConfigTest.java similarity index 100% rename from src/structures/test/org/polaris2023/wildwind/structures/config/StructureConfigTest.java rename to src/core/test/org/polaris2023/wildwind/structures/config/StructureConfigTest.java diff --git a/src/structures/test/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndexTest.java b/src/core/test/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndexTest.java similarity index 100% rename from src/structures/test/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndexTest.java rename to src/core/test/org/polaris2023/wildwind/structures/worldgen/GeneratedStructureIndexTest.java diff --git a/src/datagen/java/org/polaris2023/wildwind/hfas/HFASMod.java b/src/datagen/java/org/polaris2023/wildwind/hfas/HFASMod.java new file mode 100644 index 0000000..7f89c5e --- /dev/null +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/HFASMod.java @@ -0,0 +1,15 @@ +package org.polaris2023.wildwind.hfas; +import net.minecraft.resources.Identifier; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; +/** Development-only datagen entry; never distributed to players. */ +@Mod(HFASMod.MOD_ID) +public final class HFASMod { + public static final String MOD_ID = "wild_wind_datagen"; + public HFASMod(IEventBus bus) {} + public static Identifier id(String path) { + String module = path.contains("tiny_cactus") ? "barren" : + java.util.stream.Stream.of("blaze", "soul", "scorched", "muddy_pig", "mudcrab", "piranha", "reach", "sink", "choke", "water_breathing").anyMatch(path::contains) ? "wilderness" : "core"; + return Identifier.fromNamespaceAndPath("wild_wind_" + module, path); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/HFASDatagen.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/HFASDatagen.java similarity index 100% rename from src/hfas/java/org/polaris2023/wildwind/hfas/datagen/HFASDatagen.java rename to src/datagen/java/org/polaris2023/wildwind/hfas/datagen/HFASDatagen.java diff --git a/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java new file mode 100644 index 0000000..fc8c1a5 --- /dev/null +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java @@ -0,0 +1,33 @@ +package org.polaris2023.wildwind.hfas.datagen.provider; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.DataMapProvider; +import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps; +import net.neoforged.neoforge.registries.datamaps.builtin.Strippable; + +import java.util.concurrent.CompletableFuture; + +public class ModDataMapsProvider extends DataMapProvider { + /** + * Create a new provider. + * + * @param packOutput the output location + * @param lookupProvider a {@linkplain CompletableFuture} supplying the registries + */ + public ModDataMapsProvider(PackOutput packOutput, CompletableFuture lookupProvider) { + super(packOutput, lookupProvider); + } + + @Override + protected void gather(HolderLookup.Provider provider) { + builder(NeoForgeDataMaps.STRIPPABLES) + .add(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_LOG.getKey(), new Strippable(org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_LOG.get()), false) + .add(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WOOD.getKey(), new Strippable(org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_WOOD.get()), false) + .add(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LOG.getKey(), new Strippable(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_LOG.get()), false) + .add(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_WOOD.getKey(), new Strippable(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_WOOD.get()), false) + .add(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LOG.getKey(), new Strippable(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_LOG.get()), false) + .add(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_WOOD.getKey(), new Strippable(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_WOOD.get()), false) + ; + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java similarity index 84% rename from src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java rename to src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java index 0c57964..d75e001 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDatapackProvider.java @@ -7,8 +7,8 @@ import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider; import net.neoforged.neoforge.registries.NeoForgeRegistries; import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; -import org.polaris2023.wildwind.hfas.registry.DatadrivenRegistryKey; +import org.polaris2023.wildwind.wilderness.entity.animal.MudcrabVariant; +import org.polaris2023.wildwind.wilderness.registry.DatadrivenRegistryKey; import org.polaris2023.wildwind.hfas.worldgen.ModBiomeModifiers; import org.polaris2023.wildwind.hfas.worldgen.ModConfiguredFeatures; import org.polaris2023.wildwind.hfas.worldgen.ModPlacedFeatures; @@ -23,6 +23,6 @@ public ModDatapackProvider(PackOutput output, CompletableFuture> getKnownBlocks() { + return net.minecraft.core.registries.BuiltInRegistries.BLOCK.listElements() + .filter(holder -> org.polaris2023.wildwind.core.api.WildWindModules.owns(holder.key().identifier().getNamespace())); + } + + @Override + protected java.util.stream.Stream> getKnownItems() { + return net.minecraft.core.registries.BuiltInRegistries.ITEM.listElements() + .filter(holder -> org.polaris2023.wildwind.core.api.WildWindModules.owns(holder.key().identifier().getNamespace())); + } + + @Override + protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { + itemModels.itemModelOutput.accept( + org.polaris2023.wildwind.wilderness.registry.ModItems.MUDDY_PIG_SPAWN_EGG.get(), + ItemModelUtils.plainModel( + Identifier.withDefaultNamespace("item/pig_spawn_egg"))); + org.polaris2023.wildwind.core.registry.ModItems.MATERIALS.forEach(item -> itemModels.generateFlatItem(item.get(), ModelTemplates.FLAT_ITEM)); + // ==================== 焚烬木套件 ==================== + registerWoodModels(blockModels, itemModels, + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LOG.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_WOOD.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_LOG.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_WOOD.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PLANKS.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_STAIRS.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SLAB.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE_GATE.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_DOOR.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_TRAPDOOR.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PRESSURE_PLATE.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_BUTTON.get() + ); + // 焚烬木树叶 - 橙色染色 + blockModels.createTintedLeaves(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LEAVES.get(), TexturedModel.LEAVES, 0xFF8000); + // 焚烬木树苗 + blockModels.createCrossBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SAPLING.get(), BlockModelGenerators.PlantType.NOT_TINTED); + + // ==================== 灵焰木套件 ==================== + registerWoodModels(blockModels, itemModels, + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LOG.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_WOOD.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_LOG.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_WOOD.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PLANKS.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_STAIRS.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SLAB.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE_GATE.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_DOOR.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_TRAPDOOR.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PRESSURE_PLATE.get(), + org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_BUTTON.get() + ); + // 灵焰木树叶 - 青色染色 + blockModels.createTintedLeaves(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LEAVES.get(), TexturedModel.LEAVES, 0x00FFFF); + // 灵焰木树苗 + blockModels.createCrossBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SAPLING.get(), BlockModelGenerators.PlantType.NOT_TINTED); + + // ==================== 杜鹃木套件 ==================== + registerWoodModels(blockModels, itemModels, + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_LOG.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WOOD.get(), + org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_LOG.get(), + org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_WOOD.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PLANKS.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_STAIRS.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SLAB.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE_GATE.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_DOOR.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_TRAPDOOR.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PRESSURE_PLATE.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_BUTTON.get() + ); + + blockModels.createShelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF.get(), org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_LOG.get()); + blockModels.blockStateOutput.accept(BlockModelGenerators.createSign(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get(), + signVariant("azalea_sign_rot_0"), signVariant("azalea_sign_rot_1"), signVariant("azalea_sign_rot_2"), signVariant("azalea_sign_rot_3"))); + blockModels.blockStateOutput.accept(BlockModelGenerators.createHangingSign(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get(), + signVariant("azalea_hanging_sign_rot_0"), signVariant("azalea_hanging_sign_rot_1"), signVariant("azalea_hanging_sign_rot_2"), signVariant("azalea_hanging_sign_rot_3"), + signVariant("azalea_hanging_sign_attached_rot_0"), signVariant("azalea_hanging_sign_attached_rot_1"), signVariant("azalea_hanging_sign_attached_rot_2"), signVariant("azalea_hanging_sign_attached_rot_3"))); + blockModels.blockStateOutput.accept(net.minecraft.client.data.models.blockstates.MultiVariantGenerator.dispatch(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_SIGN.get(), signVariant("azalea_wall_sign")) + .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING_ALT)); + blockModels.blockStateOutput.accept(net.minecraft.client.data.models.blockstates.MultiVariantGenerator.dispatch(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_HANGING_SIGN.get(), signVariant("azalea_wall_hanging_sign")) + .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING_ALT)); + itemModels.generateFlatItem(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get().asItem(), ModelTemplates.FLAT_ITEM); + itemModels.generateFlatItem(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get().asItem(), ModelTemplates.FLAT_ITEM); + itemModels.itemModelOutput.accept(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get(), ItemModelUtils.tintedModel( + Identifier.withDefaultNamespace("item/tipped_arrow"), new net.minecraft.client.color.item.Potion())); + // ==================== 其他方块 ==================== + // 焦灰草方块 - 使用简单的方块模型 + createSimpleBlock(blockModels, org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_GRASS_BLOCK.get()); + + // 焦土 - 使用简单的方块模型 + createSimpleBlock(blockModels, org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_DIRT.get()); + + // 焦灰草丛 - 使用交叉模型(类似草丛) + createCrossBlock(blockModels, org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_GRASS.get()); + + // 焦灰枝条 - 使用交叉模型 + createCrossBlock(blockModels, org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_TWIG.get()); + + // 仙人球 - 使用交叉模型 + createCrossBlock(blockModels, org.polaris2023.wildwind.barren.block.ModBlocks.TINY_CACTUS.get()); + + // 制箭台 - 使用简单方块模型 + blockModels.blockStateOutput.accept(net.minecraft.client.data.models.blockstates.MultiVariantGenerator.dispatch(org.polaris2023.wildwind.core.block.ModBlocks.KILN.get()) + .with(BlockModelGenerators.createBooleanModelDispatch(net.minecraft.world.level.block.state.properties.BlockStateProperties.LIT, + BlockModelGenerators.plainVariant(Identifier.withDefaultNamespace("block/furnace_on")), + BlockModelGenerators.plainVariant(Identifier.withDefaultNamespace("block/furnace")))) + .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING)); + itemModels.itemModelOutput.accept(org.polaris2023.wildwind.core.block.ModBlocks.KILN.get().asItem(), + ItemModelUtils.plainModel(Identifier.withDefaultNamespace("block/furnace"))); + + // ==================== 独立物品 ==================== + simpleItem(itemModels, org.polaris2023.wildwind.wilderness.registry.ModItems.CRAB_CLAW); + + // 万用蟹钳 - 使用手写 3D 模型(resources 下的 models/item/omni_claw.json),仅生成物品模型定义 + itemModels.itemModelOutput.accept( + org.polaris2023.wildwind.wilderness.registry.ModItems.OMNI_CLAW.get(), + ItemModelUtils.plainModel(ModelLocationUtils.getModelLocation(org.polaris2023.wildwind.wilderness.registry.ModItems.OMNI_CLAW.get())) + ); + simpleItem(itemModels, org.polaris2023.wildwind.wilderness.registry.ModItems.MUDCRAB_BUCKET); + simpleItem(itemModels, org.polaris2023.wildwind.wilderness.registry.ModItems.MUDCRAB_SPAWN_EGG); + + // ==================== 食人鱼 ==================== + registerPiranhaModels(itemModels); + } + + /** + * 注册木质方块模型 + */ + private void registerWoodModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels, + Block log, Block wood, + Block strippedLog, Block strippedWood, + Block planks, Block stairs, Block slab, + Block fence, Block fenceGate, + Block door, Block trapdoor, + Block pressurePlate, Block button) { + // 原木 - 使用 WoodProvider(自动生成物品模型) + blockModels.woodProvider(log).logWithHorizontal(log).wood(wood); + + // 去皮原木(自动生成物品模型) + blockModels.woodProvider(strippedLog).logWithHorizontal(strippedLog).wood(strippedWood); + + // 使用 family 创建木质方块套件(包括木板,自动生成物品模型) + blockModels.family(planks) + .stairs(stairs) + .slab(slab) + .fence(fence) + .fenceGate(fenceGate) + .pressurePlate(pressurePlate) + .button(button); + + // 门(自动生成物品模型) + blockModels.createDoor(door); + + // 活板门(自动生成物品模型) + blockModels.createTrapdoor(trapdoor); + } + + /** + * 创建简单方块模型(六面相同贴图) + */ + private void createSimpleBlock(BlockModelGenerators blockModels, Block block) { + blockModels.createTrivialCube(block); + } + + /** + * 创建交叉模型(用于植物类方块) + */ + private void createCrossBlock(BlockModelGenerators blockModels, Block block) { + blockModels.createCrossBlock(block, BlockModelGenerators.PlantType.NOT_TINTED); + } + + private static net.minecraft.client.data.models.MultiVariant signVariant(String path) { + return BlockModelGenerators.plainVariant(HFASMod.id("block/" + path)); + } + + private void simpleItem(ItemModelGenerators itemModels, Supplier item){ + itemModels.generateFlatItem(item.get(), ModelTemplates.FLAT_ITEM); + } + + private void registerPiranhaModels(ItemModelGenerators itemModels) { + simpleItem(itemModels, org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA); + simpleItem(itemModels, org.polaris2023.wildwind.wilderness.registry.ModItems.COOKED_PIRANHA); + simpleItem(itemModels, org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA_BUCKET); + simpleItem(itemModels, org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA_SPAWN_EGG); + simpleItem(itemModels, org.polaris2023.wildwind.wilderness.registry.ModItems.FANG); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java similarity index 72% rename from src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java rename to src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java index 9b60aba..f3dbdf4 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModRecipeProvider.java @@ -14,11 +14,6 @@ import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.arrow.ArrowFletching; -import org.polaris2023.wildwind.hfas.arrow.ArrowHead; -import org.polaris2023.wildwind.hfas.arrow.ArrowShaft; -import org.polaris2023.wildwind.hfas.component.ArrowComponent; -import org.polaris2023.wildwind.hfas.registry.ModItems; import java.util.concurrent.CompletableFuture; @@ -37,41 +32,37 @@ protected ModRecipeProvider(HolderLookup.Provider registries, RecipeOutput outpu @Override protected void buildRecipes() { - ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.hfas.block.ModBlocks.KILN.get()) + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.core.block.ModBlocks.KILN.get()) .define('B', Items.BRICK).define('F', Items.FURNACE).define('M', Items.PACKED_MUD) .pattern(" B ").pattern("BFB").pattern("MMM") .unlockedBy("has_furnace", this.has(Items.FURNACE)).save(this.output); - var planks = org.polaris2023.wildwind.hfas.block.ModBlocks.AZALEA_PLANKS.get(); - var log = org.polaris2023.wildwind.hfas.block.ModBlocks.STRIPPED_AZALEA_LOG.get(); - ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.hfas.block.ModBlocks.AZALEA_SIGN.get(), 3) + var planks = org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PLANKS.get(); + var log = org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_LOG.get(); + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get(), 3) .define('P', planks).define('S', Items.STICK).pattern("PPP").pattern("PPP").pattern(" S ") .unlockedBy("has_azalea_planks", this.has(planks)).save(this.output); - ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.hfas.block.ModBlocks.AZALEA_HANGING_SIGN.get(), 6) + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get(), 6) .define('L', log).define('C', Items.IRON_CHAIN).pattern("C C").pattern("LLL").pattern("LLL") .unlockedBy("has_stripped_azalea_log", this.has(log)).save(this.output); - ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.hfas.block.ModBlocks.AZALEA_SHELF.get(), 6) + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.DECORATIONS, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF.get(), 6) .define('L', log).pattern("LLL").pattern(" ").pattern("LLL") .unlockedBy("has_stripped_azalea_log", this.has(log)).save(this.output); // 生成所有箭矢组合配方 - generateArrowRecipes(); // 生食人鱼 -> 熟食人鱼(熔炉) - SimpleCookingRecipeBuilder.smelting(Ingredient.of(ModItems.PIRANHA.get()), RecipeCategory.FOOD, CookingBookCategory.FOOD, ModItems.COOKED_PIRANHA.get(), 0.35F, 200) - .unlockedBy("has_" + ModItems.PIRANHA.getId().getPath(), this.has(ModItems.PIRANHA.get())) + SimpleCookingRecipeBuilder.smelting(Ingredient.of(org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA.get()), RecipeCategory.FOOD, CookingBookCategory.FOOD, org.polaris2023.wildwind.wilderness.registry.ModItems.COOKED_PIRANHA.get(), 0.35F, 200) + .unlockedBy("has_" + org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA.getId().getPath(), this.has(org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA.get())) .save(this.output); // 万用蟹钳:铜锭x6 + 蟹钳x3 - ShapedRecipeBuilder.shaped(this.items, RecipeCategory.TOOLS, ModItems.OMNI_CLAW.get()) + ShapedRecipeBuilder.shaped(this.items, RecipeCategory.TOOLS, org.polaris2023.wildwind.wilderness.registry.ModItems.OMNI_CLAW.get()) .define('I', Items.COPPER_INGOT) - .define('C', ModItems.CRAB_CLAW.get()) + .define('C', org.polaris2023.wildwind.wilderness.registry.ModItems.CRAB_CLAW.get()) .pattern("ICC") .pattern("IIC") .pattern("III") - .unlockedBy("has_" + ModItems.CRAB_CLAW.getId().getPath(), this.has(ModItems.OMNI_CLAW.get())) + .unlockedBy("has_" + org.polaris2023.wildwind.wilderness.registry.ModItems.CRAB_CLAW.getId().getPath(), this.has(org.polaris2023.wildwind.wilderness.registry.ModItems.OMNI_CLAW.get())) .save(this.output); } - private void generateArrowRecipes() { - - } public static class Runner extends RecipeProvider.Runner { diff --git a/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java new file mode 100644 index 0000000..4deb9b2 --- /dev/null +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java @@ -0,0 +1,123 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.lang; + +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.LanguageProvider; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** + * 英语语言文件生成器 + * + * @author baka4n + * @since 2026/04/15 + */ +public class EnUsLanguageProvider extends LanguageProvider { + + public EnUsLanguageProvider(PackOutput output) { + super(output, HFASMod.MOD_ID, "en_us"); + } + + @Override + protected void addTranslations() { + add("effect.wild_wind_wilderness.sink", "Sink"); + add("effect.wild_wind_wilderness.choke", "Choke"); + add("enchantment.wild_wind_core.melting", "Melting"); + add("item.wild_wind_core.duckweed", "Duckweed"); + add("item.wild_wind_core.calamari", "Calamari"); + add("item.wild_wind_core.cooked_calamari", "Cooked Calamari"); + add("item.wild_wind_core.cooked_egg", "Fried Egg"); + add("item.wild_wind_core.baked_seeds", "Baked Seeds"); + add("item.wild_wind_core.cooked_frog_legs", "Cooked Frog Legs"); + add("item.wild_wind_core.frog_legs", "Raw Frog Legs"); + add("entity.wild_wind_wilderness.muddy_pig", "Muddy Pig"); + add("item.wild_wind_wilderness.muddy_pig_spawn_egg", "Muddy Pig Spawn Egg"); + // 焚烬木套件 + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LOG, "Blaze Log"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_WOOD, "Blaze Wood"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_LOG, "Stripped Blaze Log"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_WOOD, "Stripped Blaze Wood"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PLANKS, "Blaze Planks"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_STAIRS, "Blaze Stairs"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SLAB, "Blaze Slab"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE, "Blaze Fence"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE_GATE, "Blaze Fence Gate"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_DOOR, "Blaze Door"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_TRAPDOOR, "Blaze Trapdoor"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PRESSURE_PLATE, "Blaze Pressure Plate"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_BUTTON, "Blaze Button"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LEAVES, "Blaze Leaves"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SAPLING, "Blaze Sapling"); + + // 灵焰木套件 + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LOG, "Soul Log"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_WOOD, "Soul Wood"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_LOG, "Stripped Soul Log"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_WOOD, "Stripped Soul Wood"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PLANKS, "Soul Planks"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_STAIRS, "Soul Stairs"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SLAB, "Soul Slab"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE, "Soul Fence"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE_GATE, "Soul Fence Gate"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_DOOR, "Soul Door"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_TRAPDOOR, "Soul Trapdoor"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PRESSURE_PLATE, "Soul Pressure Plate"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_BUTTON, "Soul Button"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LEAVES, "Soul Leaves"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SAPLING, "Soul Sapling"); + + // 杜鹃木套件 + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_LOG, "Azalea Log"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WOOD, "Azalea Wood"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_LOG, "Stripped Azalea Log"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_WOOD, "Stripped Azalea Wood"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PLANKS, "Azalea Planks"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_STAIRS, "Azalea Stairs"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SLAB, "Azalea Slab"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE, "Azalea Fence"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE_GATE, "Azalea Fence Gate"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_DOOR, "Azalea Door"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_TRAPDOOR, "Azalea Trapdoor"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PRESSURE_PLATE, "Azalea Pressure Plate"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_BUTTON, "Azalea Button"); + + // 其他方块 + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_GRASS_BLOCK, "Scorched Grass Block"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_DIRT, "Scorched Dirt"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_GRASS, "Scorched Grass"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_TWIG, "Scorched Twig"); + addBlock(org.polaris2023.wildwind.barren.block.ModBlocks.TINY_CACTUS, "Tiny Cactus"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN, "Azalea Sign"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_SIGN, "Azalea Wall Sign"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN, "Azalea Hanging Sign"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_HANGING_SIGN, "Azalea Wall Hanging Sign"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF, "Azalea Shelf"); + add("item.wild_wind_wilderness.tipped_arrow", "Arrow of Reach"); + add("item.wild_wind_wilderness.tipped_arrow.effect.reach", "Arrow of Reach"); + add("item.wild_wind_wilderness.tipped_arrow.effect.long_reach", "Arrow of Reach"); + add("entity.wild_wind_wilderness.arrow", "Arrow of Reach"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.KILN, "Kiln"); + + // GUI + // 属性 + add("attributes.wild_wind_wilderness.extra_item_pickup_range", "Extra Item Pickup Range"); + + // Reach effect & potions + add("effect.wild_wind_wilderness.reach", "Reach"); + add("item.minecraft.potion.effect.reach", "Potion of Reach"); + add("item.minecraft.splash_potion.effect.reach", "Splash Potion of Reach"); + add("item.minecraft.lingering_potion.effect.reach", "Lingering Potion of Reach"); + add("item.minecraft.tipped_arrow.effect.reach", "Arrow of Reach"); + add("item.minecraft.potion.effect.long_reach", "Potion of Reach"); + add("item.minecraft.splash_potion.effect.long_reach", "Splash Potion of Reach"); + add("item.minecraft.lingering_potion.effect.long_reach", "Lingering Potion of Reach"); + add("item.minecraft.tipped_arrow.effect.long_reach", "Arrow of Reach"); + + // Direfish sound subtitles + add("subtitles.entity.piranha.attack", "Direfish attacks"); + add("subtitles.entity.piranha.death", "Direfish dies"); + + //创造模式物品栏 + add("mod.wild_wind.name", "Wild Wind"); + + ZhEnCombineLangProvider.addLang(this, "en_us"); + } +} diff --git a/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java new file mode 100644 index 0000000..144fff6 --- /dev/null +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java @@ -0,0 +1,126 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.lang; + +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.LanguageProvider; +import org.polaris2023.wildwind.hfas.HFASMod; + +/** + * 中文语言文件生成器 + * + * @author baka4n + * @since 2026/04/15 + */ +public class ZhCnLanguageProvider extends LanguageProvider { + + public ZhCnLanguageProvider(PackOutput output) { + super(output, HFASMod.MOD_ID, "zh_cn"); + } + + @Override + protected void addTranslations() { + add("effect.wild_wind_wilderness.sink", "沉溺"); + add("effect.wild_wind_wilderness.choke", "窒息"); + add("enchantment.wild_wind_core.melting", "熔炼"); + add("item.wild_wind_core.duckweed", "浮萍"); + add("item.wild_wind_core.calamari", "鱿鱼须"); + add("item.wild_wind_core.cooked_calamari", "熟鱿鱼须"); + add("item.wild_wind_core.cooked_egg", "煎蛋"); + add("item.wild_wind_core.baked_seeds", "烤种子"); + add("item.wild_wind_core.cooked_frog_legs", "熟蛙腿"); + add("item.wild_wind_core.frog_legs", "生蛙腿"); + add("entity.wild_wind_wilderness.muddy_pig", "泥猪"); + add("item.wild_wind_wilderness.muddy_pig_spawn_egg", "泥猪刷怪蛋"); + // 焚烬木套件 + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LOG, "焚烬木原木"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_WOOD, "焚烬木"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_LOG, "去皮焚烬木原木"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_WOOD, "去皮焚烬木"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PLANKS, "焚烬木木板"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_STAIRS, "焚烬木楼梯"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SLAB, "焚烬木台阶"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE, "焚烬木栅栏"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE_GATE, "焚烬木栅栏门"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_DOOR, "焚烬木门"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_TRAPDOOR, "焚烬木活板门"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PRESSURE_PLATE, "焚烬木压力板"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_BUTTON, "焚烬木按钮"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LEAVES, "焚烬木树叶"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SAPLING, "焚烬木树苗"); + + // 灵焰木套件 + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LOG, "灵焰木原木"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_WOOD, "灵焰木"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_LOG, "去皮灵焰木原木"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_WOOD, "去皮灵焰木"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PLANKS, "灵焰木木板"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_STAIRS, "灵焰木楼梯"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SLAB, "灵焰木台阶"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE, "灵焰木栅栏"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE_GATE, "灵焰木栅栏门"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_DOOR, "灵焰木门"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_TRAPDOOR, "灵焰木活板门"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PRESSURE_PLATE, "灵焰木压力板"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_BUTTON, "灵焰木按钮"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LEAVES, "灵焰木树叶"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SAPLING, "灵焰木树苗"); + + // 杜鹃木套件 + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_LOG, "杜鹃木原木"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WOOD, "杜鹃木"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_LOG, "去皮杜鹃木原木"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_WOOD, "去皮杜鹃木"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PLANKS, "杜鹃木木板"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_STAIRS, "杜鹃木楼梯"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SLAB, "杜鹃木台阶"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE, "杜鹃木栅栏"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE_GATE, "杜鹃木栅栏门"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_DOOR, "杜鹃木门"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_TRAPDOOR, "杜鹃木活板门"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PRESSURE_PLATE, "杜鹃木压力板"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_BUTTON, "杜鹃木按钮"); + + // 其他方块 + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_GRASS_BLOCK, "焦灰草方块"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_DIRT, "焦土"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_GRASS, "焦灰草丛"); + addBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_TWIG, "焦灰枝条"); + addBlock(org.polaris2023.wildwind.barren.block.ModBlocks.TINY_CACTUS, "仙人球"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN, "杜鹃木告示牌"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_SIGN, "墙上的杜鹃木告示牌"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN, "悬挂式杜鹃木告示牌"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_HANGING_SIGN, "墙上的悬挂式杜鹃木告示牌"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF, "杜鹃木展示架"); + add("item.wild_wind_wilderness.tipped_arrow", "延展之箭"); + add("item.wild_wind_wilderness.tipped_arrow.effect.reach", "延展之箭"); + add("item.wild_wind_wilderness.tipped_arrow.effect.long_reach", "延展之箭"); + add("entity.wild_wind_wilderness.arrow", "延展之箭"); + addBlock(org.polaris2023.wildwind.core.block.ModBlocks.KILN, "窑炉"); + + // GUI + // 属性 + add("attributes.wild_wind_wilderness.extra_item_pickup_range", "额外物品拾取距离"); + + // 延展(reach)效果与药水 + add("effect.wild_wind_wilderness.reach", "延展"); + add("item.minecraft.potion.effect.reach", "延展药水"); + add("item.minecraft.splash_potion.effect.reach", "喷溅型延展药水"); + add("item.minecraft.lingering_potion.effect.reach", "滞留型延展药水"); + add("item.minecraft.tipped_arrow.effect.reach", "延展之箭"); + add("item.minecraft.potion.effect.long_reach", "延展药水"); + add("item.minecraft.splash_potion.effect.long_reach", "喷溅型延展药水"); + add("item.minecraft.lingering_potion.effect.long_reach", "滞留型延展药水"); + add("item.minecraft.tipped_arrow.effect.long_reach", "延展之箭"); + + // 恐鱼音效字幕 + add("subtitles.entity.piranha.attack", "恐鱼袭击"); + add("subtitles.entity.piranha.death", "恐鱼死亡"); + + //创造模式物品栏 + add("mod.wild_wind.name", "原野之风"); + + ZhEnCombineLangProvider.addLang(this, "zh_cn"); + + } + + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java similarity index 67% rename from src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java rename to src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java index 46b9eca..904e6f9 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhEnCombineLangProvider.java @@ -4,8 +4,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.neoforged.neoforge.common.data.LanguageProvider; -import org.polaris2023.wildwind.hfas.registry.ModEntities; -import org.polaris2023.wildwind.hfas.registry.ModItems; +import org.polaris2023.wildwind.wilderness.registry.ModEntities; import java.util.HashMap; import java.util.Map; @@ -36,15 +35,15 @@ public static void addLang(LanguageProvider provider, String lang){ private static void addItems() { - addItem(ModItems.MUDCRAB_SPAWN_EGG, "Mudcrab Spawn Egg", "泥沼蟹刷怪蛋"); - addItem(ModItems.MUDCRAB_BUCKET, "Bucket of Mudcrab", "泥沼蟹桶"); - addItem(ModItems.CRAB_CLAW, "Crab Claw", "蟹钳"); - addItem(ModItems.OMNI_CLAW, "Omni Craw", "万用蟹钳"); - addItem(ModItems.PIRANHA_SPAWN_EGG, "Direfish Spawn Egg", "恐鱼刷怪蛋"); - addItem(ModItems.PIRANHA, "Raw Direfish", "生恐鱼"); - addItem(ModItems.COOKED_PIRANHA, "Cooked Direfish", "熟恐鱼"); - addItem(ModItems.FANG, "Fang", "尖牙"); - addItem(ModItems.PIRANHA_BUCKET, "Bucket of Direfish", "恐鱼桶"); + addItem(org.polaris2023.wildwind.wilderness.registry.ModItems.MUDCRAB_SPAWN_EGG, "Mudcrab Spawn Egg", "泥沼蟹刷怪蛋"); + addItem(org.polaris2023.wildwind.wilderness.registry.ModItems.MUDCRAB_BUCKET, "Bucket of Mudcrab", "泥沼蟹桶"); + addItem(org.polaris2023.wildwind.wilderness.registry.ModItems.CRAB_CLAW, "Crab Claw", "蟹钳"); + addItem(org.polaris2023.wildwind.wilderness.registry.ModItems.OMNI_CLAW, "Omni Craw", "万用蟹钳"); + addItem(org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA_SPAWN_EGG, "Direfish Spawn Egg", "恐鱼刷怪蛋"); + addItem(org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA, "Raw Direfish", "生恐鱼"); + addItem(org.polaris2023.wildwind.wilderness.registry.ModItems.COOKED_PIRANHA, "Cooked Direfish", "熟恐鱼"); + addItem(org.polaris2023.wildwind.wilderness.registry.ModItems.FANG, "Fang", "尖牙"); + addItem(org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA_BUCKET, "Bucket of Direfish", "恐鱼桶"); } private static void addBlocks() { diff --git a/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java new file mode 100644 index 0000000..dbc1692 --- /dev/null +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java @@ -0,0 +1,89 @@ +package org.polaris2023.wildwind.hfas.datagen.provider.loot; + +import net.minecraft.core.HolderLookup; +import net.minecraft.data.loot.BlockLootSubProvider; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Block; +import org.jspecify.annotations.NonNull; + +import java.util.Set; + +public class BlockLoot extends BlockLootSubProvider { + public BlockLoot(HolderLookup.Provider registries) { + super(Set.of(), FeatureFlags.DEFAULT_FLAGS, registries); + } + + @Override + protected @NonNull Iterable getKnownBlocks() { + return java.util.stream.Stream.of(org.polaris2023.wildwind.core.block.ModBlocks.BLOCKS,org.polaris2023.wildwind.wilderness.block.ModBlocks.BLOCKS,org.polaris2023.wildwind.barren.block.ModBlocks.BLOCKS).flatMap(reg -> reg.getEntries().stream()).map(h -> (Block) h.value()).toList(); + } + + @Override + protected void generate() { + // 焚烬木套件 + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LOG.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_WOOD.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_LOG.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_WOOD.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PLANKS.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_STAIRS.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SLAB.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE_GATE.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PRESSURE_PLATE.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_BUTTON.get()); + // 树叶 - 使用树叶掉落逻辑 + add(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LEAVES.get(), createLeavesDrops(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LEAVES.get(), org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SAPLING.get(), 0.05F)); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SAPLING.get()); + // 门需要特殊处理 + add(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_DOOR.get(), createDoorTable(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_DOOR.get())); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_TRAPDOOR.get()); + + // 灵焰木套件 + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LOG.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_WOOD.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_LOG.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_WOOD.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PLANKS.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_STAIRS.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SLAB.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE_GATE.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PRESSURE_PLATE.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_BUTTON.get()); + // 树叶 - 使用树叶掉落逻辑 + add(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LEAVES.get(), createLeavesDrops(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LEAVES.get(), org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SAPLING.get(), 0.05F)); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SAPLING.get()); + // 门需要特殊处理 + add(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_DOOR.get(), createDoorTable(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_DOOR.get())); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_TRAPDOOR.get()); + + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF.get()); + // 杜鹃木套件 + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_LOG.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WOOD.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_LOG.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.STRIPPED_AZALEA_WOOD.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PLANKS.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_STAIRS.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SLAB.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_FENCE_GATE.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PRESSURE_PLATE.get()); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_BUTTON.get()); + // 门需要特殊处理 + add(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_DOOR.get(), createDoorTable(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_DOOR.get())); + dropSelf(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_TRAPDOOR.get()); + + // 其他方块 + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_GRASS_BLOCK.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_DIRT.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_GRASS.get()); + dropSelf(org.polaris2023.wildwind.wilderness.block.ModBlocks.SCORCHED_TWIG.get()); + dropSelf(org.polaris2023.wildwind.barren.block.ModBlocks.TINY_CACTUS.get()); + add(org.polaris2023.wildwind.core.block.ModBlocks.KILN.get(), createNameableBlockEntityTable(org.polaris2023.wildwind.core.block.ModBlocks.KILN.get())); + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java similarity index 97% rename from src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java rename to src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java index 8aa647e..0ed4533 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBiomeTagsProvider.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.biome.Biomes; import net.neoforged.neoforge.common.Tags; import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.tag.ModBiomeTags; +import org.polaris2023.wildwind.wilderness.tag.ModBiomeTags; import javax.annotation.Nullable; import java.util.concurrent.CompletableFuture; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java similarity index 53% rename from src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java rename to src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java index 5f3022e..73012da 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/tag/ModBlockTagsProvider.java @@ -12,8 +12,7 @@ import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.common.data.BlockTagsProvider; import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.tag.ModBlockTags; +import org.polaris2023.wildwind.wilderness.tag.ModBlockTags; import java.util.Arrays; import java.util.concurrent.CompletableFuture; @@ -36,76 +35,75 @@ public ModBlockTagsProvider(PackOutput output, CompletableFuture logsTag = TagKey.create( Registries.ITEM, - Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, name + "_logs") + HFASMod.id(name + "_logs") ); addToTag(logsTag, log, wood, strippedLog, strippedWood); } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java b/src/datagen/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java similarity index 97% rename from src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java rename to src/datagen/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java index afd0051..19add92 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/worldgen/ModBiomeModifiers.java @@ -18,8 +18,8 @@ import net.neoforged.neoforge.common.world.BiomeModifiers; import net.neoforged.neoforge.registries.NeoForgeRegistries; import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.registry.ModEntities; -import org.polaris2023.wildwind.hfas.tag.ModBiomeTags; +import org.polaris2023.wildwind.wilderness.registry.ModEntities; +import org.polaris2023.wildwind.wilderness.tag.ModBiomeTags; /** * 生物群系修改器 diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java b/src/datagen/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java similarity index 87% rename from src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java rename to src/datagen/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java index f79b37e..6ef14b2 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/worldgen/ModConfiguredFeatures.java @@ -23,7 +23,6 @@ import net.minecraft.world.level.levelgen.feature.trunkplacers.BendingTrunkPlacer; import net.minecraft.world.level.levelgen.feature.trunkplacers.StraightTrunkPlacer; import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; import java.util.Optional; @@ -37,18 +36,18 @@ public class ModConfiguredFeatures { public static final ResourceKey> BLAZE_TREE_KEY = ResourceKey.create( Registries.CONFIGURED_FEATURE, - Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "blaze_tree") + HFASMod.id("blaze_tree") ); public static final ResourceKey> SOUL_TREE_KEY = ResourceKey.create( Registries.CONFIGURED_FEATURE, - Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "soul_tree") + HFASMod.id("soul_tree") ); // 杜鹃树 - 使用杜鹃木原木 public static final ResourceKey> AZALEA_TREE_KEY = ResourceKey.create( Registries.CONFIGURED_FEATURE, - Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "azalea_tree") + HFASMod.id("azalea_tree") ); public static void bootstrap(BootstrapContext> context) { @@ -59,9 +58,9 @@ public static void bootstrap(BootstrapContext> context) // 焚烬木树 register(context, BLAZE_TREE_KEY, Feature.TREE, new TreeConfiguration.TreeConfigurationBuilder( - BlockStateProvider.simple(ModBlocks.BLAZE_LOG.get()), + BlockStateProvider.simple(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LOG.get()), new StraightTrunkPlacer(4, 2, 0), - BlockStateProvider.simple(ModBlocks.BLAZE_LEAVES.get()), + BlockStateProvider.simple(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LEAVES.get()), new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), new TwoLayersFeatureSize(1, 0, 1), belowTrunkProvider @@ -69,9 +68,9 @@ public static void bootstrap(BootstrapContext> context) // 灵焰木树 register(context, SOUL_TREE_KEY, Feature.TREE, new TreeConfiguration.TreeConfigurationBuilder( - BlockStateProvider.simple(ModBlocks.SOUL_LOG.get()), + BlockStateProvider.simple(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LOG.get()), new StraightTrunkPlacer(4, 2, 0), - BlockStateProvider.simple(ModBlocks.SOUL_LEAVES.get()), + BlockStateProvider.simple(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LEAVES.get()), new BlobFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 3), new TwoLayersFeatureSize(1, 0, 1), belowTrunkProvider @@ -79,7 +78,7 @@ public static void bootstrap(BootstrapContext> context) // 杜鹃树 - 使用杜鹃木原木和原版杜鹃树叶 register(context, AZALEA_TREE_KEY, Feature.TREE, new TreeConfiguration.TreeConfigurationBuilder( - BlockStateProvider.simple(ModBlocks.AZALEA_LOG.get()), + BlockStateProvider.simple(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_LOG.get()), new BendingTrunkPlacer(4, 2, 0, 3, UniformInt.of(1, 2)), new WeightedStateProvider( WeightedList.builder() diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java b/src/datagen/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java similarity index 92% rename from src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java rename to src/datagen/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java index b20b8ea..992272e 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/worldgen/ModPlacedFeatures.java @@ -30,18 +30,18 @@ public class ModPlacedFeatures { public static final ResourceKey BLAZE_TREE_PLACED_KEY = ResourceKey.create( Registries.PLACED_FEATURE, - Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "blaze_tree_placed") + HFASMod.id("blaze_tree_placed") ); public static final ResourceKey SOUL_TREE_PLACED_KEY = ResourceKey.create( Registries.PLACED_FEATURE, - Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "soul_tree_placed") + HFASMod.id("soul_tree_placed") ); // 杜鹃树放置 public static final ResourceKey AZALEA_TREE_PLACED_KEY = ResourceKey.create( Registries.PLACED_FEATURE, - Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "azalea_tree_placed") + HFASMod.id("azalea_tree_placed") ); public static void bootstrap(BootstrapContext context) { diff --git a/src/hfas/gametest/config/ww_hfas-common.toml b/src/hfas/gametest/config/ww_hfas-common.toml deleted file mode 100644 index 5d8abe1..0000000 --- a/src/hfas/gametest/config/ww_hfas-common.toml +++ /dev/null @@ -1,2 +0,0 @@ -[worldgen] -replaceVanillaFletchingTable = false diff --git a/src/hfas/gametest/resources/META-INF/neoforge.mods.toml b/src/hfas/gametest/resources/META-INF/neoforge.mods.toml deleted file mode 100644 index f27c8a3..0000000 --- a/src/hfas/gametest/resources/META-INF/neoforge.mods.toml +++ /dev/null @@ -1,14 +0,0 @@ -license="All Rights Reserved" -[[mods]] -modId="ww_hfas_tests" -version="1.0" -displayName="Wild Wind Integration Tests" -[[dependencies.ww_hfas_tests]] -modId="ww_hfas" -type="required" -versionRange="[1.0.0,)" -ordering="AFTER" -side="BOTH" - -[[mixins]] -config="ww_hfas_tests.mixins.json" diff --git a/src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/reach_arrow_acquisition.json b/src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/reach_arrow_acquisition.json deleted file mode 100644 index 7f9d74d..0000000 --- a/src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/reach_arrow_acquisition.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minecraft:function", - "function": "ww_hfas_tests:reach_arrow_acquisition", - "environment": "minecraft:default", - "structure": "ww_hfas_tests:empty", - "max_ticks": 240 -} diff --git a/src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/upstream_integration.json b/src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/upstream_integration.json deleted file mode 100644 index 386c575..0000000 --- a/src/hfas/gametest/resources/data/ww_hfas_tests/test_instance/upstream_integration.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minecraft:function", - "function": "ww_hfas_tests:upstream_integration", - "environment": "minecraft:default", - "structure": "ww_hfas_tests:empty", - "max_ticks": 240 -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/HFASMod.java b/src/hfas/java/org/polaris2023/wildwind/hfas/HFASMod.java deleted file mode 100644 index 06f6456..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/HFASMod.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.polaris2023.wildwind.hfas; - -import org.polaris2023.wildwind.hfas.effect.ModEffects; -import org.polaris2023.wildwind.hfas.recipe.ModRecipes; -import org.polaris2023.wildwind.structures.StructureModule; -import lombok.extern.slf4j.Slf4j; -import net.minecraft.resources.Identifier; -import net.neoforged.bus.api.IEventBus; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.ModContainer; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.registries.DataPackRegistryEvent; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.block.entity.ModBlockEntities; -import org.polaris2023.wildwind.hfas.config.ModCommonConfig; -import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; -import org.polaris2023.wildwind.hfas.menu.ModMenus; -import org.polaris2023.wildwind.hfas.registry.*; - -@Mod(HFASMod.MOD_ID) -@Slf4j -@EventBusSubscriber(modid = HFASMod.MOD_ID) -public class HFASMod { - public static final String MOD_ID = "ww_hfas"; - - public HFASMod(IEventBus bus, ModContainer container) { - ModEntities.register(bus); - ModItems.register(bus); - ModRecipes.register(bus); - org.polaris2023.wildwind.hfas.worldgen.MasonKilnProcessor.PROCESSORS.register(bus); - ModEffects.register(bus); - StructureModule.register(bus); - // 注册方块和物品 - ModBlocks.register(bus); - // 注册方块实体 - ModBlockEntities.register(bus); - // 注册菜单 - ModMenus.register(bus); - // 注册数据组件 - ModDataComponents.register(bus); - // 注册属性 - ModAttributes.register(bus); - - // 注册状态效果、药水 - ModMobEffects.register(bus); - ModPotions.register(bus); - - // 注册食人鱼音效 - ModSoundEvents.register(bus); - - // 注册配置文件 - container.registerConfig(net.neoforged.fml.config.ModConfig.Type.COMMON, ModCommonConfig.SPEC); - - //注册创造模式物品栏 - ModCreativeTabs.register(bus); - - //-----[实体相关]----- - //实体信息同步器 - ModEntityDataSerializers.register(bus); - } - - public static Identifier id(String path){ - return Identifier.fromNamespaceAndPath(MOD_ID,path); - } - - //数据驱动项注册 - @SubscribeEvent - public static void datapackRegistry(DataPackRegistryEvent.NewRegistry event){ - event.dataPackRegistry(DatadrivenRegistryKey.MUDCRAB_VARIANT, MudcrabVariant.DIRECT_CODEC, MudcrabVariant.NETWORK_CODEC); - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowFletching.java b/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowFletching.java deleted file mode 100644 index 98eb3a9..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowFletching.java +++ /dev/null @@ -1,62 +0,0 @@ -package org.polaris2023.wildwind.hfas.arrow; - -import net.minecraft.world.item.Items; - -/** - * 箭羽类型枚举 - * 影响箭矢飞行速度 - * - * @author baka4n - * @since 2026/04/15 - */ -public enum ArrowFletching { - /** - * 羽毛 - 无效果(基准速度) - */ - FEATHER("feather", Items.FEATHER, 1.0F, "无效果"), - - /** - * 幻翼膜 - 飞行速度更快 - */ - PHANTOM_MEMBRANE("phantom_membrane", Items.PHANTOM_MEMBRANE, 1.5F, "飞行速度更快"); - - private final String name; - private final net.minecraft.world.level.ItemLike item; - private final float speedMultiplier; - private final String description; - - ArrowFletching(String name, net.minecraft.world.level.ItemLike item, float speedMultiplier, String description) { - this.name = name; - this.item = item; - this.speedMultiplier = speedMultiplier; - this.description = description; - } - - public String getName() { - return name; - } - - public net.minecraft.world.level.ItemLike getItem() { - return item; - } - - public float getSpeedMultiplier() { - return speedMultiplier; - } - - public String getDescription() { - return description; - } - - /** - * 根据物品获取对应的箭羽类型 - */ - public static ArrowFletching fromItem(net.minecraft.world.item.Item item) { - for (ArrowFletching fletching : values()) { - if (fletching.getItem().asItem() == item) { - return fletching; - } - } - return null; - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowHead.java b/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowHead.java deleted file mode 100644 index b21bc8f..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowHead.java +++ /dev/null @@ -1,107 +0,0 @@ -package org.polaris2023.wildwind.hfas.arrow; - -import net.minecraft.world.item.Items; - -/** - * 箭头类型枚举 - * 影响命中效果 - * - * @author baka4n - * @since 2026/04/15 - */ -public enum ArrowHead { - /** - * 燧石 - 无效果 - */ - FLINT("flint", Items.FLINT, false, "无效果"), - - /** - * 火药 - 爆炸,伤害不破坏地形 - */ - GUNPOWDER("gunpowder", Items.GUNPOWDER, false, "爆炸,伤害不破坏地形"), - - /** - * 粘液球 - 命中产生弹力 - */ - SLIME_BALL("slime_ball", Items.SLIME_BALL, false, "命中产生弹力"), - - /** - * 烈焰粉 - 命中致燃实体 - */ - BLAZE_POWDER("blaze_powder", Items.BLAZE_POWDER, false, "命中致燃实体"), - - /** - * 岩浆膏 - 致燃+弹力 - */ - MAGMA_CREAM("magma_cream", Items.MAGMA_CREAM, false, "致燃+弹力"), - - /** - * 风弹 - 风弹爆炸,不可回收 - */ - WIND_CHARGE("wind_charge", Items.WIND_CHARGE, true, "风弹爆炸,不可回收"), - - /** - * 煤炭 - 命中方块放置火把,不可回收 - */ - COAL("coal", Items.COAL, true, "命中方块放置火把,不可回收"), - - /** - * 紫颂果 - 目标随机传送,不可回收 - */ - CHORUS_FRUIT("chorus_fruit", Items.CHORUS_FRUIT, true, "目标随机传送,不可回收"), - - /** - * 末影之眼 - 与目标交换位置,不可回收 - */ - ENDER_EYE("ender_eye", Items.ENDER_EYE, true, "与目标交换位置,不可回收"), - - /** - * 紫水晶 - 破坏植物/玻璃类方块 - */ - AMETHYST_SHARD("amethyst_shard", Items.AMETHYST_SHARD, false, "破坏植物/玻璃类方块"), - - /** - * 海晶碎片 - 无视流体重力 - */ - PRISMARINE_SHARD("prismarine_shard", Items.PRISMARINE_SHARD, false, "无视流体重力"); - - private final String name; - private final net.minecraft.world.level.ItemLike item; - private final boolean notRecoverable; - private final String description; - - ArrowHead(String name, net.minecraft.world.level.ItemLike item, boolean notRecoverable, String description) { - this.name = name; - this.item = item; - this.notRecoverable = notRecoverable; - this.description = description; - } - - public String getName() { - return name; - } - - public net.minecraft.world.level.ItemLike getItem() { - return item; - } - - public boolean isNotRecoverable() { - return notRecoverable; - } - - public String getDescription() { - return description; - } - - /** - * 根据物品获取对应的箭头类型 - */ - public static ArrowHead fromItem(net.minecraft.world.item.Item item) { - for (ArrowHead head : values()) { - if (head.getItem().asItem() == item) { - return head; - } - } - return null; - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowShaft.java b/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowShaft.java deleted file mode 100644 index 6cde87d..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ArrowShaft.java +++ /dev/null @@ -1,103 +0,0 @@ -package org.polaris2023.wildwind.hfas.arrow; - -import net.minecraft.world.item.Items; - -/** - * 箭杆类型枚举 - * 影响箭矢轨迹 - * - * @author baka4n - * @since 2026/04/15 - */ -public enum ArrowShaft { - /** - * 木棍 - 无效果 - */ - STICK("stick", Items.STICK, 1.0F, 0.0F, 0.0F, false, false, "无效果"), - - /** - * 烈焰棒 - 路径产生火焰粒子,落点生成火焰,不可回收 - */ - BLAZE_ROD("blaze_rod", Items.BLAZE_ROD, 1.0F, 0.0F, 0.0F, true, false, "路径产生火焰粒子,落点生成火焰,不可回收"), - - /** - * 风弹 - 非流体环境无重力,落点风弹爆炸,不可回收 - */ - WIND_CHARGE("wind_charge", Items.WIND_CHARGE, 1.0F, 0.0F, 0.0F, false, true, "非流体环境无重力,落点风弹爆炸,不可回收"), - - /** - * 骨头 - 下坠快,+1伤害,随机偏移大 - */ - BONE("bone", Items.BONE, 1.0F, 1.0F, 0.15F, false, false, "下坠快,+1伤害,随机偏移大"), - - /** - * 竹子 - 下坠慢,穿透1个目标,准度高 - */ - BAMBOO("bamboo", Items.BAMBOO, 0.7F, 0.0F, 0.0F, false, false, "下坠慢,穿透1个目标,准度高"); - - private final String name; - private final net.minecraft.world.level.ItemLike item; - private final float gravityMultiplier; - private final float damageBonus; - private final float inaccuracy; - private final boolean fireTrail; - private final boolean noGravity; - private final String description; - - ArrowShaft(String name, net.minecraft.world.level.ItemLike item, - float gravityMultiplier, float damageBonus, float inaccuracy, - boolean fireTrail, boolean noGravity, String description) { - this.name = name; - this.item = item; - this.gravityMultiplier = gravityMultiplier; - this.damageBonus = damageBonus; - this.inaccuracy = inaccuracy; - this.fireTrail = fireTrail; - this.noGravity = noGravity; - this.description = description; - } - - public String getName() { - return name; - } - - public net.minecraft.world.level.ItemLike getItem() { - return item; - } - - public float getGravityMultiplier() { - return gravityMultiplier; - } - - public float getDamageBonus() { - return damageBonus; - } - - public float getInaccuracy() { - return inaccuracy; - } - - public boolean hasFireTrail() { - return fireTrail; - } - - public boolean hasNoGravity() { - return noGravity; - } - - public String getDescription() { - return description; - } - - /** - * 根据物品获取对应的箭杆类型 - */ - public static ArrowShaft fromItem(net.minecraft.world.item.Item item) { - for (ArrowShaft shaft : values()) { - if (shaft.getItem().asItem() == item) { - return shaft; - } - } - return null; - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/FletchingTableBlock.java b/src/hfas/java/org/polaris2023/wildwind/hfas/block/FletchingTableBlock.java deleted file mode 100644 index 8a7d9ce..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/block/FletchingTableBlock.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.polaris2023.wildwind.hfas.block; - -import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.MenuProvider; -import net.minecraft.world.SimpleMenuProvider; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; -import org.polaris2023.wildwind.hfas.block.entity.FletchingTableBlockEntity; -import org.polaris2023.wildwind.hfas.menu.FletchingTableMenu; - -import javax.annotation.Nullable; - -/** - * 制箭台方块 - 带有GUI功能 - * - * @author baka4n - * @since 2026/04/15 - */ -public class FletchingTableBlock extends Block implements EntityBlock { - private static final Component CONTAINER_TITLE = Component.translatable("container.fletching_table"); - - public FletchingTableBlock(Properties properties) { - super(properties); - } - - @Override - protected InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, BlockHitResult hitResult) { - if (level.isClientSide()) { - return InteractionResult.SUCCESS; - } - player.openMenu(state.getMenuProvider(level, pos)); - return InteractionResult.CONSUME; - } - - @Nullable - @Override - public MenuProvider getMenuProvider(BlockState state, Level level, BlockPos pos) { - return new SimpleMenuProvider( - (containerId, playerInventory, player) -> new FletchingTableMenu(containerId, playerInventory), - CONTAINER_TITLE - ); - } - - @Nullable - @Override - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return new FletchingTableBlockEntity(pos, state); - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/FletchingTableBlockEntity.java b/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/FletchingTableBlockEntity.java deleted file mode 100644 index 11eaaed..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/block/entity/FletchingTableBlockEntity.java +++ /dev/null @@ -1,132 +0,0 @@ -package org.polaris2023.wildwind.hfas.block.entity; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.NonNullList; -import net.minecraft.world.Container; -import net.minecraft.world.ContainerHelper; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.storage.ValueInput; -import net.minecraft.world.level.storage.ValueOutput; - -/** - * 制箭台方块实体 - * - * @author baka4n - * @since 2026/04/15 - */ -public class FletchingTableBlockEntity extends BlockEntity implements Container { - public static int CONTAINER_SIZE = 0; - public enum Slots { - SLOT_FLETCHING, // 箭羽槽 - SLOT_SHAFT, // 箭羽槽 - SLOT_HEAD, // 箭头槽 - SLOT_FUEL, // 消耗槽 - SLOT_RESULT // 输出槽 - ; - - public final int slot; - - Slots() { - slot = CONTAINER_SIZE; - CONTAINER_SIZE++; - } - - public Slot toSlot(Container c, int x, int z) { - return new Slot(c, slot, x, z); - } - - public ItemStack remove(Container c, int size) { - return c.removeItem(slot, size); - } - } - - private final NonNullList items = NonNullList.withSize(CONTAINER_SIZE, ItemStack.EMPTY); - - - public FletchingTableBlockEntity(BlockPos pos, BlockState state) { - super(ModBlockEntities.FLETCHING_TABLE.get(), pos, state); - - } - - @Override - public int getContainerSize() { - return CONTAINER_SIZE; - } - - @Override - public boolean isEmpty() { - for (ItemStack stack : items) { - if (!stack.isEmpty()) { - return false; - } - } - return true; - } - - @Override - public ItemStack getItem(int slot) { - return slot >= 0 && slot < items.size() ? items.get(slot) : ItemStack.EMPTY; - } - - @Override - public ItemStack removeItem(int slot, int amount) { - return ContainerHelper.removeItem(items, slot, amount); - } - - @Override - public ItemStack removeItemNoUpdate(int slot) { - return ContainerHelper.takeItem(items, slot); - } - - @Override - public void setItem(int slot, ItemStack stack) { - if (slot >= 0 && slot < items.size()) { - items.set(slot, stack); - if (stack.getCount() > getMaxStackSize()) { - stack.setCount(getMaxStackSize()); - } - setChanged(); - } - } - - @Override - public void setChanged() { - super.setChanged(); - if (level != null) { - level.sendBlockUpdated(worldPosition, getBlockState(), getBlockState(), 3); - } - } - - @Override - public boolean stillValid(Player player) { - if (level == null) { - return false; - } - if (level.getBlockEntity(worldPosition) != this) { - return false; - } - return player.distanceToSqr(worldPosition.getX() + 0.5, worldPosition.getY() + 0.5, worldPosition.getZ() + 0.5) <= 64.0; - } - - @Override - public void clearContent() { - items.clear(); - setChanged(); - } - - @Override - protected void saveAdditional(ValueOutput output) { - super.saveAdditional(output); - ContainerHelper.saveAllItems(output, items); - } - - @Override - public void loadAdditional(ValueInput input) { - super.loadAdditional(input); - ContainerHelper.loadAllItems(input, items); - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/component/ArrowComponent.java b/src/hfas/java/org/polaris2023/wildwind/hfas/component/ArrowComponent.java deleted file mode 100644 index 8591db5..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/component/ArrowComponent.java +++ /dev/null @@ -1,124 +0,0 @@ -package org.polaris2023.wildwind.hfas.component; - -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.core.NonNullList; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.item.ItemStack; -import org.polaris2023.wildwind.hfas.arrow.ArrowFletching; -import org.polaris2023.wildwind.hfas.arrow.ArrowHead; -import org.polaris2023.wildwind.hfas.arrow.ArrowShaft; -import org.polaris2023.wildwind.hfas.registry.ModDataComponents; - -/** - * 箭矢组件数据 - * 存储箭羽、箭杆、箭头类型 - * - * @param fletching 箭羽类型 - * @param shaft 箭杆类型 - * @param head 箭头类型 - * @author baka4n - * @since 2026/04/15 - */ -public record ArrowComponent(ArrowFletching fletching, ArrowShaft shaft, ArrowHead head) { - - public static final Codec CODEC = RecordCodecBuilder.create(instance -> - instance.group( - Codec.STRING.xmap(ArrowFletching::valueOf, ArrowFletching::getName).fieldOf("fletching").forGetter(ArrowComponent::fletching), - Codec.STRING.xmap(ArrowShaft::valueOf, ArrowShaft::getName).fieldOf("shaft").forGetter(ArrowComponent::shaft), - Codec.STRING.xmap(ArrowHead::valueOf, ArrowHead::getName).fieldOf("head").forGetter(ArrowComponent::head) - ).apply(instance, ArrowComponent::new) - ); - - public static final StreamCodec STREAM_CODEC = StreamCodec.of( - (buf, component) -> { - buf.writeUtf(component.fletching().getName()); - buf.writeUtf(component.shaft().getName()); - buf.writeUtf(component.head().getName()); - }, - buf -> new ArrowComponent( - ArrowFletching.valueOf(buf.readUtf()), - ArrowShaft.valueOf(buf.readUtf()), - ArrowHead.valueOf(buf.readUtf()) - ) - ); - - /** - * 默认组件(普通箭矢) - */ - public static final ArrowComponent DEFAULT = new ArrowComponent( - ArrowFletching.FEATHER, - ArrowShaft.STICK, - ArrowHead.FLINT - ); - - /** - * 创建带组件的箭矢物品 - */ - public ItemStack createArrowStack(int count) { - ItemStack stack = new ItemStack(net.minecraft.world.item.Items.ARROW, count); - stack.set(ModDataComponents.ARROW_COMPONENT.get(), this); - return stack; - } - - /** - * 从物品获取箭矢组件 - */ - public static ArrowComponent fromStack(ItemStack stack) { - return stack.getOrDefault(ModDataComponents.ARROW_COMPONENT.get(), DEFAULT); - } - - /** - * 获取完整描述 - */ - public String getFullDescription() { - StringBuilder sb = new StringBuilder(); - if (fletching != ArrowFletching.FEATHER) { - sb.append("箭羽: ").append(fletching.getDescription()).append("\n"); - } - if (shaft != ArrowShaft.STICK) { - sb.append("箭杆: ").append(shaft.getDescription()).append("\n"); - } - if (head != ArrowHead.FLINT) { - sb.append("箭头: ").append(head.getDescription()); - } - return sb.toString().trim(); - } - - /** - * 是否不可回收 - */ - public boolean isNotRecoverable() { - return shaft.hasFireTrail() || shaft.hasNoGravity() || head.isNotRecoverable(); - } - - /** - * 获取飞行速度倍率 - */ - public float getSpeedMultiplier() { - return fletching.getSpeedMultiplier(); - } - - /** - * 获取重力倍率 - */ - public float getGravityMultiplier() { - return shaft.getGravityMultiplier(); - } - - /** - * 获取伤害加成 - */ - public float getDamageBonus() { - return shaft.getDamageBonus(); - } - - /** - * 获取不精确度 - */ - public float getInaccuracy() { - return shaft.getInaccuracy(); - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/config/ModCommonConfig.java b/src/hfas/java/org/polaris2023/wildwind/hfas/config/ModCommonConfig.java deleted file mode 100644 index 43aa6df..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/config/ModCommonConfig.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.polaris2023.wildwind.hfas.config; - -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.fml.event.config.ModConfigEvent; -import net.neoforged.neoforge.common.ModConfigSpec; -import org.polaris2023.wildwind.hfas.HFASMod; - -/** - * 模组配置类 - * 用于控制模组行为的各种配置选项 - * - * @author baka4n - * @since 2026/04/15 - */ -@EventBusSubscriber(modid = HFASMod.MOD_ID) -public class ModCommonConfig { - - private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); - - // ==================== 世界生成配置 ==================== - - /** - * 是否启用原版制箭台替换为模组制箭台 - * 当设置为 false 时,世界生成时不会替换原版制箭台 - */ - private static final ModConfigSpec.BooleanValue REPLACE_VANILLA_FLETCHING_TABLE = BUILDER - .comment("是否启用原版制箭台替换为模组制箭台", - "当设置为 false 时,世界生成时不会替换原版制箭台", - "Enable replacement of vanilla fletching table with mod fletching table", - "When set to false, vanilla fletching tables will not be replaced during world generation") - .define("worldgen.replaceVanillaFletchingTable", true); - - // ==================== 构建配置规范 ==================== - - public static final ModConfigSpec SPEC = BUILDER.build(); - - // ==================== 运行时配置值 ==================== - - private static boolean replaceVanillaFletchingTable = true; - - /** - * 获取是否启用原版制箭台替换 - * @return true 表示启用替换,false 表示不替换 - */ - public static boolean shouldReplaceVanillaFletchingTable() { - return replaceVanillaFletchingTable; - } - - /** - * 配置加载事件处理 - * 当配置文件被加载或重新加载时调用 - */ - @SubscribeEvent - static void onLoad(final ModConfigEvent event) { - // 更新运行时配置值 - replaceVanillaFletchingTable = REPLACE_VANILLA_FLETCHING_TABLE.get(); - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java deleted file mode 100644 index 05d0b5b..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModDataMapsProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -package org.polaris2023.wildwind.hfas.datagen.provider; - -import net.minecraft.core.HolderLookup; -import net.minecraft.data.PackOutput; -import net.neoforged.neoforge.common.data.DataMapProvider; -import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps; -import net.neoforged.neoforge.registries.datamaps.builtin.Strippable; -import org.polaris2023.wildwind.hfas.block.ModBlocks; - -import java.util.concurrent.CompletableFuture; - -public class ModDataMapsProvider extends DataMapProvider { - /** - * Create a new provider. - * - * @param packOutput the output location - * @param lookupProvider a {@linkplain CompletableFuture} supplying the registries - */ - public ModDataMapsProvider(PackOutput packOutput, CompletableFuture lookupProvider) { - super(packOutput, lookupProvider); - } - - @Override - protected void gather(HolderLookup.Provider provider) { - builder(NeoForgeDataMaps.STRIPPABLES) - .add(ModBlocks.AZALEA_LOG.getKey(), new Strippable(ModBlocks.STRIPPED_AZALEA_LOG.get()), false) - .add(ModBlocks.AZALEA_WOOD.getKey(), new Strippable(ModBlocks.STRIPPED_AZALEA_WOOD.get()), false) - .add(ModBlocks.BLAZE_LOG.getKey(), new Strippable(ModBlocks.STRIPPED_BLAZE_LOG.get()), false) - .add(ModBlocks.BLAZE_WOOD.getKey(), new Strippable(ModBlocks.STRIPPED_BLAZE_WOOD.get()), false) - .add(ModBlocks.SOUL_LOG.getKey(), new Strippable(ModBlocks.STRIPPED_SOUL_LOG.get()), false) - .add(ModBlocks.SOUL_WOOD.getKey(), new Strippable(ModBlocks.STRIPPED_SOUL_WOOD.get()), false) - ; - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java deleted file mode 100644 index b5be436..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java +++ /dev/null @@ -1,217 +0,0 @@ -package org.polaris2023.wildwind.hfas.datagen.provider; - -import net.minecraft.client.data.models.model.ItemModelUtils; -import net.minecraft.resources.Identifier; -import org.polaris2023.wildwind.hfas.registry.ModEntities; -import org.polaris2023.wildwind.hfas.registry.ModItems; -import net.minecraft.client.data.models.model.ModelTemplates; -import net.minecraft.client.data.models.BlockModelGenerators; -import net.minecraft.client.data.models.ItemModelGenerators; -import net.minecraft.client.data.models.ModelProvider; -import net.minecraft.client.data.models.model.ModelLocationUtils; -import net.minecraft.client.data.models.model.ModelTemplate; -import net.minecraft.client.data.models.model.TexturedModel; -import net.minecraft.data.PackOutput; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; - -import java.util.function.Supplier; - -/** - * 模型生成器 - * 用于生成方块和物品的模型文件 - * - * @author baka4n - * @since 2026/04/15 - */ -public class ModModelProvider extends ModelProvider { - - public ModModelProvider(PackOutput output) { - super(output, HFASMod.MOD_ID); - } - - @Override - protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels) { - itemModels.itemModelOutput.accept( - org.polaris2023.wildwind.hfas.registry.ModItems.MUDDY_PIG_SPAWN_EGG.get(), - ItemModelUtils.plainModel( - Identifier.withDefaultNamespace("item/pig_spawn_egg"))); - ModItems.MATERIALS.forEach(item -> itemModels.generateFlatItem(item.get(), ModelTemplates.FLAT_ITEM)); - // ==================== 焚烬木套件 ==================== - registerWoodModels(blockModels, itemModels, - ModBlocks.BLAZE_LOG.get(), - ModBlocks.BLAZE_WOOD.get(), - ModBlocks.STRIPPED_BLAZE_LOG.get(), - ModBlocks.STRIPPED_BLAZE_WOOD.get(), - ModBlocks.BLAZE_PLANKS.get(), - ModBlocks.BLAZE_STAIRS.get(), - ModBlocks.BLAZE_SLAB.get(), - ModBlocks.BLAZE_FENCE.get(), - ModBlocks.BLAZE_FENCE_GATE.get(), - ModBlocks.BLAZE_DOOR.get(), - ModBlocks.BLAZE_TRAPDOOR.get(), - ModBlocks.BLAZE_PRESSURE_PLATE.get(), - ModBlocks.BLAZE_BUTTON.get() - ); - // 焚烬木树叶 - 橙色染色 - blockModels.createTintedLeaves(ModBlocks.BLAZE_LEAVES.get(), TexturedModel.LEAVES, 0xFF8000); - // 焚烬木树苗 - blockModels.createCrossBlock(ModBlocks.BLAZE_SAPLING.get(), BlockModelGenerators.PlantType.NOT_TINTED); - - // ==================== 灵焰木套件 ==================== - registerWoodModels(blockModels, itemModels, - ModBlocks.SOUL_LOG.get(), - ModBlocks.SOUL_WOOD.get(), - ModBlocks.STRIPPED_SOUL_LOG.get(), - ModBlocks.STRIPPED_SOUL_WOOD.get(), - ModBlocks.SOUL_PLANKS.get(), - ModBlocks.SOUL_STAIRS.get(), - ModBlocks.SOUL_SLAB.get(), - ModBlocks.SOUL_FENCE.get(), - ModBlocks.SOUL_FENCE_GATE.get(), - ModBlocks.SOUL_DOOR.get(), - ModBlocks.SOUL_TRAPDOOR.get(), - ModBlocks.SOUL_PRESSURE_PLATE.get(), - ModBlocks.SOUL_BUTTON.get() - ); - // 灵焰木树叶 - 青色染色 - blockModels.createTintedLeaves(ModBlocks.SOUL_LEAVES.get(), TexturedModel.LEAVES, 0x00FFFF); - // 灵焰木树苗 - blockModels.createCrossBlock(ModBlocks.SOUL_SAPLING.get(), BlockModelGenerators.PlantType.NOT_TINTED); - - // ==================== 杜鹃木套件 ==================== - registerWoodModels(blockModels, itemModels, - ModBlocks.AZALEA_LOG.get(), - ModBlocks.AZALEA_WOOD.get(), - ModBlocks.STRIPPED_AZALEA_LOG.get(), - ModBlocks.STRIPPED_AZALEA_WOOD.get(), - ModBlocks.AZALEA_PLANKS.get(), - ModBlocks.AZALEA_STAIRS.get(), - ModBlocks.AZALEA_SLAB.get(), - ModBlocks.AZALEA_FENCE.get(), - ModBlocks.AZALEA_FENCE_GATE.get(), - ModBlocks.AZALEA_DOOR.get(), - ModBlocks.AZALEA_TRAPDOOR.get(), - ModBlocks.AZALEA_PRESSURE_PLATE.get(), - ModBlocks.AZALEA_BUTTON.get() - ); - - blockModels.createShelf(ModBlocks.AZALEA_SHELF.get(), ModBlocks.STRIPPED_AZALEA_LOG.get()); - blockModels.blockStateOutput.accept(BlockModelGenerators.createSign(ModBlocks.AZALEA_SIGN.get(), - signVariant("azalea_sign_rot_0"), signVariant("azalea_sign_rot_1"), signVariant("azalea_sign_rot_2"), signVariant("azalea_sign_rot_3"))); - blockModels.blockStateOutput.accept(BlockModelGenerators.createHangingSign(ModBlocks.AZALEA_HANGING_SIGN.get(), - signVariant("azalea_hanging_sign_rot_0"), signVariant("azalea_hanging_sign_rot_1"), signVariant("azalea_hanging_sign_rot_2"), signVariant("azalea_hanging_sign_rot_3"), - signVariant("azalea_hanging_sign_attached_rot_0"), signVariant("azalea_hanging_sign_attached_rot_1"), signVariant("azalea_hanging_sign_attached_rot_2"), signVariant("azalea_hanging_sign_attached_rot_3"))); - blockModels.blockStateOutput.accept(net.minecraft.client.data.models.blockstates.MultiVariantGenerator.dispatch(ModBlocks.AZALEA_WALL_SIGN.get(), signVariant("azalea_wall_sign")) - .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING_ALT)); - blockModels.blockStateOutput.accept(net.minecraft.client.data.models.blockstates.MultiVariantGenerator.dispatch(ModBlocks.AZALEA_WALL_HANGING_SIGN.get(), signVariant("azalea_wall_hanging_sign")) - .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING_ALT)); - itemModels.generateFlatItem(ModBlocks.AZALEA_SIGN.get().asItem(), ModelTemplates.FLAT_ITEM); - itemModels.generateFlatItem(ModBlocks.AZALEA_HANGING_SIGN.get().asItem(), ModelTemplates.FLAT_ITEM); - itemModels.itemModelOutput.accept(ModItems.TIPPED_ARROW.get(), ItemModelUtils.tintedModel( - Identifier.withDefaultNamespace("item/tipped_arrow"), new net.minecraft.client.color.item.Potion())); - // ==================== 其他方块 ==================== - // 焦灰草方块 - 使用简单的方块模型 - createSimpleBlock(blockModels, ModBlocks.SCORCHED_GRASS_BLOCK.get()); - - // 焦土 - 使用简单的方块模型 - createSimpleBlock(blockModels, ModBlocks.SCORCHED_DIRT.get()); - - // 焦灰草丛 - 使用交叉模型(类似草丛) - createCrossBlock(blockModels, ModBlocks.SCORCHED_GRASS.get()); - - // 焦灰枝条 - 使用交叉模型 - createCrossBlock(blockModels, ModBlocks.SCORCHED_TWIG.get()); - - // 仙人球 - 使用交叉模型 - createCrossBlock(blockModels, ModBlocks.TINY_CACTUS.get()); - - // 制箭台 - 使用简单方块模型 - createSimpleBlock(blockModels, ModBlocks.FLETCHING_TABLE.get()); - blockModels.blockStateOutput.accept(net.minecraft.client.data.models.blockstates.MultiVariantGenerator.dispatch(ModBlocks.KILN.get()) - .with(BlockModelGenerators.createBooleanModelDispatch(net.minecraft.world.level.block.state.properties.BlockStateProperties.LIT, - BlockModelGenerators.plainVariant(Identifier.withDefaultNamespace("block/furnace_on")), - BlockModelGenerators.plainVariant(Identifier.withDefaultNamespace("block/furnace")))) - .with(BlockModelGenerators.ROTATION_HORIZONTAL_FACING)); - itemModels.itemModelOutput.accept(ModBlocks.KILN.get().asItem(), - ItemModelUtils.plainModel(Identifier.withDefaultNamespace("block/furnace"))); - - // ==================== 独立物品 ==================== - simpleItem(itemModels, ModItems.CRAB_CLAW); - - // 万用蟹钳 - 使用手写 3D 模型(resources 下的 models/item/omni_claw.json),仅生成物品模型定义 - itemModels.itemModelOutput.accept( - ModItems.OMNI_CLAW.get(), - ItemModelUtils.plainModel(ModelLocationUtils.getModelLocation(ModItems.OMNI_CLAW.get())) - ); - simpleItem(itemModels, ModItems.MUDCRAB_BUCKET); - simpleItem(itemModels, ModItems.MUDCRAB_SPAWN_EGG); - - // ==================== 食人鱼 ==================== - registerPiranhaModels(itemModels); - } - - /** - * 注册木质方块模型 - */ - private void registerWoodModels(BlockModelGenerators blockModels, ItemModelGenerators itemModels, - Block log, Block wood, - Block strippedLog, Block strippedWood, - Block planks, Block stairs, Block slab, - Block fence, Block fenceGate, - Block door, Block trapdoor, - Block pressurePlate, Block button) { - // 原木 - 使用 WoodProvider(自动生成物品模型) - blockModels.woodProvider(log).logWithHorizontal(log).wood(wood); - - // 去皮原木(自动生成物品模型) - blockModels.woodProvider(strippedLog).logWithHorizontal(strippedLog).wood(strippedWood); - - // 使用 family 创建木质方块套件(包括木板,自动生成物品模型) - blockModels.family(planks) - .stairs(stairs) - .slab(slab) - .fence(fence) - .fenceGate(fenceGate) - .pressurePlate(pressurePlate) - .button(button); - - // 门(自动生成物品模型) - blockModels.createDoor(door); - - // 活板门(自动生成物品模型) - blockModels.createTrapdoor(trapdoor); - } - - /** - * 创建简单方块模型(六面相同贴图) - */ - private void createSimpleBlock(BlockModelGenerators blockModels, Block block) { - blockModels.createTrivialCube(block); - } - - /** - * 创建交叉模型(用于植物类方块) - */ - private void createCrossBlock(BlockModelGenerators blockModels, Block block) { - blockModels.createCrossBlock(block, BlockModelGenerators.PlantType.NOT_TINTED); - } - - private static net.minecraft.client.data.models.MultiVariant signVariant(String path) { - return BlockModelGenerators.plainVariant(HFASMod.id("block/" + path)); - } - - private void simpleItem(ItemModelGenerators itemModels, Supplier item){ - itemModels.generateFlatItem(item.get(), ModelTemplates.FLAT_ITEM); - } - - private void registerPiranhaModels(ItemModelGenerators itemModels) { - simpleItem(itemModels, ModItems.PIRANHA); - simpleItem(itemModels, ModItems.COOKED_PIRANHA); - simpleItem(itemModels, ModItems.PIRANHA_BUCKET); - simpleItem(itemModels, ModItems.PIRANHA_SPAWN_EGG); - simpleItem(itemModels, ModItems.FANG); - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java deleted file mode 100644 index 9ef5a4d..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/EnUsLanguageProvider.java +++ /dev/null @@ -1,126 +0,0 @@ -package org.polaris2023.wildwind.hfas.datagen.provider.lang; - -import net.minecraft.data.PackOutput; -import net.neoforged.neoforge.common.data.LanguageProvider; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; - -/** - * 英语语言文件生成器 - * - * @author baka4n - * @since 2026/04/15 - */ -public class EnUsLanguageProvider extends LanguageProvider { - - public EnUsLanguageProvider(PackOutput output) { - super(output, HFASMod.MOD_ID, "en_us"); - } - - @Override - protected void addTranslations() { - add("effect.ww_hfas.sink", "Sink"); - add("effect.ww_hfas.choke", "Choke"); - add("enchantment.ww_hfas.melting", "Melting"); - add("item.ww_hfas.duckweed", "Duckweed"); - add("item.ww_hfas.calamari", "Calamari"); - add("item.ww_hfas.cooked_calamari", "Cooked Calamari"); - add("item.ww_hfas.cooked_egg", "Fried Egg"); - add("item.ww_hfas.baked_seeds", "Baked Seeds"); - add("item.ww_hfas.cooked_frog_legs", "Cooked Frog Legs"); - add("item.ww_hfas.frog_legs", "Raw Frog Legs"); - add("entity.ww_hfas.muddy_pig", "Muddy Pig"); - add("item.ww_hfas.muddy_pig_spawn_egg", "Muddy Pig Spawn Egg"); - // 焚烬木套件 - addBlock(ModBlocks.BLAZE_LOG, "Blaze Log"); - addBlock(ModBlocks.BLAZE_WOOD, "Blaze Wood"); - addBlock(ModBlocks.STRIPPED_BLAZE_LOG, "Stripped Blaze Log"); - addBlock(ModBlocks.STRIPPED_BLAZE_WOOD, "Stripped Blaze Wood"); - addBlock(ModBlocks.BLAZE_PLANKS, "Blaze Planks"); - addBlock(ModBlocks.BLAZE_STAIRS, "Blaze Stairs"); - addBlock(ModBlocks.BLAZE_SLAB, "Blaze Slab"); - addBlock(ModBlocks.BLAZE_FENCE, "Blaze Fence"); - addBlock(ModBlocks.BLAZE_FENCE_GATE, "Blaze Fence Gate"); - addBlock(ModBlocks.BLAZE_DOOR, "Blaze Door"); - addBlock(ModBlocks.BLAZE_TRAPDOOR, "Blaze Trapdoor"); - addBlock(ModBlocks.BLAZE_PRESSURE_PLATE, "Blaze Pressure Plate"); - addBlock(ModBlocks.BLAZE_BUTTON, "Blaze Button"); - addBlock(ModBlocks.BLAZE_LEAVES, "Blaze Leaves"); - addBlock(ModBlocks.BLAZE_SAPLING, "Blaze Sapling"); - - // 灵焰木套件 - addBlock(ModBlocks.SOUL_LOG, "Soul Log"); - addBlock(ModBlocks.SOUL_WOOD, "Soul Wood"); - addBlock(ModBlocks.STRIPPED_SOUL_LOG, "Stripped Soul Log"); - addBlock(ModBlocks.STRIPPED_SOUL_WOOD, "Stripped Soul Wood"); - addBlock(ModBlocks.SOUL_PLANKS, "Soul Planks"); - addBlock(ModBlocks.SOUL_STAIRS, "Soul Stairs"); - addBlock(ModBlocks.SOUL_SLAB, "Soul Slab"); - addBlock(ModBlocks.SOUL_FENCE, "Soul Fence"); - addBlock(ModBlocks.SOUL_FENCE_GATE, "Soul Fence Gate"); - addBlock(ModBlocks.SOUL_DOOR, "Soul Door"); - addBlock(ModBlocks.SOUL_TRAPDOOR, "Soul Trapdoor"); - addBlock(ModBlocks.SOUL_PRESSURE_PLATE, "Soul Pressure Plate"); - addBlock(ModBlocks.SOUL_BUTTON, "Soul Button"); - addBlock(ModBlocks.SOUL_LEAVES, "Soul Leaves"); - addBlock(ModBlocks.SOUL_SAPLING, "Soul Sapling"); - - // 杜鹃木套件 - addBlock(ModBlocks.AZALEA_LOG, "Azalea Log"); - addBlock(ModBlocks.AZALEA_WOOD, "Azalea Wood"); - addBlock(ModBlocks.STRIPPED_AZALEA_LOG, "Stripped Azalea Log"); - addBlock(ModBlocks.STRIPPED_AZALEA_WOOD, "Stripped Azalea Wood"); - addBlock(ModBlocks.AZALEA_PLANKS, "Azalea Planks"); - addBlock(ModBlocks.AZALEA_STAIRS, "Azalea Stairs"); - addBlock(ModBlocks.AZALEA_SLAB, "Azalea Slab"); - addBlock(ModBlocks.AZALEA_FENCE, "Azalea Fence"); - addBlock(ModBlocks.AZALEA_FENCE_GATE, "Azalea Fence Gate"); - addBlock(ModBlocks.AZALEA_DOOR, "Azalea Door"); - addBlock(ModBlocks.AZALEA_TRAPDOOR, "Azalea Trapdoor"); - addBlock(ModBlocks.AZALEA_PRESSURE_PLATE, "Azalea Pressure Plate"); - addBlock(ModBlocks.AZALEA_BUTTON, "Azalea Button"); - - // 其他方块 - addBlock(ModBlocks.SCORCHED_GRASS_BLOCK, "Scorched Grass Block"); - addBlock(ModBlocks.SCORCHED_DIRT, "Scorched Dirt"); - addBlock(ModBlocks.SCORCHED_GRASS, "Scorched Grass"); - addBlock(ModBlocks.SCORCHED_TWIG, "Scorched Twig"); - addBlock(ModBlocks.TINY_CACTUS, "Tiny Cactus"); - addBlock(ModBlocks.FLETCHING_TABLE, "Fletching Table"); - addBlock(ModBlocks.AZALEA_SIGN, "Azalea Sign"); - addBlock(ModBlocks.AZALEA_WALL_SIGN, "Azalea Wall Sign"); - addBlock(ModBlocks.AZALEA_HANGING_SIGN, "Azalea Hanging Sign"); - addBlock(ModBlocks.AZALEA_WALL_HANGING_SIGN, "Azalea Wall Hanging Sign"); - addBlock(ModBlocks.AZALEA_SHELF, "Azalea Shelf"); - add("item.ww_hfas.tipped_arrow", "Arrow of Reach"); - add("item.ww_hfas.tipped_arrow.effect.reach", "Arrow of Reach"); - add("item.ww_hfas.tipped_arrow.effect.long_reach", "Arrow of Reach"); - add("entity.ww_hfas.arrow", "Arrow of Reach"); - addBlock(ModBlocks.KILN, "Kiln"); - - // GUI - add("container.fletching_table", "Fletching Table"); - // 属性 - add("attributes.ww_hfas.extra_item_pickup_range", "Extra Item Pickup Range"); - - // Reach effect & potions - add("effect.ww_hfas.reach", "Reach"); - add("item.minecraft.potion.effect.reach", "Potion of Reach"); - add("item.minecraft.splash_potion.effect.reach", "Splash Potion of Reach"); - add("item.minecraft.lingering_potion.effect.reach", "Lingering Potion of Reach"); - add("item.minecraft.tipped_arrow.effect.reach", "Arrow of Reach"); - add("item.minecraft.potion.effect.long_reach", "Potion of Reach"); - add("item.minecraft.splash_potion.effect.long_reach", "Splash Potion of Reach"); - add("item.minecraft.lingering_potion.effect.long_reach", "Lingering Potion of Reach"); - add("item.minecraft.tipped_arrow.effect.long_reach", "Arrow of Reach"); - - // Direfish sound subtitles - add("subtitles.entity.piranha.attack", "Direfish attacks"); - add("subtitles.entity.piranha.death", "Direfish dies"); - - //创造模式物品栏 - add("mod.wild_wind.name", "Wild Wind"); - - ZhEnCombineLangProvider.addLang(this, "en_us"); - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java deleted file mode 100644 index 11e8093..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/lang/ZhCnLanguageProvider.java +++ /dev/null @@ -1,130 +0,0 @@ -package org.polaris2023.wildwind.hfas.datagen.provider.lang; - -import net.minecraft.data.PackOutput; -import net.neoforged.neoforge.common.data.LanguageProvider; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.registry.ModItems; - -/** - * 中文语言文件生成器 - * - * @author baka4n - * @since 2026/04/15 - */ -public class ZhCnLanguageProvider extends LanguageProvider { - - public ZhCnLanguageProvider(PackOutput output) { - super(output, HFASMod.MOD_ID, "zh_cn"); - } - - @Override - protected void addTranslations() { - add("effect.ww_hfas.sink", "沉溺"); - add("effect.ww_hfas.choke", "窒息"); - add("enchantment.ww_hfas.melting", "熔炼"); - add("item.ww_hfas.duckweed", "浮萍"); - add("item.ww_hfas.calamari", "鱿鱼须"); - add("item.ww_hfas.cooked_calamari", "熟鱿鱼须"); - add("item.ww_hfas.cooked_egg", "煎蛋"); - add("item.ww_hfas.baked_seeds", "烤种子"); - add("item.ww_hfas.cooked_frog_legs", "熟蛙腿"); - add("item.ww_hfas.frog_legs", "生蛙腿"); - add("entity.ww_hfas.muddy_pig", "泥猪"); - add("item.ww_hfas.muddy_pig_spawn_egg", "泥猪刷怪蛋"); - // 焚烬木套件 - addBlock(ModBlocks.BLAZE_LOG, "焚烬木原木"); - addBlock(ModBlocks.BLAZE_WOOD, "焚烬木"); - addBlock(ModBlocks.STRIPPED_BLAZE_LOG, "去皮焚烬木原木"); - addBlock(ModBlocks.STRIPPED_BLAZE_WOOD, "去皮焚烬木"); - addBlock(ModBlocks.BLAZE_PLANKS, "焚烬木木板"); - addBlock(ModBlocks.BLAZE_STAIRS, "焚烬木楼梯"); - addBlock(ModBlocks.BLAZE_SLAB, "焚烬木台阶"); - addBlock(ModBlocks.BLAZE_FENCE, "焚烬木栅栏"); - addBlock(ModBlocks.BLAZE_FENCE_GATE, "焚烬木栅栏门"); - addBlock(ModBlocks.BLAZE_DOOR, "焚烬木门"); - addBlock(ModBlocks.BLAZE_TRAPDOOR, "焚烬木活板门"); - addBlock(ModBlocks.BLAZE_PRESSURE_PLATE, "焚烬木压力板"); - addBlock(ModBlocks.BLAZE_BUTTON, "焚烬木按钮"); - addBlock(ModBlocks.BLAZE_LEAVES, "焚烬木树叶"); - addBlock(ModBlocks.BLAZE_SAPLING, "焚烬木树苗"); - - // 灵焰木套件 - addBlock(ModBlocks.SOUL_LOG, "灵焰木原木"); - addBlock(ModBlocks.SOUL_WOOD, "灵焰木"); - addBlock(ModBlocks.STRIPPED_SOUL_LOG, "去皮灵焰木原木"); - addBlock(ModBlocks.STRIPPED_SOUL_WOOD, "去皮灵焰木"); - addBlock(ModBlocks.SOUL_PLANKS, "灵焰木木板"); - addBlock(ModBlocks.SOUL_STAIRS, "灵焰木楼梯"); - addBlock(ModBlocks.SOUL_SLAB, "灵焰木台阶"); - addBlock(ModBlocks.SOUL_FENCE, "灵焰木栅栏"); - addBlock(ModBlocks.SOUL_FENCE_GATE, "灵焰木栅栏门"); - addBlock(ModBlocks.SOUL_DOOR, "灵焰木门"); - addBlock(ModBlocks.SOUL_TRAPDOOR, "灵焰木活板门"); - addBlock(ModBlocks.SOUL_PRESSURE_PLATE, "灵焰木压力板"); - addBlock(ModBlocks.SOUL_BUTTON, "灵焰木按钮"); - addBlock(ModBlocks.SOUL_LEAVES, "灵焰木树叶"); - addBlock(ModBlocks.SOUL_SAPLING, "灵焰木树苗"); - - // 杜鹃木套件 - addBlock(ModBlocks.AZALEA_LOG, "杜鹃木原木"); - addBlock(ModBlocks.AZALEA_WOOD, "杜鹃木"); - addBlock(ModBlocks.STRIPPED_AZALEA_LOG, "去皮杜鹃木原木"); - addBlock(ModBlocks.STRIPPED_AZALEA_WOOD, "去皮杜鹃木"); - addBlock(ModBlocks.AZALEA_PLANKS, "杜鹃木木板"); - addBlock(ModBlocks.AZALEA_STAIRS, "杜鹃木楼梯"); - addBlock(ModBlocks.AZALEA_SLAB, "杜鹃木台阶"); - addBlock(ModBlocks.AZALEA_FENCE, "杜鹃木栅栏"); - addBlock(ModBlocks.AZALEA_FENCE_GATE, "杜鹃木栅栏门"); - addBlock(ModBlocks.AZALEA_DOOR, "杜鹃木门"); - addBlock(ModBlocks.AZALEA_TRAPDOOR, "杜鹃木活板门"); - addBlock(ModBlocks.AZALEA_PRESSURE_PLATE, "杜鹃木压力板"); - addBlock(ModBlocks.AZALEA_BUTTON, "杜鹃木按钮"); - - // 其他方块 - addBlock(ModBlocks.SCORCHED_GRASS_BLOCK, "焦灰草方块"); - addBlock(ModBlocks.SCORCHED_DIRT, "焦土"); - addBlock(ModBlocks.SCORCHED_GRASS, "焦灰草丛"); - addBlock(ModBlocks.SCORCHED_TWIG, "焦灰枝条"); - addBlock(ModBlocks.TINY_CACTUS, "仙人球"); - addBlock(ModBlocks.FLETCHING_TABLE, "制箭台"); - addBlock(ModBlocks.AZALEA_SIGN, "杜鹃木告示牌"); - addBlock(ModBlocks.AZALEA_WALL_SIGN, "墙上的杜鹃木告示牌"); - addBlock(ModBlocks.AZALEA_HANGING_SIGN, "悬挂式杜鹃木告示牌"); - addBlock(ModBlocks.AZALEA_WALL_HANGING_SIGN, "墙上的悬挂式杜鹃木告示牌"); - addBlock(ModBlocks.AZALEA_SHELF, "杜鹃木展示架"); - add("item.ww_hfas.tipped_arrow", "延展之箭"); - add("item.ww_hfas.tipped_arrow.effect.reach", "延展之箭"); - add("item.ww_hfas.tipped_arrow.effect.long_reach", "延展之箭"); - add("entity.ww_hfas.arrow", "延展之箭"); - addBlock(ModBlocks.KILN, "窑炉"); - - // GUI - add("container.fletching_table", "制箭台"); - // 属性 - add("attributes.ww_hfas.extra_item_pickup_range", "额外物品拾取距离"); - - // 延展(reach)效果与药水 - add("effect.ww_hfas.reach", "延展"); - add("item.minecraft.potion.effect.reach", "延展药水"); - add("item.minecraft.splash_potion.effect.reach", "喷溅型延展药水"); - add("item.minecraft.lingering_potion.effect.reach", "滞留型延展药水"); - add("item.minecraft.tipped_arrow.effect.reach", "延展之箭"); - add("item.minecraft.potion.effect.long_reach", "延展药水"); - add("item.minecraft.splash_potion.effect.long_reach", "喷溅型延展药水"); - add("item.minecraft.lingering_potion.effect.long_reach", "滞留型延展药水"); - add("item.minecraft.tipped_arrow.effect.long_reach", "延展之箭"); - - // 恐鱼音效字幕 - add("subtitles.entity.piranha.attack", "恐鱼袭击"); - add("subtitles.entity.piranha.death", "恐鱼死亡"); - - //创造模式物品栏 - add("mod.wild_wind.name", "原野之风"); - - ZhEnCombineLangProvider.addLang(this, "zh_cn"); - - } - - -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java b/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java deleted file mode 100644 index d6e2634..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/datagen/provider/loot/BlockLoot.java +++ /dev/null @@ -1,91 +0,0 @@ -package org.polaris2023.wildwind.hfas.datagen.provider.loot; - -import net.minecraft.core.HolderLookup; -import net.minecraft.data.loot.BlockLootSubProvider; -import net.minecraft.world.flag.FeatureFlags; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.Block; -import org.jspecify.annotations.NonNull; -import org.polaris2023.wildwind.hfas.block.ModBlocks; - -import java.util.Set; - -public class BlockLoot extends BlockLootSubProvider { - public BlockLoot(HolderLookup.Provider registries) { - super(Set.of(), FeatureFlags.DEFAULT_FLAGS, registries); - } - - @Override - protected @NonNull Iterable getKnownBlocks() { - return ModBlocks.BLOCKS.getEntries().stream().map(h -> (Block) h.value()).toList(); - } - - @Override - protected void generate() { - // 焚烬木套件 - dropSelf(ModBlocks.BLAZE_LOG.get()); - dropSelf(ModBlocks.BLAZE_WOOD.get()); - dropSelf(ModBlocks.STRIPPED_BLAZE_LOG.get()); - dropSelf(ModBlocks.STRIPPED_BLAZE_WOOD.get()); - dropSelf(ModBlocks.BLAZE_PLANKS.get()); - dropSelf(ModBlocks.BLAZE_STAIRS.get()); - dropSelf(ModBlocks.BLAZE_SLAB.get()); - dropSelf(ModBlocks.BLAZE_FENCE.get()); - dropSelf(ModBlocks.BLAZE_FENCE_GATE.get()); - dropSelf(ModBlocks.BLAZE_PRESSURE_PLATE.get()); - dropSelf(ModBlocks.BLAZE_BUTTON.get()); - // 树叶 - 使用树叶掉落逻辑 - add(ModBlocks.BLAZE_LEAVES.get(), createLeavesDrops(ModBlocks.BLAZE_LEAVES.get(), ModBlocks.BLAZE_SAPLING.get(), 0.05F)); - dropSelf(ModBlocks.BLAZE_SAPLING.get()); - // 门需要特殊处理 - add(ModBlocks.BLAZE_DOOR.get(), createDoorTable(ModBlocks.BLAZE_DOOR.get())); - dropSelf(ModBlocks.BLAZE_TRAPDOOR.get()); - - // 灵焰木套件 - dropSelf(ModBlocks.SOUL_LOG.get()); - dropSelf(ModBlocks.SOUL_WOOD.get()); - dropSelf(ModBlocks.STRIPPED_SOUL_LOG.get()); - dropSelf(ModBlocks.STRIPPED_SOUL_WOOD.get()); - dropSelf(ModBlocks.SOUL_PLANKS.get()); - dropSelf(ModBlocks.SOUL_STAIRS.get()); - dropSelf(ModBlocks.SOUL_SLAB.get()); - dropSelf(ModBlocks.SOUL_FENCE.get()); - dropSelf(ModBlocks.SOUL_FENCE_GATE.get()); - dropSelf(ModBlocks.SOUL_PRESSURE_PLATE.get()); - dropSelf(ModBlocks.SOUL_BUTTON.get()); - // 树叶 - 使用树叶掉落逻辑 - add(ModBlocks.SOUL_LEAVES.get(), createLeavesDrops(ModBlocks.SOUL_LEAVES.get(), ModBlocks.SOUL_SAPLING.get(), 0.05F)); - dropSelf(ModBlocks.SOUL_SAPLING.get()); - // 门需要特殊处理 - add(ModBlocks.SOUL_DOOR.get(), createDoorTable(ModBlocks.SOUL_DOOR.get())); - dropSelf(ModBlocks.SOUL_TRAPDOOR.get()); - - dropSelf(ModBlocks.AZALEA_SIGN.get()); - dropSelf(ModBlocks.AZALEA_HANGING_SIGN.get()); - dropSelf(ModBlocks.AZALEA_SHELF.get()); - // 杜鹃木套件 - dropSelf(ModBlocks.AZALEA_LOG.get()); - dropSelf(ModBlocks.AZALEA_WOOD.get()); - dropSelf(ModBlocks.STRIPPED_AZALEA_LOG.get()); - dropSelf(ModBlocks.STRIPPED_AZALEA_WOOD.get()); - dropSelf(ModBlocks.AZALEA_PLANKS.get()); - dropSelf(ModBlocks.AZALEA_STAIRS.get()); - dropSelf(ModBlocks.AZALEA_SLAB.get()); - dropSelf(ModBlocks.AZALEA_FENCE.get()); - dropSelf(ModBlocks.AZALEA_FENCE_GATE.get()); - dropSelf(ModBlocks.AZALEA_PRESSURE_PLATE.get()); - dropSelf(ModBlocks.AZALEA_BUTTON.get()); - // 门需要特殊处理 - add(ModBlocks.AZALEA_DOOR.get(), createDoorTable(ModBlocks.AZALEA_DOOR.get())); - dropSelf(ModBlocks.AZALEA_TRAPDOOR.get()); - - // 其他方块 - dropSelf(ModBlocks.SCORCHED_GRASS_BLOCK.get()); - dropSelf(ModBlocks.SCORCHED_DIRT.get()); - dropSelf(ModBlocks.SCORCHED_GRASS.get()); - dropSelf(ModBlocks.SCORCHED_TWIG.get()); - dropSelf(ModBlocks.TINY_CACTUS.get()); - dropOther(ModBlocks.FLETCHING_TABLE.get(), Items.FLETCHING_TABLE); - add(ModBlocks.KILN.get(), createNameableBlockEntityTable(ModBlocks.KILN.get())); - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/FletchingTableReplaceHandler.java b/src/hfas/java/org/polaris2023/wildwind/hfas/event/FletchingTableReplaceHandler.java deleted file mode 100644 index b397c17..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/event/FletchingTableReplaceHandler.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.polaris2023.wildwind.hfas.event; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.Property; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.phys.AABB; -import net.neoforged.bus.api.EventPriority; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.level.BlockEvent; -import net.neoforged.neoforge.event.level.ChunkDataEvent; -import net.neoforged.neoforge.event.level.ChunkEvent; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.config.ModCommonConfig; - -/** - * 世界生成事件处理器 - * 用于替换结构内的原版制箭台为模组制箭台 - * - * @author baka4n - * @since 2026/04/15 - */ -@EventBusSubscriber(modid = HFASMod.MOD_ID) -public class FletchingTableReplaceHandler { - - /** - * 方块放置事件 - 处理所有制箭台放置 - * 包括结构生成、玩家放置等 - */ - @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onBlockPlace(BlockEvent.EntityPlaceEvent event) { - if (!ModCommonConfig.shouldReplaceVanillaFletchingTable()) { - return; - } - - BlockState placedState = event.getPlacedBlock(); - - if (placedState.getBlock() == Blocks.FLETCHING_TABLE) { - LevelAccessor levelAccessor = event.getLevel(); - - if (levelAccessor instanceof Level level && !level.isClientSide()) { - BlockPos pos = event.getPos(); - // 取消原事件并设置模组制箭台 - event.setCanceled(true); - level.setBlock(pos, ModBlocks.FLETCHING_TABLE.get().defaultBlockState(), 3); - } - } - } - - /** - * 区块加载事件 - 替换区块内的原版制箭台 - */ - @SuppressWarnings({"unchecked", "rawtypes"}) - @SubscribeEvent(priority = EventPriority.HIGHEST) - public static void onChunkLoad(ChunkEvent.Load event) { - if (!ModCommonConfig.shouldReplaceVanillaFletchingTable()) { - return; - } - - LevelChunk chunk = event.getChunk(); - LevelAccessor level = event.getLevel(); - - if (!level.isClientSide()) { - BlockPos.betweenClosedStream(new AABB( - chunk.getPos().getMinBlockX(), level.getMinY(), chunk.getPos().getMinBlockZ(), - chunk.getPos().getMaxBlockX(), 200, chunk.getPos().getMaxBlockZ() - )).forEach(pos -> { - BlockState state = chunk.getBlockState(pos); - if (state.is(Blocks.FLETCHING_TABLE)) { - BlockState returnState = ModBlocks.FLETCHING_TABLE.get().defaultBlockState(); - state.getValues().forEach(v -> { - Property property = v.property(); - Comparable value = v.value(); - returnState.setValue(property, value); - }); - chunk.setBlockState(pos, returnState); - } - }); - - } - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/FuelHandler.java b/src/hfas/java/org/polaris2023/wildwind/hfas/event/FuelHandler.java deleted file mode 100644 index 38bf6ef..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/event/FuelHandler.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.polaris2023.wildwind.hfas.event; - -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.EventBusSubscriber; -import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; -import net.neoforged.neoforge.event.furnace.FurnaceFuelBurnTimeEvent; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; - -/** - * 燃料事件处理器 - * 为木质方块添加燃料功能 - * - * @author baka4n - * @since 2026/04/15 - */ -@EventBusSubscriber(modid = HFASMod.MOD_ID) -public class FuelHandler { - - /** - * 燃料燃烧时间事件 - * 木质方块可作为燃料,燃烧300 tick(与原版木板相同) - */ - @SubscribeEvent - public static void onFuelBurnTime(FurnaceFuelBurnTimeEvent event) { - Item item = event.getItemStack().getItem(); - - // 检查是否是木质方块物品 - int burnTime = getWoodBurnTime(item); - if (burnTime > 0) { - event.setBurnTime(burnTime); - } - } - - /** - * 获取木质方块的燃烧时间 - */ - private static int getWoodBurnTime(Item item) { - if (item == ModBlocks.AZALEA_SIGN.get().asItem()) return 200; - if (item == ModBlocks.AZALEA_HANGING_SIGN.get().asItem()) return 800; - if (item == ModBlocks.AZALEA_SHELF.get().asItem()) return 300; - // 焚烬木 - 300 tick(15秒) - if (isBlazeWoodItem(item)) return 300; - // 灵焰木 - 300 tick - if (isSoulWoodItem(item)) return 300; - // 杜鹃木 - 300 tick - if (isAzaleaWoodItem(item)) return 300; - - return 0; - } - - private static boolean isBlazeWoodItem(Item item) { - return item == ModBlocks.BLAZE_LOG.get().asItem() - || item == ModBlocks.BLAZE_WOOD.get().asItem() - || item == ModBlocks.STRIPPED_BLAZE_LOG.get().asItem() - || item == ModBlocks.STRIPPED_BLAZE_WOOD.get().asItem() - || item == ModBlocks.BLAZE_PLANKS.get().asItem() - || item == ModBlocks.BLAZE_SLAB.get().asItem() - || item == ModBlocks.BLAZE_FENCE.get().asItem() - || item == ModBlocks.BLAZE_FENCE_GATE.get().asItem(); - } - - private static boolean isSoulWoodItem(Item item) { - return item == ModBlocks.SOUL_LOG.get().asItem() - || item == ModBlocks.SOUL_WOOD.get().asItem() - || item == ModBlocks.STRIPPED_SOUL_LOG.get().asItem() - || item == ModBlocks.STRIPPED_SOUL_WOOD.get().asItem() - || item == ModBlocks.SOUL_PLANKS.get().asItem() - || item == ModBlocks.SOUL_SLAB.get().asItem() - || item == ModBlocks.SOUL_FENCE.get().asItem() - || item == ModBlocks.SOUL_FENCE_GATE.get().asItem(); - } - - private static boolean isAzaleaWoodItem(Item item) { - return item == ModBlocks.AZALEA_LOG.get().asItem() - || item == ModBlocks.AZALEA_WOOD.get().asItem() - || item == ModBlocks.STRIPPED_AZALEA_LOG.get().asItem() - || item == ModBlocks.STRIPPED_AZALEA_WOOD.get().asItem() - || item == ModBlocks.AZALEA_PLANKS.get().asItem() - || item == ModBlocks.AZALEA_SLAB.get().asItem() - || item == ModBlocks.AZALEA_FENCE.get().asItem() - || item == ModBlocks.AZALEA_FENCE_GATE.get().asItem(); - } -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/menu/FletchingTableMenu.java b/src/hfas/java/org/polaris2023/wildwind/hfas/menu/FletchingTableMenu.java deleted file mode 100644 index 29f4e81..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/menu/FletchingTableMenu.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.polaris2023.wildwind.hfas.menu; - -import net.minecraft.world.Container; -import net.minecraft.world.SimpleContainer; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ContainerLevelAccess; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.block.entity.FletchingTableBlockEntity; - -import javax.annotation.Nullable; -import java.util.Optional; - -/** - * 制箭台菜单 - * - * @author baka4n - * @since 2026/04/15 - */ -public class FletchingTableMenu extends AbstractContainerMenu { - private final Container container; - private final ContainerLevelAccess access; - - public FletchingTableMenu(int containerId, Inventory playerInventory) { - this(containerId, playerInventory, new SimpleContainer(4), ContainerLevelAccess.NULL); - } - - public FletchingTableMenu(int containerId, Inventory playerInventory, Container container, ContainerLevelAccess access) { - super(ModMenus.FLETCHING_TABLE.get(), containerId); - this.container = container; - this.access = access; - - // 箭羽槽 (slot 0) - this.addSlot(FletchingTableBlockEntity.Slots.SLOT_FLETCHING.toSlot(container, 26, 18)); - // 箭杆槽 (slot 1) - this.addSlot(FletchingTableBlockEntity.Slots.SLOT_SHAFT.toSlot(container, 62, 18)); - // 箭头槽 (slot 2) - this.addSlot( FletchingTableBlockEntity.Slots.SLOT_HEAD.toSlot(container, 98, 18)); - // 燃料槽口(slot 3) - this.addSlot(FletchingTableBlockEntity.Slots.SLOT_FUEL.toSlot(container, 62, 68)); - // 输出槽 (slot 4) - this.addSlot(this.addSlot(FletchingTableBlockEntity.Slots.SLOT_RESULT.toSlot(container, 134, 18))); - - // 添加玩家物品栏 - for (int row = 0; row < 3; ++row) { - for (int col = 0; col < 9; ++col) { - this.addSlot(new Slot(playerInventory, col + row * 9 + 9, 8 + col * 18, 50 + row * 18)); - } - } - - // 添加玩家快捷栏 - for (int col = 0; col < 9; ++col) { - this.addSlot(new Slot(playerInventory, col, 8 + col * 18, 108)); - } - } - - /** - * 输出槽 - 不能放入物品,取出时消耗材料 - */ - private class ResultSlot extends Slot { - public ResultSlot(Container container, int slot, int x, int y) { - super(container, slot, x, y); - } - - @Override - public boolean mayPlace(ItemStack stack) { - return false; - } - - @Override - public void onTake(Player player, ItemStack stack) { - // 消耗输入材料 -// container.removeItem(FletchingTableBlockEntity.SLOT_FLETCHING, 1); -// container.removeItem(FletchingTableBlockEntity.SLOT_SHAFT, 1); -// container.removeItem(FletchingTableBlockEntity.SLOT_HEAD, 1); - super.onTake(player, stack); - } - } - - @Override - public ItemStack quickMoveStack(Player player, int index) { - ItemStack itemStack = ItemStack.EMPTY; - Slot slot = this.slots.get(index); - - if (slot != null && slot.hasItem()) { - ItemStack slotItem = slot.getItem(); - itemStack = slotItem.copy(); - - // 输出槽 (index 3) - if (index == 3) { - if (!this.moveItemStackTo(slotItem, 4, this.slots.size(), true)) { - return ItemStack.EMPTY; - } - slot.onTake(player, slotItem); - } - // 输入槽 (index 0-2) - else if (index >= 0 && index < 3) { - if (!this.moveItemStackTo(slotItem, 4, this.slots.size(), true)) { - return ItemStack.EMPTY; - } - } - // 玩家物品栏 - else { - // 尝试放入输入槽 - if (!this.moveItemStackTo(slotItem, 0, 3, false)) { - return ItemStack.EMPTY; - } - } - - if (slotItem.isEmpty()) { - slot.set(ItemStack.EMPTY); - } else { - slot.setChanged(); - } - } - - return itemStack; - } - - @Override - public boolean stillValid(Player player) { - return stillValid(this.access, player, ModBlocks.FLETCHING_TABLE.get()); - } - -} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModTreeGrowers.java b/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModTreeGrowers.java deleted file mode 100644 index 034c406..0000000 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/worldgen/ModTreeGrowers.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.polaris2023.wildwind.hfas.worldgen; - -import net.minecraft.resources.ResourceKey; -import net.minecraft.world.level.block.grower.TreeGrower; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import org.polaris2023.wildwind.hfas.HFASMod; - -import java.util.Optional; - -/** - * 树木生长器注册 - * - * @author baka4n - * @since 2026/04/15 - */ -public class ModTreeGrowers { - - // 焚烬木树苗生长器 - public static final TreeGrower BLAZE = new TreeGrower( - "blaze", - Optional.empty(), - Optional.of(ModConfiguredFeatures.BLAZE_TREE_KEY), - Optional.empty() - ); - - // 灵焰木树苗生长器 - public static final TreeGrower SOUL = new TreeGrower( - "soul", - Optional.empty(), - Optional.of(ModConfiguredFeatures.SOUL_TREE_KEY), - Optional.empty() - ); - - // 杜鹃木树苗生长器 - public static final TreeGrower AZALEA = new TreeGrower( - "azalea", - Optional.empty(), - Optional.of(ModConfiguredFeatures.AZALEA_TREE_KEY), - Optional.empty() - ); -} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_hanging_sign.json deleted file mode 100644 index 0f047ad..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_hanging_sign.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "variants": { - "attached=false,rotation=0": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_0" - }, - "attached=false,rotation=1": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_1" - }, - "attached=false,rotation=10": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_2", - "y": 180 - }, - "attached=false,rotation=11": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_3", - "y": 180 - }, - "attached=false,rotation=12": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_0", - "y": 270 - }, - "attached=false,rotation=13": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_1", - "y": 270 - }, - "attached=false,rotation=14": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_2", - "y": 270 - }, - "attached=false,rotation=15": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_3", - "y": 270 - }, - "attached=false,rotation=2": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_2" - }, - "attached=false,rotation=3": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_3" - }, - "attached=false,rotation=4": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_0", - "y": 90 - }, - "attached=false,rotation=5": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_1", - "y": 90 - }, - "attached=false,rotation=6": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_2", - "y": 90 - }, - "attached=false,rotation=7": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_3", - "y": 90 - }, - "attached=false,rotation=8": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_0", - "y": 180 - }, - "attached=false,rotation=9": { - "model": "ww_hfas:block/azalea_hanging_sign_rot_1", - "y": 180 - }, - "attached=true,rotation=0": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_0" - }, - "attached=true,rotation=1": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_1" - }, - "attached=true,rotation=10": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_2", - "y": 180 - }, - "attached=true,rotation=11": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_3", - "y": 180 - }, - "attached=true,rotation=12": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_0", - "y": 270 - }, - "attached=true,rotation=13": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_1", - "y": 270 - }, - "attached=true,rotation=14": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_2", - "y": 270 - }, - "attached=true,rotation=15": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_3", - "y": 270 - }, - "attached=true,rotation=2": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_2" - }, - "attached=true,rotation=3": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_3" - }, - "attached=true,rotation=4": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_0", - "y": 90 - }, - "attached=true,rotation=5": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_1", - "y": 90 - }, - "attached=true,rotation=6": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_2", - "y": 90 - }, - "attached=true,rotation=7": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_3", - "y": 90 - }, - "attached=true,rotation=8": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_0", - "y": 180 - }, - "attached=true,rotation=9": { - "model": "ww_hfas:block/azalea_hanging_sign_attached_rot_1", - "y": 180 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_log.json deleted file mode 100644 index b5fcbcc..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_log.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/azalea_log_horizontal", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/azalea_log" - }, - "axis=z": { - "model": "ww_hfas:block/azalea_log_horizontal", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_planks.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_planks.json deleted file mode 100644 index 7faecf5..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_planks.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/azalea_planks" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_pressure_plate.json deleted file mode 100644 index 145f530..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_pressure_plate.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "powered=false": { - "model": "ww_hfas:block/azalea_pressure_plate" - }, - "powered=true": { - "model": "ww_hfas:block/azalea_pressure_plate_down" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_sign.json deleted file mode 100644 index cae3261..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_sign.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "variants": { - "rotation=0": { - "model": "ww_hfas:block/azalea_sign_rot_0" - }, - "rotation=1": { - "model": "ww_hfas:block/azalea_sign_rot_1" - }, - "rotation=10": { - "model": "ww_hfas:block/azalea_sign_rot_2", - "y": 180 - }, - "rotation=11": { - "model": "ww_hfas:block/azalea_sign_rot_3", - "y": 180 - }, - "rotation=12": { - "model": "ww_hfas:block/azalea_sign_rot_0", - "y": 270 - }, - "rotation=13": { - "model": "ww_hfas:block/azalea_sign_rot_1", - "y": 270 - }, - "rotation=14": { - "model": "ww_hfas:block/azalea_sign_rot_2", - "y": 270 - }, - "rotation=15": { - "model": "ww_hfas:block/azalea_sign_rot_3", - "y": 270 - }, - "rotation=2": { - "model": "ww_hfas:block/azalea_sign_rot_2" - }, - "rotation=3": { - "model": "ww_hfas:block/azalea_sign_rot_3" - }, - "rotation=4": { - "model": "ww_hfas:block/azalea_sign_rot_0", - "y": 90 - }, - "rotation=5": { - "model": "ww_hfas:block/azalea_sign_rot_1", - "y": 90 - }, - "rotation=6": { - "model": "ww_hfas:block/azalea_sign_rot_2", - "y": 90 - }, - "rotation=7": { - "model": "ww_hfas:block/azalea_sign_rot_3", - "y": 90 - }, - "rotation=8": { - "model": "ww_hfas:block/azalea_sign_rot_0", - "y": 180 - }, - "rotation=9": { - "model": "ww_hfas:block/azalea_sign_rot_1", - "y": 180 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_slab.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_slab.json deleted file mode 100644 index 0a70f39..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_slab.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "variants": { - "type=bottom": { - "model": "ww_hfas:block/azalea_slab" - }, - "type=double": { - "model": "ww_hfas:block/azalea_planks" - }, - "type=top": { - "model": "ww_hfas:block/azalea_slab_top" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_trapdoor.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_trapdoor.json deleted file mode 100644 index 77e04b6..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_trapdoor.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "variants": { - "facing=east,half=bottom,open=false": { - "model": "ww_hfas:block/azalea_trapdoor_bottom", - "y": 90 - }, - "facing=east,half=bottom,open=true": { - "model": "ww_hfas:block/azalea_trapdoor_open", - "y": 90 - }, - "facing=east,half=top,open=false": { - "model": "ww_hfas:block/azalea_trapdoor_top", - "y": 90 - }, - "facing=east,half=top,open=true": { - "model": "ww_hfas:block/azalea_trapdoor_open", - "x": 180, - "y": 270 - }, - "facing=north,half=bottom,open=false": { - "model": "ww_hfas:block/azalea_trapdoor_bottom" - }, - "facing=north,half=bottom,open=true": { - "model": "ww_hfas:block/azalea_trapdoor_open" - }, - "facing=north,half=top,open=false": { - "model": "ww_hfas:block/azalea_trapdoor_top" - }, - "facing=north,half=top,open=true": { - "model": "ww_hfas:block/azalea_trapdoor_open", - "x": 180, - "y": 180 - }, - "facing=south,half=bottom,open=false": { - "model": "ww_hfas:block/azalea_trapdoor_bottom", - "y": 180 - }, - "facing=south,half=bottom,open=true": { - "model": "ww_hfas:block/azalea_trapdoor_open", - "y": 180 - }, - "facing=south,half=top,open=false": { - "model": "ww_hfas:block/azalea_trapdoor_top", - "y": 180 - }, - "facing=south,half=top,open=true": { - "model": "ww_hfas:block/azalea_trapdoor_open", - "x": 180 - }, - "facing=west,half=bottom,open=false": { - "model": "ww_hfas:block/azalea_trapdoor_bottom", - "y": 270 - }, - "facing=west,half=bottom,open=true": { - "model": "ww_hfas:block/azalea_trapdoor_open", - "y": 270 - }, - "facing=west,half=top,open=false": { - "model": "ww_hfas:block/azalea_trapdoor_top", - "y": 270 - }, - "facing=west,half=top,open=true": { - "model": "ww_hfas:block/azalea_trapdoor_open", - "x": 180, - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_hanging_sign.json deleted file mode 100644 index 096969a..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_hanging_sign.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "ww_hfas:block/azalea_wall_hanging_sign", - "y": 270 - }, - "facing=north": { - "model": "ww_hfas:block/azalea_wall_hanging_sign", - "y": 180 - }, - "facing=south": { - "model": "ww_hfas:block/azalea_wall_hanging_sign" - }, - "facing=west": { - "model": "ww_hfas:block/azalea_wall_hanging_sign", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_sign.json deleted file mode 100644 index 0a82a3e..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wall_sign.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "ww_hfas:block/azalea_wall_sign", - "y": 270 - }, - "facing=north": { - "model": "ww_hfas:block/azalea_wall_sign", - "y": 180 - }, - "facing=south": { - "model": "ww_hfas:block/azalea_wall_sign" - }, - "facing=west": { - "model": "ww_hfas:block/azalea_wall_sign", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wood.json deleted file mode 100644 index 9afc39e..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/azalea_wood.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/azalea_wood", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/azalea_wood" - }, - "axis=z": { - "model": "ww_hfas:block/azalea_wood", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_hanging_sign.json deleted file mode 100644 index 7838ce6..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_hanging_sign.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "variants": { - "attached=false,rotation=0": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_0" - }, - "attached=false,rotation=1": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_1" - }, - "attached=false,rotation=10": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_2", - "y": 180 - }, - "attached=false,rotation=11": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_3", - "y": 180 - }, - "attached=false,rotation=12": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_0", - "y": 270 - }, - "attached=false,rotation=13": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_1", - "y": 270 - }, - "attached=false,rotation=14": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_2", - "y": 270 - }, - "attached=false,rotation=15": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_3", - "y": 270 - }, - "attached=false,rotation=2": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_2" - }, - "attached=false,rotation=3": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_3" - }, - "attached=false,rotation=4": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_0", - "y": 90 - }, - "attached=false,rotation=5": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_1", - "y": 90 - }, - "attached=false,rotation=6": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_2", - "y": 90 - }, - "attached=false,rotation=7": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_3", - "y": 90 - }, - "attached=false,rotation=8": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_0", - "y": 180 - }, - "attached=false,rotation=9": { - "model": "ww_hfas:block/blaze_hanging_sign_rot_1", - "y": 180 - }, - "attached=true,rotation=0": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_0" - }, - "attached=true,rotation=1": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_1" - }, - "attached=true,rotation=10": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_2", - "y": 180 - }, - "attached=true,rotation=11": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_3", - "y": 180 - }, - "attached=true,rotation=12": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_0", - "y": 270 - }, - "attached=true,rotation=13": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_1", - "y": 270 - }, - "attached=true,rotation=14": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_2", - "y": 270 - }, - "attached=true,rotation=15": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_3", - "y": 270 - }, - "attached=true,rotation=2": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_2" - }, - "attached=true,rotation=3": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_3" - }, - "attached=true,rotation=4": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_0", - "y": 90 - }, - "attached=true,rotation=5": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_1", - "y": 90 - }, - "attached=true,rotation=6": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_2", - "y": 90 - }, - "attached=true,rotation=7": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_3", - "y": 90 - }, - "attached=true,rotation=8": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_0", - "y": 180 - }, - "attached=true,rotation=9": { - "model": "ww_hfas:block/blaze_hanging_sign_attached_rot_1", - "y": 180 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_leaves.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_leaves.json deleted file mode 100644 index c08f648..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_leaves.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/blaze_leaves" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_log.json deleted file mode 100644 index f098e76..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_log.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/blaze_log_horizontal", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/blaze_log" - }, - "axis=z": { - "model": "ww_hfas:block/blaze_log_horizontal", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_planks.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_planks.json deleted file mode 100644 index d4467a3..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_planks.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/blaze_planks" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_pressure_plate.json deleted file mode 100644 index 16d2853..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_pressure_plate.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "powered=false": { - "model": "ww_hfas:block/blaze_pressure_plate" - }, - "powered=true": { - "model": "ww_hfas:block/blaze_pressure_plate_down" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sapling.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sapling.json deleted file mode 100644 index fc98d7d..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sapling.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/blaze_sapling" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sign.json deleted file mode 100644 index 1810e9a..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_sign.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "variants": { - "rotation=0": { - "model": "ww_hfas:block/blaze_sign_rot_0" - }, - "rotation=1": { - "model": "ww_hfas:block/blaze_sign_rot_1" - }, - "rotation=10": { - "model": "ww_hfas:block/blaze_sign_rot_2", - "y": 180 - }, - "rotation=11": { - "model": "ww_hfas:block/blaze_sign_rot_3", - "y": 180 - }, - "rotation=12": { - "model": "ww_hfas:block/blaze_sign_rot_0", - "y": 270 - }, - "rotation=13": { - "model": "ww_hfas:block/blaze_sign_rot_1", - "y": 270 - }, - "rotation=14": { - "model": "ww_hfas:block/blaze_sign_rot_2", - "y": 270 - }, - "rotation=15": { - "model": "ww_hfas:block/blaze_sign_rot_3", - "y": 270 - }, - "rotation=2": { - "model": "ww_hfas:block/blaze_sign_rot_2" - }, - "rotation=3": { - "model": "ww_hfas:block/blaze_sign_rot_3" - }, - "rotation=4": { - "model": "ww_hfas:block/blaze_sign_rot_0", - "y": 90 - }, - "rotation=5": { - "model": "ww_hfas:block/blaze_sign_rot_1", - "y": 90 - }, - "rotation=6": { - "model": "ww_hfas:block/blaze_sign_rot_2", - "y": 90 - }, - "rotation=7": { - "model": "ww_hfas:block/blaze_sign_rot_3", - "y": 90 - }, - "rotation=8": { - "model": "ww_hfas:block/blaze_sign_rot_0", - "y": 180 - }, - "rotation=9": { - "model": "ww_hfas:block/blaze_sign_rot_1", - "y": 180 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_slab.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_slab.json deleted file mode 100644 index 3f9f5a7..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_slab.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "variants": { - "type=bottom": { - "model": "ww_hfas:block/blaze_slab" - }, - "type=double": { - "model": "ww_hfas:block/blaze_planks" - }, - "type=top": { - "model": "ww_hfas:block/blaze_slab_top" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_trapdoor.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_trapdoor.json deleted file mode 100644 index f7fa982..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_trapdoor.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "variants": { - "facing=east,half=bottom,open=false": { - "model": "ww_hfas:block/blaze_trapdoor_bottom", - "y": 90 - }, - "facing=east,half=bottom,open=true": { - "model": "ww_hfas:block/blaze_trapdoor_open", - "y": 90 - }, - "facing=east,half=top,open=false": { - "model": "ww_hfas:block/blaze_trapdoor_top", - "y": 90 - }, - "facing=east,half=top,open=true": { - "model": "ww_hfas:block/blaze_trapdoor_open", - "x": 180, - "y": 270 - }, - "facing=north,half=bottom,open=false": { - "model": "ww_hfas:block/blaze_trapdoor_bottom" - }, - "facing=north,half=bottom,open=true": { - "model": "ww_hfas:block/blaze_trapdoor_open" - }, - "facing=north,half=top,open=false": { - "model": "ww_hfas:block/blaze_trapdoor_top" - }, - "facing=north,half=top,open=true": { - "model": "ww_hfas:block/blaze_trapdoor_open", - "x": 180, - "y": 180 - }, - "facing=south,half=bottom,open=false": { - "model": "ww_hfas:block/blaze_trapdoor_bottom", - "y": 180 - }, - "facing=south,half=bottom,open=true": { - "model": "ww_hfas:block/blaze_trapdoor_open", - "y": 180 - }, - "facing=south,half=top,open=false": { - "model": "ww_hfas:block/blaze_trapdoor_top", - "y": 180 - }, - "facing=south,half=top,open=true": { - "model": "ww_hfas:block/blaze_trapdoor_open", - "x": 180 - }, - "facing=west,half=bottom,open=false": { - "model": "ww_hfas:block/blaze_trapdoor_bottom", - "y": 270 - }, - "facing=west,half=bottom,open=true": { - "model": "ww_hfas:block/blaze_trapdoor_open", - "y": 270 - }, - "facing=west,half=top,open=false": { - "model": "ww_hfas:block/blaze_trapdoor_top", - "y": 270 - }, - "facing=west,half=top,open=true": { - "model": "ww_hfas:block/blaze_trapdoor_open", - "x": 180, - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_hanging_sign.json deleted file mode 100644 index 2c625f8..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_hanging_sign.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "ww_hfas:block/blaze_wall_hanging_sign", - "y": 270 - }, - "facing=north": { - "model": "ww_hfas:block/blaze_wall_hanging_sign", - "y": 180 - }, - "facing=south": { - "model": "ww_hfas:block/blaze_wall_hanging_sign" - }, - "facing=west": { - "model": "ww_hfas:block/blaze_wall_hanging_sign", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_sign.json deleted file mode 100644 index 575e827..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wall_sign.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "ww_hfas:block/blaze_wall_sign", - "y": 270 - }, - "facing=north": { - "model": "ww_hfas:block/blaze_wall_sign", - "y": 180 - }, - "facing=south": { - "model": "ww_hfas:block/blaze_wall_sign" - }, - "facing=west": { - "model": "ww_hfas:block/blaze_wall_sign", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wood.json deleted file mode 100644 index 426d363..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_wood.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/blaze_wood", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/blaze_wood" - }, - "axis=z": { - "model": "ww_hfas:block/blaze_wood", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/fletching_table.json b/src/hfas/resources/assets/ww_hfas/blockstates/fletching_table.json deleted file mode 100644 index 57bec1b..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/fletching_table.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/fletching_table" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/potted_blaze_sapling.json b/src/hfas/resources/assets/ww_hfas/blockstates/potted_blaze_sapling.json deleted file mode 100644 index 93cd762..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/potted_blaze_sapling.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/potted_blaze_sapling" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/potted_soul_sapling.json b/src/hfas/resources/assets/ww_hfas/blockstates/potted_soul_sapling.json deleted file mode 100644 index 9758a01..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/potted_soul_sapling.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/potted_soul_sapling" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_dirt.json b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_dirt.json deleted file mode 100644 index ebc4431..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_dirt.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/scorched_dirt" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass.json b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass.json deleted file mode 100644 index b8d0ce6..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/scorched_grass" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass_block.json b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass_block.json deleted file mode 100644 index 88f605f..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_grass_block.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/scorched_grass_block" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_twig.json b/src/hfas/resources/assets/ww_hfas/blockstates/scorched_twig.json deleted file mode 100644 index 8aa3f44..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/scorched_twig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/scorched_twig" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_hanging_sign.json deleted file mode 100644 index df51ca3..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_hanging_sign.json +++ /dev/null @@ -1,124 +0,0 @@ -{ - "variants": { - "attached=false,rotation=0": { - "model": "ww_hfas:block/soul_hanging_sign_rot_0" - }, - "attached=false,rotation=1": { - "model": "ww_hfas:block/soul_hanging_sign_rot_1" - }, - "attached=false,rotation=10": { - "model": "ww_hfas:block/soul_hanging_sign_rot_2", - "y": 180 - }, - "attached=false,rotation=11": { - "model": "ww_hfas:block/soul_hanging_sign_rot_3", - "y": 180 - }, - "attached=false,rotation=12": { - "model": "ww_hfas:block/soul_hanging_sign_rot_0", - "y": 270 - }, - "attached=false,rotation=13": { - "model": "ww_hfas:block/soul_hanging_sign_rot_1", - "y": 270 - }, - "attached=false,rotation=14": { - "model": "ww_hfas:block/soul_hanging_sign_rot_2", - "y": 270 - }, - "attached=false,rotation=15": { - "model": "ww_hfas:block/soul_hanging_sign_rot_3", - "y": 270 - }, - "attached=false,rotation=2": { - "model": "ww_hfas:block/soul_hanging_sign_rot_2" - }, - "attached=false,rotation=3": { - "model": "ww_hfas:block/soul_hanging_sign_rot_3" - }, - "attached=false,rotation=4": { - "model": "ww_hfas:block/soul_hanging_sign_rot_0", - "y": 90 - }, - "attached=false,rotation=5": { - "model": "ww_hfas:block/soul_hanging_sign_rot_1", - "y": 90 - }, - "attached=false,rotation=6": { - "model": "ww_hfas:block/soul_hanging_sign_rot_2", - "y": 90 - }, - "attached=false,rotation=7": { - "model": "ww_hfas:block/soul_hanging_sign_rot_3", - "y": 90 - }, - "attached=false,rotation=8": { - "model": "ww_hfas:block/soul_hanging_sign_rot_0", - "y": 180 - }, - "attached=false,rotation=9": { - "model": "ww_hfas:block/soul_hanging_sign_rot_1", - "y": 180 - }, - "attached=true,rotation=0": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_0" - }, - "attached=true,rotation=1": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_1" - }, - "attached=true,rotation=10": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_2", - "y": 180 - }, - "attached=true,rotation=11": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_3", - "y": 180 - }, - "attached=true,rotation=12": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_0", - "y": 270 - }, - "attached=true,rotation=13": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_1", - "y": 270 - }, - "attached=true,rotation=14": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_2", - "y": 270 - }, - "attached=true,rotation=15": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_3", - "y": 270 - }, - "attached=true,rotation=2": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_2" - }, - "attached=true,rotation=3": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_3" - }, - "attached=true,rotation=4": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_0", - "y": 90 - }, - "attached=true,rotation=5": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_1", - "y": 90 - }, - "attached=true,rotation=6": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_2", - "y": 90 - }, - "attached=true,rotation=7": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_3", - "y": 90 - }, - "attached=true,rotation=8": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_0", - "y": 180 - }, - "attached=true,rotation=9": { - "model": "ww_hfas:block/soul_hanging_sign_attached_rot_1", - "y": 180 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_leaves.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_leaves.json deleted file mode 100644 index 81dba78..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_leaves.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/soul_leaves" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_log.json deleted file mode 100644 index 7af97ce..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_log.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/soul_log_horizontal", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/soul_log" - }, - "axis=z": { - "model": "ww_hfas:block/soul_log_horizontal", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_planks.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_planks.json deleted file mode 100644 index 231d2f8..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_planks.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/soul_planks" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_pressure_plate.json deleted file mode 100644 index 77a7e47..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_pressure_plate.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variants": { - "powered=false": { - "model": "ww_hfas:block/soul_pressure_plate" - }, - "powered=true": { - "model": "ww_hfas:block/soul_pressure_plate_down" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_sapling.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_sapling.json deleted file mode 100644 index e8f258e..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_sapling.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/soul_sapling" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_sign.json deleted file mode 100644 index 9493438..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_sign.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "variants": { - "rotation=0": { - "model": "ww_hfas:block/soul_sign_rot_0" - }, - "rotation=1": { - "model": "ww_hfas:block/soul_sign_rot_1" - }, - "rotation=10": { - "model": "ww_hfas:block/soul_sign_rot_2", - "y": 180 - }, - "rotation=11": { - "model": "ww_hfas:block/soul_sign_rot_3", - "y": 180 - }, - "rotation=12": { - "model": "ww_hfas:block/soul_sign_rot_0", - "y": 270 - }, - "rotation=13": { - "model": "ww_hfas:block/soul_sign_rot_1", - "y": 270 - }, - "rotation=14": { - "model": "ww_hfas:block/soul_sign_rot_2", - "y": 270 - }, - "rotation=15": { - "model": "ww_hfas:block/soul_sign_rot_3", - "y": 270 - }, - "rotation=2": { - "model": "ww_hfas:block/soul_sign_rot_2" - }, - "rotation=3": { - "model": "ww_hfas:block/soul_sign_rot_3" - }, - "rotation=4": { - "model": "ww_hfas:block/soul_sign_rot_0", - "y": 90 - }, - "rotation=5": { - "model": "ww_hfas:block/soul_sign_rot_1", - "y": 90 - }, - "rotation=6": { - "model": "ww_hfas:block/soul_sign_rot_2", - "y": 90 - }, - "rotation=7": { - "model": "ww_hfas:block/soul_sign_rot_3", - "y": 90 - }, - "rotation=8": { - "model": "ww_hfas:block/soul_sign_rot_0", - "y": 180 - }, - "rotation=9": { - "model": "ww_hfas:block/soul_sign_rot_1", - "y": 180 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_slab.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_slab.json deleted file mode 100644 index 0b76191..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_slab.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "variants": { - "type=bottom": { - "model": "ww_hfas:block/soul_slab" - }, - "type=double": { - "model": "ww_hfas:block/soul_planks" - }, - "type=top": { - "model": "ww_hfas:block/soul_slab_top" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_trapdoor.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_trapdoor.json deleted file mode 100644 index 57124ba..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_trapdoor.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "variants": { - "facing=east,half=bottom,open=false": { - "model": "ww_hfas:block/soul_trapdoor_bottom", - "y": 90 - }, - "facing=east,half=bottom,open=true": { - "model": "ww_hfas:block/soul_trapdoor_open", - "y": 90 - }, - "facing=east,half=top,open=false": { - "model": "ww_hfas:block/soul_trapdoor_top", - "y": 90 - }, - "facing=east,half=top,open=true": { - "model": "ww_hfas:block/soul_trapdoor_open", - "x": 180, - "y": 270 - }, - "facing=north,half=bottom,open=false": { - "model": "ww_hfas:block/soul_trapdoor_bottom" - }, - "facing=north,half=bottom,open=true": { - "model": "ww_hfas:block/soul_trapdoor_open" - }, - "facing=north,half=top,open=false": { - "model": "ww_hfas:block/soul_trapdoor_top" - }, - "facing=north,half=top,open=true": { - "model": "ww_hfas:block/soul_trapdoor_open", - "x": 180, - "y": 180 - }, - "facing=south,half=bottom,open=false": { - "model": "ww_hfas:block/soul_trapdoor_bottom", - "y": 180 - }, - "facing=south,half=bottom,open=true": { - "model": "ww_hfas:block/soul_trapdoor_open", - "y": 180 - }, - "facing=south,half=top,open=false": { - "model": "ww_hfas:block/soul_trapdoor_top", - "y": 180 - }, - "facing=south,half=top,open=true": { - "model": "ww_hfas:block/soul_trapdoor_open", - "x": 180 - }, - "facing=west,half=bottom,open=false": { - "model": "ww_hfas:block/soul_trapdoor_bottom", - "y": 270 - }, - "facing=west,half=bottom,open=true": { - "model": "ww_hfas:block/soul_trapdoor_open", - "y": 270 - }, - "facing=west,half=top,open=false": { - "model": "ww_hfas:block/soul_trapdoor_top", - "y": 270 - }, - "facing=west,half=top,open=true": { - "model": "ww_hfas:block/soul_trapdoor_open", - "x": 180, - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_hanging_sign.json deleted file mode 100644 index a46cddd..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_hanging_sign.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "ww_hfas:block/soul_wall_hanging_sign", - "y": 270 - }, - "facing=north": { - "model": "ww_hfas:block/soul_wall_hanging_sign", - "y": 180 - }, - "facing=south": { - "model": "ww_hfas:block/soul_wall_hanging_sign" - }, - "facing=west": { - "model": "ww_hfas:block/soul_wall_hanging_sign", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_sign.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_sign.json deleted file mode 100644 index 01329b6..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_wall_sign.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "variants": { - "facing=east": { - "model": "ww_hfas:block/soul_wall_sign", - "y": 270 - }, - "facing=north": { - "model": "ww_hfas:block/soul_wall_sign", - "y": 180 - }, - "facing=south": { - "model": "ww_hfas:block/soul_wall_sign" - }, - "facing=west": { - "model": "ww_hfas:block/soul_wall_sign", - "y": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/soul_wood.json deleted file mode 100644 index 9738065..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_wood.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/soul_wood", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/soul_wood" - }, - "axis=z": { - "model": "ww_hfas:block/soul_wood", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_log.json deleted file mode 100644 index 2a0c472..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_log.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/stripped_azalea_log_horizontal", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/stripped_azalea_log" - }, - "axis=z": { - "model": "ww_hfas:block/stripped_azalea_log_horizontal", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_wood.json deleted file mode 100644 index b62010e..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_azalea_wood.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/stripped_azalea_wood", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/stripped_azalea_wood" - }, - "axis=z": { - "model": "ww_hfas:block/stripped_azalea_wood", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_log.json deleted file mode 100644 index 04f0e8b..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_log.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/stripped_blaze_log_horizontal", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/stripped_blaze_log" - }, - "axis=z": { - "model": "ww_hfas:block/stripped_blaze_log_horizontal", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_wood.json deleted file mode 100644 index e9182fb..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_blaze_wood.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/stripped_blaze_wood", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/stripped_blaze_wood" - }, - "axis=z": { - "model": "ww_hfas:block/stripped_blaze_wood", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_log.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_log.json deleted file mode 100644 index a640e5d..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_log.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/stripped_soul_log_horizontal", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/stripped_soul_log" - }, - "axis=z": { - "model": "ww_hfas:block/stripped_soul_log_horizontal", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_wood.json b/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_wood.json deleted file mode 100644 index 8af4e7d..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/stripped_soul_wood.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "variants": { - "axis=x": { - "model": "ww_hfas:block/stripped_soul_wood", - "x": 90, - "y": 90 - }, - "axis=y": { - "model": "ww_hfas:block/stripped_soul_wood" - }, - "axis=z": { - "model": "ww_hfas:block/stripped_soul_wood", - "x": 90 - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/tiny_cactus.json b/src/hfas/resources/assets/ww_hfas/blockstates/tiny_cactus.json deleted file mode 100644 index e2e7ed9..0000000 --- a/src/hfas/resources/assets/ww_hfas/blockstates/tiny_cactus.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "ww_hfas:block/tiny_cactus" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_button.json b/src/hfas/resources/assets/ww_hfas/items/azalea_button.json deleted file mode 100644 index f3f2a60..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_button.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_button_inventory" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_chest_boat.json b/src/hfas/resources/assets/ww_hfas/items/azalea_chest_boat.json deleted file mode 100644 index 6a78e74..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_chest_boat.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/azalea_chest_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_door.json b/src/hfas/resources/assets/ww_hfas/items/azalea_door.json deleted file mode 100644 index 55b63a4..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_door.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/azalea_door" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_fence.json b/src/hfas/resources/assets/ww_hfas/items/azalea_fence.json deleted file mode 100644 index 1dce673..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_fence.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_fence_inventory" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_fence_gate.json b/src/hfas/resources/assets/ww_hfas/items/azalea_fence_gate.json deleted file mode 100644 index 7e5582c..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_fence_gate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_fence_gate" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/items/azalea_hanging_sign.json deleted file mode 100644 index d09691e..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_hanging_sign.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/azalea_hanging_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_log.json b/src/hfas/resources/assets/ww_hfas/items/azalea_log.json deleted file mode 100644 index 4ca420c..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_log.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_planks.json b/src/hfas/resources/assets/ww_hfas/items/azalea_planks.json deleted file mode 100644 index 233fb23..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_planks.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/items/azalea_pressure_plate.json deleted file mode 100644 index 5f9d223..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_pressure_plate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_pressure_plate" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_shelf.json b/src/hfas/resources/assets/ww_hfas/items/azalea_shelf.json deleted file mode 100644 index 452fca8..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_shelf.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_shelf_inventory" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_sign.json b/src/hfas/resources/assets/ww_hfas/items/azalea_sign.json deleted file mode 100644 index a8316e2..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_sign.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/azalea_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_slab.json b/src/hfas/resources/assets/ww_hfas/items/azalea_slab.json deleted file mode 100644 index c48b3fb..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_slab.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_slab" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_stairs.json b/src/hfas/resources/assets/ww_hfas/items/azalea_stairs.json deleted file mode 100644 index f767c58..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_stairs.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_stairs" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_trapdoor.json b/src/hfas/resources/assets/ww_hfas/items/azalea_trapdoor.json deleted file mode 100644 index 88e2060..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_trapdoor.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_trapdoor_bottom" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/azalea_wood.json b/src/hfas/resources/assets/ww_hfas/items/azalea_wood.json deleted file mode 100644 index 856a2ec..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/azalea_wood.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/azalea_wood" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_boat.json b/src/hfas/resources/assets/ww_hfas/items/blaze_boat.json deleted file mode 100644 index 086a9ee..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_boat.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/blaze_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_button.json b/src/hfas/resources/assets/ww_hfas/items/blaze_button.json deleted file mode 100644 index 4e4313b..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_button.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_button_inventory" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_chest_boat.json b/src/hfas/resources/assets/ww_hfas/items/blaze_chest_boat.json deleted file mode 100644 index c4c31a8..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_chest_boat.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/blaze_chest_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_door.json b/src/hfas/resources/assets/ww_hfas/items/blaze_door.json deleted file mode 100644 index 4c6a902..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_door.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/blaze_door" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_fence.json b/src/hfas/resources/assets/ww_hfas/items/blaze_fence.json deleted file mode 100644 index 21effa9..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_fence.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_fence_inventory" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_fence_gate.json b/src/hfas/resources/assets/ww_hfas/items/blaze_fence_gate.json deleted file mode 100644 index 8dc0347..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_fence_gate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_fence_gate" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/items/blaze_hanging_sign.json deleted file mode 100644 index bff07a8..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_hanging_sign.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/blaze_hanging_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_log.json b/src/hfas/resources/assets/ww_hfas/items/blaze_log.json deleted file mode 100644 index 34e4433..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_log.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_planks.json b/src/hfas/resources/assets/ww_hfas/items/blaze_planks.json deleted file mode 100644 index 4309700..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_planks.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/items/blaze_pressure_plate.json deleted file mode 100644 index 18debc5..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_pressure_plate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_pressure_plate" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_sapling.json b/src/hfas/resources/assets/ww_hfas/items/blaze_sapling.json deleted file mode 100644 index 3bf4eb0..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_sapling.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/blaze_sapling" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_sign.json b/src/hfas/resources/assets/ww_hfas/items/blaze_sign.json deleted file mode 100644 index 2b44f32..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_sign.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/blaze_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_slab.json b/src/hfas/resources/assets/ww_hfas/items/blaze_slab.json deleted file mode 100644 index 1d050b3..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_slab.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_slab" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_stairs.json b/src/hfas/resources/assets/ww_hfas/items/blaze_stairs.json deleted file mode 100644 index 32fe30d..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_stairs.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_stairs" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_trapdoor.json b/src/hfas/resources/assets/ww_hfas/items/blaze_trapdoor.json deleted file mode 100644 index 792dedd..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_trapdoor.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_trapdoor_bottom" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_wood.json b/src/hfas/resources/assets/ww_hfas/items/blaze_wood.json deleted file mode 100644 index 1b9afe2..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_wood.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/blaze_wood" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/scorched_dirt.json b/src/hfas/resources/assets/ww_hfas/items/scorched_dirt.json deleted file mode 100644 index a5fd716..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/scorched_dirt.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/scorched_dirt" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/scorched_grass.json b/src/hfas/resources/assets/ww_hfas/items/scorched_grass.json deleted file mode 100644 index 8785b18..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/scorched_grass.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/scorched_grass" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/scorched_grass_block.json b/src/hfas/resources/assets/ww_hfas/items/scorched_grass_block.json deleted file mode 100644 index 2405871..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/scorched_grass_block.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/scorched_grass_block" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/scorched_twig.json b/src/hfas/resources/assets/ww_hfas/items/scorched_twig.json deleted file mode 100644 index 5e75abd..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/scorched_twig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/scorched_twig" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_button.json b/src/hfas/resources/assets/ww_hfas/items/soul_button.json deleted file mode 100644 index 89e68d0..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_button.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_button_inventory" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_chest_boat.json b/src/hfas/resources/assets/ww_hfas/items/soul_chest_boat.json deleted file mode 100644 index 1b6d6e9..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_chest_boat.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/soul_chest_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_door.json b/src/hfas/resources/assets/ww_hfas/items/soul_door.json deleted file mode 100644 index 61bd3cb..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_door.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/soul_door" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_fence.json b/src/hfas/resources/assets/ww_hfas/items/soul_fence.json deleted file mode 100644 index 75148db..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_fence.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_fence_inventory" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_fence_gate.json b/src/hfas/resources/assets/ww_hfas/items/soul_fence_gate.json deleted file mode 100644 index a14f107..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_fence_gate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_fence_gate" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/items/soul_hanging_sign.json deleted file mode 100644 index 13e32c0..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_hanging_sign.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/soul_hanging_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_log.json b/src/hfas/resources/assets/ww_hfas/items/soul_log.json deleted file mode 100644 index be6fff1..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_log.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_planks.json b/src/hfas/resources/assets/ww_hfas/items/soul_planks.json deleted file mode 100644 index 3bfa2e4..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_planks.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_pressure_plate.json b/src/hfas/resources/assets/ww_hfas/items/soul_pressure_plate.json deleted file mode 100644 index 97daf71..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_pressure_plate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_pressure_plate" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_sapling.json b/src/hfas/resources/assets/ww_hfas/items/soul_sapling.json deleted file mode 100644 index 10abb9c..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_sapling.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:item/soul_sapling" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_slab.json b/src/hfas/resources/assets/ww_hfas/items/soul_slab.json deleted file mode 100644 index 818017e..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_slab.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_slab" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_stairs.json b/src/hfas/resources/assets/ww_hfas/items/soul_stairs.json deleted file mode 100644 index 687331a..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_stairs.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_stairs" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_trapdoor.json b/src/hfas/resources/assets/ww_hfas/items/soul_trapdoor.json deleted file mode 100644 index f1d57f0..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_trapdoor.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_trapdoor_bottom" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_wood.json b/src/hfas/resources/assets/ww_hfas/items/soul_wood.json deleted file mode 100644 index 5466a33..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/soul_wood.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/soul_wood" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_log.json b/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_log.json deleted file mode 100644 index 72fa897..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_log.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_wood.json b/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_wood.json deleted file mode 100644 index 3c3f37e..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/stripped_azalea_wood.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/stripped_azalea_wood" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_log.json b/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_log.json deleted file mode 100644 index c925415..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_log.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_wood.json b/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_wood.json deleted file mode 100644 index 98bb532..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/stripped_blaze_wood.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/stripped_blaze_wood" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_soul_log.json b/src/hfas/resources/assets/ww_hfas/items/stripped_soul_log.json deleted file mode 100644 index 5a503de..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/stripped_soul_log.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/stripped_soul_wood.json b/src/hfas/resources/assets/ww_hfas/items/stripped_soul_wood.json deleted file mode 100644 index 937b493..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/stripped_soul_wood.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/stripped_soul_wood" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/tiny_cactus.json b/src/hfas/resources/assets/ww_hfas/items/tiny_cactus.json deleted file mode 100644 index be42856..0000000 --- a/src/hfas/resources/assets/ww_hfas/items/tiny_cactus.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "model": { - "type": "minecraft:model", - "model": "ww_hfas:block/tiny_cactus" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/lang/en_us.json b/src/hfas/resources/assets/ww_hfas/lang/en_us.json deleted file mode 100644 index 30f7265..0000000 --- a/src/hfas/resources/assets/ww_hfas/lang/en_us.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "block.ww_hfas.azalea_button": "Azalea Button", - "block.ww_hfas.azalea_door": "Azalea Door", - "block.ww_hfas.azalea_fence": "Azalea Fence", - "block.ww_hfas.azalea_fence_gate": "Azalea Fence Gate", - "block.ww_hfas.azalea_hanging_sign": "Azalea Hanging Sign", - "block.ww_hfas.azalea_log": "Azalea Log", - "block.ww_hfas.azalea_planks": "Azalea Planks", - "block.ww_hfas.azalea_pressure_plate": "Azalea Pressure Plate", - "block.ww_hfas.azalea_sign": "Azalea Sign", - "block.ww_hfas.azalea_slab": "Azalea Slab", - "block.ww_hfas.azalea_stairs": "Azalea Stairs", - "block.ww_hfas.azalea_trapdoor": "Azalea Trapdoor", - "block.ww_hfas.azalea_wall_hanging_sign": "Azalea Hanging Sign", - "block.ww_hfas.azalea_wall_sign": "Azalea Sign", - "block.ww_hfas.azalea_wood": "Azalea Wood", - "block.ww_hfas.blaze_button": "Blaze Button", - "block.ww_hfas.blaze_door": "Blaze Door", - "block.ww_hfas.blaze_fence": "Blaze Fence", - "block.ww_hfas.blaze_fence_gate": "Blaze Fence Gate", - "block.ww_hfas.blaze_hanging_sign": "Blaze Hanging Sign", - "block.ww_hfas.blaze_leaves": "Blaze Leaves", - "block.ww_hfas.blaze_log": "Blaze Log", - "block.ww_hfas.blaze_planks": "Blaze Planks", - "block.ww_hfas.blaze_pressure_plate": "Blaze Pressure Plate", - "block.ww_hfas.blaze_sapling": "Blaze Sapling", - "block.ww_hfas.blaze_sign": "Blaze Sign", - "block.ww_hfas.blaze_slab": "Blaze Slab", - "block.ww_hfas.blaze_stairs": "Blaze Stairs", - "block.ww_hfas.blaze_trapdoor": "Blaze Trapdoor", - "block.ww_hfas.blaze_wall_hanging_sign": "Blaze Hanging Sign", - "block.ww_hfas.blaze_wall_sign": "Blaze Sign", - "block.ww_hfas.blaze_wood": "Blaze Wood", - "block.ww_hfas.fletching_table": "Fletching Table", - "block.ww_hfas.scorched_dirt": "Scorched Dirt", - "block.ww_hfas.scorched_grass": "Scorched Grass", - "block.ww_hfas.scorched_grass_block": "Scorched Grass Block", - "block.ww_hfas.scorched_twig": "Scorched Twig", - "block.ww_hfas.soul_button": "Soul Button", - "block.ww_hfas.soul_door": "Soul Door", - "block.ww_hfas.soul_fence": "Soul Fence", - "block.ww_hfas.soul_fence_gate": "Soul Fence Gate", - "block.ww_hfas.soul_hanging_sign": "Soul Hanging Sign", - "block.ww_hfas.soul_leaves": "Soul Leaves", - "block.ww_hfas.soul_log": "Soul Log", - "block.ww_hfas.soul_planks": "Soul Planks", - "block.ww_hfas.soul_pressure_plate": "Soul Pressure Plate", - "block.ww_hfas.soul_sapling": "Soul Sapling", - "block.ww_hfas.soul_sign": "Soul Sign", - "block.ww_hfas.soul_slab": "Soul Slab", - "block.ww_hfas.soul_stairs": "Soul Stairs", - "block.ww_hfas.soul_trapdoor": "Soul Trapdoor", - "block.ww_hfas.soul_wall_hanging_sign": "Soul Hanging Sign", - "block.ww_hfas.soul_wall_sign": "Soul Sign", - "block.ww_hfas.soul_wood": "Soul Wood", - "block.ww_hfas.stripped_azalea_log": "Stripped Azalea Log", - "block.ww_hfas.stripped_azalea_wood": "Stripped Azalea Wood", - "block.ww_hfas.stripped_blaze_log": "Stripped Blaze Log", - "block.ww_hfas.stripped_blaze_wood": "Stripped Blaze Wood", - "block.ww_hfas.stripped_soul_log": "Stripped Soul Log", - "block.ww_hfas.stripped_soul_wood": "Stripped Soul Wood", - "block.ww_hfas.tiny_cactus": "Tiny Cactus", - "container.fletching_table": "Fletching Table", - "item.ww_hfas.azalea_boat": "Azalea Boat", - "item.ww_hfas.azalea_chest_boat": "Azalea Chest Boat", - "item.ww_hfas.blaze_boat": "Blaze Boat", - "item.ww_hfas.blaze_chest_boat": "Blaze Chest Boat", - "item.ww_hfas.soul_boat": "Soul Boat", - "item.ww_hfas.soul_chest_boat": "Soul Chest Boat", - "entity.ww_hfas.muddy_pig": "Muddy Pig", - "item.ww_hfas.muddy_pig_spawn_egg": "Muddy Pig Spawn Egg", - "item.ww_hfas.duckweed": "Duckweed", - "item.ww_hfas.calamari": "Calamari", - "item.ww_hfas.cooked_calamari": "Cooked Calamari", - "item.ww_hfas.cooked_egg": "Fried Egg", - "item.ww_hfas.baked_seeds": "Baked Seeds", - "item.ww_hfas.cooked_frog_legs": "Cooked Frog Legs", - "item.ww_hfas.frog_legs": "Raw Frog Legs", - "effect.ww_hfas.sink": "Sink", - "effect.ww_hfas.choke": "Choke", - "enchantment.ww_hfas.melting": "Melting", - "block.ww_hfas.kiln": "Kiln", - "entity.ww_hfas.piranha": "Direfish", - "item.ww_hfas.cooked_piranha": "Cooked Direfish", - "item.ww_hfas.piranha": "Raw Direfish", - "item.ww_hfas.piranha_bucket": "Bucket of Direfish", - "item.ww_hfas.piranha_spawn_egg": "Direfish Spawn Egg", - "subtitles.entity.piranha.attack": "Direfish attacks", - "subtitles.entity.piranha.death": "Direfish dies", - "block.ww_hfas.azalea_shelf": "Azalea Shelf", - "entity.ww_hfas.arrow": "Arrow of Reach", - "item.minecraft.tipped_arrow.effect.long_reach": "Arrow of Reach", - "item.minecraft.tipped_arrow.effect.reach": "Arrow of Reach", - "item.ww_hfas.tipped_arrow": "Arrow of Reach", - "item.ww_hfas.tipped_arrow.effect.long_reach": "Arrow of Reach", - "item.ww_hfas.tipped_arrow.effect.reach": "Arrow of Reach" -} diff --git a/src/hfas/resources/assets/ww_hfas/lang/zh_cn.json b/src/hfas/resources/assets/ww_hfas/lang/zh_cn.json deleted file mode 100644 index 1f32a42..0000000 --- a/src/hfas/resources/assets/ww_hfas/lang/zh_cn.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "block.ww_hfas.azalea_button": "杜鹃木按钮", - "block.ww_hfas.azalea_door": "杜鹃木门", - "block.ww_hfas.azalea_fence": "杜鹃木栅栏", - "block.ww_hfas.azalea_fence_gate": "杜鹃木栅栏门", - "block.ww_hfas.azalea_hanging_sign": "悬挂式杜鹃木告示牌", - "block.ww_hfas.azalea_log": "杜鹃木原木", - "block.ww_hfas.azalea_planks": "杜鹃木木板", - "block.ww_hfas.azalea_pressure_plate": "杜鹃木压力板", - "block.ww_hfas.azalea_sign": "杜鹃木告示牌", - "block.ww_hfas.azalea_slab": "杜鹃木台阶", - "block.ww_hfas.azalea_stairs": "杜鹃木楼梯", - "block.ww_hfas.azalea_trapdoor": "杜鹃木活板门", - "block.ww_hfas.azalea_wall_hanging_sign": "杜鹃木悬挂告示牌", - "block.ww_hfas.azalea_wall_sign": "杜鹃木告示牌", - "block.ww_hfas.azalea_wood": "杜鹃木", - "block.ww_hfas.blaze_button": "焚烬木按钮", - "block.ww_hfas.blaze_door": "焚烬木门", - "block.ww_hfas.blaze_fence": "焚烬木栅栏", - "block.ww_hfas.blaze_fence_gate": "焚烬木栅栏门", - "block.ww_hfas.blaze_hanging_sign": "焚烬木悬挂告示牌", - "block.ww_hfas.blaze_leaves": "焚烬木树叶", - "block.ww_hfas.blaze_log": "焚烬木原木", - "block.ww_hfas.blaze_planks": "焚烬木木板", - "block.ww_hfas.blaze_pressure_plate": "焚烬木压力板", - "block.ww_hfas.blaze_sapling": "焚烬木树苗", - "block.ww_hfas.blaze_sign": "焚烬木告示牌", - "block.ww_hfas.blaze_slab": "焚烬木台阶", - "block.ww_hfas.blaze_stairs": "焚烬木楼梯", - "block.ww_hfas.blaze_trapdoor": "焚烬木活板门", - "block.ww_hfas.blaze_wall_hanging_sign": "焚烬木悬挂告示牌", - "block.ww_hfas.blaze_wall_sign": "焚烬木告示牌", - "block.ww_hfas.blaze_wood": "焚烬木", - "block.ww_hfas.fletching_table": "制箭台", - "block.ww_hfas.scorched_dirt": "焦土", - "block.ww_hfas.scorched_grass": "焦灰草丛", - "block.ww_hfas.scorched_grass_block": "焦灰草方块", - "block.ww_hfas.scorched_twig": "焦灰枝条", - "block.ww_hfas.soul_button": "灵焰木按钮", - "block.ww_hfas.soul_door": "灵焰木门", - "block.ww_hfas.soul_fence": "灵焰木栅栏", - "block.ww_hfas.soul_fence_gate": "灵焰木栅栏门", - "block.ww_hfas.soul_hanging_sign": "灵焰木悬挂告示牌", - "block.ww_hfas.soul_leaves": "灵焰木树叶", - "block.ww_hfas.soul_log": "灵焰木原木", - "block.ww_hfas.soul_planks": "灵焰木木板", - "block.ww_hfas.soul_pressure_plate": "灵焰木压力板", - "block.ww_hfas.soul_sapling": "灵焰木树苗", - "block.ww_hfas.soul_sign": "灵焰木告示牌", - "block.ww_hfas.soul_slab": "灵焰木台阶", - "block.ww_hfas.soul_stairs": "灵焰木楼梯", - "block.ww_hfas.soul_trapdoor": "灵焰木活板门", - "block.ww_hfas.soul_wall_hanging_sign": "灵焰木悬挂告示牌", - "block.ww_hfas.soul_wall_sign": "灵焰木告示牌", - "block.ww_hfas.soul_wood": "灵焰木", - "block.ww_hfas.stripped_azalea_log": "去皮杜鹃木原木", - "block.ww_hfas.stripped_azalea_wood": "去皮杜鹃木", - "block.ww_hfas.stripped_blaze_log": "去皮焚烬木原木", - "block.ww_hfas.stripped_blaze_wood": "去皮焚烬木", - "block.ww_hfas.stripped_soul_log": "去皮灵焰木原木", - "block.ww_hfas.stripped_soul_wood": "去皮灵焰木", - "block.ww_hfas.tiny_cactus": "仙人球", - "container.fletching_table": "制箭台", - "item.ww_hfas.azalea_boat": "杜鹃木船", - "item.ww_hfas.azalea_chest_boat": "杜鹃木运输船", - "item.ww_hfas.blaze_boat": "焚烬木船", - "item.ww_hfas.blaze_chest_boat": "焚烬木运输船", - "item.ww_hfas.soul_boat": "灵焰木船", - "item.ww_hfas.soul_chest_boat": "灵焰木运输船", - "entity.ww_hfas.muddy_pig": "泥猪", - "item.ww_hfas.muddy_pig_spawn_egg": "泥猪刷怪蛋", - "item.ww_hfas.duckweed": "浮萍", - "item.ww_hfas.calamari": "鱿鱼须", - "item.ww_hfas.cooked_calamari": "熟鱿鱼须", - "item.ww_hfas.cooked_egg": "煎蛋", - "item.ww_hfas.baked_seeds": "烤种子", - "item.ww_hfas.cooked_frog_legs": "熟蛙腿", - "item.ww_hfas.frog_legs": "生蛙腿", - "effect.ww_hfas.sink": "沉溺", - "effect.ww_hfas.choke": "窒息", - "enchantment.ww_hfas.melting": "熔炼", - "block.ww_hfas.kiln": "窑炉", - "entity.ww_hfas.piranha": "恐鱼", - "item.ww_hfas.cooked_piranha": "熟恐鱼", - "item.ww_hfas.piranha": "生恐鱼", - "item.ww_hfas.piranha_bucket": "恐鱼桶", - "item.ww_hfas.piranha_spawn_egg": "恐鱼刷怪蛋", - "subtitles.entity.piranha.attack": "恐鱼袭击", - "subtitles.entity.piranha.death": "恐鱼死亡", - "block.ww_hfas.azalea_shelf": "杜鹃木展示架", - "entity.ww_hfas.arrow": "延展之箭", - "item.minecraft.tipped_arrow.effect.long_reach": "延展之箭", - "item.minecraft.tipped_arrow.effect.reach": "延展之箭", - "item.ww_hfas.tipped_arrow": "延展之箭", - "item.ww_hfas.tipped_arrow.effect.long_reach": "延展之箭", - "item.ww_hfas.tipped_arrow.effect.reach": "延展之箭" -} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left.json deleted file mode 100644 index 9a363b3..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_left", - "textures": { - "bottom": "ww_hfas:block/azalea_door_bottom", - "top": "ww_hfas:block/azalea_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left_open.json deleted file mode 100644 index fd2834c..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_left_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_left_open", - "textures": { - "bottom": "ww_hfas:block/azalea_door_bottom", - "top": "ww_hfas:block/azalea_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right.json deleted file mode 100644 index 1b3a7fd..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_right", - "textures": { - "bottom": "ww_hfas:block/azalea_door_bottom", - "top": "ww_hfas:block/azalea_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right_open.json deleted file mode 100644 index 58905e2..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_bottom_right_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_right_open", - "textures": { - "bottom": "ww_hfas:block/azalea_door_bottom", - "top": "ww_hfas:block/azalea_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left.json deleted file mode 100644 index c41a92d..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_left", - "textures": { - "bottom": "ww_hfas:block/azalea_door_bottom", - "top": "ww_hfas:block/azalea_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left_open.json deleted file mode 100644 index 54791c1..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_left_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_left_open", - "textures": { - "bottom": "ww_hfas:block/azalea_door_bottom", - "top": "ww_hfas:block/azalea_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right.json deleted file mode 100644 index a3f958c..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_right", - "textures": { - "bottom": "ww_hfas:block/azalea_door_bottom", - "top": "ww_hfas:block/azalea_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right_open.json deleted file mode 100644 index c2e47a7..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_door_top_right_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_right_open", - "textures": { - "bottom": "ww_hfas:block/azalea_door_bottom", - "top": "ww_hfas:block/azalea_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_0.json deleted file mode 100644 index 17656b4..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_0", - "textures": { - "all": "ww_hfas:block/azalea_hanging_sign", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_1.json deleted file mode 100644 index e61f747..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_1", - "textures": { - "all": "ww_hfas:block/azalea_hanging_sign", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_2.json deleted file mode 100644 index a957d88..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_2", - "textures": { - "all": "ww_hfas:block/azalea_hanging_sign", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_3.json deleted file mode 100644 index f5aa45c..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_attached_rot_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_3", - "textures": { - "all": "ww_hfas:block/azalea_hanging_sign", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_0.json deleted file mode 100644 index 67f91b6..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_0", - "textures": { - "all": "ww_hfas:block/azalea_hanging_sign", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_1.json deleted file mode 100644 index 5acf0e1..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_1", - "textures": { - "all": "ww_hfas:block/azalea_hanging_sign", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_2.json deleted file mode 100644 index 349e892..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_2", - "textures": { - "all": "ww_hfas:block/azalea_hanging_sign", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_3.json deleted file mode 100644 index 91fd4f1..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_hanging_sign_rot_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_3", - "textures": { - "all": "ww_hfas:block/azalea_hanging_sign", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_log.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_log.json deleted file mode 100644 index b407e48..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_log.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/azalea_log_top", - "side": "ww_hfas:block/azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_log_horizontal.json deleted file mode 100644 index 945028f..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_log_horizontal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column_horizontal", - "textures": { - "end": "ww_hfas:block/azalea_log_top", - "side": "ww_hfas:block/azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf.json deleted file mode 100644 index 9fb24d8..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_shelf_body", - "textures": { - "all": "ww_hfas:block/azalea_shelf", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_center.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_center.json deleted file mode 100644 index b7ba4a7..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_center.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_shelf_center", - "textures": { - "all": "ww_hfas:block/azalea_shelf", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_inventory.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_inventory.json deleted file mode 100644 index 8a76fed..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_inventory.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_shelf_inventory", - "textures": { - "all": "ww_hfas:block/azalea_shelf", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_left.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_left.json deleted file mode 100644 index ba2e868..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_left.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_shelf_left", - "textures": { - "all": "ww_hfas:block/azalea_shelf", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_right.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_right.json deleted file mode 100644 index 7e1696e..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_right.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_shelf_right", - "textures": { - "all": "ww_hfas:block/azalea_shelf", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unconnected.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unconnected.json deleted file mode 100644 index d3a2e0f..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unconnected.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_shelf_unconnected", - "textures": { - "all": "ww_hfas:block/azalea_shelf", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unpowered.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unpowered.json deleted file mode 100644 index b56de0a..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_shelf_unpowered.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_shelf_unpowered", - "textures": { - "all": "ww_hfas:block/azalea_shelf", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_0.json deleted file mode 100644 index 57ab485..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_0", - "textures": { - "all": "ww_hfas:block/azalea_sign", - "particle": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_1.json deleted file mode 100644 index badcc3f..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_1", - "textures": { - "all": "ww_hfas:block/azalea_sign", - "particle": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_2.json deleted file mode 100644 index 4aadca6..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_2", - "textures": { - "all": "ww_hfas:block/azalea_sign", - "particle": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_3.json deleted file mode 100644 index ca1f9cc..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_sign_rot_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_3", - "textures": { - "all": "ww_hfas:block/azalea_sign", - "particle": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab.json deleted file mode 100644 index aa827b3..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/slab", - "textures": { - "bottom": "ww_hfas:block/azalea_planks", - "side": "ww_hfas:block/azalea_planks", - "top": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab_top.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab_top.json deleted file mode 100644 index 8d49d8a..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_slab_top.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/slab_top", - "textures": { - "bottom": "ww_hfas:block/azalea_planks", - "side": "ww_hfas:block/azalea_planks", - "top": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs.json deleted file mode 100644 index c3a479e..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/stairs", - "textures": { - "bottom": "ww_hfas:block/azalea_planks", - "side": "ww_hfas:block/azalea_planks", - "top": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_inner.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_inner.json deleted file mode 100644 index 10226f2..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_inner.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/inner_stairs", - "textures": { - "bottom": "ww_hfas:block/azalea_planks", - "side": "ww_hfas:block/azalea_planks", - "top": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_outer.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_outer.json deleted file mode 100644 index aef79e1..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_stairs_outer.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/outer_stairs", - "textures": { - "bottom": "ww_hfas:block/azalea_planks", - "side": "ww_hfas:block/azalea_planks", - "top": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_bottom.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_bottom.json deleted file mode 100644 index e5b03d7..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_bottom.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_orientable_trapdoor_bottom", - "textures": { - "texture": "ww_hfas:block/azalea_trapdoor" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_open.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_open.json deleted file mode 100644 index 6ca6f0d..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_open.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_orientable_trapdoor_open", - "textures": { - "texture": "ww_hfas:block/azalea_trapdoor" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_top.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_top.json deleted file mode 100644 index 66b24c4..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_trapdoor_top.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_orientable_trapdoor_top", - "textures": { - "texture": "ww_hfas:block/azalea_trapdoor" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_hanging_sign.json deleted file mode 100644 index 2355131..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_hanging_sign.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_hanging_sign", - "textures": { - "all": "ww_hfas:block/azalea_hanging_sign", - "particle": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_sign.json deleted file mode 100644 index 1f275af..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_wall_sign.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_sign", - "textures": { - "all": "ww_hfas:block/azalea_sign", - "particle": "ww_hfas:block/azalea_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/azalea_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/azalea_wood.json deleted file mode 100644 index 82d72d0..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/azalea_wood.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/azalea_log", - "side": "ww_hfas:block/azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left.json deleted file mode 100644 index ffa1e5a..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_left", - "textures": { - "bottom": "ww_hfas:block/blaze_door_bottom", - "top": "ww_hfas:block/blaze_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left_open.json deleted file mode 100644 index 1dba029..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_left_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_left_open", - "textures": { - "bottom": "ww_hfas:block/blaze_door_bottom", - "top": "ww_hfas:block/blaze_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right.json deleted file mode 100644 index 0d1f7c3..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_right", - "textures": { - "bottom": "ww_hfas:block/blaze_door_bottom", - "top": "ww_hfas:block/blaze_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right_open.json deleted file mode 100644 index 7406287..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_bottom_right_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_right_open", - "textures": { - "bottom": "ww_hfas:block/blaze_door_bottom", - "top": "ww_hfas:block/blaze_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left.json deleted file mode 100644 index 1b03e3c..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_left", - "textures": { - "bottom": "ww_hfas:block/blaze_door_bottom", - "top": "ww_hfas:block/blaze_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left_open.json deleted file mode 100644 index 5a57be6..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_left_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_left_open", - "textures": { - "bottom": "ww_hfas:block/blaze_door_bottom", - "top": "ww_hfas:block/blaze_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right.json deleted file mode 100644 index 9889caa..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_right", - "textures": { - "bottom": "ww_hfas:block/blaze_door_bottom", - "top": "ww_hfas:block/blaze_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right_open.json deleted file mode 100644 index 67b8807..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_door_top_right_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_right_open", - "textures": { - "bottom": "ww_hfas:block/blaze_door_bottom", - "top": "ww_hfas:block/blaze_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_0.json deleted file mode 100644 index d3b6fcd..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_0", - "textures": { - "all": "ww_hfas:block/blaze_hanging_sign", - "particle": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_1.json deleted file mode 100644 index fcf12c6..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_1", - "textures": { - "all": "ww_hfas:block/blaze_hanging_sign", - "particle": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_2.json deleted file mode 100644 index 01be23c..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_2", - "textures": { - "all": "ww_hfas:block/blaze_hanging_sign", - "particle": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_3.json deleted file mode 100644 index 9b45ba8..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_attached_rot_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_3", - "textures": { - "all": "ww_hfas:block/blaze_hanging_sign", - "particle": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_0.json deleted file mode 100644 index 254fac6..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_0", - "textures": { - "all": "ww_hfas:block/blaze_hanging_sign", - "particle": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_1.json deleted file mode 100644 index d9b2040..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_1", - "textures": { - "all": "ww_hfas:block/blaze_hanging_sign", - "particle": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_2.json deleted file mode 100644 index 29bc176..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_2", - "textures": { - "all": "ww_hfas:block/blaze_hanging_sign", - "particle": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_3.json deleted file mode 100644 index 214de88..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_hanging_sign_rot_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_3", - "textures": { - "all": "ww_hfas:block/blaze_hanging_sign", - "particle": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_log.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_log.json deleted file mode 100644 index 80c570a..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_log.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/blaze_log_top", - "side": "ww_hfas:block/blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_log_horizontal.json deleted file mode 100644 index db339ed..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_log_horizontal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column_horizontal", - "textures": { - "end": "ww_hfas:block/blaze_log_top", - "side": "ww_hfas:block/blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_0.json deleted file mode 100644 index 188c6cb..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_0", - "textures": { - "all": "ww_hfas:block/blaze_sign", - "particle": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_1.json deleted file mode 100644 index e50ada1..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_1", - "textures": { - "all": "ww_hfas:block/blaze_sign", - "particle": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_2.json deleted file mode 100644 index 7004435..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_2", - "textures": { - "all": "ww_hfas:block/blaze_sign", - "particle": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_3.json deleted file mode 100644 index 416e90e..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sign_rot_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_3", - "textures": { - "all": "ww_hfas:block/blaze_sign", - "particle": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab.json deleted file mode 100644 index 50e6078..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/slab", - "textures": { - "bottom": "ww_hfas:block/blaze_planks", - "side": "ww_hfas:block/blaze_planks", - "top": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab_top.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab_top.json deleted file mode 100644 index 1007ee4..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_slab_top.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/slab_top", - "textures": { - "bottom": "ww_hfas:block/blaze_planks", - "side": "ww_hfas:block/blaze_planks", - "top": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs.json deleted file mode 100644 index 8d2a639..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/stairs", - "textures": { - "bottom": "ww_hfas:block/blaze_planks", - "side": "ww_hfas:block/blaze_planks", - "top": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_inner.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_inner.json deleted file mode 100644 index 15e7cd4..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_inner.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/inner_stairs", - "textures": { - "bottom": "ww_hfas:block/blaze_planks", - "side": "ww_hfas:block/blaze_planks", - "top": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_outer.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_outer.json deleted file mode 100644 index 4564aa9..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_stairs_outer.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/outer_stairs", - "textures": { - "bottom": "ww_hfas:block/blaze_planks", - "side": "ww_hfas:block/blaze_planks", - "top": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_bottom.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_bottom.json deleted file mode 100644 index 61f8c27..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_bottom.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_orientable_trapdoor_bottom", - "textures": { - "texture": "ww_hfas:block/blaze_trapdoor" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_open.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_open.json deleted file mode 100644 index cf64f11..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_open.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_orientable_trapdoor_open", - "textures": { - "texture": "ww_hfas:block/blaze_trapdoor" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_top.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_top.json deleted file mode 100644 index 48c82ef..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_trapdoor_top.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_orientable_trapdoor_top", - "textures": { - "texture": "ww_hfas:block/blaze_trapdoor" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_hanging_sign.json deleted file mode 100644 index a5183c7..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_hanging_sign.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_hanging_sign", - "textures": { - "all": "ww_hfas:block/blaze_hanging_sign", - "particle": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_sign.json deleted file mode 100644 index a401e69..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_wall_sign.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_sign", - "textures": { - "all": "ww_hfas:block/blaze_sign", - "particle": "ww_hfas:block/blaze_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/blaze_wood.json deleted file mode 100644 index 2e60081..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_wood.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/blaze_log", - "side": "ww_hfas:block/blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/fletching_table.json b/src/hfas/resources/assets/ww_hfas/models/block/fletching_table.json deleted file mode 100644 index 9e38b5b..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/fletching_table.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/cube_all", - "textures": { - "all": "ww_hfas:block/fletching_table" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass_block.json b/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass_block.json deleted file mode 100644 index 7b7d66a..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass_block.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/cube_all", - "textures": { - "all": "ww_hfas:block/scorched_grass_block" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left.json deleted file mode 100644 index 9f3a416..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_left", - "textures": { - "bottom": "ww_hfas:block/soul_door_bottom", - "top": "ww_hfas:block/soul_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left_open.json deleted file mode 100644 index f1ade50..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_left_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_left_open", - "textures": { - "bottom": "ww_hfas:block/soul_door_bottom", - "top": "ww_hfas:block/soul_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right.json deleted file mode 100644 index 552a6d2..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_right", - "textures": { - "bottom": "ww_hfas:block/soul_door_bottom", - "top": "ww_hfas:block/soul_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right_open.json deleted file mode 100644 index 007e77e..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_bottom_right_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_bottom_right_open", - "textures": { - "bottom": "ww_hfas:block/soul_door_bottom", - "top": "ww_hfas:block/soul_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left.json deleted file mode 100644 index 9ae8f7b..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_left", - "textures": { - "bottom": "ww_hfas:block/soul_door_bottom", - "top": "ww_hfas:block/soul_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left_open.json deleted file mode 100644 index 5df9000..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_left_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_left_open", - "textures": { - "bottom": "ww_hfas:block/soul_door_bottom", - "top": "ww_hfas:block/soul_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right.json deleted file mode 100644 index 2cc36d7..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_right", - "textures": { - "bottom": "ww_hfas:block/soul_door_bottom", - "top": "ww_hfas:block/soul_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right_open.json deleted file mode 100644 index 4ba8da3..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_door_top_right_open.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/door_top_right_open", - "textures": { - "bottom": "ww_hfas:block/soul_door_bottom", - "top": "ww_hfas:block/soul_door_top" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_0.json deleted file mode 100644 index 03904e6..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_0", - "textures": { - "all": "ww_hfas:block/soul_hanging_sign", - "particle": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_1.json deleted file mode 100644 index 47a2e65..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_1", - "textures": { - "all": "ww_hfas:block/soul_hanging_sign", - "particle": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_2.json deleted file mode 100644 index 1e3e47b..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_2", - "textures": { - "all": "ww_hfas:block/soul_hanging_sign", - "particle": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_3.json deleted file mode 100644 index 643e627..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_attached_rot_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_attached_hanging_sign_rot_3", - "textures": { - "all": "ww_hfas:block/soul_hanging_sign", - "particle": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_0.json deleted file mode 100644 index 6986bca..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_0", - "textures": { - "all": "ww_hfas:block/soul_hanging_sign", - "particle": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_1.json deleted file mode 100644 index acb72a6..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_1", - "textures": { - "all": "ww_hfas:block/soul_hanging_sign", - "particle": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_2.json deleted file mode 100644 index 40fb18c..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_2", - "textures": { - "all": "ww_hfas:block/soul_hanging_sign", - "particle": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_3.json deleted file mode 100644 index 34efb63..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_hanging_sign_rot_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_hanging_sign_rot_3", - "textures": { - "all": "ww_hfas:block/soul_hanging_sign", - "particle": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_log.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_log.json deleted file mode 100644 index 95fe4d6..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_log.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/soul_log_top", - "side": "ww_hfas:block/soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_log_horizontal.json deleted file mode 100644 index ac124e5..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_log_horizontal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column_horizontal", - "textures": { - "end": "ww_hfas:block/soul_log_top", - "side": "ww_hfas:block/soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_0.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_0.json deleted file mode 100644 index 66be653..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_0", - "textures": { - "all": "ww_hfas:block/soul_sign", - "particle": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_1.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_1.json deleted file mode 100644 index c0f54d0..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_1", - "textures": { - "all": "ww_hfas:block/soul_sign", - "particle": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_2.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_2.json deleted file mode 100644 index bdbc310..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_2", - "textures": { - "all": "ww_hfas:block/soul_sign", - "particle": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_3.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_3.json deleted file mode 100644 index 9f40093..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_sign_rot_3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_sign_rot_3", - "textures": { - "all": "ww_hfas:block/soul_sign", - "particle": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_slab.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_slab.json deleted file mode 100644 index 1c2ebba..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_slab.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/slab", - "textures": { - "bottom": "ww_hfas:block/soul_planks", - "side": "ww_hfas:block/soul_planks", - "top": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_slab_top.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_slab_top.json deleted file mode 100644 index 6aadbad..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_slab_top.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/slab_top", - "textures": { - "bottom": "ww_hfas:block/soul_planks", - "side": "ww_hfas:block/soul_planks", - "top": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs.json deleted file mode 100644 index 8de2751..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/stairs", - "textures": { - "bottom": "ww_hfas:block/soul_planks", - "side": "ww_hfas:block/soul_planks", - "top": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_inner.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_inner.json deleted file mode 100644 index 08895e7..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_inner.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/inner_stairs", - "textures": { - "bottom": "ww_hfas:block/soul_planks", - "side": "ww_hfas:block/soul_planks", - "top": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_outer.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_outer.json deleted file mode 100644 index d5a4636..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_stairs_outer.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "parent": "minecraft:block/outer_stairs", - "textures": { - "bottom": "ww_hfas:block/soul_planks", - "side": "ww_hfas:block/soul_planks", - "top": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_bottom.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_bottom.json deleted file mode 100644 index 35dbb38..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_bottom.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_orientable_trapdoor_bottom", - "textures": { - "texture": "ww_hfas:block/soul_trapdoor" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_open.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_open.json deleted file mode 100644 index a4a481d..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_open.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_orientable_trapdoor_open", - "textures": { - "texture": "ww_hfas:block/soul_trapdoor" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_top.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_top.json deleted file mode 100644 index 2cb1c29..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_trapdoor_top.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:block/template_orientable_trapdoor_top", - "textures": { - "texture": "ww_hfas:block/soul_trapdoor" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_hanging_sign.json deleted file mode 100644 index 07f2385..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_hanging_sign.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_hanging_sign", - "textures": { - "all": "ww_hfas:block/soul_hanging_sign", - "particle": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_sign.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_sign.json deleted file mode 100644 index 3070323..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_wall_sign.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/template_wall_sign", - "textures": { - "all": "ww_hfas:block/soul_sign", - "particle": "ww_hfas:block/soul_planks" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/soul_wood.json deleted file mode 100644 index 00a3492..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_wood.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/soul_log", - "side": "ww_hfas:block/soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log.json deleted file mode 100644 index b90fc17..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/stripped_azalea_log_top", - "side": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log_horizontal.json deleted file mode 100644 index 1534da3..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_log_horizontal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column_horizontal", - "textures": { - "end": "ww_hfas:block/stripped_azalea_log_top", - "side": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_wood.json deleted file mode 100644 index 9efa944..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/stripped_azalea_wood.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/stripped_azalea_log", - "side": "ww_hfas:block/stripped_azalea_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log.json deleted file mode 100644 index a108025..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/stripped_blaze_log_top", - "side": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log_horizontal.json deleted file mode 100644 index 3e3f046..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_log_horizontal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column_horizontal", - "textures": { - "end": "ww_hfas:block/stripped_blaze_log_top", - "side": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_wood.json deleted file mode 100644 index a29dcda..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/stripped_blaze_wood.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/stripped_blaze_log", - "side": "ww_hfas:block/stripped_blaze_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log.json deleted file mode 100644 index 045c65f..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/stripped_soul_log_top", - "side": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log_horizontal.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log_horizontal.json deleted file mode 100644 index cfdec37..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_log_horizontal.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column_horizontal", - "textures": { - "end": "ww_hfas:block/stripped_soul_log_top", - "side": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_wood.json b/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_wood.json deleted file mode 100644 index b58988e..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/block/stripped_soul_wood.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "parent": "minecraft:block/cube_column", - "textures": { - "end": "ww_hfas:block/stripped_soul_log", - "side": "ww_hfas:block/stripped_soul_log" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_door.json b/src/hfas/resources/assets/ww_hfas/models/item/azalea_door.json deleted file mode 100644 index 25d13f4..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/item/azalea_door.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "ww_hfas:item/azalea_door" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_hanging_sign.json b/src/hfas/resources/assets/ww_hfas/models/item/azalea_hanging_sign.json deleted file mode 100644 index 2f7231f..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/item/azalea_hanging_sign.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "ww_hfas:item/azalea_hanging_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/azalea_sign.json b/src/hfas/resources/assets/ww_hfas/models/item/azalea_sign.json deleted file mode 100644 index e177fb0..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/item/azalea_sign.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "ww_hfas:item/azalea_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_door.json b/src/hfas/resources/assets/ww_hfas/models/item/blaze_door.json deleted file mode 100644 index f18f481..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/item/blaze_door.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "ww_hfas:item/blaze_door" - } -} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_door.json b/src/hfas/resources/assets/ww_hfas/models/item/soul_door.json deleted file mode 100644 index 6fce687..0000000 --- a/src/hfas/resources/assets/ww_hfas/models/item/soul_door.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "ww_hfas:item/soul_door" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/block/fence_gates/wooden.json b/src/hfas/resources/data/c/tags/block/fence_gates/wooden.json deleted file mode 100644 index 5924312..0000000 --- a/src/hfas/resources/data/c/tags/block/fence_gates/wooden.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence_gate", - "ww_hfas:soul_fence_gate", - "ww_hfas:azalea_fence_gate" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/block/fences.json b/src/hfas/resources/data/c/tags/block/fences.json deleted file mode 100644 index c52925f..0000000 --- a/src/hfas/resources/data/c/tags/block/fences.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence", - "ww_hfas:soul_fence", - "ww_hfas:azalea_fence" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/block/fences/wooden.json b/src/hfas/resources/data/c/tags/block/fences/wooden.json deleted file mode 100644 index c52925f..0000000 --- a/src/hfas/resources/data/c/tags/block/fences/wooden.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence", - "ww_hfas:soul_fence", - "ww_hfas:azalea_fence" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/block/stripped_logs.json b/src/hfas/resources/data/c/tags/block/stripped_logs.json deleted file mode 100644 index 94855fa..0000000 --- a/src/hfas/resources/data/c/tags/block/stripped_logs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:stripped_blaze_log", - "ww_hfas:stripped_soul_log", - "ww_hfas:stripped_azalea_log" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/block/stripped_woods.json b/src/hfas/resources/data/c/tags/block/stripped_woods.json deleted file mode 100644 index c297d5c..0000000 --- a/src/hfas/resources/data/c/tags/block/stripped_woods.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:stripped_blaze_wood", - "ww_hfas:stripped_soul_wood", - "ww_hfas:stripped_azalea_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/item/fence_gates/wooden.json b/src/hfas/resources/data/c/tags/item/fence_gates/wooden.json deleted file mode 100644 index 5924312..0000000 --- a/src/hfas/resources/data/c/tags/item/fence_gates/wooden.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence_gate", - "ww_hfas:soul_fence_gate", - "ww_hfas:azalea_fence_gate" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/item/fences/wooden.json b/src/hfas/resources/data/c/tags/item/fences/wooden.json deleted file mode 100644 index c52925f..0000000 --- a/src/hfas/resources/data/c/tags/item/fences/wooden.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence", - "ww_hfas:soul_fence", - "ww_hfas:azalea_fence" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/item/stripped_logs.json b/src/hfas/resources/data/c/tags/item/stripped_logs.json deleted file mode 100644 index 94855fa..0000000 --- a/src/hfas/resources/data/c/tags/item/stripped_logs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:stripped_blaze_log", - "ww_hfas:stripped_soul_log", - "ww_hfas:stripped_azalea_log" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/c/tags/item/stripped_woods.json b/src/hfas/resources/data/c/tags/item/stripped_woods.json deleted file mode 100644 index c297d5c..0000000 --- a/src/hfas/resources/data/c/tags/item/stripped_woods.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:stripped_blaze_wood", - "ww_hfas:stripped_soul_wood", - "ww_hfas:stripped_azalea_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/all_hanging_signs.json b/src/hfas/resources/data/minecraft/tags/block/all_hanging_signs.json deleted file mode 100644 index 661dab3..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/all_hanging_signs.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "values": [ - { - "required": false, - "id": "ww_hfas:blaze_hanging_sign" - }, - { - "required": false, - "id": "ww_hfas:blaze_wall_hanging_sign" - }, - { - "required": false, - "id": "ww_hfas:soul_hanging_sign" - }, - { - "required": false, - "id": "ww_hfas:soul_wall_hanging_sign" - }, - { - "required": false, - "id": "ww_hfas:azalea_hanging_sign" - }, - { - "required": false, - "id": "ww_hfas:azalea_wall_hanging_sign" - } - ] -} diff --git a/src/hfas/resources/data/minecraft/tags/block/all_signs.json b/src/hfas/resources/data/minecraft/tags/block/all_signs.json deleted file mode 100644 index 26d2659..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/all_signs.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "values": [ - { - "required": false, - "id": "ww_hfas:blaze_sign" - }, - { - "required": false, - "id": "ww_hfas:blaze_wall_sign" - }, - { - "required": false, - "id": "ww_hfas:soul_sign" - }, - { - "required": false, - "id": "ww_hfas:soul_wall_sign" - }, - { - "required": false, - "id": "ww_hfas:azalea_sign" - }, - { - "required": false, - "id": "ww_hfas:azalea_wall_sign" - } - ] -} diff --git a/src/hfas/resources/data/minecraft/tags/block/ceiling_hanging_signs.json b/src/hfas/resources/data/minecraft/tags/block/ceiling_hanging_signs.json deleted file mode 100644 index aa2d1b9..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/ceiling_hanging_signs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_hanging_sign" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/dirt.json b/src/hfas/resources/data/minecraft/tags/block/dirt.json deleted file mode 100644 index cd686ba..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/dirt.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "ww_hfas:scorched_grass_block", - "ww_hfas:scorched_dirt" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/doors.json b/src/hfas/resources/data/minecraft/tags/block/doors.json deleted file mode 100644 index 2bc45ed..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/doors.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_door", - "ww_hfas:soul_door", - "ww_hfas:azalea_door" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/fence_gates.json b/src/hfas/resources/data/minecraft/tags/block/fence_gates.json deleted file mode 100644 index 5924312..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/fence_gates.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence_gate", - "ww_hfas:soul_fence_gate", - "ww_hfas:azalea_fence_gate" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/fences.json b/src/hfas/resources/data/minecraft/tags/block/fences.json deleted file mode 100644 index c52925f..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/fences.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence", - "ww_hfas:soul_fence", - "ww_hfas:azalea_fence" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/leaves.json b/src/hfas/resources/data/minecraft/tags/block/leaves.json deleted file mode 100644 index 0ac131e..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/leaves.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_leaves", - "ww_hfas:soul_leaves" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/logs.json b/src/hfas/resources/data/minecraft/tags/block/logs.json deleted file mode 100644 index e35133a..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/logs.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_log", - "ww_hfas:blaze_wood", - "ww_hfas:stripped_blaze_log", - "ww_hfas:stripped_blaze_wood", - "ww_hfas:soul_log", - "ww_hfas:soul_wood", - "ww_hfas:stripped_soul_log", - "ww_hfas:stripped_soul_wood", - "ww_hfas:azalea_log", - "ww_hfas:azalea_wood", - "ww_hfas:stripped_azalea_log", - "ww_hfas:stripped_azalea_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/logs_that_burn.json b/src/hfas/resources/data/minecraft/tags/block/logs_that_burn.json deleted file mode 100644 index e35133a..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/logs_that_burn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_log", - "ww_hfas:blaze_wood", - "ww_hfas:stripped_blaze_log", - "ww_hfas:stripped_blaze_wood", - "ww_hfas:soul_log", - "ww_hfas:soul_wood", - "ww_hfas:stripped_soul_log", - "ww_hfas:stripped_soul_wood", - "ww_hfas:azalea_log", - "ww_hfas:azalea_wood", - "ww_hfas:stripped_azalea_log", - "ww_hfas:stripped_azalea_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/mineable/axe.json b/src/hfas/resources/data/minecraft/tags/block/mineable/axe.json deleted file mode 100644 index 84f0d69..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/mineable/axe.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_sign", - "ww_hfas:azalea_wall_sign", - "ww_hfas:azalea_hanging_sign", - "ww_hfas:azalea_wall_hanging_sign", - "ww_hfas:azalea_shelf", - "ww_hfas:blaze_log", - "ww_hfas:blaze_wood", - "ww_hfas:stripped_blaze_log", - "ww_hfas:stripped_blaze_wood", - "ww_hfas:blaze_planks", - "ww_hfas:blaze_stairs", - "ww_hfas:blaze_slab", - "ww_hfas:blaze_fence", - "ww_hfas:blaze_fence_gate", - "ww_hfas:blaze_door", - "ww_hfas:blaze_trapdoor", - "ww_hfas:blaze_pressure_plate", - "ww_hfas:blaze_button", - "ww_hfas:soul_log", - "ww_hfas:soul_wood", - "ww_hfas:stripped_soul_log", - "ww_hfas:stripped_soul_wood", - "ww_hfas:soul_planks", - "ww_hfas:soul_stairs", - "ww_hfas:soul_slab", - "ww_hfas:soul_fence", - "ww_hfas:soul_fence_gate", - "ww_hfas:soul_door", - "ww_hfas:soul_trapdoor", - "ww_hfas:soul_pressure_plate", - "ww_hfas:soul_button", - "ww_hfas:azalea_log", - "ww_hfas:azalea_wood", - "ww_hfas:stripped_azalea_log", - "ww_hfas:stripped_azalea_wood", - "ww_hfas:azalea_planks", - "ww_hfas:azalea_stairs", - "ww_hfas:azalea_slab", - "ww_hfas:azalea_fence", - "ww_hfas:azalea_fence_gate", - "ww_hfas:azalea_door", - "ww_hfas:azalea_trapdoor", - "ww_hfas:azalea_pressure_plate", - "ww_hfas:azalea_button", - "ww_hfas:fletching_table" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/hfas/resources/data/minecraft/tags/block/mineable/pickaxe.json deleted file mode 100644 index b1c1fc4..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/mineable/pickaxe.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:kiln" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/overworld_natural_logs.json b/src/hfas/resources/data/minecraft/tags/block/overworld_natural_logs.json deleted file mode 100644 index 7771fb0..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/overworld_natural_logs.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_log", - "ww_hfas:soul_log" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/planks.json b/src/hfas/resources/data/minecraft/tags/block/planks.json deleted file mode 100644 index 7eab9b1..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/planks.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_planks", - "ww_hfas:soul_planks", - "ww_hfas:azalea_planks" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/saplings.json b/src/hfas/resources/data/minecraft/tags/block/saplings.json deleted file mode 100644 index 26a05ef..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/saplings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_sapling", - "ww_hfas:soul_sapling" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/standing_signs.json b/src/hfas/resources/data/minecraft/tags/block/standing_signs.json deleted file mode 100644 index e9aa7f7..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/standing_signs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_sign" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/trapdoors.json b/src/hfas/resources/data/minecraft/tags/block/trapdoors.json deleted file mode 100644 index e0fd3d8..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/trapdoors.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_trapdoor", - "ww_hfas:soul_trapdoor", - "ww_hfas:azalea_trapdoor" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wall_hanging_signs.json b/src/hfas/resources/data/minecraft/tags/block/wall_hanging_signs.json deleted file mode 100644 index cb695ca..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wall_hanging_signs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_wall_hanging_sign" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wall_signs.json b/src/hfas/resources/data/minecraft/tags/block/wall_signs.json deleted file mode 100644 index e0bf093..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wall_signs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_wall_sign" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_buttons.json b/src/hfas/resources/data/minecraft/tags/block/wooden_buttons.json deleted file mode 100644 index d854e4b..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wooden_buttons.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_button", - "ww_hfas:soul_button", - "ww_hfas:azalea_button" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_doors.json b/src/hfas/resources/data/minecraft/tags/block/wooden_doors.json deleted file mode 100644 index 2bc45ed..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wooden_doors.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_door", - "ww_hfas:soul_door", - "ww_hfas:azalea_door" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_fences.json b/src/hfas/resources/data/minecraft/tags/block/wooden_fences.json deleted file mode 100644 index c52925f..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wooden_fences.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence", - "ww_hfas:soul_fence", - "ww_hfas:azalea_fence" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_pressure_plates.json b/src/hfas/resources/data/minecraft/tags/block/wooden_pressure_plates.json deleted file mode 100644 index dde9ab5..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wooden_pressure_plates.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_pressure_plate", - "ww_hfas:soul_pressure_plate", - "ww_hfas:azalea_pressure_plate" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_shelves.json b/src/hfas/resources/data/minecraft/tags/block/wooden_shelves.json deleted file mode 100644 index 7a3e0de..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wooden_shelves.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_shelf" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_slabs.json b/src/hfas/resources/data/minecraft/tags/block/wooden_slabs.json deleted file mode 100644 index df411e9..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wooden_slabs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_slab", - "ww_hfas:soul_slab", - "ww_hfas:azalea_slab" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_stairs.json b/src/hfas/resources/data/minecraft/tags/block/wooden_stairs.json deleted file mode 100644 index 805944b..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wooden_stairs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_stairs", - "ww_hfas:soul_stairs", - "ww_hfas:azalea_stairs" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/block/wooden_trapdoors.json b/src/hfas/resources/data/minecraft/tags/block/wooden_trapdoors.json deleted file mode 100644 index e0fd3d8..0000000 --- a/src/hfas/resources/data/minecraft/tags/block/wooden_trapdoors.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_trapdoor", - "ww_hfas:soul_trapdoor", - "ww_hfas:azalea_trapdoor" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json b/src/hfas/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json deleted file mode 100644 index 0df4532..0000000 --- a/src/hfas/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "replace": false, - "values": [ - "#ww_hfas:water_breathing" - ] -} diff --git a/src/hfas/resources/data/minecraft/tags/item/arrows.json b/src/hfas/resources/data/minecraft/tags/item/arrows.json deleted file mode 100644 index ca12d80..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/arrows.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:tipped_arrow" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/boats.json b/src/hfas/resources/data/minecraft/tags/item/boats.json deleted file mode 100644 index 9b6b40f..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/boats.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "values": [ - { - "required": false, - "id": "ww_hfas:blaze_boat" - }, - { - "required": false, - "id": "ww_hfas:soul_boat" - }, - { - "required": false, - "id": "ww_hfas:azalea_boat" - } - ] -} diff --git a/src/hfas/resources/data/minecraft/tags/item/buttons.json b/src/hfas/resources/data/minecraft/tags/item/buttons.json deleted file mode 100644 index d854e4b..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/buttons.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_button", - "ww_hfas:soul_button", - "ww_hfas:azalea_button" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/chest_boats.json b/src/hfas/resources/data/minecraft/tags/item/chest_boats.json deleted file mode 100644 index 5f47b85..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/chest_boats.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "values": [ - { - "required": false, - "id": "ww_hfas:blaze_chest_boat" - }, - { - "required": false, - "id": "ww_hfas:soul_chest_boat" - }, - { - "required": false, - "id": "ww_hfas:azalea_chest_boat" - } - ] -} diff --git a/src/hfas/resources/data/minecraft/tags/item/doors.json b/src/hfas/resources/data/minecraft/tags/item/doors.json deleted file mode 100644 index 2bc45ed..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/doors.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_door", - "ww_hfas:soul_door", - "ww_hfas:azalea_door" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/fence_gates.json b/src/hfas/resources/data/minecraft/tags/item/fence_gates.json deleted file mode 100644 index 5924312..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/fence_gates.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence_gate", - "ww_hfas:soul_fence_gate", - "ww_hfas:azalea_fence_gate" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/hanging_signs.json b/src/hfas/resources/data/minecraft/tags/item/hanging_signs.json deleted file mode 100644 index aa2d1b9..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/hanging_signs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_hanging_sign" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/leaves.json b/src/hfas/resources/data/minecraft/tags/item/leaves.json deleted file mode 100644 index 0ac131e..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/leaves.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_leaves", - "ww_hfas:soul_leaves" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/logs.json b/src/hfas/resources/data/minecraft/tags/item/logs.json deleted file mode 100644 index e35133a..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/logs.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_log", - "ww_hfas:blaze_wood", - "ww_hfas:stripped_blaze_log", - "ww_hfas:stripped_blaze_wood", - "ww_hfas:soul_log", - "ww_hfas:soul_wood", - "ww_hfas:stripped_soul_log", - "ww_hfas:stripped_soul_wood", - "ww_hfas:azalea_log", - "ww_hfas:azalea_wood", - "ww_hfas:stripped_azalea_log", - "ww_hfas:stripped_azalea_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/logs_that_burn.json b/src/hfas/resources/data/minecraft/tags/item/logs_that_burn.json deleted file mode 100644 index e35133a..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/logs_that_burn.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_log", - "ww_hfas:blaze_wood", - "ww_hfas:stripped_blaze_log", - "ww_hfas:stripped_blaze_wood", - "ww_hfas:soul_log", - "ww_hfas:soul_wood", - "ww_hfas:stripped_soul_log", - "ww_hfas:stripped_soul_wood", - "ww_hfas:azalea_log", - "ww_hfas:azalea_wood", - "ww_hfas:stripped_azalea_log", - "ww_hfas:stripped_azalea_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/planks.json b/src/hfas/resources/data/minecraft/tags/item/planks.json deleted file mode 100644 index 7eab9b1..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/planks.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_planks", - "ww_hfas:soul_planks", - "ww_hfas:azalea_planks" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/saplings.json b/src/hfas/resources/data/minecraft/tags/item/saplings.json deleted file mode 100644 index 26a05ef..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/saplings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_sapling", - "ww_hfas:soul_sapling" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/signs.json b/src/hfas/resources/data/minecraft/tags/item/signs.json deleted file mode 100644 index e9aa7f7..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/signs.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_sign" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/trapdoors.json b/src/hfas/resources/data/minecraft/tags/item/trapdoors.json deleted file mode 100644 index e0fd3d8..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/trapdoors.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_trapdoor", - "ww_hfas:soul_trapdoor", - "ww_hfas:azalea_trapdoor" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_buttons.json b/src/hfas/resources/data/minecraft/tags/item/wooden_buttons.json deleted file mode 100644 index d854e4b..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/wooden_buttons.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_button", - "ww_hfas:soul_button", - "ww_hfas:azalea_button" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_doors.json b/src/hfas/resources/data/minecraft/tags/item/wooden_doors.json deleted file mode 100644 index 2bc45ed..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/wooden_doors.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_door", - "ww_hfas:soul_door", - "ww_hfas:azalea_door" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_fences.json b/src/hfas/resources/data/minecraft/tags/item/wooden_fences.json deleted file mode 100644 index c52925f..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/wooden_fences.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_fence", - "ww_hfas:soul_fence", - "ww_hfas:azalea_fence" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_pressure_plates.json b/src/hfas/resources/data/minecraft/tags/item/wooden_pressure_plates.json deleted file mode 100644 index dde9ab5..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/wooden_pressure_plates.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_pressure_plate", - "ww_hfas:soul_pressure_plate", - "ww_hfas:azalea_pressure_plate" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_shelves.json b/src/hfas/resources/data/minecraft/tags/item/wooden_shelves.json deleted file mode 100644 index 7a3e0de..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/wooden_shelves.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_shelf" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_slabs.json b/src/hfas/resources/data/minecraft/tags/item/wooden_slabs.json deleted file mode 100644 index df411e9..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/wooden_slabs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_slab", - "ww_hfas:soul_slab", - "ww_hfas:azalea_slab" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_stairs.json b/src/hfas/resources/data/minecraft/tags/item/wooden_stairs.json deleted file mode 100644 index 805944b..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/wooden_stairs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_stairs", - "ww_hfas:soul_stairs", - "ww_hfas:azalea_stairs" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/item/wooden_trapdoors.json b/src/hfas/resources/data/minecraft/tags/item/wooden_trapdoors.json deleted file mode 100644 index e0fd3d8..0000000 --- a/src/hfas/resources/data/minecraft/tags/item/wooden_trapdoors.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_trapdoor", - "ww_hfas:soul_trapdoor", - "ww_hfas:azalea_trapdoor" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/minecraft/tags/potion/tradeable.json b/src/hfas/resources/data/minecraft/tags/potion/tradeable.json deleted file mode 100644 index 8487bb4..0000000 --- a/src/hfas/resources/data/minecraft/tags/potion/tradeable.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "replace": false, - "values": [ - "ww_hfas:reach", - "ww_hfas:long_reach" - ] -} diff --git a/src/hfas/resources/data/neoforge/data_maps/block/strippables.json b/src/hfas/resources/data/neoforge/data_maps/block/strippables.json deleted file mode 100644 index bca011a..0000000 --- a/src/hfas/resources/data/neoforge/data_maps/block/strippables.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "values": { - "ww_hfas:azalea_log": { - "stripped_block": "ww_hfas:stripped_azalea_log" - }, - "ww_hfas:azalea_wood": { - "stripped_block": "ww_hfas:stripped_azalea_wood" - }, - "ww_hfas:blaze_log": { - "stripped_block": "ww_hfas:stripped_blaze_log" - }, - "ww_hfas:blaze_wood": { - "stripped_block": "ww_hfas:stripped_blaze_wood" - }, - "ww_hfas:soul_log": { - "stripped_block": "ww_hfas:stripped_soul_log" - }, - "ww_hfas:soul_wood": { - "stripped_block": "ww_hfas:stripped_soul_wood" - } - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_hanging_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_hanging_sign.json deleted file mode 100644 index b12d42e..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_hanging_sign.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_blaze_stripped_log": { - "conditions": { - "items": [ - { - "items": "ww_hfas:stripped_blaze_log" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:blaze_hanging_sign" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_blaze_stripped_log" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:blaze_hanging_sign" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_sign.json deleted file mode 100644 index a603ced..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_sign.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_blaze_planks": { - "conditions": { - "items": [ - { - "items": "ww_hfas:blaze_planks" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:blaze_sign" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_blaze_planks" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:blaze_sign" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_hanging_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_hanging_sign.json deleted file mode 100644 index e73b842..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_hanging_sign.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_soul_stripped_log": { - "conditions": { - "items": [ - { - "items": "ww_hfas:stripped_soul_log" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:soul_hanging_sign" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_soul_stripped_log" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:soul_hanging_sign" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_sign.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_sign.json deleted file mode 100644 index 93c92cc..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_sign.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_soul_planks": { - "conditions": { - "items": [ - { - "items": "ww_hfas:soul_planks" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:soul_sign" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_soul_planks" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:soul_sign" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_boat.json deleted file mode 100644 index 3dc39e3..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_boat.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_azalea_planks": { - "conditions": { - "items": [ - { - "items": "ww_hfas:azalea_planks" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:azalea_boat" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_azalea_planks" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:azalea_boat" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_chest_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_chest_boat.json deleted file mode 100644 index 25f7742..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/azalea_chest_boat.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_azalea_boat": { - "conditions": { - "items": [ - { - "items": "ww_hfas:azalea_boat" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:azalea_chest_boat" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_azalea_boat" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:azalea_chest_boat" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_boat.json deleted file mode 100644 index 7899eac..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_boat.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_blaze_planks": { - "conditions": { - "items": [ - { - "items": "ww_hfas:blaze_planks" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:blaze_boat" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_blaze_planks" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:blaze_boat" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_chest_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_chest_boat.json deleted file mode 100644 index ea1b322..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/blaze_chest_boat.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_blaze_boat": { - "conditions": { - "items": [ - { - "items": "ww_hfas:blaze_boat" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:blaze_chest_boat" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_blaze_boat" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:blaze_chest_boat" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_boat.json deleted file mode 100644 index 2513c20..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_boat.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_soul_planks": { - "conditions": { - "items": [ - { - "items": "ww_hfas:soul_planks" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:soul_boat" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_soul_planks" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:soul_boat" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_chest_boat.json b/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_chest_boat.json deleted file mode 100644 index db25256..0000000 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/transportation/soul_chest_boat.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "parent": "minecraft:recipes/root", - "criteria": { - "has_soul_boat": { - "conditions": { - "items": [ - { - "items": "ww_hfas:soul_boat" - } - ] - }, - "trigger": "minecraft:inventory_changed" - }, - "has_the_recipe": { - "conditions": { - "recipe": "ww_hfas:soul_chest_boat" - }, - "trigger": "minecraft:recipe_unlocked" - } - }, - "requirements": [ - [ - "has_the_recipe", - "has_soul_boat" - ] - ], - "rewards": { - "recipes": [ - "ww_hfas:soul_chest_boat" - ] - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_hanging_sign.json deleted file mode 100644 index 0303978..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_hanging_sign.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:blaze_hanging_sign" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/blaze_hanging_sign" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sign.json deleted file mode 100644 index 6c96540..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sign.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:blaze_sign" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/blaze_sign" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_hanging_sign.json deleted file mode 100644 index 63cbd85..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_hanging_sign.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:blaze_hanging_sign" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/blaze_wall_hanging_sign" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_sign.json deleted file mode 100644 index ecc76a3..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wall_sign.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:blaze_sign" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/blaze_wall_sign" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/fletching_table.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/fletching_table.json deleted file mode 100644 index a4d401d..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/fletching_table.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:fletching_table" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/fletching_table" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_blaze_sapling.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_blaze_sapling.json deleted file mode 100644 index 58909e1..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_blaze_sapling.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:flower_pot" - } - ], - "rolls": 1.0 - }, - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:blaze_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/potted_blaze_sapling" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_soul_sapling.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_soul_sapling.json deleted file mode 100644 index 0e32e13..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/potted_soul_sapling.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "minecraft:flower_pot" - } - ], - "rolls": 1.0 - }, - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:soul_sapling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/potted_soul_sapling" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_hanging_sign.json deleted file mode 100644 index f3dbb37..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_hanging_sign.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:soul_hanging_sign" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/soul_hanging_sign" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sign.json deleted file mode 100644 index b4f5967..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sign.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:soul_sign" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/soul_sign" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_hanging_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_hanging_sign.json deleted file mode 100644 index aac71f5..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_hanging_sign.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:soul_hanging_sign" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/soul_wall_hanging_sign" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_sign.json b/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_sign.json deleted file mode 100644 index 9688647..0000000 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wall_sign.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "ww_hfas:soul_sign" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "ww_hfas:blocks/soul_wall_sign" -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_boat.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_boat.json deleted file mode 100644 index 838ae63..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_boat.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "group": "boat", - "key": { - "#": "ww_hfas:azalea_planks" - }, - "pattern": [ - "# #", - "###" - ], - "result": { - "id": "ww_hfas:azalea_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/azalea_chest_boat.json b/src/hfas/resources/data/ww_hfas/recipe/azalea_chest_boat.json deleted file mode 100644 index 1933d42..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/azalea_chest_boat.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "group": "chest_boat", - "ingredients": [ - "ww_hfas:azalea_boat", - "minecraft:chest" - ], - "result": { - "id": "ww_hfas:azalea_chest_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_boat.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_boat.json deleted file mode 100644 index a305b91..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_boat.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "group": "boat", - "key": { - "#": "ww_hfas:blaze_planks" - }, - "pattern": [ - "# #", - "###" - ], - "result": { - "id": "ww_hfas:blaze_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_chest_boat.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_chest_boat.json deleted file mode 100644 index cea4e61..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_chest_boat.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "group": "chest_boat", - "ingredients": [ - "ww_hfas:blaze_boat", - "minecraft:chest" - ], - "result": { - "id": "ww_hfas:blaze_chest_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_hanging_sign.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_hanging_sign.json deleted file mode 100644 index 0d82e36..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_hanging_sign.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "group": "hanging_sign", - "key": { - "#": "ww_hfas:stripped_blaze_log", - "X": "minecraft:iron_chain" - }, - "pattern": [ - "X X", - "###", - "###" - ], - "result": { - "count": 6, - "id": "ww_hfas:blaze_hanging_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_sign.json b/src/hfas/resources/data/ww_hfas/recipe/blaze_sign.json deleted file mode 100644 index 8172341..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_sign.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "group": "sign", - "key": { - "#": "ww_hfas:blaze_planks", - "X": "minecraft:stick" - }, - "pattern": [ - "###", - "###", - " X " - ], - "result": { - "count": 3, - "id": "ww_hfas:blaze_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_boat.json b/src/hfas/resources/data/ww_hfas/recipe/soul_boat.json deleted file mode 100644 index c871897..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_boat.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "group": "boat", - "key": { - "#": "ww_hfas:soul_planks" - }, - "pattern": [ - "# #", - "###" - ], - "result": { - "id": "ww_hfas:soul_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_chest_boat.json b/src/hfas/resources/data/ww_hfas/recipe/soul_chest_boat.json deleted file mode 100644 index 14dfde6..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_chest_boat.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "type": "minecraft:crafting_shapeless", - "group": "chest_boat", - "ingredients": [ - "ww_hfas:soul_boat", - "minecraft:chest" - ], - "result": { - "id": "ww_hfas:soul_chest_boat" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_hanging_sign.json b/src/hfas/resources/data/ww_hfas/recipe/soul_hanging_sign.json deleted file mode 100644 index 2a1bad9..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_hanging_sign.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "group": "hanging_sign", - "key": { - "#": "ww_hfas:stripped_soul_log", - "X": "minecraft:iron_chain" - }, - "pattern": [ - "X X", - "###", - "###" - ], - "result": { - "count": 6, - "id": "ww_hfas:soul_hanging_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_sign.json b/src/hfas/resources/data/ww_hfas/recipe/soul_sign.json deleted file mode 100644 index 67bdf79..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_sign.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - "group": "sign", - "key": { - "#": "ww_hfas:soul_planks", - "X": "minecraft:stick" - }, - "pattern": [ - "###", - "###", - " X " - ], - "result": { - "count": 3, - "id": "ww_hfas:soul_sign" - } -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/wool_to_string.json b/src/hfas/resources/data/ww_hfas/recipe/wool_to_string.json deleted file mode 100644 index f000199..0000000 --- a/src/hfas/resources/data/ww_hfas/recipe/wool_to_string.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "type": "ww_hfas:wool_to_string" -} diff --git a/src/hfas/resources/data/ww_hfas/tags/block/azalea_logs.json b/src/hfas/resources/data/ww_hfas/tags/block/azalea_logs.json deleted file mode 100644 index 8b47bdf..0000000 --- a/src/hfas/resources/data/ww_hfas/tags/block/azalea_logs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_log", - "ww_hfas:azalea_wood", - "ww_hfas:stripped_azalea_log", - "ww_hfas:stripped_azalea_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/block/blaze_logs.json b/src/hfas/resources/data/ww_hfas/tags/block/blaze_logs.json deleted file mode 100644 index 5b0cec5..0000000 --- a/src/hfas/resources/data/ww_hfas/tags/block/blaze_logs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_log", - "ww_hfas:blaze_wood", - "ww_hfas:stripped_blaze_log", - "ww_hfas:stripped_blaze_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/block/soul_logs.json b/src/hfas/resources/data/ww_hfas/tags/block/soul_logs.json deleted file mode 100644 index aefaa6f..0000000 --- a/src/hfas/resources/data/ww_hfas/tags/block/soul_logs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "ww_hfas:soul_log", - "ww_hfas:soul_wood", - "ww_hfas:stripped_soul_log", - "ww_hfas:stripped_soul_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/item/azalea_logs.json b/src/hfas/resources/data/ww_hfas/tags/item/azalea_logs.json deleted file mode 100644 index 8b47bdf..0000000 --- a/src/hfas/resources/data/ww_hfas/tags/item/azalea_logs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "ww_hfas:azalea_log", - "ww_hfas:azalea_wood", - "ww_hfas:stripped_azalea_log", - "ww_hfas:stripped_azalea_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/item/blaze_logs.json b/src/hfas/resources/data/ww_hfas/tags/item/blaze_logs.json deleted file mode 100644 index 5b0cec5..0000000 --- a/src/hfas/resources/data/ww_hfas/tags/item/blaze_logs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "ww_hfas:blaze_log", - "ww_hfas:blaze_wood", - "ww_hfas:stripped_blaze_log", - "ww_hfas:stripped_blaze_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/item/soul_logs.json b/src/hfas/resources/data/ww_hfas/tags/item/soul_logs.json deleted file mode 100644 index aefaa6f..0000000 --- a/src/hfas/resources/data/ww_hfas/tags/item/soul_logs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "values": [ - "ww_hfas:soul_log", - "ww_hfas:soul_wood", - "ww_hfas:stripped_soul_log", - "ww_hfas:stripped_soul_wood" - ] -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/blaze_tree_placed.json b/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/blaze_tree_placed.json deleted file mode 100644 index 1439cda..0000000 --- a/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/blaze_tree_placed.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "feature": "ww_hfas:blaze_tree", - "placement": [] -} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/soul_tree_placed.json b/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/soul_tree_placed.json deleted file mode 100644 index b6396b3..0000000 --- a/src/hfas/resources/data/ww_hfas/worldgen/placed_feature/soul_tree_placed.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "feature": "ww_hfas:soul_tree", - "placement": [] -} \ No newline at end of file diff --git a/src/smoke/java/org/polaris2023/wildwind/smoke/ClientInstallationTests.java b/src/smoke/java/org/polaris2023/wildwind/smoke/ClientInstallationTests.java new file mode 100644 index 0000000..a4fd89c --- /dev/null +++ b/src/smoke/java/org/polaris2023/wildwind/smoke/ClientInstallationTests.java @@ -0,0 +1,37 @@ +package org.polaris2023.wildwind.smoke; + +import com.mojang.logging.LogUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.resources.Identifier; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.ModList; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; + +/** Opt-in client resource-load check; never packaged in a release mod. */ +@EventBusSubscriber(modid = "wild_wind_smoke", value = Dist.CLIENT) +public final class ClientInstallationTests { + @SubscribeEvent + public static void tick(ClientTickEvent.Post event) { + if (!Boolean.getBoolean("wildwind.clientSmoke")) return; + var client = Minecraft.getInstance(); + if (client.gui.overlay() != null || !(client.gui.screen() instanceof TitleScreen)) return; + require(client, "wild_wind_core:textures/entity/signs/azalea.png"); + if (ModList.get().isLoaded("wild_wind_wilderness")) { + require(client, "wild_wind_wilderness:textures/entity/pig/pig_muddy.png"); + require(client, "wild_wind_wilderness:textures/entity/pig/pig_muddy_baby.png"); + require(client, "wild_wind_wilderness:textures/entity/piranha.png"); + require(client, "wild_wind_wilderness:geckolib/models/entity/mudcrab.geo.json"); + } + LogUtils.getLogger().info("Wild Wind client installation check passed"); + client.stop(); + } + + private static void require(Minecraft client, String id) { + if (client.getResourceManager().getResource(Identifier.parse(id)).isEmpty()) { + throw new IllegalStateException("Missing module resource: " + id); + } + } +} diff --git a/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java b/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java new file mode 100644 index 0000000..b96247d --- /dev/null +++ b/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java @@ -0,0 +1,53 @@ +package org.polaris2023.wildwind.smoke; + +import java.util.Arrays; +import java.util.Set; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.world.item.CreativeModeTab; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModList; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.registries.DeferredRegister; +import org.polaris2023.wildwind.core.registry.ModCreativeTabs; + +/** Boots each supported installation using its actual release JAR dependencies. */ +@Mod("wild_wind_smoke") +public final class InstallationTests { + public InstallationTests(IEventBus bus) { + var functions = DeferredRegister.>create(Registries.TEST_FUNCTION, "wild_wind_smoke"); + functions.register("installation", () -> InstallationTests::installation); + functions.register(bus); + } + + private static void check(GameTestHelper h, boolean condition, String message) { + h.assertTrue(condition, Component.literal(message)); + } + + private static void installation(GameTestHelper h) { + Set expected = Arrays.stream(System.getProperty("wildwind.testModules").split(",")).collect(Collectors.toSet()); + for (String module : new String[]{"core", "wilderness", "barren"}) { + check(h, ModList.get().isLoaded("wild_wind_" + module) == expected.contains(module), "Loaded module: " + module); + } + check(h, ModList.get().isLoaded("geckolib") == expected.contains("wilderness"), "Only Wilderness needs GeckoLib"); + check(h, !ModList.get().isLoaded("ww_hfas") && !ModList.get().isLoaded("ww_structures"), "Legacy entrypoints must not load"); + var tab = ModCreativeTabs.WILD_WIND.get(); + tab.buildContents(new CreativeModeTab.ItemDisplayParameters(h.getLevel().enabledFeatures(), true, h.getLevel().registryAccess())); + for (String path : new String[]{"azalea_planks", "azalea_sign", "azalea_hanging_sign", "azalea_shelf", "kiln", "duckweed"}) { + check(h, tab.contains(BuiltInRegistries.ITEM.getValue(Identifier.parse("wild_wind_core:" + path)).getDefaultInstance()), "Core item in tab: " + path); + } + for (String path : new String[]{"blaze_planks", "soul_planks", "scorched_dirt", "muddy_pig_spawn_egg"}) { + var id = Identifier.parse("wild_wind_wilderness:" + path); + check(h, BuiltInRegistries.ITEM.containsKey(id) == expected.contains("wilderness"), "Wilderness ownership: " + path); + if (expected.contains("wilderness")) check(h, tab.contains(BuiltInRegistries.ITEM.getValue(id).getDefaultInstance()), "Wilderness tab entry: " + path); + } + check(h, BuiltInRegistries.BLOCK.containsKey(Identifier.parse("wild_wind_barren:tiny_cactus")) == expected.contains("barren"), "Cactus belongs only to Barren"); + check(h, BuiltInRegistries.BLOCK.keySet().stream().noneMatch(id -> id.getNamespace().startsWith("wild_wind_") && id.getPath().equals("fletching_table")), "Custom fletching table removed"); + h.succeed(); + } +} diff --git a/src/hfas/gametest/resources/data/ww_hfas_tests/structure/empty.nbt b/src/smoke/resources/data/wild_wind_smoke/structure/empty.nbt similarity index 100% rename from src/hfas/gametest/resources/data/ww_hfas_tests/structure/empty.nbt rename to src/smoke/resources/data/wild_wind_smoke/structure/empty.nbt diff --git a/src/smoke/resources/data/wild_wind_smoke/test_instance/installation.json b/src/smoke/resources/data/wild_wind_smoke/test_instance/installation.json new file mode 100644 index 0000000..182f139 --- /dev/null +++ b/src/smoke/resources/data/wild_wind_smoke/test_instance/installation.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "function": "wild_wind_smoke:installation", + "environment": "minecraft:default", + "structure": "wild_wind_smoke:empty", + "max_ticks": 100 +} \ No newline at end of file diff --git a/src/templates/META-INF/neoforge.mods.toml b/src/templates/META-INF/neoforge.mods.toml index 2a98073..5efef7e 100644 --- a/src/templates/META-INF/neoforge.mods.toml +++ b/src/templates/META-INF/neoforge.mods.toml @@ -1,105 +1,37 @@ -# This is an example neoforge.mods.toml file. It contains the data relating to the loading mods. -# There are several mandatory fields (#mandatory), and many more that are optional (#optional). -# The overall format is standard TOML format, v0.5.0. -# Note that there are a couple of TOML lists in this file. -# Find more information on toml format here: https://github.com/toml-lang/toml - -# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. -# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. license="${mod_license}" - -# A URL to refer people to when problems occur with this mod -#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional - -# A list of mods - how many allowed here is determined by the individual mod loader -[[mods]] #mandatory - -# The modid of the mod -modId="${mod_id}" #mandatory - -# The version number of the mod -version="${mod_version}" #mandatory - -# A display name for the mod -displayName="${mod_name}" #mandatory - -# A URL to query for updates for this mod. See the JSON update specification https://docs.neoforged.net/docs/misc/updatechecker/ -#updateJSONURL="https://change.me.example.invalid/updates.json" #optional - -# A URL for the "homepage" for this mod, displayed in the mod UI -#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional - -# A file name (in the root of the mod JAR) containing a logo for display -#logoFile="examplemod.png" #optional - -# A text field displayed in the mod UI -#credits="" #optional - -# The authors of the mod, displayed in the mod UI (optional) +[[mods]] +modId="${mod_id}" +version="${mod_version}" +displayName="${mod_name}" authors="baka4n,viola-Siemens,ENC-Euphony,wdog5734" +description='''${mod_name} for Minecraft 26.2.''' -# The description text for the mod (multi line!) (#mandatory) -description=''' -${mod_description} -''' - -# The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded. -[[mixins]] -config="${mod_id}.mixins.json" - -# The [[accessTransformers]] block allows you to declare where your AT file is. -# If this block is omitted, a fallback attempt will be made to load an AT from META-INF/accesstransformer.cfg -#[[accessTransformers]] -#file="META-INF/accesstransformer.cfg" +${module_mixins} -# The coremods config file path is not configurable and is always loaded from META-INF/coremods.json - -# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. -[[dependencies.${mod_id}]] #optional - # the modid of the dependency - modId="neoforge" #mandatory - # The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). - # 'required' requires the mod to exist, 'optional' does not - # 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning - type="required" #mandatory - # Optional field describing why the dependency is required or why it is incompatible - # reason="..." - # The version range of the dependency - versionRange="[${neo_version},)" #mandatory - # An ordering relationship for the dependency. - # BEFORE - This mod is loaded BEFORE the dependency - # AFTER - This mod is loaded AFTER the dependency - ordering="NONE" - # Side this dependency is applied on - BOTH, CLIENT, or SERVER - side="BOTH" - -# Here's another dependency [[dependencies.${mod_id}]] - modId="minecraft" - type="required" - # This version range declares a minimum of the current minecraft version up to but not including the next major version - versionRange="${minecraft_version_range}" - ordering="NONE" - side="BOTH" - +modId="neoforge" +type="required" +versionRange="[${neo_version},)" +ordering="NONE" +side="BOTH" [[dependencies.${mod_id}]] - modId="geckolib" - type="required" - versionRange="[${geocklib_version},)" - ordering="NONE" - side="BOTH" +modId="minecraft" +type="required" +versionRange="${minecraft_version_range}" +ordering="NONE" +side="BOTH" -# Features are specific properties of the game environment, that you may want to declare you require. This example declares -# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't -# stop your mod loading on the server for example. -#[features.${mod_id}] -#openGLVersion="[3.2,)" +${module_dependencies} -# Structure generation is now registered by the main mod; loading the old standalone -# mod as well would register the same structure types twice. [[dependencies.${mod_id}]] - modId="ww_structures" - type="incompatible" - reason="Structure generation is included in Wild Wind. Remove the old standalone ww_structures JAR." - ordering="NONE" - side="BOTH" +modId="ww_hfas" +type="incompatible" +reason="Replace the old unified Wild Wind mod with the modular JARs." +ordering="NONE" +side="BOTH" +[[dependencies.${mod_id}]] +modId="ww_structures" +type="incompatible" +reason="Structure generation is included in Wild Wind:Core." +ordering="NONE" +side="BOTH" diff --git a/src/structures/gametest/config/ww_structures/definitions/blocked.json b/src/verification/config/ww_structures/definitions/blocked.json similarity index 100% rename from src/structures/gametest/config/ww_structures/definitions/blocked.json rename to src/verification/config/ww_structures/definitions/blocked.json diff --git a/src/structures/gametest/config/ww_structures/definitions/disabled.json b/src/verification/config/ww_structures/definitions/disabled.json similarity index 100% rename from src/structures/gametest/config/ww_structures/definitions/disabled.json rename to src/verification/config/ww_structures/definitions/disabled.json diff --git a/src/structures/gametest/config/ww_structures/definitions/smoke.json b/src/verification/config/ww_structures/definitions/smoke.json similarity index 100% rename from src/structures/gametest/config/ww_structures/definitions/smoke.json rename to src/verification/config/ww_structures/definitions/smoke.json diff --git a/src/structures/gametest/config/ww_structures/templates/wide_ruins.nbt b/src/verification/config/ww_structures/templates/wide_ruins.nbt similarity index 100% rename from src/structures/gametest/config/ww_structures/templates/wide_ruins.nbt rename to src/verification/config/ww_structures/templates/wide_ruins.nbt diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java similarity index 81% rename from src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java rename to src/verification/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java index 9009c98..827e697 100644 --- a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/AzaleaAndArrowGameTests.java @@ -43,13 +43,11 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.entity.ReachArrow; -import org.polaris2023.wildwind.hfas.registry.ModEntities; -import org.polaris2023.wildwind.hfas.registry.ModItems; -import org.polaris2023.wildwind.hfas.registry.ModMobEffects; -import org.polaris2023.wildwind.hfas.registry.ModPotions; +import org.polaris2023.wildwind.core.CoreMod; +import org.polaris2023.wildwind.wilderness.entity.ReachArrow; +import org.polaris2023.wildwind.wilderness.registry.ModEntities; +import org.polaris2023.wildwind.wilderness.registry.ModMobEffects; +import org.polaris2023.wildwind.wilderness.registry.ModPotions; final class AzaleaAndArrowGameTests { private static void check(GameTestHelper h, boolean value, String message) { @@ -58,8 +56,8 @@ private static void check(GameTestHelper h, boolean value, String message) { static void signs(GameTestHelper h) { var level = h.getLevel(); - var blocks = List.of(ModBlocks.AZALEA_SIGN.get(), ModBlocks.AZALEA_WALL_SIGN.get(), - ModBlocks.AZALEA_HANGING_SIGN.get(), ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); + var blocks = List.of(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get(), org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_SIGN.get(), + org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get(), org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_WALL_HANGING_SIGN.get()); int x = 1; for (var block : blocks) { var rel = new BlockPos(x++, 2, 2); @@ -84,10 +82,10 @@ static void signs(GameTestHelper h) { check(h, !Block.getDrops(state, level, pos, sign).isEmpty(), "Every sign variant must drop its item"); check(h, state.hasProperty(BlockStateProperties.WATERLOGGED), "Signs must support waterlogging"); } - check(h, ModBlocks.AZALEA_SIGN.get().asItem().getDefaultInstance().getMaxStackSize() == 16 - && ModBlocks.AZALEA_HANGING_SIGN.get().asItem().getDefaultInstance().getMaxStackSize() == 16, "Signs stack to 16"); - check(h, new ItemStack(ModBlocks.AZALEA_SIGN.get()).getBurnTime(null, level.fuelValues()) == 200 - && new ItemStack(ModBlocks.AZALEA_HANGING_SIGN.get()).getBurnTime(null, level.fuelValues()) == 800, "Sign fuel values must match specification"); + check(h, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get().asItem().getDefaultInstance().getMaxStackSize() == 16 + && org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get().asItem().getDefaultInstance().getMaxStackSize() == 16, "Signs stack to 16"); + check(h, new ItemStack(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SIGN.get()).getBurnTime(null, level.fuelValues()) == 200 + && new ItemStack(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_HANGING_SIGN.get()).getBurnTime(null, level.fuelValues()) == 800, "Sign fuel values must match specification"); h.succeed(); } @@ -95,7 +93,7 @@ static void shelf(GameTestHelper h) { var level = h.getLevel(); var rel = new BlockPos(3, 2, 3); var pos = h.absolutePos(rel); - var state = ModBlocks.AZALEA_SHELF.get().defaultBlockState().setValue(ShelfBlock.FACING, Direction.NORTH); + var state = org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF.get().defaultBlockState().setValue(ShelfBlock.FACING, Direction.NORTH); level.setBlock(pos, state, 3); var shelf = (ShelfBlockEntity) level.getBlockEntity(pos); check(h, shelf != null && shelf.getType().isValid(state), "Shelf must use a valid native container"); @@ -122,7 +120,7 @@ static void shelf(GameTestHelper h) { check(h, HopperBlockEntity.suckInItems(level, hopper) && hopper.getItem(0).is(Items.DIAMOND), "Hopper must extract leftmost occupied slot"); check(h, level.getCapability(net.neoforged.neoforge.capabilities.Capabilities.Item.BLOCK, pos, Direction.UP) != null, "Shelf must expose native item capability"); check(h, state.getFlammability(level, pos, Direction.UP) == 20 && state.getFireSpreadSpeed(level, pos, Direction.UP) == 30, "Shelf fire values must be 30/20"); - check(h, new ItemStack(ModBlocks.AZALEA_SHELF.get()).getBurnTime(null, level.fuelValues()) == 300, "Shelf fuel value must be 300"); + check(h, new ItemStack(org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF.get()).getBurnTime(null, level.fuelValues()) == 300, "Shelf fuel value must be 300"); h.succeed(); } @@ -135,12 +133,12 @@ static void shelfChain(GameTestHelper h) { } for (int x = 1; x <= count; x++) { h.setBlock(x, 1, 3, Blocks.REDSTONE_BLOCK); - h.setBlock(x, 2, 3, ModBlocks.AZALEA_SHELF.get().defaultBlockState() + h.setBlock(x, 2, 3, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF.get().defaultBlockState() .setValue(ShelfBlock.FACING, Direction.NORTH).setValue(ShelfBlock.POWERED, true)); } var rel = new BlockPos(1, 2, 3); var pos = h.absolutePos(rel); - check(h, ModBlocks.AZALEA_SHELF.get().getAllBlocksConnectedTo(level, pos).size() == count, "Powered shelf chain must connect up to three shelves"); + check(h, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_SHELF.get().getAllBlocksConnectedTo(level, pos).size() == count, "Powered shelf chain must connect up to three shelves"); var player = h.makeMockPlayer(GameType.SURVIVAL); for (int slot = 0; slot < 9; slot++) player.getInventory().setItem(slot, new ItemStack(Items.DIAMOND, slot + 1)); h.useBlock(rel, player, new BlockHitResult(new Vec3(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ()), Direction.NORTH, pos, false)); @@ -162,11 +160,11 @@ static void arrows(GameTestHelper h) { var input = CraftingInput.of(3, 3, slots); var recipe = level.recipeAccess().getRecipeFor(RecipeType.CRAFTING, input, level).orElseThrow(); var result = recipe.value().assemble(input); - check(h, result.is(ModItems.TIPPED_ARROW.get()) && result.getCount() == 8, "Vanilla surround recipe must produce eight mod Reach arrows"); + check(h, result.is(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get()) && result.getCount() == 8, "Vanilla surround recipe must produce eight mod Reach arrows"); check(h, result.is(ItemTags.ARROWS), "Reach arrows must be valid bow and crossbow ammunition"); - var arrow = ModItems.TIPPED_ARROW.get().createArrow(level, result, owner, new ItemStack(Items.BOW)); + var arrow = org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get().createArrow(level, result, owner, new ItemStack(Items.BOW)); check(h, arrow.getType() == ModEntities.REACH_ARROW.get() && arrow.getOwner() == owner, "Bow must spawn the custom arrow type with owner"); - check(h, !ModItems.TIPPED_ARROW.get().isInfinite(result, new ItemStack(Items.BOW), owner), "Infinity must not save potion arrows"); + check(h, !org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get().isInfinite(result, new ItemStack(Items.BOW), owner), "Infinity must not save potion arrows"); var hitArrow = new TestArrow(level, h.absoluteVec(new Vec3(2.5, 2.5, 2.5)), result); target.removeAllEffects(); hitArrow.hit(target); @@ -174,15 +172,15 @@ static void arrows(GameTestHelper h) { check(h, target.getEffect(ModMobEffects.REACH).getDuration() == expected, "Arrow must apply exactly 450/1200 ticks of Reach"); h.setBlock(2, 2, 2, Blocks.STONE); for (int tick = 0; tick < 599; tick++) hitArrow.tick(); - check(h, hitArrow.getPickupItemStackOrigin().is(ModItems.TIPPED_ARROW.get()), "Potion must remain before 600 ground ticks"); + check(h, hitArrow.getPickupItemStackOrigin().is(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get()), "Potion must remain before 600 ground ticks"); hitArrow.tick(); check(h, hitArrow.getPickupItemStackOrigin().is(Items.ARROW) && hitArrow.getColor() == -1, "At 600 ground ticks pickup must become an ordinary arrow"); } - check(h, DispenserBlock.DISPENSER_REGISTRY.containsKey(ModItems.TIPPED_ARROW.get()), "Dispenser projectile behavior must be registered"); - var dispensed = ModItems.TIPPED_ARROW.get().asProjectile(level, Vec3.ZERO, new ItemStack(ModItems.TIPPED_ARROW.get()), Direction.NORTH); + check(h, DispenserBlock.DISPENSER_REGISTRY.containsKey(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get()), "Dispenser projectile behavior must be registered"); + var dispensed = org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get().asProjectile(level, Vec3.ZERO, new ItemStack(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get()), Direction.NORTH); check(h, dispensed.getType() == ModEntities.REACH_ARROW.get() && ((AbstractArrow) dispensed).pickup == AbstractArrow.Pickup.ALLOWED, "Dispensed arrows must be recoverable custom arrows"); var poison = PotionContents.createItemStack(Items.TIPPED_ARROW, Potions.POISON); - check(h, org.polaris2023.wildwind.hfas.arrow.ReachArrows.convert(poison) == poison, "Other potion arrows must remain vanilla"); + check(h, org.polaris2023.wildwind.wilderness.arrow.ReachArrows.convert(poison) == poison, "Other potion arrows must remain vanilla"); h.succeed(); } @@ -211,7 +209,7 @@ static void acquisition(GameTestHelper h) { && offer.getCostB().is(Items.ARROW) && offer.getCostB().getCount() == 5 && offer.getResult().getCount() == 5, "Fletcher potion-arrow cost must remain two emeralds plus five arrows for five arrows"); var result = offer.getResult(); - if (result.is(ModItems.TIPPED_ARROW.get())) { + if (result.is(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get())) { var potion = result.get(DataComponents.POTION_CONTENTS).potion().orElseThrow(); normal |= potion.is(ModPotions.REACH.getKey()); longReach |= potion.is(ModPotions.LONG_REACH.getKey()); @@ -228,7 +226,7 @@ static void acquisition(GameTestHelper h) { var results = gift.getRandomItems(giftParams, random); check(h, results.size() <= 1, "Reach gift must join the existing random choice, not add an extra gift"); for (var result : results) { - reachGift |= result.is(ModItems.TIPPED_ARROW.get()); + reachGift |= result.is(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get()); vanillaGift |= result.is(Items.ARROW) || result.is(Items.TIPPED_ARROW); } } diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java similarity index 98% rename from src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java rename to src/verification/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java index aadd37d..fcc604e 100644 --- a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/FluidEntityRulesGameTests.java @@ -23,9 +23,9 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.CommonHooks; -import org.polaris2023.wildwind.hfas.effect.FluidEffects; -import org.polaris2023.wildwind.hfas.effect.ModEffects; -import org.polaris2023.wildwind.hfas.entity.ModEntityTypeTags; +import org.polaris2023.wildwind.wilderness.effect.FluidEffects; +import org.polaris2023.wildwind.wilderness.effect.ModEffects; +import org.polaris2023.wildwind.wilderness.entity.ModEntityTypeTags; final class FluidEntityRulesGameTests { private FluidEntityRulesGameTests() {} @@ -158,7 +158,7 @@ static void run(GameTestHelper h) { private static void assertWhitelist(GameTestHelper h, TagKey> tag, String vanillaNames) { Set expected = new HashSet<>(); for (String name : vanillaNames.strip().split("\\s+")) expected.add("minecraft:" + name); - expected.add("ww_hfas:muddy_pig"); + expected.add("wild_wind_wilderness:muddy_pig"); Set actual = new HashSet<>(); for (var holder : h.getLevel().registryAccess().lookupOrThrow(Registries.ENTITY_TYPE).getOrThrow(tag)) { actual.add(BuiltInRegistries.ENTITY_TYPE.getKey(holder.value()).toString()); diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java similarity index 98% rename from src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java rename to src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java index 872ff61..992cc88 100644 --- a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java @@ -34,15 +34,15 @@ import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.level.BlockDropsEvent; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.effect.ModEffects; -import org.polaris2023.wildwind.hfas.enchantment.MeltingEnchantment; -import org.polaris2023.wildwind.hfas.event.CobwebBreaking; -import org.polaris2023.wildwind.hfas.recipe.WoolToStringRecipe; +import org.polaris2023.wildwind.wilderness.effect.ModEffects; +import org.polaris2023.wildwind.core.enchantment.MeltingEnchantment; +import org.polaris2023.wildwind.core.event.CobwebBreaking; +import org.polaris2023.wildwind.core.recipe.WoolToStringRecipe; public final class GameplayGameTests { private GameplayGameTests() {} public static void register(IEventBus bus) { - DeferredRegister> tests = DeferredRegister.create(Registries.TEST_FUNCTION, "ww_hfas_tests"); + DeferredRegister> tests = DeferredRegister.create(Registries.TEST_FUNCTION, "wild_wind_tests"); tests.register("wool_recipe", () -> GameplayGameTests::woolRecipe); tests.register("crafter_shears", () -> GameplayGameTests::crafterShears); tests.register("fluid_effects", () -> GameplayGameTests::fluidEffects); diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java similarity index 92% rename from src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java rename to src/verification/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java index ee01637..d0abbf2 100644 --- a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/KilnGameTests.java @@ -25,16 +25,15 @@ import net.minecraft.world.level.levelgen.structure.templatesystem.LiquidSettings; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import org.polaris2023.wildwind.hfas.worldgen.MasonKilnProcessor; +import org.polaris2023.wildwind.core.worldgen.MasonKilnProcessor; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.AbstractFurnaceBlock; import net.minecraft.world.level.block.entity.BlockEntity; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.block.entity.KilnBlockEntity; -import org.polaris2023.wildwind.hfas.recipe.KilnRecipes; +import org.polaris2023.wildwind.core.block.entity.KilnBlockEntity; +import org.polaris2023.wildwind.core.recipe.KilnRecipes; final class KilnGameTests { private KilnGameTests() {} @@ -45,12 +44,12 @@ private static void check(GameTestHelper h, boolean ok, String message) { static void cooking(GameTestHelper h) { var pos = h.absolutePos(new net.minecraft.core.BlockPos(2, 1, 2)); - h.setBlock(2, 1, 2, ModBlocks.KILN.get()); + h.setBlock(2, 1, 2, org.polaris2023.wildwind.core.block.ModBlocks.KILN.get()); BlockEntity raw = h.getLevel().getBlockEntity(pos); check(h, raw instanceof KilnBlockEntity, "Kiln must create its block entity"); var kiln = (KilnBlockEntity) raw; var state = kiln.getBlockState(); - check(h, state.getDestroySpeed(h.getLevel(), pos) == 3.5F && ModBlocks.KILN.get().getExplosionResistance() == 3.5F, + check(h, state.getDestroySpeed(h.getLevel(), pos) == 3.5F && org.polaris2023.wildwind.core.block.ModBlocks.KILN.get().getExplosionResistance() == 3.5F, "Kiln hardness and blast resistance must both be 3.5"); check(h, state.getPistonPushReaction() == net.minecraft.world.level.material.PushReaction.BLOCK && state.isRedstoneConductor(h.getLevel(), pos) && state.isSuffocating(h.getLevel(), pos), @@ -60,7 +59,7 @@ ItemStack.EMPTY, new ItemStack(Items.BRICK), ItemStack.EMPTY, new ItemStack(Items.BRICK), new ItemStack(Items.FURNACE), new ItemStack(Items.BRICK), new ItemStack(Items.PACKED_MUD), new ItemStack(Items.PACKED_MUD), new ItemStack(Items.PACKED_MUD))); check(h, h.getLevel().recipeAccess().getRecipeFor(net.minecraft.world.item.crafting.RecipeType.CRAFTING, recipeInput, h.getLevel()) - .orElseThrow().value().assemble(recipeInput).is(ModBlocks.KILN.get().asItem()), "Requested kiln crafting pattern must work"); + .orElseThrow().value().assemble(recipeInput).is(org.polaris2023.wildwind.core.block.ModBlocks.KILN.get().asItem()), "Requested kiln crafting pattern must work"); kiln.setItem(0, new ItemStack(Items.CACTUS, 2)); kiln.setItem(1, new ItemStack(Items.COAL)); check(h, KilnRecipes.find(h.getLevel(), kiln.getItem(0)).isPresent(), "Cactus must be kiln-smeltable"); @@ -74,8 +73,8 @@ ItemStack.EMPTY, new ItemStack(Items.BRICK), ItemStack.EMPTY, } tick(h, kiln, 99); check(h, kiln.getItem(2).isEmpty(), "Nothing may finish before tick 100"); - var ticker = ModBlocks.KILN.get().getTicker(h.getLevel(), state, - org.polaris2023.wildwind.hfas.block.entity.ModBlockEntities.KILN.get()); + var ticker = org.polaris2023.wildwind.core.block.ModBlocks.KILN.get().getTicker(h.getLevel(), state, + org.polaris2023.wildwind.core.block.entity.ModBlockEntities.KILN.get()); check(h, ticker != null, "Kiln must have a registered server ticker"); ticker.tick(h.getLevel(), pos, h.getLevel().getBlockState(pos), kiln); check(h, kiln.getItem(0).getCount() == 1, "Kiln must consume exactly one input after 100 ticks"); @@ -124,7 +123,7 @@ private static void tick(GameTestHelper h, KilnBlockEntity kiln, int ticks) { static void inventory(GameTestHelper h) { var level = h.getLevel(); var pos = h.absolutePos(new BlockPos(3, 2, 3)); - h.setBlock(3, 2, 3, ModBlocks.KILN.get()); + h.setBlock(3, 2, 3, org.polaris2023.wildwind.core.block.ModBlocks.KILN.get()); var kiln = (KilnBlockEntity) level.getBlockEntity(pos); check(h, Arrays.equals(kiln.getSlotsForFace(Direction.UP), new int[]{0}) && Arrays.equals(kiln.getSlotsForFace(Direction.DOWN), new int[]{2, 1}) @@ -156,7 +155,7 @@ static void inventory(GameTestHelper h) { check(h, kiln.getBlockState().getAnalogOutputSignal(level, pos, Direction.NORTH) == 15, "Comparator must count all three slots"); kiln.clearContent(); var player = connectedPlayer(h); - var named = new ItemStack(ModBlocks.KILN.get()); + var named = new ItemStack(org.polaris2023.wildwind.core.block.ModBlocks.KILN.get()); named.set(DataComponents.CUSTOM_NAME, Component.literal("Test kiln")); named.set(DataComponents.LOCK, new LockCode(ItemPredicate.Builder.item() .of(level.registryAccess().lookupOrThrow(Registries.ITEM), Items.BRICK).build())); @@ -179,13 +178,13 @@ static void inventory(GameTestHelper h) { tick(h, kiln, 100); var state = kiln.getBlockState(); check(h, Block.getDrops(state, level, pos, kiln, player, new ItemStack(Items.WOODEN_PICKAXE)).stream() - .anyMatch(stack -> stack.is(ModBlocks.KILN.get().asItem())), "Wooden pickaxe must allow kiln loot"); + .anyMatch(stack -> stack.is(org.polaris2023.wildwind.core.block.ModBlocks.KILN.get().asItem())), "Wooden pickaxe must allow kiln loot"); check(h, !player.hasCorrectToolForDrops(state), "A held brick must not qualify for kiln drops"); player.setItemInHand(InteractionHand.MAIN_HAND, new ItemStack(Items.WOODEN_PICKAXE)); check(h, player.hasCorrectToolForDrops(state), "Wooden pickaxe must qualify for kiln drops"); level.destroyBlock(pos, true, player); var dropped = level.getEntitiesOfClass(ItemEntity.class, new AABB(pos).inflate(2)); - check(h, dropped.stream().anyMatch(e -> e.getItem().is(ModBlocks.KILN.get().asItem())) + check(h, dropped.stream().anyMatch(e -> e.getItem().is(org.polaris2023.wildwind.core.block.ModBlocks.KILN.get().asItem())) && dropped.stream().anyMatch(e -> e.getItem().is(Items.DYE.green())), "Breaking must drop the kiln and its inventory"); check(h, !level.getEntitiesOfClass(ExperienceOrb.class, new AABB(pos).inflate(2)).isEmpty(), "Breaking must release stored experience"); h.succeed(); @@ -217,7 +216,7 @@ static void villages(GameTestHelper h) { "Mason house must place through the real pool path: " + house.getKey()); var kilnPos = net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate .calculateRelativePosition(settings, house.getValue().target()).offset(origin); - check(h, level.getBlockState(kilnPos).is(ModBlocks.KILN.get()) && level.getBlockEntity(kilnPos) instanceof KilnBlockEntity, + check(h, level.getBlockState(kilnPos).is(org.polaris2023.wildwind.core.block.ModBlocks.KILN.get()) && level.getBlockEntity(kilnPos) instanceof KilnBlockEntity, "Every mason house rotation must contain a functional kiln: " + house.getKey() + " " + rotation); check(h, level.getBlockState(kilnPos).getValue(AbstractFurnaceBlock.FACING) == rotation.rotate(house.getValue().facing()), "Kiln facing must rotate with its house"); diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java similarity index 95% rename from src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java rename to src/verification/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java index e7dab63..93b02ec 100644 --- a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/MuddyPigGameTests.java @@ -17,15 +17,15 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.wilderness.registry.ModEntities; import org.polaris2023.wildwind.structures.test.StructureGameTests; -@Mod("ww_hfas_tests") +@Mod("wild_wind_tests") public final class MuddyPigGameTests { public MuddyPigGameTests(IEventBus bus) { StructureGameTests.register(bus); GameplayGameTests.register(bus); - DeferredRegister> functions = DeferredRegister.create(Registries.TEST_FUNCTION, "ww_hfas_tests"); + DeferredRegister> functions = DeferredRegister.create(Registries.TEST_FUNCTION, "wild_wind_tests"); functions.register("entity", () -> MuddyPigGameTests::entity); functions.register("spawning", () -> MuddyPigGameTests::spawning); functions.register(bus); @@ -44,7 +44,7 @@ private static void entity(GameTestHelper helper) { "Muddy pig must receive vanilla pig attributes"); check(helper, pig.isFood(Items.CARROT.getDefaultInstance()) && !pig.isFood(Items.WHEAT.getDefaultInstance()), "Muddy pig must use vanilla pig food tag"); - check(helper, SpawnEggItem.getType(org.polaris2023.wildwind.hfas.registry.ModItems.MUDDY_PIG_SPAWN_EGG.toStack()) == type, + check(helper, SpawnEggItem.getType(org.polaris2023.wildwind.wilderness.registry.ModItems.MUDDY_PIG_SPAWN_EGG.toStack()) == type, "Spawn egg entity component must point to muddy pig"); var baby = pig.getBreedOffspring(level, partner); check(helper, baby != null && baby.getType() == type, "Breeding must create a muddy pig rather than vanilla pig"); @@ -57,7 +57,7 @@ private static void entity(GameTestHelper helper) { vanilla.setInLove(null); check(helper, !pig.canMate(vanilla) && !vanilla.canMate(pig), "Vanilla pigs must remain a separate breeding species"); var eggBaby = SpawnEggItem.spawnOffspringFromSpawnEgg(helper.makeMockServerPlayerInLevel(), pig, - type, level, pig.position(), org.polaris2023.wildwind.hfas.registry.ModItems.MUDDY_PIG_SPAWN_EGG.toStack()); + type, level, pig.position(), org.polaris2023.wildwind.wilderness.registry.ModItems.MUDDY_PIG_SPAWN_EGG.toStack()); check(helper, eggBaby.isPresent() && eggBaby.get().isBaby() && eggBaby.get().getType() == type, "Using the spawn egg on an adult must create a muddy pig baby"); check(helper, level.getServer().reloadableRegistries().getLootTable(pig.getLootTable().orElseThrow()) diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java similarity index 87% rename from src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java rename to src/verification/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java index bec52e5..98964bf 100644 --- a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/SkeletonAndFarmlandGameTests.java @@ -24,11 +24,9 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.FarmlandBlock; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.block.ModBlocks; -import org.polaris2023.wildwind.hfas.registry.ModCreativeTabs; -import org.polaris2023.wildwind.hfas.registry.ModItems; -import org.polaris2023.wildwind.hfas.registry.ModPotions; +import org.polaris2023.wildwind.core.CoreMod; +import org.polaris2023.wildwind.core.registry.ModCreativeTabs; +import org.polaris2023.wildwind.wilderness.registry.ModPotions; final class SkeletonAndFarmlandGameTests { private SkeletonAndFarmlandGameTests() {} @@ -123,15 +121,15 @@ static void creativeTab(GameTestHelper h) { var params = new CreativeModeTab.ItemDisplayParameters(h.getLevel().enabledFeatures(), true, h.getLevel().registryAccess()); var tab = ModCreativeTabs.WILD_WIND.get(); tab.buildContents(params); - for (var register : List.of(ModBlocks.ITEMS, ModItems.ITEMS)) { + for (var register : List.of(org.polaris2023.wildwind.core.block.ModBlocks.ITEMS, org.polaris2023.wildwind.core.registry.ModItems.ITEMS, org.polaris2023.wildwind.wilderness.block.ModBlocks.ITEMS, org.polaris2023.wildwind.wilderness.registry.ModItems.ITEMS, org.polaris2023.wildwind.barren.block.ModBlocks.ITEMS)) { for (var item : register.getEntries()) { - check(h, tab.getDisplayItems().stream().filter(stack -> stack.is(item.get())).count() == (item == ModItems.TIPPED_ARROW ? 2 : 1), + check(h, tab.getDisplayItems().stream().filter(stack -> stack.is(item.get())).count() == (item == org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW ? 2 : 1), "Every registered mod item/arrow variant must appear once in its own tab: " + item.getId()); } } for (var potion : ModPotions.POTIONS.getEntries()) { for (var item : List.of(Items.POTION, Items.SPLASH_POTION, Items.LINGERING_POTION, Items.TIPPED_ARROW)) { - check(h, tab.contains(org.polaris2023.wildwind.hfas.arrow.ReachArrows.convert(PotionContents.createItemStack(item, potion))), "Mod tab must include each Reach potion and arrow variant"); + check(h, tab.contains(org.polaris2023.wildwind.wilderness.arrow.ReachArrows.convert(PotionContents.createItemStack(item, potion))), "Mod tab must include each Reach potion and arrow variant"); } } for (var key : List.of(CreativeModeTabs.BUILDING_BLOCKS, CreativeModeTabs.NATURAL_BLOCKS, @@ -139,16 +137,16 @@ static void creativeTab(GameTestHelper h) { var vanilla = BuiltInRegistries.CREATIVE_MODE_TAB.getValueOrThrow(key); vanilla.buildContents(params); check(h, vanilla.getDisplayItems().stream().noneMatch(stack -> - BuiltInRegistries.ITEM.getKey(stack.getItem()).getNamespace().equals(HFASMod.MOD_ID)), + org.polaris2023.wildwind.core.api.WildWindModules.owns(BuiltInRegistries.ITEM.getKey(stack.getItem()).getNamespace())), "Vanilla categories must not contain mod items"); check(h, vanilla.getDisplayItems().stream().noneMatch(stack -> { var contents = stack.get(DataComponents.POTION_CONTENTS); return contents != null && contents.potion().isPresent() - && contents.potion().get().unwrapKey().orElseThrow().identifier().getNamespace().equals(HFASMod.MOD_ID); + && org.polaris2023.wildwind.core.api.WildWindModules.owns(contents.potion().get().unwrapKey().orElseThrow().identifier().getNamespace()); }), "Vanilla categories must not duplicate mod potions"); } CreativeModeTabs.searchTab().buildContents(params); - check(h, CreativeModeTabs.searchTab().contains(ModItems.MUDDY_PIG_SPAWN_EGG.toStack()) + check(h, CreativeModeTabs.searchTab().contains(org.polaris2023.wildwind.wilderness.registry.ModItems.MUDDY_PIG_SPAWN_EGG.toStack()) && CreativeModeTabs.searchTab().contains(PotionContents.createItemStack(Items.POTION, ModPotions.REACH)), "Global creative search must still discover mod contents"); h.succeed(); diff --git a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java similarity index 78% rename from src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java rename to src/verification/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java index ff3b748..1348f5a 100644 --- a/src/hfas/gametest/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/UpstreamIntegrationGameTests.java @@ -18,10 +18,10 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import org.polaris2023.wildwind.hfas.component.OmniClawTools; -import org.polaris2023.wildwind.hfas.enchantment.MeltingEnchantment; -import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; -import org.polaris2023.wildwind.hfas.registry.*; +import org.polaris2023.wildwind.wilderness.component.OmniClawTools; +import org.polaris2023.wildwind.core.enchantment.MeltingEnchantment; +import org.polaris2023.wildwind.wilderness.entity.animal.MudcrabVariant; +import org.polaris2023.wildwind.wilderness.registry.*; final class UpstreamIntegrationGameTests { private UpstreamIntegrationGameTests() {} @@ -40,15 +40,15 @@ static void run(GameTestHelper h) { "All three mudcrab variants must be present"); crab.setVariant(MudcrabVariant.lookup(level.registryAccess(), MudcrabVariant.WARM)); check(h, crab.getVariant().is(MudcrabVariant.WARM) - && crab.getBucketItemStack().is(ModItems.MUDCRAB_BUCKET.get()), "Mudcrab variant and bucket must work"); + && crab.getBucketItemStack().is(org.polaris2023.wildwind.wilderness.registry.ModItems.MUDCRAB_BUCKET.get()), "Mudcrab variant and bucket must work"); var fish = h.spawn(ModEntities.PIRANHA.get(), 4, 2, 2); fish.setNoAi(true); - check(h, fish.getBucketItemStack().is(ModItems.PIRANHA_BUCKET.get()), "Piranha bucket must remain registered"); + check(h, fish.getBucketItemStack().is(org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA_BUCKET.get()), "Piranha bucket must remain registered"); var cooking = level.recipeAccess().getRecipeFor(RecipeType.SMELTING, - new SingleRecipeInput(ModItems.PIRANHA.toStack()), level); - check(h, cooking.isPresent() && cooking.get().value().assemble(new SingleRecipeInput(ModItems.PIRANHA.toStack())) - .is(ModItems.COOKED_PIRANHA.get()), "Upstream piranha smelting recipe must load"); - for (var material : ModItems.MATERIALS) { + new SingleRecipeInput(org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA.toStack()), level); + check(h, cooking.isPresent() && cooking.get().value().assemble(new SingleRecipeInput(org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA.toStack())) + .is(org.polaris2023.wildwind.wilderness.registry.ModItems.COOKED_PIRANHA.get()), "Upstream piranha smelting recipe must load"); + for (var material : org.polaris2023.wildwind.core.registry.ModItems.MATERIALS) { check(h, !material.toStack().has(DataComponents.FOOD), "The seven local materials must stay ordinary items"); } check(h, !ModPotions.REACH.value().getEffects().isEmpty(), "Upstream Reach potion must remain registered"); @@ -67,7 +67,7 @@ static void run(GameTestHelper h) { var pickaxe = new ItemStack(Items.DIAMOND_PICKAXE); pickaxe.enchant(level.registryAccess().lookupOrThrow(Registries.ENCHANTMENT).getOrThrow(MeltingEnchantment.MELTING), 1); - var claw = ModItems.OMNI_CLAW.toStack(); + var claw = org.polaris2023.wildwind.wilderness.registry.ModItems.OMNI_CLAW.toStack(); claw.set(ModDataComponents.OMNI_CLAW_TOOLS.get(), new OmniClawTools(List.of(pickaxe), 0)); player.setItemInHand(InteractionHand.MAIN_HAND, claw); player.setExperienceLevels(1); diff --git a/src/structures/gametest/java/org/polaris2023/wildwind/structures/test/StructureGameTests.java b/src/verification/java/org/polaris2023/wildwind/structures/test/StructureGameTests.java similarity index 97% rename from src/structures/gametest/java/org/polaris2023/wildwind/structures/test/StructureGameTests.java rename to src/verification/java/org/polaris2023/wildwind/structures/test/StructureGameTests.java index 1ff9416..c16527a 100644 --- a/src/structures/gametest/java/org/polaris2023/wildwind/structures/test/StructureGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/structures/test/StructureGameTests.java @@ -22,16 +22,16 @@ public final class StructureGameTests { private StructureGameTests() {} public static void register(IEventBus bus) { - DeferredRegister> functions = DeferredRegister.create(Registries.TEST_FUNCTION, "ww_hfas_tests"); + DeferredRegister> functions = DeferredRegister.create(Registries.TEST_FUNCTION, "wild_wind_tests"); functions.register("generation", () -> StructureGameTests::generation); functions.register(bus); } private static void generation(GameTestHelper helper) { - helper.assertTrue(net.neoforged.fml.ModList.get().isLoaded("ww_hfas") + helper.assertTrue(net.neoforged.fml.ModList.get().isLoaded("wild_wind_core") && !net.neoforged.fml.ModList.get().isLoaded("ww_structures"), - Component.literal("Structures and items must load from the single HFAS mod")); - for (var item : org.polaris2023.wildwind.hfas.registry.ModItems.MATERIALS) { + Component.literal("Structures and items must load from the core mod")); + for (var item : org.polaris2023.wildwind.core.registry.ModItems.MATERIALS) { helper.assertTrue(net.minecraft.core.registries.BuiltInRegistries.ITEM.containsKey(item.getId()) && item.get().getClass() == net.minecraft.world.item.Item.class && !item.toStack().has(net.minecraft.core.component.DataComponents.FOOD), diff --git a/src/structures/gametest/java/org/polaris2023/wildwind/structures/test/mixin/GameTestServerMixin.java b/src/verification/java/org/polaris2023/wildwind/structures/test/mixin/GameTestServerMixin.java similarity index 100% rename from src/structures/gametest/java/org/polaris2023/wildwind/structures/test/mixin/GameTestServerMixin.java rename to src/verification/java/org/polaris2023/wildwind/structures/test/mixin/GameTestServerMixin.java diff --git a/src/structures/gametest/resources/data/minecraft/worldgen/world_preset/flat.json b/src/verification/resources/data/minecraft/worldgen/world_preset/flat.json similarity index 100% rename from src/structures/gametest/resources/data/minecraft/worldgen/world_preset/flat.json rename to src/verification/resources/data/minecraft/worldgen/world_preset/flat.json diff --git a/src/verification/resources/data/wild_wind_tests/structure/empty.nbt b/src/verification/resources/data/wild_wind_tests/structure/empty.nbt new file mode 100644 index 0000000000000000000000000000000000000000..1b63d36657f1a88c48210084cfcced954ce71090 GIT binary patch literal 113 zcmV-%0FM73iwFP!00002|0T+?3V<*W1JH;?TgAoCadvieKjnl&t z8lXfwlG4l}%H@InbudvLE|EvTrc}8d>YEN$ + event.dataPackRegistry(DatadrivenRegistryKey.MUDCRAB_VARIANT, + org.polaris2023.wildwind.wilderness.entity.animal.MudcrabVariant.DIRECT_CODEC, + org.polaris2023.wildwind.wilderness.entity.animal.MudcrabVariant.NETWORK_CODEC)); + + } + public static Identifier id(String path) { return Identifier.fromNamespaceAndPath(MOD_ID, path); } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ReachArrows.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/arrow/ReachArrows.java similarity index 75% rename from src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ReachArrows.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/arrow/ReachArrows.java index a5b62ae..d12b24f 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/arrow/ReachArrows.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/arrow/ReachArrows.java @@ -1,10 +1,9 @@ -package org.polaris2023.wildwind.hfas.arrow; +package org.polaris2023.wildwind.wilderness.arrow; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import org.polaris2023.wildwind.hfas.registry.ModItems; -import org.polaris2023.wildwind.hfas.registry.ModPotions; +import org.polaris2023.wildwind.wilderness.registry.ModPotions; public final class ReachArrows { private ReachArrows() {} @@ -15,6 +14,6 @@ public static ItemStack convert(ItemStack stack) { if (!stack.is(Items.TIPPED_ARROW) || potion == null || potion.potion().isEmpty()) return stack; var holder = potion.potion().get(); if (!holder.is(ModPotions.REACH.getKey()) && !holder.is(ModPotions.LONG_REACH.getKey())) return stack; - return stack.transmuteCopy(ModItems.TIPPED_ARROW.get()); + return stack.transmuteCopy(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get()); } } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/block/ModBlocks.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/block/ModBlocks.java similarity index 56% rename from src/hfas/java/org/polaris2023/wildwind/hfas/block/ModBlocks.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/block/ModBlocks.java index c74db5d..3da6f1b 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/block/ModBlocks.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/block/ModBlocks.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.block; +package org.polaris2023.wildwind.wilderness.block; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -12,8 +12,8 @@ import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.worldgen.ModTreeGrowers; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.worldgen.ModTreeGrowers; import java.util.ArrayList; import java.util.List; @@ -29,36 +29,16 @@ */ //TODO 考虑迁移至registry目录下,或将registry目录下的注册条目分散到各目录下 public class ModBlocks { - // 方块注册器 - public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(HFASMod.MOD_ID); - // 物品注册器 - public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(HFASMod.MOD_ID); - - public static final DeferredBlock KILN = BLOCKS.registerBlock("kiln", p -> new KilnBlock(p - .mapColor(MapColor.STONE).instrument(net.minecraft.world.level.block.state.properties.NoteBlockInstrument.BASEDRUM) - .requiresCorrectToolForDrops().strength(3.5F, 3.5F).sound(SoundType.STONE) - .lightLevel(state -> state.getValue(KilnBlock.LIT) ? 13 : 0).pushReaction(PushReaction.BLOCK))); - - // ==================== 方块类型定义 ==================== - - // 焚烬木方块类型 + public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(WildernessMod.MOD_ID); + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(WildernessMod.MOD_ID); public static final BlockSetType BLAZE_BLOCK_SET = BlockSetType.register(new BlockSetType("blaze")); - // 焚烬木木材类型 + public static final WoodType BLAZE_WOOD_TYPE = WoodType.register(new WoodType("blaze", BLAZE_BLOCK_SET)); - // 灵焰木方块类型 public static final BlockSetType SOUL_BLOCK_SET = BlockSetType.register(new BlockSetType("soul")); - // 灵焰木木材类型 - public static final WoodType SOUL_WOOD_TYPE = WoodType.register(new WoodType("soul", SOUL_BLOCK_SET)); - - // 杜鹃木方块类型 - public static final BlockSetType AZALEA_BLOCK_SET = BlockSetType.register(new BlockSetType("azalea")); - // 杜鹃木木材类型 - public static final WoodType AZALEA_WOOD_TYPE = WoodType.register(new WoodType("ww_hfas:azalea", AZALEA_BLOCK_SET)); - // ==================== 焚烬木套件 (blaze_wood) ==================== + public static final WoodType SOUL_WOOD_TYPE = WoodType.register(new WoodType("soul", SOUL_BLOCK_SET)); - // 焚烬木原木 public static final DeferredBlock BLAZE_LOG = BLOCKS.registerBlock( "blaze_log", p -> new RotatedPillarBlock(p @@ -67,7 +47,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木 public static final DeferredBlock BLAZE_WOOD = BLOCKS.registerBlock( "blaze_wood", p -> new RotatedPillarBlock(p @@ -76,7 +55,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 去皮焚烬木原木 public static final DeferredBlock STRIPPED_BLAZE_LOG = BLOCKS.registerBlock( "stripped_blaze_log", p -> new RotatedPillarBlock(p @@ -85,7 +63,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 去皮焚烬木 public static final DeferredBlock STRIPPED_BLAZE_WOOD = BLOCKS.registerBlock( "stripped_blaze_wood", p -> new RotatedPillarBlock(p @@ -94,7 +71,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木木板 public static final DeferredBlock BLAZE_PLANKS = BLOCKS.registerBlock( "blaze_planks", p -> new Block(p @@ -103,7 +79,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木楼梯 public static final DeferredBlock BLAZE_STAIRS = BLOCKS.registerBlock( "blaze_stairs", p -> new StairBlock(BLAZE_PLANKS.get().defaultBlockState(), p @@ -112,7 +87,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木台阶 public static final DeferredBlock BLAZE_SLAB = BLOCKS.registerBlock( "blaze_slab", p -> new SlabBlock(p @@ -121,7 +95,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木栅栏 public static final DeferredBlock BLAZE_FENCE = BLOCKS.registerBlock( "blaze_fence", p -> new FenceBlock(p @@ -130,7 +103,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木栅栏门 public static final DeferredBlock BLAZE_FENCE_GATE = BLOCKS.registerBlock( "blaze_fence_gate", p -> new FenceGateBlock(BLAZE_WOOD_TYPE, p @@ -139,7 +111,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木门 public static final DeferredBlock BLAZE_DOOR = BLOCKS.registerBlock( "blaze_door", p -> new DoorBlock(BLAZE_BLOCK_SET, p @@ -148,7 +119,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木活板门 public static final DeferredBlock BLAZE_TRAPDOOR = BLOCKS.registerBlock( "blaze_trapdoor", p -> new TrapDoorBlock(BLAZE_BLOCK_SET, p @@ -157,7 +127,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木压力板 public static final DeferredBlock BLAZE_PRESSURE_PLATE = BLOCKS.registerBlock( "blaze_pressure_plate", p -> new PressurePlateBlock(BLAZE_BLOCK_SET, p @@ -166,7 +135,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木按钮 public static final DeferredBlock BLAZE_BUTTON = BLOCKS.registerBlock( "blaze_button", p -> new ButtonBlock(BLAZE_BLOCK_SET, 30, p @@ -175,7 +143,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 焚烬木树叶 public static final DeferredBlock BLAZE_LEAVES = BLOCKS.registerBlock( "blaze_leaves", p -> new TintedParticleLeavesBlock(0.01F,p @@ -186,7 +153,6 @@ public class ModBlocks { .randomTicks()) ); - // 焚烬木树苗 public static final DeferredBlock BLAZE_SAPLING = BLOCKS.registerBlock( "blaze_sapling", p -> new SaplingBlock(ModTreeGrowers.BLAZE, p @@ -197,9 +163,6 @@ public class ModBlocks { .randomTicks()) ); - // ==================== 灵焰木套件 (soul_wood) ==================== - - // 灵焰木原木 public static final DeferredBlock SOUL_LOG = BLOCKS.registerBlock( "soul_log", p -> new RotatedPillarBlock(p @@ -208,7 +171,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木 public static final DeferredBlock SOUL_WOOD = BLOCKS.registerBlock( "soul_wood", p -> new RotatedPillarBlock(p @@ -217,7 +179,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 去皮灵焰木原木 public static final DeferredBlock STRIPPED_SOUL_LOG = BLOCKS.registerBlock( "stripped_soul_log", p -> new RotatedPillarBlock(p @@ -226,7 +187,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 去皮灵焰木 public static final DeferredBlock STRIPPED_SOUL_WOOD = BLOCKS.registerBlock( "stripped_soul_wood", p -> new RotatedPillarBlock(p @@ -235,7 +195,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木木板 public static final DeferredBlock SOUL_PLANKS = BLOCKS.registerBlock( "soul_planks", p -> new Block(p @@ -244,7 +203,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木楼梯 public static final DeferredBlock SOUL_STAIRS = BLOCKS.registerBlock( "soul_stairs", p -> new StairBlock(SOUL_PLANKS.get().defaultBlockState(), p @@ -253,7 +211,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木台阶 public static final DeferredBlock SOUL_SLAB = BLOCKS.registerBlock( "soul_slab", p -> new SlabBlock(p @@ -262,7 +219,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木栅栏 public static final DeferredBlock SOUL_FENCE = BLOCKS.registerBlock( "soul_fence", p -> new FenceBlock(p @@ -271,7 +227,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木栅栏门 public static final DeferredBlock SOUL_FENCE_GATE = BLOCKS.registerBlock( "soul_fence_gate", p -> new FenceGateBlock(SOUL_WOOD_TYPE, p @@ -280,7 +235,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木门 public static final DeferredBlock SOUL_DOOR = BLOCKS.registerBlock( "soul_door", p -> new DoorBlock(SOUL_BLOCK_SET, p @@ -289,7 +243,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木活板门 public static final DeferredBlock SOUL_TRAPDOOR = BLOCKS.registerBlock( "soul_trapdoor", p -> new TrapDoorBlock(SOUL_BLOCK_SET, p @@ -298,7 +251,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木压力板 public static final DeferredBlock SOUL_PRESSURE_PLATE = BLOCKS.registerBlock( "soul_pressure_plate", p -> new PressurePlateBlock(SOUL_BLOCK_SET, p @@ -307,7 +259,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木按钮 public static final DeferredBlock SOUL_BUTTON = BLOCKS.registerBlock( "soul_button", p -> new ButtonBlock(SOUL_BLOCK_SET, 30, p @@ -316,7 +267,6 @@ public class ModBlocks { .sound(SoundType.WOOD)) ); - // 灵焰木树叶 public static final DeferredBlock SOUL_LEAVES = BLOCKS.registerBlock( "soul_leaves", p -> new TintedParticleLeavesBlock(0.01F, p @@ -327,7 +277,6 @@ public class ModBlocks { .randomTicks()) ); - // 灵焰木树苗 public static final DeferredBlock SOUL_SAPLING = BLOCKS.registerBlock( "soul_sapling", p -> new SaplingBlock(ModTreeGrowers.SOUL, p @@ -338,145 +287,6 @@ public class ModBlocks { .randomTicks()) ); - // ==================== 杜鹃木套件 (azalea_wood) ==================== - - // 杜鹃木原木 - public static final DeferredBlock AZALEA_LOG = BLOCKS.registerBlock( - "azalea_log", - p -> new RotatedPillarBlock(p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木 - public static final DeferredBlock AZALEA_WOOD = BLOCKS.registerBlock( - "azalea_wood", - p -> new RotatedPillarBlock(p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 去皮杜鹃木原木 - public static final DeferredBlock STRIPPED_AZALEA_LOG = BLOCKS.registerBlock( - "stripped_azalea_log", - p -> new RotatedPillarBlock(p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 去皮杜鹃木 - public static final DeferredBlock STRIPPED_AZALEA_WOOD = BLOCKS.registerBlock( - "stripped_azalea_wood", - p -> new RotatedPillarBlock(p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木木板 - public static final DeferredBlock AZALEA_PLANKS = BLOCKS.registerBlock( - "azalea_planks", - p -> new Block(p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木楼梯 - public static final DeferredBlock AZALEA_STAIRS = BLOCKS.registerBlock( - "azalea_stairs", - p -> new StairBlock(AZALEA_PLANKS.get().defaultBlockState(), p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木台阶 - public static final DeferredBlock AZALEA_SLAB = BLOCKS.registerBlock( - "azalea_slab", - p -> new SlabBlock(p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木栅栏 - public static final DeferredBlock AZALEA_FENCE = BLOCKS.registerBlock( - "azalea_fence", - p -> new FenceBlock(p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木栅栏门 - public static final DeferredBlock AZALEA_FENCE_GATE = BLOCKS.registerBlock( - "azalea_fence_gate", - p -> new FenceGateBlock(AZALEA_WOOD_TYPE, p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木门 - public static final DeferredBlock AZALEA_DOOR = BLOCKS.registerBlock( - "azalea_door", - p -> new DoorBlock(AZALEA_BLOCK_SET, p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木活板门 - public static final DeferredBlock AZALEA_TRAPDOOR = BLOCKS.registerBlock( - "azalea_trapdoor", - p -> new TrapDoorBlock(AZALEA_BLOCK_SET, p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(2.0F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木压力板 - public static final DeferredBlock AZALEA_PRESSURE_PLATE = BLOCKS.registerBlock( - "azalea_pressure_plate", - p -> new PressurePlateBlock(AZALEA_BLOCK_SET, p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(0.5F) - .sound(SoundType.WOOD)) - ); - - // 杜鹃木按钮 - public static final DeferredBlock AZALEA_BUTTON = BLOCKS.registerBlock( - "azalea_button", - p -> new ButtonBlock(AZALEA_BLOCK_SET, 30, p - .mapColor(MapColor.COLOR_LIGHT_GREEN) - .strength(0.5F) - .sound(SoundType.WOOD)) - ); - - public static final DeferredBlock AZALEA_SIGN = BLOCKS.registerBlock("azalea_sign", - p -> new StandingSignBlock(AZALEA_WOOD_TYPE, p), () -> signProperties(Blocks.OAK_SIGN)); - public static final DeferredBlock AZALEA_WALL_SIGN = BLOCKS.registerBlock("azalea_wall_sign", - p -> new WallSignBlock(AZALEA_WOOD_TYPE, p.overrideLootTable(AZALEA_SIGN.get().getLootTable())), () -> signProperties(Blocks.OAK_WALL_SIGN)); - public static final DeferredBlock AZALEA_HANGING_SIGN = BLOCKS.registerBlock("azalea_hanging_sign", - p -> new CeilingHangingSignBlock(AZALEA_WOOD_TYPE, p), () -> signProperties(Blocks.OAK_HANGING_SIGN)); - public static final DeferredBlock AZALEA_WALL_HANGING_SIGN = BLOCKS.registerBlock("azalea_wall_hanging_sign", - p -> new WallHangingSignBlock(AZALEA_WOOD_TYPE, p.overrideLootTable(AZALEA_HANGING_SIGN.get().getLootTable())), () -> signProperties(Blocks.OAK_WALL_HANGING_SIGN)); - public static final DeferredBlock AZALEA_SHELF = BLOCKS.registerBlock("azalea_shelf", - AzaleaShelfBlock::new, () -> BlockBehaviour.Properties.ofFullCopy(Blocks.OAK_SHELF) - .strength(2.0F, 3.0F).mapColor(MapColor.COLOR_LIGHT_GREEN).pushReaction(PushReaction.BLOCK)); - - private static BlockBehaviour.Properties signProperties(Block template) { - return BlockBehaviour.Properties.ofFullCopy(template).strength(1.0F, 1.0F) - .mapColor(MapColor.COLOR_LIGHT_GREEN).pushReaction(PushReaction.BLOCK); - } - - // ==================== 其他方块 ==================== - - // 焦灰草方块 (scorched_grass_block) public static final DeferredBlock SCORCHED_GRASS_BLOCK = BLOCKS.registerBlock( "scorched_grass_block", p -> new Block(p @@ -486,7 +296,6 @@ private static BlockBehaviour.Properties signProperties(Block template) { .randomTicks()) ); - // 焦土 (scorched_dirt) public static final DeferredBlock SCORCHED_DIRT = BLOCKS.registerBlock( "scorched_dirt", p -> new Block(p @@ -495,7 +304,6 @@ private static BlockBehaviour.Properties signProperties(Block template) { .sound(SoundType.GRAVEL)) ); - // 焦灰草丛 (scorched_grass) public static final DeferredBlock SCORCHED_GRASS = BLOCKS.registerBlock( "scorched_grass", p -> new Block(p @@ -506,7 +314,6 @@ private static BlockBehaviour.Properties signProperties(Block template) { .pushReaction(PushReaction.DESTROY)) ); - // 焦灰枝条 (scorched_twig) public static final DeferredBlock SCORCHED_TWIG = BLOCKS.registerBlock( "scorched_twig", p -> new Block(p @@ -517,28 +324,7 @@ private static BlockBehaviour.Properties signProperties(Block template) { .pushReaction(PushReaction.DESTROY)) ); - // 仙人球 (tiny_cactus) - public static final DeferredBlock TINY_CACTUS = BLOCKS.registerBlock( - "tiny_cactus", - p -> new Block(p - .mapColor(MapColor.PLANT) - .noCollision() - .instabreak() - .sound(SoundType.WOOL) - .pushReaction(PushReaction.DESTROY)) - ); - - // 制箭台 (fletching_table) - 使用自定义方块类支持GUI - public static final DeferredBlock FLETCHING_TABLE = BLOCKS.registerBlock( - "fletching_table", - p -> new FletchingTableBlock(p - .mapColor(MapColor.WOOD) - .strength(2.5F) - .sound(SoundType.WOOD)) - ); - - public static void blockItems() { - // 焚烬木套件物品 + private static void blockItems() { ITEMS.registerSimpleBlockItem(BLAZE_LOG); ITEMS.registerSimpleBlockItem(BLAZE_WOOD); ITEMS.registerSimpleBlockItem(STRIPPED_BLAZE_LOG); @@ -554,8 +340,6 @@ public static void blockItems() { ITEMS.registerSimpleBlockItem(BLAZE_BUTTON); ITEMS.registerSimpleBlockItem(BLAZE_LEAVES); ITEMS.registerSimpleBlockItem(BLAZE_SAPLING); - - // 灵焰木套件物品 ITEMS.registerSimpleBlockItem(SOUL_LOG); ITEMS.registerSimpleBlockItem(SOUL_WOOD); ITEMS.registerSimpleBlockItem(STRIPPED_SOUL_LOG); @@ -571,41 +355,10 @@ public static void blockItems() { ITEMS.registerSimpleBlockItem(SOUL_BUTTON); ITEMS.registerSimpleBlockItem(SOUL_LEAVES); ITEMS.registerSimpleBlockItem(SOUL_SAPLING); - - // 杜鹃木套件物品 - ITEMS.registerSimpleBlockItem(AZALEA_LOG); - ITEMS.registerSimpleBlockItem(AZALEA_WOOD); - ITEMS.registerSimpleBlockItem(STRIPPED_AZALEA_LOG); - ITEMS.registerSimpleBlockItem(STRIPPED_AZALEA_WOOD); - ITEMS.registerSimpleBlockItem(AZALEA_PLANKS); - ITEMS.registerSimpleBlockItem(AZALEA_STAIRS); - ITEMS.registerSimpleBlockItem(AZALEA_SLAB); - ITEMS.registerSimpleBlockItem(AZALEA_FENCE); - ITEMS.registerSimpleBlockItem(AZALEA_FENCE_GATE); - ITEMS.registerSimpleBlockItem(AZALEA_DOOR); - ITEMS.registerSimpleBlockItem(AZALEA_TRAPDOOR); - ITEMS.registerSimpleBlockItem(AZALEA_PRESSURE_PLATE); - ITEMS.registerSimpleBlockItem(AZALEA_BUTTON); - ITEMS.registerItem("azalea_sign", p -> new net.minecraft.world.item.SignItem(AZALEA_SIGN.get(), AZALEA_WALL_SIGN.get(), p.stacksTo(16).useBlockDescriptionPrefix())); - ITEMS.registerItem("azalea_hanging_sign", p -> new net.minecraft.world.item.HangingSignItem(AZALEA_HANGING_SIGN.get(), AZALEA_WALL_HANGING_SIGN.get(), p.stacksTo(16).useBlockDescriptionPrefix())); - ITEMS.registerSimpleBlockItem(AZALEA_SHELF, () -> new Item.Properties().component(net.minecraft.core.component.DataComponents.CONTAINER, net.minecraft.world.item.component.ItemContainerContents.EMPTY)); - - // 其他方块物品 ITEMS.registerSimpleBlockItem(SCORCHED_GRASS_BLOCK); ITEMS.registerSimpleBlockItem(SCORCHED_DIRT); ITEMS.registerSimpleBlockItem(SCORCHED_GRASS); ITEMS.registerSimpleBlockItem(SCORCHED_TWIG); - ITEMS.registerSimpleBlockItem(TINY_CACTUS); - ITEMS.registerSimpleBlockItem(KILN); - } - - /** - * 注册方块和物品到事件总线 - * 必须在模组构造函数中调用 - */ - public static void register(IEventBus bus) { - BLOCKS.register(bus); - blockItems(); - ITEMS.register(bus); } + public static void register(IEventBus bus) { BLOCKS.register(bus); blockItems(); ITEMS.register(bus); } } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModClientHooks.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/ModClientHooks.java similarity index 77% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/ModClientHooks.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/ModClientHooks.java index 6ee0e30..5c0dec1 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModClientHooks.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/ModClientHooks.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.client; +package org.polaris2023.wildwind.wilderness.client; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.world.inventory.Slot; @@ -9,11 +9,11 @@ import net.neoforged.neoforge.client.event.RegisterClientTooltipComponentFactoriesEvent; import net.neoforged.neoforge.client.event.ScreenEvent; import net.neoforged.neoforge.client.network.ClientPacketDistributor; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.client.tooltip.ClientOmniClawTooltip; -import org.polaris2023.wildwind.hfas.component.OmniClawTools; -import org.polaris2023.wildwind.hfas.network.payload.ServerBoundSelectOmniClawItemPayload; -import org.polaris2023.wildwind.hfas.registry.ModDataComponents; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.client.tooltip.ClientOmniClawTooltip; +import org.polaris2023.wildwind.wilderness.component.OmniClawTools; +import org.polaris2023.wildwind.wilderness.network.payload.ServerBoundSelectOmniClawItemPayload; +import org.polaris2023.wildwind.wilderness.registry.ModDataComponents; import java.util.List; @@ -23,13 +23,9 @@ * 26.2 迁移说明:PacketDistributor.sendToServer 迁移至 ClientPacketDistributor; * AbstractContainerScreen#getSlotUnderMouse 废弃,改用 getHoveredSlot()。 */ -@EventBusSubscriber(modid = HFASMod.MOD_ID, value = Dist.CLIENT) +@EventBusSubscriber(modid = WildernessMod.MOD_ID, value = Dist.CLIENT) public class ModClientHooks { - @SubscribeEvent - static void registerScreens(net.neoforged.neoforge.client.event.RegisterMenuScreensEvent event) { - event.register(org.polaris2023.wildwind.hfas.menu.ModMenus.KILN.get(), KilnScreen::new); - } /** * 注册全能蟹钳的客户端提示组件工厂喵~ diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModEntityRenderers.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/ModEntityRenderers.java similarity index 80% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/ModEntityRenderers.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/ModEntityRenderers.java index 1ee3887..af969dd 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/ModEntityRenderers.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/ModEntityRenderers.java @@ -1,13 +1,13 @@ -package org.polaris2023.wildwind.hfas.client; +package org.polaris2023.wildwind.wilderness.client; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.EntityRenderersEvent; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.registry.ModEntities; -@EventBusSubscriber(modid = HFASMod.MOD_ID, value = Dist.CLIENT) +@EventBusSubscriber(modid = WildernessMod.MOD_ID, value = Dist.CLIENT) public final class ModEntityRenderers { private ModEntityRenderers() {} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigModel.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/MuddyPigModel.java similarity index 98% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigModel.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/MuddyPigModel.java index c4598ef..8db6c54 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigModel.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/MuddyPigModel.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.client; +package org.polaris2023.wildwind.wilderness.client; import net.minecraft.client.model.animal.pig.PigModel; import net.minecraft.client.model.geom.ModelPart; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigRenderer.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/MuddyPigRenderer.java similarity index 88% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigRenderer.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/MuddyPigRenderer.java index 6d0b189..622e0fb 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/MuddyPigRenderer.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/MuddyPigRenderer.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.client; +package org.polaris2023.wildwind.wilderness.client; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.model.AdultAndBabyModelPair; @@ -12,8 +12,8 @@ import net.minecraft.client.resources.model.EquipmentClientInfo; import net.minecraft.resources.Identifier; import net.minecraft.world.entity.EquipmentSlot; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.entity.MuddyPig; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.entity.MuddyPig; public final class MuddyPigRenderer extends MobRenderer { public static final ModelLayerLocation ADULT = layer("main"); @@ -54,10 +54,10 @@ public void extractRenderState(MuddyPig entity, PigRenderState state, float part } private static ModelLayerLocation layer(String name) { - return new ModelLayerLocation(Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "muddy_pig"), name); + return new ModelLayerLocation(Identifier.fromNamespaceAndPath(WildernessMod.MOD_ID, "muddy_pig"), name); } private static Identifier texture(String name) { - return Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "textures/entity/pig/" + name + ".png"); + return Identifier.fromNamespaceAndPath(WildernessMod.MOD_ID, "textures/entity/pig/" + name + ".png"); } } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/MudcrabModel.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/model/MudcrabModel.java similarity index 66% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/MudcrabModel.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/model/MudcrabModel.java index df0980d..b638dcf 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/MudcrabModel.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/model/MudcrabModel.java @@ -1,13 +1,13 @@ -package org.polaris2023.wildwind.hfas.client.entity.model; +package org.polaris2023.wildwind.wilderness.client.entity.model; import com.geckolib.model.DefaultedEntityGeoModel; import com.geckolib.renderer.base.GeoRenderState; import net.minecraft.client.renderer.entity.state.EntityRenderState; import net.minecraft.resources.Identifier; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.client.entity.renderstate.MudcrabRenderState; -import org.polaris2023.wildwind.hfas.entity.animal.Mudcrab; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.client.entity.renderstate.MudcrabRenderState; +import org.polaris2023.wildwind.wilderness.entity.animal.Mudcrab; /** * 泥沼蟹实体的几何模型定义喵~ @@ -18,7 +18,7 @@ public class MudcrabModel extends DefaultedEntityGeoModel { * 创建泥沼蟹模型实例喵~ */ public MudcrabModel() { - super(HFASMod.id("mudcrab")); + super(WildernessMod.id("mudcrab")); } /** diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/PiranhaModel.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/model/PiranhaModel.java similarity index 62% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/PiranhaModel.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/model/PiranhaModel.java index 00e35fb..9e136f0 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/model/PiranhaModel.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/model/PiranhaModel.java @@ -1,10 +1,10 @@ -package org.polaris2023.wildwind.hfas.client.entity.model; +package org.polaris2023.wildwind.wilderness.client.entity.model; import com.geckolib.model.DefaultedEntityGeoModel; import com.geckolib.renderer.base.GeoRenderState; import net.minecraft.resources.Identifier; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.entity.animal.Piranha; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.entity.animal.Piranha; /** * 食人鱼实体的几何模型定义喵~ @@ -15,7 +15,7 @@ public class PiranhaModel extends DefaultedEntityGeoModel { * 创建食人鱼模型实例喵~ */ public PiranhaModel() { - super(HFASMod.id("piranha")); + super(WildernessMod.id("piranha")); } /** @@ -23,6 +23,6 @@ public PiranhaModel() { */ @Override public Identifier getTextureResource(GeoRenderState state) { - return HFASMod.id("textures/entity/piranha.png"); + return WildernessMod.id("textures/entity/piranha.png"); } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/MudcrabRenderer.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderer/MudcrabRenderer.java similarity index 92% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/MudcrabRenderer.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderer/MudcrabRenderer.java index 9a7d594..958d3f5 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/MudcrabRenderer.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderer/MudcrabRenderer.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.client.entity.renderer; +package org.polaris2023.wildwind.wilderness.client.entity.renderer; import com.geckolib.renderer.GeoEntityRenderer; import com.geckolib.renderer.base.RenderPassInfo; @@ -9,9 +9,9 @@ import net.minecraft.client.renderer.item.ItemModelResolver; import net.minecraft.util.Mth; import net.minecraft.world.entity.LivingEntity; -import org.polaris2023.wildwind.hfas.client.entity.model.MudcrabModel; -import org.polaris2023.wildwind.hfas.client.entity.renderstate.MudcrabRenderState; -import org.polaris2023.wildwind.hfas.entity.animal.Mudcrab; +import org.polaris2023.wildwind.wilderness.client.entity.model.MudcrabModel; +import org.polaris2023.wildwind.wilderness.client.entity.renderstate.MudcrabRenderState; +import org.polaris2023.wildwind.wilderness.entity.animal.Mudcrab; import javax.annotation.Nullable; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/PiranhaRenderer.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderer/PiranhaRenderer.java similarity index 64% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/PiranhaRenderer.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderer/PiranhaRenderer.java index 46dd5da..5514383 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderer/PiranhaRenderer.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderer/PiranhaRenderer.java @@ -1,10 +1,10 @@ -package org.polaris2023.wildwind.hfas.client.entity.renderer; +package org.polaris2023.wildwind.wilderness.client.entity.renderer; import com.geckolib.renderer.GeoEntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; -import org.polaris2023.wildwind.hfas.client.entity.model.PiranhaModel; -import org.polaris2023.wildwind.hfas.client.entity.renderstate.PiranhaRenderState; -import org.polaris2023.wildwind.hfas.entity.animal.Piranha; +import org.polaris2023.wildwind.wilderness.client.entity.model.PiranhaModel; +import org.polaris2023.wildwind.wilderness.client.entity.renderstate.PiranhaRenderState; +import org.polaris2023.wildwind.wilderness.entity.animal.Piranha; import javax.annotation.Nullable; @@ -21,4 +21,4 @@ public PiranhaRenderer(EntityRendererProvider.Context renderManager) { public PiranhaRenderState createRenderState(Piranha animatable, @Nullable Void relatedObject) { return new PiranhaRenderState(); } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/MudcrabRenderState.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderstate/MudcrabRenderState.java similarity index 69% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/MudcrabRenderState.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderstate/MudcrabRenderState.java index 33c3cc0..d77b0df 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/MudcrabRenderState.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderstate/MudcrabRenderState.java @@ -1,12 +1,12 @@ -package org.polaris2023.wildwind.hfas.client.entity.renderstate; +package org.polaris2023.wildwind.wilderness.client.entity.renderstate; import net.minecraft.core.Direction; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; -import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; +import org.polaris2023.wildwind.wilderness.entity.animal.MudcrabVariant; public class MudcrabRenderState extends LivingEntityRenderState { public MudcrabVariant variant; public float modelYRotOffset; public float modelXRotOffset; public Direction motionDirection = Direction.NORTH; -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/PiranhaRenderState.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderstate/PiranhaRenderState.java similarity index 71% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/PiranhaRenderState.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderstate/PiranhaRenderState.java index 5c7b419..9f8b829 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/entity/renderstate/PiranhaRenderState.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/entity/renderstate/PiranhaRenderState.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.client.entity.renderstate; +package org.polaris2023.wildwind.wilderness.client.entity.renderstate; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; @@ -6,4 +6,4 @@ * 食人鱼渲染状态喵~ */ public class PiranhaRenderState extends LivingEntityRenderState { -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/eventsub/EntitiesClientHandler.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/eventsub/EntitiesClientHandler.java similarity index 65% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/eventsub/EntitiesClientHandler.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/eventsub/EntitiesClientHandler.java index 6d4d87e..7785460 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/eventsub/EntitiesClientHandler.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/eventsub/EntitiesClientHandler.java @@ -1,12 +1,12 @@ -package org.polaris2023.wildwind.hfas.client.eventsub; +package org.polaris2023.wildwind.wilderness.client.eventsub; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.EntityRenderersEvent; -import org.polaris2023.wildwind.hfas.client.entity.renderer.MudcrabRenderer; -import org.polaris2023.wildwind.hfas.client.entity.renderer.PiranhaRenderer; -import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.wilderness.client.entity.renderer.MudcrabRenderer; +import org.polaris2023.wildwind.wilderness.client.entity.renderer.PiranhaRenderer; +import org.polaris2023.wildwind.wilderness.registry.ModEntities; @EventBusSubscriber(value = Dist.CLIENT) public class EntitiesClientHandler { @@ -15,4 +15,4 @@ static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(ModEntities.PIRANHA.get(), PiranhaRenderer::new); event.registerEntityRenderer(ModEntities.MUDCRAB.get(), MudcrabRenderer::new); } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/client/tooltip/ClientOmniClawTooltip.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/tooltip/ClientOmniClawTooltip.java similarity index 96% rename from src/hfas/java/org/polaris2023/wildwind/hfas/client/tooltip/ClientOmniClawTooltip.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/client/tooltip/ClientOmniClawTooltip.java index 2c86888..fc66555 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/client/tooltip/ClientOmniClawTooltip.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/client/tooltip/ClientOmniClawTooltip.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.client.tooltip; +package org.polaris2023.wildwind.wilderness.client.tooltip; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphicsExtractor; @@ -6,7 +6,7 @@ import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.resources.Identifier; import net.minecraft.world.item.ItemStack; -import org.polaris2023.wildwind.hfas.component.OmniClawTools; +import org.polaris2023.wildwind.wilderness.component.OmniClawTools; /** * 全能蟹钳工具列表的客户端提示组件喵~ @@ -99,4 +99,4 @@ public void extractImage(Font font, int x, int y, int w, int h, GuiGraphicsExtra x += SLOT_WIDTH; } } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/component/OmniClawTools.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/component/OmniClawTools.java similarity index 99% rename from src/hfas/java/org/polaris2023/wildwind/hfas/component/OmniClawTools.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/component/OmniClawTools.java index f54311f..90d4b1b 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/component/OmniClawTools.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/component/OmniClawTools.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.component; +package org.polaris2023.wildwind.wilderness.component; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -372,4 +372,4 @@ public boolean equals(Object obj) { public int hashCode() { return 31 * ItemStack.hashStackList(this.toolList) + this.selectedTool; } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/effect/FluidEffects.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/effect/FluidEffects.java similarity index 94% rename from src/hfas/java/org/polaris2023/wildwind/hfas/effect/FluidEffects.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/effect/FluidEffects.java index bb444e6..967263c 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/effect/FluidEffects.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/effect/FluidEffects.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.effect; +package org.polaris2023.wildwind.wilderness.effect; import net.minecraft.tags.FluidTags; import net.minecraft.core.BlockPos; @@ -13,10 +13,10 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.living.LivingBreatheEvent; import net.neoforged.neoforge.event.tick.EntityTickEvent; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.entity.ModEntityTypeTags; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.entity.ModEntityTypeTags; -@EventBusSubscriber(modid = HFASMod.MOD_ID) +@EventBusSubscriber(modid = WildernessMod.MOD_ID) public final class FluidEffects { private FluidEffects() {} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/effect/ModEffects.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/effect/ModEffects.java similarity index 83% rename from src/hfas/java/org/polaris2023/wildwind/hfas/effect/ModEffects.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/effect/ModEffects.java index aa90190..8ec14d3 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/effect/ModEffects.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/effect/ModEffects.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.effect; +package org.polaris2023.wildwind.wilderness.effect; import net.minecraft.core.registries.Registries; import net.minecraft.world.effect.MobEffect; @@ -6,10 +6,10 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.wilderness.WildernessMod; public final class ModEffects { - private static final DeferredRegister EFFECTS = DeferredRegister.create(Registries.MOB_EFFECT, HFASMod.MOD_ID); + private static final DeferredRegister EFFECTS = DeferredRegister.create(Registries.MOB_EFFECT, WildernessMod.MOD_ID); public static final DeferredHolder SINK = EFFECTS.register("sink", () -> new HarmfulEffect(0x344D78)); public static final DeferredHolder CHOKE = EFFECTS.register("choke", () -> new HarmfulEffect(0x737C81)); private ModEffects() {} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/effect/WildWindMobEffect.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/effect/WildWindMobEffect.java similarity index 93% rename from src/hfas/java/org/polaris2023/wildwind/hfas/effect/WildWindMobEffect.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/effect/WildWindMobEffect.java index 0b45d30..edb1aa3 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/effect/WildWindMobEffect.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/effect/WildWindMobEffect.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.effect; +package org.polaris2023.wildwind.wilderness.effect; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.world.effect.MobEffect; @@ -28,4 +28,4 @@ public WildWindMobEffect(MobEffectCategory category, int color) { public WildWindMobEffect(MobEffectCategory category, int color, ParticleOptions particle) { super(category, color, particle); } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModEntityTypeTags.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ModEntityTypeTags.java similarity index 82% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModEntityTypeTags.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ModEntityTypeTags.java index e006b4f..d2a8a85 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModEntityTypeTags.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ModEntityTypeTags.java @@ -1,10 +1,10 @@ -package org.polaris2023.wildwind.hfas.entity; +package org.polaris2023.wildwind.wilderness.entity; import net.minecraft.core.registries.Registries; import net.minecraft.resources.Identifier; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EntityType; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.wilderness.WildernessMod; /** Exact entity-type lists, shared by the server and client through data-pack tags. */ public final class ModEntityTypeTags { @@ -15,6 +15,6 @@ public final class ModEntityTypeTags { private ModEntityTypeTags() {} private static TagKey> create(String name) { - return TagKey.create(Registries.ENTITY_TYPE, Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, name)); + return TagKey.create(Registries.ENTITY_TYPE, Identifier.fromNamespaceAndPath(WildernessMod.MOD_ID, name)); } } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModSpawnPlacementTypes.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ModSpawnPlacementTypes.java similarity index 97% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModSpawnPlacementTypes.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ModSpawnPlacementTypes.java index 9b6dfbf..a6e81fb 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ModSpawnPlacementTypes.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ModSpawnPlacementTypes.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.entity; +package org.polaris2023.wildwind.wilderness.entity; import net.minecraft.core.BlockPos; import net.minecraft.tags.BlockTags; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/MuddyPig.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/MuddyPig.java similarity index 84% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/MuddyPig.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/MuddyPig.java index 0660844..37ad3f5 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/MuddyPig.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/MuddyPig.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.entity; +package org.polaris2023.wildwind.wilderness.entity; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.Registries; @@ -14,13 +14,13 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import org.jspecify.annotations.Nullable; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.registry.ModEntities; /** Vanilla pig AI, food and adult/baby sounds with a distinct entity and offspring type. */ public class MuddyPig extends Pig { public static final TagKey SPAWNABLE_ON = TagKey.create(Registries.BLOCK, - Identifier.fromNamespaceAndPath(HFASMod.MOD_ID, "muddy_pig_spawnable_on")); + Identifier.fromNamespaceAndPath(WildernessMod.MOD_ID, "muddy_pig_spawnable_on")); public MuddyPig(EntityType type, Level level) { super(type, level); diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ReachArrow.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ReachArrow.java similarity index 85% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/ReachArrow.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ReachArrow.java index 06030d8..ea8083f 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ReachArrow.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ReachArrow.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.entity; +package org.polaris2023.wildwind.wilderness.entity; import net.minecraft.core.component.DataComponents; import net.minecraft.server.level.ServerLevel; @@ -8,14 +8,14 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; import org.jspecify.annotations.Nullable; -import org.polaris2023.wildwind.hfas.mixin.AbstractArrowAccessor; -import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.wilderness.mixin.AbstractArrowAccessor; +import org.polaris2023.wildwind.wilderness.registry.ModEntities; /** Native arrow physics, potion application, persistence and 600-tick decay. */ public class ReachArrow extends Arrow { public ReachArrow(EntityType type, Level level) { super(type, level); - setPickupItemStack(new ItemStack(org.polaris2023.wildwind.hfas.registry.ModItems.TIPPED_ARROW.get())); + setPickupItemStack(new ItemStack(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get())); } public ReachArrow(Level level, double x, double y, double z, ItemStack ammo, @Nullable ItemStack weapon) { diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/WindupAttackMob.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/WindupAttackMob.java similarity index 97% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/WindupAttackMob.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/WindupAttackMob.java index 881ea24..5f20f90 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/WindupAttackMob.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/WindupAttackMob.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.entity; +package org.polaris2023.wildwind.wilderness.entity; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.LivingEntity; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java similarity index 98% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java index 9559a74..9b349cd 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ai/goal/AlertOthersNearestAttackableTargetGoal.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.entity.ai.goal; +package org.polaris2023.wildwind.wilderness.entity.ai.goal; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import net.minecraft.world.entity.EntitySelector; @@ -88,4 +88,4 @@ protected double getFollowDistance() { ? this.overrideFindEntityFollowDistance : super.getFollowDistance(); } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/ChargingMeleeAttackGoal.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ai/goal/ChargingMeleeAttackGoal.java similarity index 90% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/ChargingMeleeAttackGoal.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ai/goal/ChargingMeleeAttackGoal.java index 56d9176..abd281f 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/ai/goal/ChargingMeleeAttackGoal.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/ai/goal/ChargingMeleeAttackGoal.java @@ -1,9 +1,9 @@ -package org.polaris2023.wildwind.hfas.entity.ai.goal; +package org.polaris2023.wildwind.wilderness.entity.ai.goal; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.PathfinderMob; import net.minecraft.world.entity.ai.goal.MeleeAttackGoal; -import org.polaris2023.wildwind.hfas.entity.WindupAttackMob; +import org.polaris2023.wildwind.wilderness.entity.WindupAttackMob; /** * 准备近战攻击目标 diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Mudcrab.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/animal/Mudcrab.java similarity index 98% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Mudcrab.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/animal/Mudcrab.java index 92ec6a6..d42c80c 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Mudcrab.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/animal/Mudcrab.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.entity.animal; +package org.polaris2023.wildwind.wilderness.entity.animal; import com.geckolib.animatable.GeoEntity; import com.geckolib.animatable.instance.AnimatableInstanceCache; @@ -65,12 +65,12 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.common.Tags; import net.neoforged.neoforge.fluids.FluidType; -import org.polaris2023.wildwind.hfas.entity.ModSpawnPlacementTypes; -import org.polaris2023.wildwind.hfas.entity.WindupAttackMob; -import org.polaris2023.wildwind.hfas.entity.ai.goal.ChargingMeleeAttackGoal; -import org.polaris2023.wildwind.hfas.registry.*; -import org.polaris2023.wildwind.hfas.tag.ModBlockTags; -import org.polaris2023.wildwind.hfas.tag.ModItemTags; +import org.polaris2023.wildwind.wilderness.entity.ModSpawnPlacementTypes; +import org.polaris2023.wildwind.wilderness.entity.WindupAttackMob; +import org.polaris2023.wildwind.wilderness.entity.ai.goal.ChargingMeleeAttackGoal; +import org.polaris2023.wildwind.wilderness.registry.*; +import org.polaris2023.wildwind.wilderness.tag.ModBlockTags; +import org.polaris2023.wildwind.wilderness.tag.ModItemTags; import org.slf4j.Logger; import javax.annotation.Nullable; @@ -564,7 +564,7 @@ public void loadFromBucketTag(CompoundTag tag) { */ @Override public ItemStack getBucketItemStack() { - return new ItemStack((ItemLike) ModItems.MUDCRAB_BUCKET); + return new ItemStack((ItemLike) org.polaris2023.wildwind.wilderness.registry.ModItems.MUDCRAB_BUCKET); } /** @@ -626,7 +626,7 @@ protected SoundEvent getSwimSound() { protected void ageBoundaryReached() { super.ageBoundaryReached(); if (!this.isBaby() && ((ServerLevel)this.level()).getServer().getGameRules().get(GameRules.MOB_DROPS)) { - this.spawnAtLocation((ServerLevel)this.level(), ModItems.CRAB_CLAW); + this.spawnAtLocation((ServerLevel)this.level(), org.polaris2023.wildwind.wilderness.registry.ModItems.CRAB_CLAW); } } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/MudcrabVariant.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/animal/MudcrabVariant.java similarity index 80% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/MudcrabVariant.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/animal/MudcrabVariant.java index 513e989..6766eda 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/MudcrabVariant.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/animal/MudcrabVariant.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.entity.animal; +package org.polaris2023.wildwind.wilderness.entity.animal; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -15,9 +15,9 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.world.entity.animal.TemperatureVariants; import net.minecraft.world.entity.variant.*; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.registry.DatadrivenRegistryKey; -import org.polaris2023.wildwind.hfas.tag.ModBiomeTags; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.registry.DatadrivenRegistryKey; +import org.polaris2023.wildwind.wilderness.tag.ModBiomeTags; import java.util.List; import java.util.function.Function; @@ -56,9 +56,9 @@ private static ResourceKey createKey(Identifier id) { } public static void bootstrapDatagen(BootstrapContext registry) { - registry.register(TEMPERATE, new MudcrabVariant(new ClientAsset.ResourceTexture(HFASMod.id("entity/mudcrab/temperate")), SpawnPrioritySelectors.fallback(0))); - registry.register(WARM, new MudcrabVariant(new ClientAsset.ResourceTexture(HFASMod.id("entity/mudcrab/warm")), SpawnPrioritySelectors.single(new BiomeCheck(registry.lookup(Registries.BIOME).getOrThrow(ModBiomeTags.EntityGen.MUDCRABS_WARM)), 1))); - registry.register(COLD, new MudcrabVariant(new ClientAsset.ResourceTexture(HFASMod.id("entity/mudcrab/cold")), SpawnPrioritySelectors.single(new BiomeCheck(registry.lookup(Registries.BIOME).getOrThrow(ModBiomeTags.EntityGen.MUDCRABS_COLD)), 1))); + registry.register(TEMPERATE, new MudcrabVariant(new ClientAsset.ResourceTexture(WildernessMod.id("entity/mudcrab/temperate")), SpawnPrioritySelectors.fallback(0))); + registry.register(WARM, new MudcrabVariant(new ClientAsset.ResourceTexture(WildernessMod.id("entity/mudcrab/warm")), SpawnPrioritySelectors.single(new BiomeCheck(registry.lookup(Registries.BIOME).getOrThrow(ModBiomeTags.EntityGen.MUDCRABS_WARM)), 1))); + registry.register(COLD, new MudcrabVariant(new ClientAsset.ResourceTexture(WildernessMod.id("entity/mudcrab/cold")), SpawnPrioritySelectors.single(new BiomeCheck(registry.lookup(Registries.BIOME).getOrThrow(ModBiomeTags.EntityGen.MUDCRABS_COLD)), 1))); } public static Holder lookup(RegistryAccess access, ResourceKey key){ diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Piranha.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/animal/Piranha.java similarity index 91% rename from src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Piranha.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/animal/Piranha.java index ef9b90f..3ddf5e4 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/entity/animal/Piranha.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/entity/animal/Piranha.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.entity.animal; +package org.polaris2023.wildwind.wilderness.entity.animal; import com.geckolib.animatable.GeoEntity; import com.geckolib.animatable.instance.AnimatableInstanceCache; @@ -23,11 +23,10 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.Level; -import org.polaris2023.wildwind.hfas.entity.WindupAttackMob; -import org.polaris2023.wildwind.hfas.entity.ai.goal.AlertOthersNearestAttackableTargetGoal; -import org.polaris2023.wildwind.hfas.entity.ai.goal.ChargingMeleeAttackGoal; -import org.polaris2023.wildwind.hfas.registry.ModItems; -import org.polaris2023.wildwind.hfas.registry.ModSoundEvents; +import org.polaris2023.wildwind.wilderness.entity.WindupAttackMob; +import org.polaris2023.wildwind.wilderness.entity.ai.goal.AlertOthersNearestAttackableTargetGoal; +import org.polaris2023.wildwind.wilderness.entity.ai.goal.ChargingMeleeAttackGoal; +import org.polaris2023.wildwind.wilderness.registry.ModSoundEvents; import javax.annotation.Nullable; @@ -84,7 +83,7 @@ protected SoundEvent getAttackSound() { @Override public ItemStack getBucketItemStack() { - return new ItemStack((ItemLike) ModItems.PIRANHA_BUCKET); + return new ItemStack((ItemLike) org.polaris2023.wildwind.wilderness.registry.ModItems.PIRANHA_BUCKET); } @Override @@ -152,4 +151,4 @@ public boolean canUse() { return this.mob.isInWater() && super.canUse(); } } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/AzaleaAndArrowEvents.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/AzaleaAndArrowEvents.java similarity index 68% rename from src/hfas/java/org/polaris2023/wildwind/hfas/event/AzaleaAndArrowEvents.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/event/AzaleaAndArrowEvents.java index 7a7b8fd..cb94e8b 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/event/AzaleaAndArrowEvents.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/AzaleaAndArrowEvents.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.event; +package org.polaris2023.wildwind.wilderness.event; import java.util.ArrayList; import net.minecraft.resources.Identifier; @@ -9,18 +9,17 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.event.LootTableLoadEvent; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.mixin.LootPoolEntriesAccessor; -import org.polaris2023.wildwind.hfas.mixin.LootTablePoolsAccessor; -import org.polaris2023.wildwind.hfas.registry.ModItems; -import org.polaris2023.wildwind.hfas.registry.ModPotions; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.mixin.LootPoolEntriesAccessor; +import org.polaris2023.wildwind.wilderness.mixin.LootTablePoolsAccessor; +import org.polaris2023.wildwind.wilderness.registry.ModPotions; -@EventBusSubscriber(modid = HFASMod.MOD_ID) +@EventBusSubscriber(modid = WildernessMod.MOD_ID) public final class AzaleaAndArrowEvents { @SubscribeEvent public static void setup(FMLCommonSetupEvent event) { event.enqueueWork(() -> { - DispenserBlock.registerProjectileBehavior(ModItems.TIPPED_ARROW.get()); + DispenserBlock.registerProjectileBehavior(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get()); }); } @@ -32,7 +31,7 @@ public static void gifts(LootTableLoadEvent event) { // Extend the existing random choice, preserving other mods' entries and the original number of rolls. var pool = (LootPoolEntriesAccessor) pools.getFirst(); var entries = new ArrayList<>(pool.wildwind$entries()); - entries.add(LootItem.lootTableItem(ModItems.TIPPED_ARROW.get()) + entries.add(LootItem.lootTableItem(org.polaris2023.wildwind.wilderness.registry.ModItems.TIPPED_ARROW.get()) .apply(SetPotionFunction.setPotion(ModPotions.REACH)).build()); pool.wildwind$setEntries(java.util.List.copyOf(entries)); } diff --git a/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/CreativeContents.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/CreativeContents.java new file mode 100644 index 0000000..687db3b --- /dev/null +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/CreativeContents.java @@ -0,0 +1,27 @@ +package org.polaris2023.wildwind.wilderness.event; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.alchemy.PotionContents; +import org.polaris2023.wildwind.core.registry.ModCreativeTabs; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.block.ModBlocks; +import org.polaris2023.wildwind.wilderness.registry.*; + +@EventBusSubscriber(modid = WildernessMod.MOD_ID) +public final class CreativeContents { + @SubscribeEvent public static void populate(BuildCreativeModeTabContentsEvent event) { + if (!event.getTabKey().equals(ModCreativeTabs.WILD_WIND.getKey())) return; + ModBlocks.ITEMS.getEntries().forEach(item -> event.accept(item.get())); + + ModItems.ITEMS.getEntries().stream().filter(item -> item != ModItems.TIPPED_ARROW).forEach(item -> event.accept(item.get())); + ModPotions.POTIONS.getEntries().forEach(potion -> { + event.accept(PotionContents.createItemStack(Items.POTION, potion)); + event.accept(PotionContents.createItemStack(Items.SPLASH_POTION, potion)); + event.accept(PotionContents.createItemStack(Items.LINGERING_POTION, potion)); + event.accept(org.polaris2023.wildwind.wilderness.arrow.ReachArrows.convert(PotionContents.createItemStack(Items.TIPPED_ARROW, potion))); + }); + + } +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/event/EntitiesHandler.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/EntitiesHandler.java similarity index 84% rename from src/hfas/java/org/polaris2023/wildwind/hfas/event/EntitiesHandler.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/event/EntitiesHandler.java index d84b36c..d0ebdf4 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/event/EntitiesHandler.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/EntitiesHandler.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.event; +package org.polaris2023.wildwind.wilderness.event; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.entity.SpawnPlacementTypes; @@ -7,11 +7,11 @@ import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent; import net.neoforged.neoforge.event.entity.RegisterSpawnPlacementsEvent; -import org.polaris2023.wildwind.hfas.entity.animal.Mudcrab; -import org.polaris2023.wildwind.hfas.entity.animal.Piranha; -import org.polaris2023.wildwind.hfas.entity.MuddyPig; +import org.polaris2023.wildwind.wilderness.entity.animal.Mudcrab; +import org.polaris2023.wildwind.wilderness.entity.animal.Piranha; +import org.polaris2023.wildwind.wilderness.entity.MuddyPig; import net.minecraft.world.entity.animal.pig.Pig; -import org.polaris2023.wildwind.hfas.registry.ModEntities; +import org.polaris2023.wildwind.wilderness.registry.ModEntities; @EventBusSubscriber public class EntitiesHandler { diff --git a/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/FuelHandler.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/FuelHandler.java new file mode 100644 index 0000000..b0889da --- /dev/null +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/event/FuelHandler.java @@ -0,0 +1,71 @@ +package org.polaris2023.wildwind.wilderness.event; + +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.neoforge.event.furnace.FurnaceFuelBurnTimeEvent; +import org.polaris2023.wildwind.wilderness.WildernessMod; + +/** + * 燃料事件处理器 + * 为木质方块添加燃料功能 + * + * @author baka4n + * @since 2026/04/15 + */ +@EventBusSubscriber(modid = WildernessMod.MOD_ID) +public class FuelHandler { + + /** + * 燃料燃烧时间事件 + * 木质方块可作为燃料,燃烧300 tick(与原版木板相同) + */ + @SubscribeEvent + public static void onFuelBurnTime(FurnaceFuelBurnTimeEvent event) { + Item item = event.getItemStack().getItem(); + + // 检查是否是木质方块物品 + int burnTime = getWoodBurnTime(item); + if (burnTime > 0) { + event.setBurnTime(burnTime); + } + } + + /** + * 获取木质方块的燃烧时间 + */ + private static int getWoodBurnTime(Item item) { + // 焚烬木 - 300 tick(15秒) + if (isBlazeWoodItem(item)) return 300; + // 灵焰木 - 300 tick + if (isSoulWoodItem(item)) return 300; + // 杜鹃木 - 300 tick + + return 0; + } + + private static boolean isBlazeWoodItem(Item item) { + return item == org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LOG.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_WOOD.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_LOG.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_BLAZE_WOOD.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PLANKS.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SLAB.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_FENCE_GATE.get().asItem(); + } + + private static boolean isSoulWoodItem(Item item) { + return item == org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LOG.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_WOOD.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_LOG.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.STRIPPED_SOUL_WOOD.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PLANKS.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SLAB.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE.get().asItem() + || item == org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_FENCE_GATE.get().asItem(); + } + +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/item/ModFoods.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/item/ModFoods.java similarity index 96% rename from src/hfas/java/org/polaris2023/wildwind/hfas/item/ModFoods.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/item/ModFoods.java index ac63de6..fbcea60 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/item/ModFoods.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/item/ModFoods.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.item; +package org.polaris2023.wildwind.wilderness.item; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/item/OmniClawItem.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/item/OmniClawItem.java similarity index 95% rename from src/hfas/java/org/polaris2023/wildwind/hfas/item/OmniClawItem.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/item/OmniClawItem.java index 2c4bd91..dc9f0bb 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/item/OmniClawItem.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/item/OmniClawItem.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.item; +package org.polaris2023.wildwind.wilderness.item; import com.google.common.collect.Lists; import net.minecraft.core.BlockPos; @@ -32,10 +32,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.common.ItemAbility; import net.neoforged.neoforge.common.extensions.IItemExtension; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.component.OmniClawTools; -import org.polaris2023.wildwind.hfas.registry.ModAttributes; -import org.polaris2023.wildwind.hfas.registry.ModDataComponents; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.component.OmniClawTools; +import org.polaris2023.wildwind.wilderness.registry.ModAttributes; +import org.polaris2023.wildwind.wilderness.registry.ModDataComponents; import java.util.Optional; import java.util.function.Function; @@ -53,15 +53,15 @@ public class OmniClawItem extends Item { /** * 额外交互方块距离属性修饰符标识喵~ */ - public static final Identifier BLOCK_INTERACTION_RANGE_ID = HFASMod.id("omni_claw_block_interaction_range"); + public static final Identifier BLOCK_INTERACTION_RANGE_ID = WildernessMod.id("omni_claw_block_interaction_range"); /** * 额外交互实体距离属性修饰符标识喵~ */ - public static final Identifier ENTITY_INTERACTION_RANGE_ID = HFASMod.id("omni_claw_entity_interaction_range"); + public static final Identifier ENTITY_INTERACTION_RANGE_ID = WildernessMod.id("omni_claw_entity_interaction_range"); /** * 额外拾取物品距离属性修饰符标识喵~ */ - public static final Identifier EXTRA_ITEM_PICKUP_RANGE_ID = HFASMod.id("omni_claw_extra_item_pickup_range"); + public static final Identifier EXTRA_ITEM_PICKUP_RANGE_ID = WildernessMod.id("omni_claw_extra_item_pickup_range"); /** * 创建万用蟹钳物品喵~ @@ -404,4 +404,4 @@ private void playRemoveOneSound(Entity entity) { private void playInsertSound(Entity entity) { entity.playSound(SoundEvents.BUNDLE_INSERT, 0.8F, 0.8F + entity.level().getRandom().nextFloat() * 0.4F); } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/item/ReachArrowItem.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/item/ReachArrowItem.java similarity index 89% rename from src/hfas/java/org/polaris2023/wildwind/hfas/item/ReachArrowItem.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/item/ReachArrowItem.java index a1527d2..2bb5464 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/item/ReachArrowItem.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/item/ReachArrowItem.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.item; +package org.polaris2023.wildwind.wilderness.item; import net.minecraft.core.Direction; import net.minecraft.core.Position; @@ -11,8 +11,8 @@ import net.minecraft.world.item.alchemy.PotionContents; import net.minecraft.world.level.Level; import org.jspecify.annotations.Nullable; -import org.polaris2023.wildwind.hfas.entity.ReachArrow; -import org.polaris2023.wildwind.hfas.registry.ModPotions; +import org.polaris2023.wildwind.wilderness.entity.ReachArrow; +import org.polaris2023.wildwind.wilderness.registry.ModPotions; public class ReachArrowItem extends TippedArrowItem { public ReachArrowItem(Properties properties) { diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractArrowAccessor.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/AbstractArrowAccessor.java similarity index 90% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractArrowAccessor.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/AbstractArrowAccessor.java index 0519f28..b60b73b 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/AbstractArrowAccessor.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/AbstractArrowAccessor.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import net.minecraft.world.entity.projectile.arrow.AbstractArrow; import net.minecraft.world.item.ItemStack; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EnchantmentHelperMixin.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/EnchantmentHelperMixin.java similarity index 89% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EnchantmentHelperMixin.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/EnchantmentHelperMixin.java index 1ed9566..2fa4c45 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EnchantmentHelperMixin.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/EnchantmentHelperMixin.java @@ -1,11 +1,11 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.item.enchantment.ItemEnchantments; -import org.polaris2023.wildwind.hfas.item.OmniClawItem; +import org.polaris2023.wildwind.wilderness.item.OmniClawItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; @@ -22,4 +22,4 @@ private static ItemEnchantments getRandomItemWithUnwarpOmniClaw(ItemEnchantments if (!tool.isEmpty()) enchantments = tool.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY); return enchantments; } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EntityFluidMovementMixin.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/EntityFluidMovementMixin.java similarity index 84% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EntityFluidMovementMixin.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/EntityFluidMovementMixin.java index 3e89925..2416c4a 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/EntityFluidMovementMixin.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/EntityFluidMovementMixin.java @@ -1,8 +1,8 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import net.minecraft.world.entity.Entity; import net.minecraft.world.phys.Vec3; -import org.polaris2023.wildwind.hfas.effect.FluidEffects; +import org.polaris2023.wildwind.wilderness.effect.FluidEffects; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/IronGolemAirSupplyMixin.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/IronGolemAirSupplyMixin.java similarity index 85% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/IronGolemAirSupplyMixin.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/IronGolemAirSupplyMixin.java index 7a702a3..172ddc2 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/IronGolemAirSupplyMixin.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/IronGolemAirSupplyMixin.java @@ -1,11 +1,11 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.golem.IronGolem; import net.minecraft.world.level.Level; -import org.polaris2023.wildwind.hfas.effect.ModEffects; -import org.polaris2023.wildwind.hfas.entity.ModEntityTypeTags; +import org.polaris2023.wildwind.wilderness.effect.ModEffects; +import org.polaris2023.wildwind.wilderness.entity.ModEntityTypeTags; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ItemStackMixin.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ItemStackMixin.java similarity index 88% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ItemStackMixin.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ItemStackMixin.java index ffc746f..0d18b35 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ItemStackMixin.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ItemStackMixin.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; @@ -7,9 +7,9 @@ import com.llamalad7.mixinextras.sugar.ref.LocalRef; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import org.polaris2023.wildwind.hfas.component.OmniClawTools; -import org.polaris2023.wildwind.hfas.item.OmniClawItem; -import org.polaris2023.wildwind.hfas.registry.ModDataComponents; +import org.polaris2023.wildwind.wilderness.component.OmniClawTools; +import org.polaris2023.wildwind.wilderness.item.OmniClawItem; +import org.polaris2023.wildwind.wilderness.registry.ModDataComponents; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -49,4 +49,4 @@ private void omniClawShrinkTool(ItemStack instance, int decrement, Operation cir) { - if (cir.getReturnValueZ() && target instanceof LivingEntity living) { - SkeletonBehavior.afterMeleeHit((Mob) (Object) this, living); - } - } @ModifyVariable(method = "aiStep", at = @At(value = "STORE", ordinal = 0)) private Vec3i reachMobEffectPickupRange(Vec3i vec3i) { diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/PlayerMixin.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/PlayerMixin.java similarity index 92% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/PlayerMixin.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/PlayerMixin.java index b689dd8..74c2a01 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/PlayerMixin.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/PlayerMixin.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.world.entity.Entity; @@ -6,7 +6,7 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.AABB; -import org.polaris2023.wildwind.hfas.registry.ModAttributes; +import org.polaris2023.wildwind.wilderness.registry.ModAttributes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -33,4 +33,4 @@ private void reachMobEffectTouchItem(CallbackInfo ci, @Local(ordinal = 0) AABB a } } } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowCraftingMixin.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ReachArrowCraftingMixin.java similarity index 86% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowCraftingMixin.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ReachArrowCraftingMixin.java index 9d04a12..3fd2216 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowCraftingMixin.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ReachArrowCraftingMixin.java @@ -1,8 +1,8 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.ImbueRecipe; -import org.polaris2023.wildwind.hfas.arrow.ReachArrows; +import org.polaris2023.wildwind.wilderness.arrow.ReachArrows; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowLootMixin.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ReachArrowLootMixin.java similarity index 87% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowLootMixin.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ReachArrowLootMixin.java index e02e4d3..391b3e8 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ReachArrowLootMixin.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ReachArrowLootMixin.java @@ -1,9 +1,9 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.functions.SetRandomPotionFunction; import net.minecraft.world.level.storage.loot.functions.SetPotionFunction; -import org.polaris2023.wildwind.hfas.arrow.ReachArrows; +import org.polaris2023.wildwind.wilderness.arrow.ReachArrows; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ServerPlayerGameModeMixin.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ServerPlayerGameModeMixin.java similarity index 96% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ServerPlayerGameModeMixin.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ServerPlayerGameModeMixin.java index 7a9292e..d8a7756 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/ServerPlayerGameModeMixin.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/ServerPlayerGameModeMixin.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -import org.polaris2023.wildwind.hfas.item.OmniClawItem; +import org.polaris2023.wildwind.wilderness.item.OmniClawItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -47,4 +47,4 @@ private ItemStack handleBlockBreakOmniClawSelectTool(ServerPlayer instance, Oper OmniClawItem.chooseToolItemByBlock(stack, state); return stack; } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/WaterAnimalAirSupplyMixin.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/WaterAnimalAirSupplyMixin.java similarity index 85% rename from src/hfas/java/org/polaris2023/wildwind/hfas/mixin/WaterAnimalAirSupplyMixin.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/WaterAnimalAirSupplyMixin.java index ffd4bec..65ca4fe 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/mixin/WaterAnimalAirSupplyMixin.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/mixin/WaterAnimalAirSupplyMixin.java @@ -1,9 +1,9 @@ -package org.polaris2023.wildwind.hfas.mixin; +package org.polaris2023.wildwind.wilderness.mixin; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.animal.axolotl.Axolotl; import net.minecraft.world.entity.animal.fish.WaterAnimal; -import org.polaris2023.wildwind.hfas.effect.FluidEffects; +import org.polaris2023.wildwind.wilderness.effect.FluidEffects; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/network/HFASNetwork.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/network/HFASNetwork.java similarity index 71% rename from src/hfas/java/org/polaris2023/wildwind/hfas/network/HFASNetwork.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/network/HFASNetwork.java index 2b23805..4b1be9c 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/network/HFASNetwork.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/network/HFASNetwork.java @@ -1,16 +1,16 @@ -package org.polaris2023.wildwind.hfas.network; +package org.polaris2023.wildwind.wilderness.network; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; import net.neoforged.neoforge.network.registration.PayloadRegistrar; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.network.payload.ServerBoundSelectOmniClawItemPayload; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.network.payload.ServerBoundSelectOmniClawItemPayload; /** * 模组网络负载注册入口喵~ */ -@EventBusSubscriber(modid = HFASMod.MOD_ID) +@EventBusSubscriber(modid = WildernessMod.MOD_ID) public class HFASNetwork { @SubscribeEvent @@ -25,4 +25,4 @@ static void register(RegisterPayloadHandlersEvent event) { private HFASNetwork() { } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/network/payload/ServerBoundSelectOmniClawItemPayload.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/network/payload/ServerBoundSelectOmniClawItemPayload.java similarity index 86% rename from src/hfas/java/org/polaris2023/wildwind/hfas/network/payload/ServerBoundSelectOmniClawItemPayload.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/network/payload/ServerBoundSelectOmniClawItemPayload.java index 1c672b6..ea2a446 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/network/payload/ServerBoundSelectOmniClawItemPayload.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/network/payload/ServerBoundSelectOmniClawItemPayload.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.network.payload; +package org.polaris2023.wildwind.wilderness.network.payload; import io.netty.buffer.ByteBuf; import net.minecraft.network.codec.ByteBufCodecs; @@ -7,9 +7,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.network.handling.IPayloadContext; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.component.OmniClawTools; -import org.polaris2023.wildwind.hfas.registry.ModDataComponents; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.component.OmniClawTools; +import org.polaris2023.wildwind.wilderness.registry.ModDataComponents; /** * 客户端通知服务端切换全能蟹钳选中工具的网络负载喵~ @@ -21,7 +21,7 @@ public record ServerBoundSelectOmniClawItemPayload(int slot, int index) implemen /** * 当前负载的类型标识喵~ */ - public static final Type TYPE = new Type<>(HFASMod.id("select_omni_claw_item")); + public static final Type TYPE = new Type<>(WildernessMod.id("select_omni_claw_item")); /** * 当前负载的流编解码器喵~ */ @@ -70,4 +70,4 @@ public void handle(IPayloadContext context) { stack.set(ModDataComponents.OMNI_CLAW_TOOLS.get(), mutableTools.toImmutable()); } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/DatadrivenRegistryKey.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/DatadrivenRegistryKey.java similarity index 63% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/DatadrivenRegistryKey.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/DatadrivenRegistryKey.java index 250ae7f..271ee42 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/DatadrivenRegistryKey.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/DatadrivenRegistryKey.java @@ -1,9 +1,9 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.wilderness.registry; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.entity.animal.MudcrabVariant; //内容请注册到mod主类的Datapack注册事件中 public class DatadrivenRegistryKey { @@ -14,6 +14,6 @@ public class DatadrivenRegistryKey { private static ResourceKey> createRegistryKey(String name) { - return ResourceKey.createRegistryKey(HFASMod.id(name)); + return ResourceKey.createRegistryKey(WildernessMod.id(name)); } } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModAttributes.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModAttributes.java similarity index 84% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModAttributes.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModAttributes.java index c802b34..fd1537f 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModAttributes.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModAttributes.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.wilderness.registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.entity.ai.attributes.Attribute; @@ -9,7 +9,7 @@ import net.neoforged.neoforge.event.entity.EntityAttributeModificationEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.wilderness.WildernessMod; /** * 注册模组属性喵~ @@ -17,19 +17,19 @@ * 26.2 迁移说明:旧仓库通过 LivingEntityMixin 向全体生物基础属性表追加属性, * 现改用 NeoForge 的 EntityAttributeModificationEvent 实现同等效果(涵盖玩家)。 */ -@EventBusSubscriber(modid = HFASMod.MOD_ID) +@EventBusSubscriber(modid = WildernessMod.MOD_ID) public class ModAttributes { /** * 模组属性延迟注册器喵~ */ - public static final DeferredRegister ATTRIBUTES = DeferredRegister.create(BuiltInRegistries.ATTRIBUTE, HFASMod.MOD_ID); + public static final DeferredRegister ATTRIBUTES = DeferredRegister.create(BuiltInRegistries.ATTRIBUTE, WildernessMod.MOD_ID); /** * 额外物品拾取距离属性喵~ */ public static final DeferredHolder EXTRA_ITEM_PICKUP_RANGE = ATTRIBUTES.register("extra_item_pickup_range", () -> new RangedAttribute( - "attributes.ww_hfas.extra_item_pickup_range", + "attributes.wild_wind_wilderness.extra_item_pickup_range", 0.0, 0.0, 10.0 @@ -56,4 +56,4 @@ public static void register(IEventBus modBus) { static void addAttributesToLivingEntities(EntityAttributeModificationEvent event) { event.getTypes().forEach(type -> event.add(type, EXTRA_ITEM_PICKUP_RANGE)); } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModDataComponents.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModDataComponents.java similarity index 68% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModDataComponents.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModDataComponents.java index f36f99f..f63f1d4 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModDataComponents.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModDataComponents.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.wilderness.registry; import net.minecraft.core.Holder; import net.minecraft.core.component.DataComponentType; @@ -7,13 +7,12 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.component.ArrowComponent; -import org.polaris2023.wildwind.hfas.component.OmniClawTools; -import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.component.OmniClawTools; +import org.polaris2023.wildwind.wilderness.entity.animal.MudcrabVariant; public class ModDataComponents { - public static final DeferredRegister.DataComponents REGISTER = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, HFASMod.MOD_ID); + public static final DeferredRegister.DataComponents REGISTER = DeferredRegister.createDataComponents(Registries.DATA_COMPONENT_TYPE, WildernessMod.MOD_ID); public static final DeferredHolder, DataComponentType>> MUDCRAB_VARIANT = REGISTER.registerComponentType("mubcrab_variant", builder -> @@ -23,10 +22,7 @@ public class ModDataComponents { /** * 箭矢组件 - 存储箭羽、箭杆、箭头类型 */ - public static final DeferredHolder, DataComponentType> ARROW_COMPONENT = - REGISTER.registerComponentType("arrow_component", builder -> - builder.persistent(ArrowComponent.CODEC).networkSynchronized(ArrowComponent.STREAM_CODEC) - ); + /** * 万用蟹钳工具集合数据组件喵~ diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntities.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModEntities.java similarity index 71% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntities.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModEntities.java index 9790e5e..7007d28 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntities.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModEntities.java @@ -1,23 +1,23 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.wilderness.registry; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.client.eventsub.EntitiesClientHandler; -import org.polaris2023.wildwind.hfas.entity.animal.Mudcrab; -import org.polaris2023.wildwind.hfas.entity.animal.Piranha; -import org.polaris2023.wildwind.hfas.entity.MuddyPig; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.client.eventsub.EntitiesClientHandler; +import org.polaris2023.wildwind.wilderness.entity.animal.Mudcrab; +import org.polaris2023.wildwind.wilderness.entity.animal.Piranha; +import org.polaris2023.wildwind.wilderness.entity.MuddyPig; public class ModEntities { public static final DeferredRegister.Entities ENTITY_TYPES = - DeferredRegister.createEntities(HFASMod.MOD_ID); + DeferredRegister.createEntities(WildernessMod.MOD_ID); - public static final DeferredHolder, EntityType> REACH_ARROW = - ENTITY_TYPES.registerEntityType("arrow", org.polaris2023.wildwind.hfas.entity.ReachArrow::new, MobCategory.MISC, + public static final DeferredHolder, EntityType> REACH_ARROW = + ENTITY_TYPES.registerEntityType("arrow", org.polaris2023.wildwind.wilderness.entity.ReachArrow::new, MobCategory.MISC, builder -> builder.noLootTable().sized(0.5F, 0.5F).eyeHeight(0.13F).clientTrackingRange(4).updateInterval(20)); private ModEntities() { @@ -43,7 +43,7 @@ private ModEntities() { * 向模组事件总线注册实体类型喵~ * * @see EntitiesClientHandler EntitiesClientEvent 实体客户端渲染绑定 - * @see org.polaris2023.wildwind.hfas.event.EntitiesHandler EntitiesHandler 实体服务端信息(attribute等绑定) + * @see org.polaris2023.wildwind.wilderness.event.EntitiesHandler EntitiesHandler 实体服务端信息(attribute等绑定) * * @param modBus 模组事件总线喵~ */ diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntityDataSerializers.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModEntityDataSerializers.java similarity index 82% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntityDataSerializers.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModEntityDataSerializers.java index f8f98ca..7d0d306 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModEntityDataSerializers.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModEntityDataSerializers.java @@ -1,12 +1,12 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.wilderness.registry; import net.minecraft.core.Holder; import net.minecraft.network.syncher.EntityDataSerializer; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.registries.NeoForgeRegistries; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.entity.animal.MudcrabVariant; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.entity.animal.MudcrabVariant; import java.util.function.Supplier; @@ -17,7 +17,7 @@ public class ModEntityDataSerializers { /** * 实体数据序列化器延迟注册器喵~ */ - public static final DeferredRegister> ENTITY_DATA_SERIALIZERS = DeferredRegister.create(NeoForgeRegistries.ENTITY_DATA_SERIALIZERS, HFASMod.MOD_ID); + public static final DeferredRegister> ENTITY_DATA_SERIALIZERS = DeferredRegister.create(NeoForgeRegistries.ENTITY_DATA_SERIALIZERS, WildernessMod.MOD_ID); /** * 泥沼蟹变种实体数据序列化器喵~ diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModItems.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModItems.java similarity index 66% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModItems.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModItems.java index 838d231..d32e374 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModItems.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModItems.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.wilderness.registry; import net.minecraft.core.Holder; import net.minecraft.sounds.SoundEvents; @@ -10,62 +10,33 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.component.OmniClawTools; -import org.polaris2023.wildwind.hfas.item.ModFoods; -import org.polaris2023.wildwind.hfas.item.OmniClawItem; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.component.OmniClawTools; +import org.polaris2023.wildwind.wilderness.item.ModFoods; +import org.polaris2023.wildwind.wilderness.item.OmniClawItem; import java.util.function.Function; import java.util.List; public class ModItems { - public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(HFASMod.MOD_ID); - - public static final DeferredItem TIPPED_ARROW = - register("tipped_arrow", org.polaris2023.wildwind.hfas.item.ReachArrowItem::new); - + public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(WildernessMod.MOD_ID); + public static final DeferredItem TIPPED_ARROW = + register("tipped_arrow", org.polaris2023.wildwind.wilderness.item.ReachArrowItem::new); public static final DeferredItem MUDDY_PIG_SPAWN_EGG = registerMobEgg("muddy_pig_spawn_egg", ModEntities.MUDDY_PIG); - - // User-supplied materials remain ordinary items, without food components. - public static final DeferredItem DUCKWEED = register("duckweed"); - public static final DeferredItem CALAMARI = register("calamari"); - public static final DeferredItem COOKED_CALAMARI = register("cooked_calamari"); - public static final DeferredItem COOKED_EGG = register("cooked_egg"); - public static final DeferredItem BAKED_SEEDS = register("baked_seeds"); - public static final DeferredItem COOKED_FROG_LEGS = register("cooked_frog_legs"); - public static final DeferredItem FROG_LEGS = register("frog_legs"); - public static final List> MATERIALS = List.of( - DUCKWEED, CALAMARI, COOKED_CALAMARI, COOKED_EGG, BAKED_SEEDS, COOKED_FROG_LEGS, FROG_LEGS); - - //泥沼蟹刷怪蛋 public static final DeferredItem MUDCRAB_SPAWN_EGG = registerMobEgg("mudcrab_spawn_egg",ModEntities.MUDCRAB); - - //泥沼蟹桶 public static final DeferredItem MUDCRAB_BUCKET = register("mudcrab_bucket",p -> new MobBucketItem(ModEntities.MUDCRAB.get(),Fluids.WATER,SoundEvents.BUCKET_EMPTY,p)); - - //蟹钳 public static final DeferredItem CRAB_CLAW = register("crab_claw"); - - //食人鱼 public static final DeferredItem PIRANHA = register("piranha", p -> new Item(p.food(ModFoods.PIRANHA, ModFoods.PIRANHA_CONSUMABLE))); public static final DeferredItem COOKED_PIRANHA = register("cooked_piranha", p -> new Item(p.food(ModFoods.COOKED_PIRANHA, ModFoods.COOKED_PIRANHA_CONSUMABLE))); public static final DeferredItem PIRANHA_SPAWN_EGG = registerMobEgg("piranha_spawn_egg", ModEntities.PIRANHA); - - //食人鱼桶 public static final DeferredItem PIRANHA_BUCKET = register("piranha_bucket", p -> new MobBucketItem(ModEntities.PIRANHA.get(), Fluids.WATER, SoundEvents.BUCKET_EMPTY_FISH, p)); - - //尖牙(食人鱼掉落物) public static final DeferredItem FANG = register("fang"); - - - //万用蟹钳 public static final DeferredItem OMNI_CLAW = register("omni_claw", p -> new OmniClawItem( p.stacksTo(1) .attributes(OmniClawItem.createAttributes()) .component(ModDataComponents.OMNI_CLAW_TOOLS.get(), OmniClawTools.EMPTY) )); - public static void register(IEventBus modBus) { ITEMS.register(modBus); } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModMobEffects.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModMobEffects.java similarity index 76% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModMobEffects.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModMobEffects.java index 7cf7b3d..b61c872 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModMobEffects.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModMobEffects.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.wilderness.registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.effect.MobEffect; @@ -8,9 +8,9 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; -import org.polaris2023.wildwind.hfas.registry.ModAttributes; -import org.polaris2023.wildwind.hfas.effect.WildWindMobEffect; +import org.polaris2023.wildwind.wilderness.WildernessMod; +import org.polaris2023.wildwind.wilderness.registry.ModAttributes; +import org.polaris2023.wildwind.wilderness.effect.WildWindMobEffect; /** * 注册模组状态效果喵~ @@ -20,7 +20,7 @@ public class ModMobEffects { * 状态效果延迟注册器喵~ */ public static final DeferredRegister MOB_EFFECTS = - DeferredRegister.create(BuiltInRegistries.MOB_EFFECT, HFASMod.MOD_ID); + DeferredRegister.create(BuiltInRegistries.MOB_EFFECT, WildernessMod.MOD_ID); /** * 延展状态效果喵~ @@ -30,19 +30,19 @@ public class ModMobEffects { () -> new WildWindMobEffect(MobEffectCategory.BENEFICIAL, 0xFF3F7E8E) .addAttributeModifier( Attributes.BLOCK_INTERACTION_RANGE, - HFASMod.id("effect.reach"), + WildernessMod.id("effect.reach"), 2.0, AttributeModifier.Operation.ADD_VALUE ) .addAttributeModifier( Attributes.ENTITY_INTERACTION_RANGE, - HFASMod.id("effect.reach"), + WildernessMod.id("effect.reach"), 2.0, AttributeModifier.Operation.ADD_VALUE ) .addAttributeModifier( ModAttributes.EXTRA_ITEM_PICKUP_RANGE, - HFASMod.id("effect.reach"), + WildernessMod.id("effect.reach"), 2.0, AttributeModifier.Operation.ADD_VALUE ) @@ -59,4 +59,4 @@ public static void register(IEventBus modBus) { private ModMobEffects() { } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModPotions.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModPotions.java similarity index 85% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModPotions.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModPotions.java index 0d27a65..7c976cc 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModPotions.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModPotions.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.wilderness.registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.effect.MobEffectInstance; @@ -12,18 +12,18 @@ import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.wilderness.WildernessMod; /** * 注册模组药水并处理酿造配方喵~ */ -@EventBusSubscriber(modid = HFASMod.MOD_ID) +@EventBusSubscriber(modid = WildernessMod.MOD_ID) public class ModPotions { /** * 药水延迟注册器喵~ */ public static final DeferredRegister POTIONS = - DeferredRegister.create(BuiltInRegistries.POTION, HFASMod.MOD_ID); + DeferredRegister.create(BuiltInRegistries.POTION, WildernessMod.MOD_ID); /** * 延展药水喵~ @@ -56,7 +56,7 @@ static void registerBrewingRecipes(RegisterBrewingRecipesEvent event) { builder.addMix( Potions.AWKWARD, - ModItems.CRAB_CLAW.get(), + org.polaris2023.wildwind.wilderness.registry.ModItems.CRAB_CLAW.get(), ModPotions.REACH ); @@ -69,4 +69,4 @@ static void registerBrewingRecipes(RegisterBrewingRecipesEvent event) { private ModPotions() { } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModSoundEvents.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModSoundEvents.java similarity index 87% rename from src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModSoundEvents.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModSoundEvents.java index 8b5eedd..80aa6a4 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/registry/ModSoundEvents.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/registry/ModSoundEvents.java @@ -1,15 +1,15 @@ -package org.polaris2023.wildwind.hfas.registry; +package org.polaris2023.wildwind.wilderness.registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.sounds.SoundEvent; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.wilderness.WildernessMod; public class ModSoundEvents { public static final DeferredRegister SOUND_EVENTS = - DeferredRegister.create(BuiltInRegistries.SOUND_EVENT, HFASMod.MOD_ID); + DeferredRegister.create(BuiltInRegistries.SOUND_EVENT, WildernessMod.MOD_ID); public static final DeferredHolder PIRANHA_ATTACK = SOUND_EVENTS.register( "entity.piranha.attack", @@ -27,4 +27,4 @@ public static void register(IEventBus modEventBus) { private ModSoundEvents() { } -} \ No newline at end of file +} diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBiomeTags.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/tag/ModBiomeTags.java similarity index 81% rename from src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBiomeTags.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/tag/ModBiomeTags.java index 26259d8..a947df9 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBiomeTags.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/tag/ModBiomeTags.java @@ -1,9 +1,9 @@ -package org.polaris2023.wildwind.hfas.tag; +package org.polaris2023.wildwind.wilderness.tag; import net.minecraft.core.registries.Registries; import net.minecraft.tags.TagKey; import net.minecraft.world.level.biome.Biome; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.wilderness.WildernessMod; /** * 定义模组群系标签喵~ @@ -32,6 +32,6 @@ interface EntityGen{ * @return 群系标签键喵~ */ static TagKey create(String path) { - return TagKey.create(Registries.BIOME, HFASMod.id(path)); + return TagKey.create(Registries.BIOME, WildernessMod.id(path)); } } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBlockTags.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/tag/ModBlockTags.java similarity index 54% rename from src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBlockTags.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/tag/ModBlockTags.java index 7ef4a96..38532c3 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModBlockTags.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/tag/ModBlockTags.java @@ -1,9 +1,9 @@ -package org.polaris2023.wildwind.hfas.tag; +package org.polaris2023.wildwind.wilderness.tag; import net.minecraft.tags.BlockTags; import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.wilderness.WildernessMod; /** * 定义模组方块标签喵~ @@ -12,14 +12,14 @@ public interface ModBlockTags { interface EntityAbout { //泥沼蟹可在其上生成的方块标签喵~ - TagKey MUDCRAB_SPAWNABLE_ON = BlockTags.create(HFASMod.id("entity/mudcrab/spawnable_on")); + TagKey MUDCRAB_SPAWNABLE_ON = BlockTags.create(WildernessMod.id("entity/mudcrab/spawnable_on")); //泥沼蟹可在水下地面生成的方块标签喵~ - TagKey MUDCRAB_SPAWNABLE_IN_WATER_GROUND = BlockTags.create(HFASMod.id("entity/mudcrab/spawnable_in_water_ground")); + TagKey MUDCRAB_SPAWNABLE_IN_WATER_GROUND = BlockTags.create(WildernessMod.id("entity/mudcrab/spawnable_in_water_ground")); //泥沼蟹偏好游荡的方块标签喵~ - TagKey MUDCRAB_PREFERRED_WANDER_BLOCKS = BlockTags.create(HFASMod.id("entity/mudcrab/preferred_wander_blocks")); + TagKey MUDCRAB_PREFERRED_WANDER_BLOCKS = BlockTags.create(WildernessMod.id("entity/mudcrab/preferred_wander_blocks")); //蜘蛛卵 - TagKey SPIDER_COCOONS = BlockTags.create(HFASMod.id("spider_cocoons")); + TagKey SPIDER_COCOONS = BlockTags.create(WildernessMod.id("spider_cocoons")); } } diff --git a/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModItemTags.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/tag/ModItemTags.java similarity index 55% rename from src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModItemTags.java rename to src/wilderness/java/org/polaris2023/wildwind/wilderness/tag/ModItemTags.java index 29cea11..8390280 100644 --- a/src/hfas/java/org/polaris2023/wildwind/hfas/tag/ModItemTags.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/tag/ModItemTags.java @@ -1,9 +1,9 @@ -package org.polaris2023.wildwind.hfas.tag; +package org.polaris2023.wildwind.wilderness.tag; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; -import org.polaris2023.wildwind.hfas.HFASMod; +import org.polaris2023.wildwind.wilderness.WildernessMod; /** * 定义模组物品标签喵~ @@ -12,5 +12,5 @@ public interface ModItemTags { /** * 泥沼蟹食物的物品标签喵~ */ - TagKey MUDCRAB_FOOD = ItemTags.create(HFASMod.id("mudcrab_food")); + TagKey MUDCRAB_FOOD = ItemTags.create(WildernessMod.id("mudcrab_food")); } diff --git a/src/wilderness/java/org/polaris2023/wildwind/wilderness/worldgen/ModTreeGrowers.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/worldgen/ModTreeGrowers.java new file mode 100644 index 0000000..a3a6c01 --- /dev/null +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/worldgen/ModTreeGrowers.java @@ -0,0 +1,10 @@ +package org.polaris2023.wildwind.wilderness.worldgen; +import net.minecraft.world.level.block.grower.TreeGrower; +import net.minecraft.resources.ResourceKey; +import net.minecraft.core.registries.Registries; +import java.util.Optional; +import org.polaris2023.wildwind.wilderness.WildernessMod; +public final class ModTreeGrowers { + public static final TreeGrower BLAZE = new TreeGrower("wild_wind_wilderness:blaze", Optional.empty(), Optional.of(ResourceKey.create(Registries.CONFIGURED_FEATURE, WildernessMod.id("blaze_tree"))), Optional.empty()); + public static final TreeGrower SOUL = new TreeGrower("wild_wind_wilderness:soul", Optional.empty(), Optional.of(ResourceKey.create(Registries.CONFIGURED_FEATURE, WildernessMod.id("soul_tree"))), Optional.empty()); +} diff --git a/src/hfas/resources/META-INF/accesstransformer.cfg b/src/wilderness/resources/META-INF/accesstransformer.cfg similarity index 100% rename from src/hfas/resources/META-INF/accesstransformer.cfg rename to src/wilderness/resources/META-INF/accesstransformer.cfg diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_button.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_button.json similarity index 57% rename from src/hfas/resources/assets/ww_hfas/blockstates/blaze_button.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_button.json index 296fbc8..865fa4b 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_button.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_button.json @@ -1,118 +1,118 @@ { "variants": { "face=ceiling,facing=east,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "x": 180, "y": 270 }, "face=ceiling,facing=east,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "x": 180, "y": 270 }, "face=ceiling,facing=north,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "x": 180, "y": 180 }, "face=ceiling,facing=north,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "x": 180, "y": 180 }, "face=ceiling,facing=south,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "x": 180 }, "face=ceiling,facing=south,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "x": 180 }, "face=ceiling,facing=west,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "x": 180, "y": 90 }, "face=ceiling,facing=west,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "x": 180, "y": 90 }, "face=floor,facing=east,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "y": 90 }, "face=floor,facing=east,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "y": 90 }, "face=floor,facing=north,powered=false": { - "model": "ww_hfas:block/blaze_button" + "model": "wild_wind_wilderness:block/blaze_button" }, "face=floor,facing=north,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed" + "model": "wild_wind_wilderness:block/blaze_button_pressed" }, "face=floor,facing=south,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "y": 180 }, "face=floor,facing=south,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "y": 180 }, "face=floor,facing=west,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "y": 270 }, "face=floor,facing=west,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "y": 270 }, "face=wall,facing=east,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "uvlock": true, "x": 90, "y": 90 }, "face=wall,facing=east,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "uvlock": true, "x": 90, "y": 90 }, "face=wall,facing=north,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "uvlock": true, "x": 90 }, "face=wall,facing=north,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "uvlock": true, "x": 90 }, "face=wall,facing=south,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "uvlock": true, "x": 90, "y": 180 }, "face=wall,facing=south,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "uvlock": true, "x": 90, "y": 180 }, "face=wall,facing=west,powered=false": { - "model": "ww_hfas:block/blaze_button", + "model": "wild_wind_wilderness:block/blaze_button", "uvlock": true, "x": 90, "y": 270 }, "face=wall,facing=west,powered=true": { - "model": "ww_hfas:block/blaze_button_pressed", + "model": "wild_wind_wilderness:block/blaze_button_pressed", "uvlock": true, "x": 90, "y": 270 } } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_door.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_door.json similarity index 51% rename from src/hfas/resources/assets/ww_hfas/blockstates/blaze_door.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_door.json index 9092f32..af8c56d 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_door.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_door.json @@ -1,124 +1,124 @@ { "variants": { "facing=east,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/blaze_door_bottom_left" + "model": "wild_wind_wilderness:block/blaze_door_bottom_left" }, "facing=east,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/blaze_door_bottom_left_open", + "model": "wild_wind_wilderness:block/blaze_door_bottom_left_open", "y": 90 }, "facing=east,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/blaze_door_bottom_right" + "model": "wild_wind_wilderness:block/blaze_door_bottom_right" }, "facing=east,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/blaze_door_bottom_right_open", + "model": "wild_wind_wilderness:block/blaze_door_bottom_right_open", "y": 270 }, "facing=east,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/blaze_door_top_left" + "model": "wild_wind_wilderness:block/blaze_door_top_left" }, "facing=east,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/blaze_door_top_left_open", + "model": "wild_wind_wilderness:block/blaze_door_top_left_open", "y": 90 }, "facing=east,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/blaze_door_top_right" + "model": "wild_wind_wilderness:block/blaze_door_top_right" }, "facing=east,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/blaze_door_top_right_open", + "model": "wild_wind_wilderness:block/blaze_door_top_right_open", "y": 270 }, "facing=north,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/blaze_door_bottom_left", + "model": "wild_wind_wilderness:block/blaze_door_bottom_left", "y": 270 }, "facing=north,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/blaze_door_bottom_left_open" + "model": "wild_wind_wilderness:block/blaze_door_bottom_left_open" }, "facing=north,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/blaze_door_bottom_right", + "model": "wild_wind_wilderness:block/blaze_door_bottom_right", "y": 270 }, "facing=north,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/blaze_door_bottom_right_open", + "model": "wild_wind_wilderness:block/blaze_door_bottom_right_open", "y": 180 }, "facing=north,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/blaze_door_top_left", + "model": "wild_wind_wilderness:block/blaze_door_top_left", "y": 270 }, "facing=north,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/blaze_door_top_left_open" + "model": "wild_wind_wilderness:block/blaze_door_top_left_open" }, "facing=north,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/blaze_door_top_right", + "model": "wild_wind_wilderness:block/blaze_door_top_right", "y": 270 }, "facing=north,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/blaze_door_top_right_open", + "model": "wild_wind_wilderness:block/blaze_door_top_right_open", "y": 180 }, "facing=south,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/blaze_door_bottom_left", + "model": "wild_wind_wilderness:block/blaze_door_bottom_left", "y": 90 }, "facing=south,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/blaze_door_bottom_left_open", + "model": "wild_wind_wilderness:block/blaze_door_bottom_left_open", "y": 180 }, "facing=south,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/blaze_door_bottom_right", + "model": "wild_wind_wilderness:block/blaze_door_bottom_right", "y": 90 }, "facing=south,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/blaze_door_bottom_right_open" + "model": "wild_wind_wilderness:block/blaze_door_bottom_right_open" }, "facing=south,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/blaze_door_top_left", + "model": "wild_wind_wilderness:block/blaze_door_top_left", "y": 90 }, "facing=south,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/blaze_door_top_left_open", + "model": "wild_wind_wilderness:block/blaze_door_top_left_open", "y": 180 }, "facing=south,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/blaze_door_top_right", + "model": "wild_wind_wilderness:block/blaze_door_top_right", "y": 90 }, "facing=south,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/blaze_door_top_right_open" + "model": "wild_wind_wilderness:block/blaze_door_top_right_open" }, "facing=west,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/blaze_door_bottom_left", + "model": "wild_wind_wilderness:block/blaze_door_bottom_left", "y": 180 }, "facing=west,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/blaze_door_bottom_left_open", + "model": "wild_wind_wilderness:block/blaze_door_bottom_left_open", "y": 270 }, "facing=west,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/blaze_door_bottom_right", + "model": "wild_wind_wilderness:block/blaze_door_bottom_right", "y": 180 }, "facing=west,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/blaze_door_bottom_right_open", + "model": "wild_wind_wilderness:block/blaze_door_bottom_right_open", "y": 90 }, "facing=west,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/blaze_door_top_left", + "model": "wild_wind_wilderness:block/blaze_door_top_left", "y": 180 }, "facing=west,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/blaze_door_top_left_open", + "model": "wild_wind_wilderness:block/blaze_door_top_left_open", "y": 270 }, "facing=west,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/blaze_door_top_right", + "model": "wild_wind_wilderness:block/blaze_door_top_right", "y": 180 }, "facing=west,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/blaze_door_top_right_open", + "model": "wild_wind_wilderness:block/blaze_door_top_right_open", "y": 90 } } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_fence.json similarity index 63% rename from src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_fence.json index ab441f0..8afb5ec 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_fence.json @@ -2,12 +2,12 @@ "multipart": [ { "apply": { - "model": "ww_hfas:block/blaze_fence_post" + "model": "wild_wind_wilderness:block/blaze_fence_post" } }, { "apply": { - "model": "ww_hfas:block/blaze_fence_side", + "model": "wild_wind_wilderness:block/blaze_fence_side", "uvlock": true }, "when": { @@ -16,7 +16,7 @@ }, { "apply": { - "model": "ww_hfas:block/blaze_fence_side", + "model": "wild_wind_wilderness:block/blaze_fence_side", "uvlock": true, "y": 90 }, @@ -26,7 +26,7 @@ }, { "apply": { - "model": "ww_hfas:block/blaze_fence_side", + "model": "wild_wind_wilderness:block/blaze_fence_side", "uvlock": true, "y": 180 }, @@ -36,7 +36,7 @@ }, { "apply": { - "model": "ww_hfas:block/blaze_fence_side", + "model": "wild_wind_wilderness:block/blaze_fence_side", "uvlock": true, "y": 270 }, @@ -45,4 +45,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence_gate.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_fence_gate.json similarity index 56% rename from src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence_gate.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_fence_gate.json index efe2183..c9c0c65 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_fence_gate.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_fence_gate.json @@ -1,80 +1,80 @@ { "variants": { "facing=east,in_wall=false,open=false": { - "model": "ww_hfas:block/blaze_fence_gate", + "model": "wild_wind_wilderness:block/blaze_fence_gate", "uvlock": true, "y": 270 }, "facing=east,in_wall=false,open=true": { - "model": "ww_hfas:block/blaze_fence_gate_open", + "model": "wild_wind_wilderness:block/blaze_fence_gate_open", "uvlock": true, "y": 270 }, "facing=east,in_wall=true,open=false": { - "model": "ww_hfas:block/blaze_fence_gate_wall", + "model": "wild_wind_wilderness:block/blaze_fence_gate_wall", "uvlock": true, "y": 270 }, "facing=east,in_wall=true,open=true": { - "model": "ww_hfas:block/blaze_fence_gate_wall_open", + "model": "wild_wind_wilderness:block/blaze_fence_gate_wall_open", "uvlock": true, "y": 270 }, "facing=north,in_wall=false,open=false": { - "model": "ww_hfas:block/blaze_fence_gate", + "model": "wild_wind_wilderness:block/blaze_fence_gate", "uvlock": true, "y": 180 }, "facing=north,in_wall=false,open=true": { - "model": "ww_hfas:block/blaze_fence_gate_open", + "model": "wild_wind_wilderness:block/blaze_fence_gate_open", "uvlock": true, "y": 180 }, "facing=north,in_wall=true,open=false": { - "model": "ww_hfas:block/blaze_fence_gate_wall", + "model": "wild_wind_wilderness:block/blaze_fence_gate_wall", "uvlock": true, "y": 180 }, "facing=north,in_wall=true,open=true": { - "model": "ww_hfas:block/blaze_fence_gate_wall_open", + "model": "wild_wind_wilderness:block/blaze_fence_gate_wall_open", "uvlock": true, "y": 180 }, "facing=south,in_wall=false,open=false": { - "model": "ww_hfas:block/blaze_fence_gate", + "model": "wild_wind_wilderness:block/blaze_fence_gate", "uvlock": true }, "facing=south,in_wall=false,open=true": { - "model": "ww_hfas:block/blaze_fence_gate_open", + "model": "wild_wind_wilderness:block/blaze_fence_gate_open", "uvlock": true }, "facing=south,in_wall=true,open=false": { - "model": "ww_hfas:block/blaze_fence_gate_wall", + "model": "wild_wind_wilderness:block/blaze_fence_gate_wall", "uvlock": true }, "facing=south,in_wall=true,open=true": { - "model": "ww_hfas:block/blaze_fence_gate_wall_open", + "model": "wild_wind_wilderness:block/blaze_fence_gate_wall_open", "uvlock": true }, "facing=west,in_wall=false,open=false": { - "model": "ww_hfas:block/blaze_fence_gate", + "model": "wild_wind_wilderness:block/blaze_fence_gate", "uvlock": true, "y": 90 }, "facing=west,in_wall=false,open=true": { - "model": "ww_hfas:block/blaze_fence_gate_open", + "model": "wild_wind_wilderness:block/blaze_fence_gate_open", "uvlock": true, "y": 90 }, "facing=west,in_wall=true,open=false": { - "model": "ww_hfas:block/blaze_fence_gate_wall", + "model": "wild_wind_wilderness:block/blaze_fence_gate_wall", "uvlock": true, "y": 90 }, "facing=west,in_wall=true,open=true": { - "model": "ww_hfas:block/blaze_fence_gate_wall_open", + "model": "wild_wind_wilderness:block/blaze_fence_gate_wall_open", "uvlock": true, "y": 90 } } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_leaves.json new file mode 100644 index 0000000..6926d22 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/blaze_leaves" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_log.json new file mode 100644 index 0000000..298540f --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_wilderness:block/blaze_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_wilderness:block/blaze_log" + }, + "axis=z": { + "model": "wild_wind_wilderness:block/blaze_log_horizontal", + "x": 90 + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_planks.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_planks.json new file mode 100644 index 0000000..743e44c --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_planks.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/blaze_planks" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_pressure_plate.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_pressure_plate.json new file mode 100644 index 0000000..2da9ceb --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_pressure_plate.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "wild_wind_wilderness:block/blaze_pressure_plate" + }, + "powered=true": { + "model": "wild_wind_wilderness:block/blaze_pressure_plate_down" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_sapling.json new file mode 100644 index 0000000..b2d26c7 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/blaze_sapling" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_slab.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_slab.json new file mode 100644 index 0000000..41dc685 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "wild_wind_wilderness:block/blaze_slab" + }, + "type=double": { + "model": "wild_wind_wilderness:block/blaze_planks" + }, + "type=top": { + "model": "wild_wind_wilderness:block/blaze_slab_top" + } + } +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_stairs.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_stairs.json similarity index 60% rename from src/hfas/resources/assets/ww_hfas/blockstates/blaze_stairs.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_stairs.json index 3874ab4..bca7c2c 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/blaze_stairs.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_stairs.json @@ -1,209 +1,209 @@ { "variants": { "facing=east,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "y": 270 }, "facing=east,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/blaze_stairs_inner" + "model": "wild_wind_wilderness:block/blaze_stairs_inner" }, "facing=east,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "y": 270 }, "facing=east,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/blaze_stairs_outer" + "model": "wild_wind_wilderness:block/blaze_stairs_outer" }, "facing=east,half=bottom,shape=straight": { - "model": "ww_hfas:block/blaze_stairs" + "model": "wild_wind_wilderness:block/blaze_stairs" }, "facing=east,half=top,shape=inner_left": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "x": 180 }, "facing=east,half=top,shape=inner_right": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "x": 180, "y": 90 }, "facing=east,half=top,shape=outer_left": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "x": 180 }, "facing=east,half=top,shape=outer_right": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "x": 180, "y": 90 }, "facing=east,half=top,shape=straight": { - "model": "ww_hfas:block/blaze_stairs", + "model": "wild_wind_wilderness:block/blaze_stairs", "uvlock": true, "x": 180 }, "facing=north,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "y": 180 }, "facing=north,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "y": 270 }, "facing=north,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "y": 180 }, "facing=north,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "y": 270 }, "facing=north,half=bottom,shape=straight": { - "model": "ww_hfas:block/blaze_stairs", + "model": "wild_wind_wilderness:block/blaze_stairs", "uvlock": true, "y": 270 }, "facing=north,half=top,shape=inner_left": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "x": 180, "y": 270 }, "facing=north,half=top,shape=inner_right": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "x": 180 }, "facing=north,half=top,shape=outer_left": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "x": 180, "y": 270 }, "facing=north,half=top,shape=outer_right": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "x": 180 }, "facing=north,half=top,shape=straight": { - "model": "ww_hfas:block/blaze_stairs", + "model": "wild_wind_wilderness:block/blaze_stairs", "uvlock": true, "x": 180, "y": 270 }, "facing=south,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/blaze_stairs_inner" + "model": "wild_wind_wilderness:block/blaze_stairs_inner" }, "facing=south,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "y": 90 }, "facing=south,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/blaze_stairs_outer" + "model": "wild_wind_wilderness:block/blaze_stairs_outer" }, "facing=south,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "y": 90 }, "facing=south,half=bottom,shape=straight": { - "model": "ww_hfas:block/blaze_stairs", + "model": "wild_wind_wilderness:block/blaze_stairs", "uvlock": true, "y": 90 }, "facing=south,half=top,shape=inner_left": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "x": 180, "y": 90 }, "facing=south,half=top,shape=inner_right": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "x": 180, "y": 180 }, "facing=south,half=top,shape=outer_left": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "x": 180, "y": 90 }, "facing=south,half=top,shape=outer_right": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "x": 180, "y": 180 }, "facing=south,half=top,shape=straight": { - "model": "ww_hfas:block/blaze_stairs", + "model": "wild_wind_wilderness:block/blaze_stairs", "uvlock": true, "x": 180, "y": 90 }, "facing=west,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "y": 90 }, "facing=west,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "y": 180 }, "facing=west,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "y": 90 }, "facing=west,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "y": 180 }, "facing=west,half=bottom,shape=straight": { - "model": "ww_hfas:block/blaze_stairs", + "model": "wild_wind_wilderness:block/blaze_stairs", "uvlock": true, "y": 180 }, "facing=west,half=top,shape=inner_left": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "x": 180, "y": 180 }, "facing=west,half=top,shape=inner_right": { - "model": "ww_hfas:block/blaze_stairs_inner", + "model": "wild_wind_wilderness:block/blaze_stairs_inner", "uvlock": true, "x": 180, "y": 270 }, "facing=west,half=top,shape=outer_left": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "x": 180, "y": 180 }, "facing=west,half=top,shape=outer_right": { - "model": "ww_hfas:block/blaze_stairs_outer", + "model": "wild_wind_wilderness:block/blaze_stairs_outer", "uvlock": true, "x": 180, "y": 270 }, "facing=west,half=top,shape=straight": { - "model": "ww_hfas:block/blaze_stairs", + "model": "wild_wind_wilderness:block/blaze_stairs", "uvlock": true, "x": 180, "y": 180 } } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_trapdoor.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_trapdoor.json new file mode 100644 index 0000000..d237422 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_trapdoor.json @@ -0,0 +1,58 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_bottom" + }, + "facing=east,half=bottom,open=true": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_top" + }, + "facing=east,half=top,open=true": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_open", + "y": 90 + }, + "facing=north,half=bottom,open=false": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_open" + }, + "facing=south,half=bottom,open=false": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_bottom" + }, + "facing=south,half=bottom,open=true": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_top" + }, + "facing=south,half=top,open=true": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_open", + "y": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_bottom" + }, + "facing=west,half=bottom,open=true": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_top" + }, + "facing=west,half=top,open=true": { + "model": "wild_wind_wilderness:block/blaze_trapdoor_open", + "y": 270 + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_wood.json new file mode 100644 index 0000000..27b64df --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/blaze_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_wilderness:block/blaze_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_wilderness:block/blaze_wood" + }, + "axis=z": { + "model": "wild_wind_wilderness:block/blaze_wood", + "x": 90 + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_dirt.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_dirt.json new file mode 100644 index 0000000..ac45a27 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_dirt.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/scorched_dirt" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_grass.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_grass.json new file mode 100644 index 0000000..0e56aff --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_grass.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/scorched_grass" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_grass_block.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_grass_block.json new file mode 100644 index 0000000..c80d1eb --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_grass_block.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/scorched_grass_block" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_twig.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_twig.json new file mode 100644 index 0000000..e1ac045 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/scorched_twig.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/scorched_twig" + } + } +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_button.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_button.json similarity index 57% rename from src/hfas/resources/assets/ww_hfas/blockstates/soul_button.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_button.json index 00586c3..498ab5d 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_button.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_button.json @@ -1,118 +1,118 @@ { "variants": { "face=ceiling,facing=east,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "x": 180, "y": 270 }, "face=ceiling,facing=east,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "x": 180, "y": 270 }, "face=ceiling,facing=north,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "x": 180, "y": 180 }, "face=ceiling,facing=north,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "x": 180, "y": 180 }, "face=ceiling,facing=south,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "x": 180 }, "face=ceiling,facing=south,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "x": 180 }, "face=ceiling,facing=west,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "x": 180, "y": 90 }, "face=ceiling,facing=west,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "x": 180, "y": 90 }, "face=floor,facing=east,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "y": 90 }, "face=floor,facing=east,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "y": 90 }, "face=floor,facing=north,powered=false": { - "model": "ww_hfas:block/soul_button" + "model": "wild_wind_wilderness:block/soul_button" }, "face=floor,facing=north,powered=true": { - "model": "ww_hfas:block/soul_button_pressed" + "model": "wild_wind_wilderness:block/soul_button_pressed" }, "face=floor,facing=south,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "y": 180 }, "face=floor,facing=south,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "y": 180 }, "face=floor,facing=west,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "y": 270 }, "face=floor,facing=west,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "y": 270 }, "face=wall,facing=east,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "uvlock": true, "x": 90, "y": 90 }, "face=wall,facing=east,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "uvlock": true, "x": 90, "y": 90 }, "face=wall,facing=north,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "uvlock": true, "x": 90 }, "face=wall,facing=north,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "uvlock": true, "x": 90 }, "face=wall,facing=south,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "uvlock": true, "x": 90, "y": 180 }, "face=wall,facing=south,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "uvlock": true, "x": 90, "y": 180 }, "face=wall,facing=west,powered=false": { - "model": "ww_hfas:block/soul_button", + "model": "wild_wind_wilderness:block/soul_button", "uvlock": true, "x": 90, "y": 270 }, "face=wall,facing=west,powered=true": { - "model": "ww_hfas:block/soul_button_pressed", + "model": "wild_wind_wilderness:block/soul_button_pressed", "uvlock": true, "x": 90, "y": 270 } } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_door.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_door.json similarity index 51% rename from src/hfas/resources/assets/ww_hfas/blockstates/soul_door.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_door.json index ad6f45f..2855a12 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_door.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_door.json @@ -1,124 +1,124 @@ { "variants": { "facing=east,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/soul_door_bottom_left" + "model": "wild_wind_wilderness:block/soul_door_bottom_left" }, "facing=east,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/soul_door_bottom_left_open", + "model": "wild_wind_wilderness:block/soul_door_bottom_left_open", "y": 90 }, "facing=east,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/soul_door_bottom_right" + "model": "wild_wind_wilderness:block/soul_door_bottom_right" }, "facing=east,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/soul_door_bottom_right_open", + "model": "wild_wind_wilderness:block/soul_door_bottom_right_open", "y": 270 }, "facing=east,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/soul_door_top_left" + "model": "wild_wind_wilderness:block/soul_door_top_left" }, "facing=east,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/soul_door_top_left_open", + "model": "wild_wind_wilderness:block/soul_door_top_left_open", "y": 90 }, "facing=east,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/soul_door_top_right" + "model": "wild_wind_wilderness:block/soul_door_top_right" }, "facing=east,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/soul_door_top_right_open", + "model": "wild_wind_wilderness:block/soul_door_top_right_open", "y": 270 }, "facing=north,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/soul_door_bottom_left", + "model": "wild_wind_wilderness:block/soul_door_bottom_left", "y": 270 }, "facing=north,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/soul_door_bottom_left_open" + "model": "wild_wind_wilderness:block/soul_door_bottom_left_open" }, "facing=north,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/soul_door_bottom_right", + "model": "wild_wind_wilderness:block/soul_door_bottom_right", "y": 270 }, "facing=north,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/soul_door_bottom_right_open", + "model": "wild_wind_wilderness:block/soul_door_bottom_right_open", "y": 180 }, "facing=north,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/soul_door_top_left", + "model": "wild_wind_wilderness:block/soul_door_top_left", "y": 270 }, "facing=north,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/soul_door_top_left_open" + "model": "wild_wind_wilderness:block/soul_door_top_left_open" }, "facing=north,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/soul_door_top_right", + "model": "wild_wind_wilderness:block/soul_door_top_right", "y": 270 }, "facing=north,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/soul_door_top_right_open", + "model": "wild_wind_wilderness:block/soul_door_top_right_open", "y": 180 }, "facing=south,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/soul_door_bottom_left", + "model": "wild_wind_wilderness:block/soul_door_bottom_left", "y": 90 }, "facing=south,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/soul_door_bottom_left_open", + "model": "wild_wind_wilderness:block/soul_door_bottom_left_open", "y": 180 }, "facing=south,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/soul_door_bottom_right", + "model": "wild_wind_wilderness:block/soul_door_bottom_right", "y": 90 }, "facing=south,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/soul_door_bottom_right_open" + "model": "wild_wind_wilderness:block/soul_door_bottom_right_open" }, "facing=south,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/soul_door_top_left", + "model": "wild_wind_wilderness:block/soul_door_top_left", "y": 90 }, "facing=south,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/soul_door_top_left_open", + "model": "wild_wind_wilderness:block/soul_door_top_left_open", "y": 180 }, "facing=south,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/soul_door_top_right", + "model": "wild_wind_wilderness:block/soul_door_top_right", "y": 90 }, "facing=south,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/soul_door_top_right_open" + "model": "wild_wind_wilderness:block/soul_door_top_right_open" }, "facing=west,half=lower,hinge=left,open=false": { - "model": "ww_hfas:block/soul_door_bottom_left", + "model": "wild_wind_wilderness:block/soul_door_bottom_left", "y": 180 }, "facing=west,half=lower,hinge=left,open=true": { - "model": "ww_hfas:block/soul_door_bottom_left_open", + "model": "wild_wind_wilderness:block/soul_door_bottom_left_open", "y": 270 }, "facing=west,half=lower,hinge=right,open=false": { - "model": "ww_hfas:block/soul_door_bottom_right", + "model": "wild_wind_wilderness:block/soul_door_bottom_right", "y": 180 }, "facing=west,half=lower,hinge=right,open=true": { - "model": "ww_hfas:block/soul_door_bottom_right_open", + "model": "wild_wind_wilderness:block/soul_door_bottom_right_open", "y": 90 }, "facing=west,half=upper,hinge=left,open=false": { - "model": "ww_hfas:block/soul_door_top_left", + "model": "wild_wind_wilderness:block/soul_door_top_left", "y": 180 }, "facing=west,half=upper,hinge=left,open=true": { - "model": "ww_hfas:block/soul_door_top_left_open", + "model": "wild_wind_wilderness:block/soul_door_top_left_open", "y": 270 }, "facing=west,half=upper,hinge=right,open=false": { - "model": "ww_hfas:block/soul_door_top_right", + "model": "wild_wind_wilderness:block/soul_door_top_right", "y": 180 }, "facing=west,half=upper,hinge=right,open=true": { - "model": "ww_hfas:block/soul_door_top_right_open", + "model": "wild_wind_wilderness:block/soul_door_top_right_open", "y": 90 } } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_fence.json similarity index 63% rename from src/hfas/resources/assets/ww_hfas/blockstates/soul_fence.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_fence.json index 45c2027..d986c20 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_fence.json @@ -2,12 +2,12 @@ "multipart": [ { "apply": { - "model": "ww_hfas:block/soul_fence_post" + "model": "wild_wind_wilderness:block/soul_fence_post" } }, { "apply": { - "model": "ww_hfas:block/soul_fence_side", + "model": "wild_wind_wilderness:block/soul_fence_side", "uvlock": true }, "when": { @@ -16,7 +16,7 @@ }, { "apply": { - "model": "ww_hfas:block/soul_fence_side", + "model": "wild_wind_wilderness:block/soul_fence_side", "uvlock": true, "y": 90 }, @@ -26,7 +26,7 @@ }, { "apply": { - "model": "ww_hfas:block/soul_fence_side", + "model": "wild_wind_wilderness:block/soul_fence_side", "uvlock": true, "y": 180 }, @@ -36,7 +36,7 @@ }, { "apply": { - "model": "ww_hfas:block/soul_fence_side", + "model": "wild_wind_wilderness:block/soul_fence_side", "uvlock": true, "y": 270 }, @@ -45,4 +45,4 @@ } } ] -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence_gate.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_fence_gate.json similarity index 56% rename from src/hfas/resources/assets/ww_hfas/blockstates/soul_fence_gate.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_fence_gate.json index 6eee7d9..44f1e65 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_fence_gate.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_fence_gate.json @@ -1,80 +1,80 @@ { "variants": { "facing=east,in_wall=false,open=false": { - "model": "ww_hfas:block/soul_fence_gate", + "model": "wild_wind_wilderness:block/soul_fence_gate", "uvlock": true, "y": 270 }, "facing=east,in_wall=false,open=true": { - "model": "ww_hfas:block/soul_fence_gate_open", + "model": "wild_wind_wilderness:block/soul_fence_gate_open", "uvlock": true, "y": 270 }, "facing=east,in_wall=true,open=false": { - "model": "ww_hfas:block/soul_fence_gate_wall", + "model": "wild_wind_wilderness:block/soul_fence_gate_wall", "uvlock": true, "y": 270 }, "facing=east,in_wall=true,open=true": { - "model": "ww_hfas:block/soul_fence_gate_wall_open", + "model": "wild_wind_wilderness:block/soul_fence_gate_wall_open", "uvlock": true, "y": 270 }, "facing=north,in_wall=false,open=false": { - "model": "ww_hfas:block/soul_fence_gate", + "model": "wild_wind_wilderness:block/soul_fence_gate", "uvlock": true, "y": 180 }, "facing=north,in_wall=false,open=true": { - "model": "ww_hfas:block/soul_fence_gate_open", + "model": "wild_wind_wilderness:block/soul_fence_gate_open", "uvlock": true, "y": 180 }, "facing=north,in_wall=true,open=false": { - "model": "ww_hfas:block/soul_fence_gate_wall", + "model": "wild_wind_wilderness:block/soul_fence_gate_wall", "uvlock": true, "y": 180 }, "facing=north,in_wall=true,open=true": { - "model": "ww_hfas:block/soul_fence_gate_wall_open", + "model": "wild_wind_wilderness:block/soul_fence_gate_wall_open", "uvlock": true, "y": 180 }, "facing=south,in_wall=false,open=false": { - "model": "ww_hfas:block/soul_fence_gate", + "model": "wild_wind_wilderness:block/soul_fence_gate", "uvlock": true }, "facing=south,in_wall=false,open=true": { - "model": "ww_hfas:block/soul_fence_gate_open", + "model": "wild_wind_wilderness:block/soul_fence_gate_open", "uvlock": true }, "facing=south,in_wall=true,open=false": { - "model": "ww_hfas:block/soul_fence_gate_wall", + "model": "wild_wind_wilderness:block/soul_fence_gate_wall", "uvlock": true }, "facing=south,in_wall=true,open=true": { - "model": "ww_hfas:block/soul_fence_gate_wall_open", + "model": "wild_wind_wilderness:block/soul_fence_gate_wall_open", "uvlock": true }, "facing=west,in_wall=false,open=false": { - "model": "ww_hfas:block/soul_fence_gate", + "model": "wild_wind_wilderness:block/soul_fence_gate", "uvlock": true, "y": 90 }, "facing=west,in_wall=false,open=true": { - "model": "ww_hfas:block/soul_fence_gate_open", + "model": "wild_wind_wilderness:block/soul_fence_gate_open", "uvlock": true, "y": 90 }, "facing=west,in_wall=true,open=false": { - "model": "ww_hfas:block/soul_fence_gate_wall", + "model": "wild_wind_wilderness:block/soul_fence_gate_wall", "uvlock": true, "y": 90 }, "facing=west,in_wall=true,open=true": { - "model": "ww_hfas:block/soul_fence_gate_wall_open", + "model": "wild_wind_wilderness:block/soul_fence_gate_wall_open", "uvlock": true, "y": 90 } } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_leaves.json new file mode 100644 index 0000000..7b4ef47 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_leaves.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/soul_leaves" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_log.json new file mode 100644 index 0000000..38f0ceb --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_wilderness:block/soul_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_wilderness:block/soul_log" + }, + "axis=z": { + "model": "wild_wind_wilderness:block/soul_log_horizontal", + "x": 90 + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_planks.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_planks.json new file mode 100644 index 0000000..9c95c1b --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_planks.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/soul_planks" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_pressure_plate.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_pressure_plate.json new file mode 100644 index 0000000..d1d2320 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_pressure_plate.json @@ -0,0 +1,10 @@ +{ + "variants": { + "powered=false": { + "model": "wild_wind_wilderness:block/soul_pressure_plate" + }, + "powered=true": { + "model": "wild_wind_wilderness:block/soul_pressure_plate_down" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_sapling.json new file mode 100644 index 0000000..8ad94d2 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_sapling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "wild_wind_wilderness:block/soul_sapling" + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_slab.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_slab.json new file mode 100644 index 0000000..89a0900 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "wild_wind_wilderness:block/soul_slab" + }, + "type=double": { + "model": "wild_wind_wilderness:block/soul_planks" + }, + "type=top": { + "model": "wild_wind_wilderness:block/soul_slab_top" + } + } +} diff --git a/src/hfas/resources/assets/ww_hfas/blockstates/soul_stairs.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_stairs.json similarity index 60% rename from src/hfas/resources/assets/ww_hfas/blockstates/soul_stairs.json rename to src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_stairs.json index 9a32c7a..8480d90 100644 --- a/src/hfas/resources/assets/ww_hfas/blockstates/soul_stairs.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_stairs.json @@ -1,209 +1,209 @@ { "variants": { "facing=east,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "y": 270 }, "facing=east,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/soul_stairs_inner" + "model": "wild_wind_wilderness:block/soul_stairs_inner" }, "facing=east,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "y": 270 }, "facing=east,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/soul_stairs_outer" + "model": "wild_wind_wilderness:block/soul_stairs_outer" }, "facing=east,half=bottom,shape=straight": { - "model": "ww_hfas:block/soul_stairs" + "model": "wild_wind_wilderness:block/soul_stairs" }, "facing=east,half=top,shape=inner_left": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "x": 180 }, "facing=east,half=top,shape=inner_right": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "x": 180, "y": 90 }, "facing=east,half=top,shape=outer_left": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "x": 180 }, "facing=east,half=top,shape=outer_right": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "x": 180, "y": 90 }, "facing=east,half=top,shape=straight": { - "model": "ww_hfas:block/soul_stairs", + "model": "wild_wind_wilderness:block/soul_stairs", "uvlock": true, "x": 180 }, "facing=north,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "y": 180 }, "facing=north,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "y": 270 }, "facing=north,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "y": 180 }, "facing=north,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "y": 270 }, "facing=north,half=bottom,shape=straight": { - "model": "ww_hfas:block/soul_stairs", + "model": "wild_wind_wilderness:block/soul_stairs", "uvlock": true, "y": 270 }, "facing=north,half=top,shape=inner_left": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "x": 180, "y": 270 }, "facing=north,half=top,shape=inner_right": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "x": 180 }, "facing=north,half=top,shape=outer_left": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "x": 180, "y": 270 }, "facing=north,half=top,shape=outer_right": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "x": 180 }, "facing=north,half=top,shape=straight": { - "model": "ww_hfas:block/soul_stairs", + "model": "wild_wind_wilderness:block/soul_stairs", "uvlock": true, "x": 180, "y": 270 }, "facing=south,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/soul_stairs_inner" + "model": "wild_wind_wilderness:block/soul_stairs_inner" }, "facing=south,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "y": 90 }, "facing=south,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/soul_stairs_outer" + "model": "wild_wind_wilderness:block/soul_stairs_outer" }, "facing=south,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "y": 90 }, "facing=south,half=bottom,shape=straight": { - "model": "ww_hfas:block/soul_stairs", + "model": "wild_wind_wilderness:block/soul_stairs", "uvlock": true, "y": 90 }, "facing=south,half=top,shape=inner_left": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "x": 180, "y": 90 }, "facing=south,half=top,shape=inner_right": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "x": 180, "y": 180 }, "facing=south,half=top,shape=outer_left": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "x": 180, "y": 90 }, "facing=south,half=top,shape=outer_right": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "x": 180, "y": 180 }, "facing=south,half=top,shape=straight": { - "model": "ww_hfas:block/soul_stairs", + "model": "wild_wind_wilderness:block/soul_stairs", "uvlock": true, "x": 180, "y": 90 }, "facing=west,half=bottom,shape=inner_left": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "y": 90 }, "facing=west,half=bottom,shape=inner_right": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "y": 180 }, "facing=west,half=bottom,shape=outer_left": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "y": 90 }, "facing=west,half=bottom,shape=outer_right": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "y": 180 }, "facing=west,half=bottom,shape=straight": { - "model": "ww_hfas:block/soul_stairs", + "model": "wild_wind_wilderness:block/soul_stairs", "uvlock": true, "y": 180 }, "facing=west,half=top,shape=inner_left": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "x": 180, "y": 180 }, "facing=west,half=top,shape=inner_right": { - "model": "ww_hfas:block/soul_stairs_inner", + "model": "wild_wind_wilderness:block/soul_stairs_inner", "uvlock": true, "x": 180, "y": 270 }, "facing=west,half=top,shape=outer_left": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "x": 180, "y": 180 }, "facing=west,half=top,shape=outer_right": { - "model": "ww_hfas:block/soul_stairs_outer", + "model": "wild_wind_wilderness:block/soul_stairs_outer", "uvlock": true, "x": 180, "y": 270 }, "facing=west,half=top,shape=straight": { - "model": "ww_hfas:block/soul_stairs", + "model": "wild_wind_wilderness:block/soul_stairs", "uvlock": true, "x": 180, "y": 180 } } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_trapdoor.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_trapdoor.json new file mode 100644 index 0000000..07e831d --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_trapdoor.json @@ -0,0 +1,58 @@ +{ + "variants": { + "facing=east,half=bottom,open=false": { + "model": "wild_wind_wilderness:block/soul_trapdoor_bottom" + }, + "facing=east,half=bottom,open=true": { + "model": "wild_wind_wilderness:block/soul_trapdoor_open", + "y": 90 + }, + "facing=east,half=top,open=false": { + "model": "wild_wind_wilderness:block/soul_trapdoor_top" + }, + "facing=east,half=top,open=true": { + "model": "wild_wind_wilderness:block/soul_trapdoor_open", + "y": 90 + }, + "facing=north,half=bottom,open=false": { + "model": "wild_wind_wilderness:block/soul_trapdoor_bottom" + }, + "facing=north,half=bottom,open=true": { + "model": "wild_wind_wilderness:block/soul_trapdoor_open" + }, + "facing=north,half=top,open=false": { + "model": "wild_wind_wilderness:block/soul_trapdoor_top" + }, + "facing=north,half=top,open=true": { + "model": "wild_wind_wilderness:block/soul_trapdoor_open" + }, + "facing=south,half=bottom,open=false": { + "model": "wild_wind_wilderness:block/soul_trapdoor_bottom" + }, + "facing=south,half=bottom,open=true": { + "model": "wild_wind_wilderness:block/soul_trapdoor_open", + "y": 180 + }, + "facing=south,half=top,open=false": { + "model": "wild_wind_wilderness:block/soul_trapdoor_top" + }, + "facing=south,half=top,open=true": { + "model": "wild_wind_wilderness:block/soul_trapdoor_open", + "y": 180 + }, + "facing=west,half=bottom,open=false": { + "model": "wild_wind_wilderness:block/soul_trapdoor_bottom" + }, + "facing=west,half=bottom,open=true": { + "model": "wild_wind_wilderness:block/soul_trapdoor_open", + "y": 270 + }, + "facing=west,half=top,open=false": { + "model": "wild_wind_wilderness:block/soul_trapdoor_top" + }, + "facing=west,half=top,open=true": { + "model": "wild_wind_wilderness:block/soul_trapdoor_open", + "y": 270 + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_wood.json new file mode 100644 index 0000000..f12f569 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/soul_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_wilderness:block/soul_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_wilderness:block/soul_wood" + }, + "axis=z": { + "model": "wild_wind_wilderness:block/soul_wood", + "x": 90 + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_blaze_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_blaze_log.json new file mode 100644 index 0000000..e41cc6f --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_blaze_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_wilderness:block/stripped_blaze_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_wilderness:block/stripped_blaze_log" + }, + "axis=z": { + "model": "wild_wind_wilderness:block/stripped_blaze_log_horizontal", + "x": 90 + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_blaze_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_blaze_wood.json new file mode 100644 index 0000000..995d07c --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_blaze_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_wilderness:block/stripped_blaze_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_wilderness:block/stripped_blaze_wood" + }, + "axis=z": { + "model": "wild_wind_wilderness:block/stripped_blaze_wood", + "x": 90 + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_soul_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_soul_log.json new file mode 100644 index 0000000..adffdd3 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_soul_log.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_wilderness:block/stripped_soul_log_horizontal", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_wilderness:block/stripped_soul_log" + }, + "axis=z": { + "model": "wild_wind_wilderness:block/stripped_soul_log_horizontal", + "x": 90 + } + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_soul_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_soul_wood.json new file mode 100644 index 0000000..493f993 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/blockstates/stripped_soul_wood.json @@ -0,0 +1,16 @@ +{ + "variants": { + "axis=x": { + "model": "wild_wind_wilderness:block/stripped_soul_wood", + "x": 90, + "y": 90 + }, + "axis=y": { + "model": "wild_wind_wilderness:block/stripped_soul_wood" + }, + "axis=z": { + "model": "wild_wind_wilderness:block/stripped_soul_wood", + "x": 90 + } + } +} diff --git a/src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/mudcrab.animation.json b/src/wilderness/resources/assets/wild_wind_wilderness/geckolib/animations/entity/mudcrab.animation.json similarity index 100% rename from src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/mudcrab.animation.json rename to src/wilderness/resources/assets/wild_wind_wilderness/geckolib/animations/entity/mudcrab.animation.json diff --git a/src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/piranha.animation.json b/src/wilderness/resources/assets/wild_wind_wilderness/geckolib/animations/entity/piranha.animation.json similarity index 100% rename from src/hfas/resources/assets/ww_hfas/geckolib/animations/entity/piranha.animation.json rename to src/wilderness/resources/assets/wild_wind_wilderness/geckolib/animations/entity/piranha.animation.json diff --git a/src/hfas/resources/assets/ww_hfas/geckolib/models/entity/mudcrab.geo.json b/src/wilderness/resources/assets/wild_wind_wilderness/geckolib/models/entity/mudcrab.geo.json similarity index 100% rename from src/hfas/resources/assets/ww_hfas/geckolib/models/entity/mudcrab.geo.json rename to src/wilderness/resources/assets/wild_wind_wilderness/geckolib/models/entity/mudcrab.geo.json diff --git a/src/hfas/resources/assets/ww_hfas/geckolib/models/entity/piranha.geo.json b/src/wilderness/resources/assets/wild_wind_wilderness/geckolib/models/entity/piranha.geo.json similarity index 100% rename from src/hfas/resources/assets/ww_hfas/geckolib/models/entity/piranha.geo.json rename to src/wilderness/resources/assets/wild_wind_wilderness/geckolib/models/entity/piranha.geo.json diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_boat.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_boat.json new file mode 100644 index 0000000..dd165d5 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/blaze_boat" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_button.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_button.json new file mode 100644 index 0000000..89e58ca --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_button_inventory" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_chest_boat.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_chest_boat.json new file mode 100644 index 0000000..357c1f8 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/blaze_chest_boat" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_door.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_door.json new file mode 100644 index 0000000..d8506a5 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/blaze_door" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_fence.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_fence.json new file mode 100644 index 0000000..8208f87 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_fence_inventory" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_fence_gate.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_fence_gate.json new file mode 100644 index 0000000..2d10aca --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_fence_gate" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_hanging_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_hanging_sign.json new file mode 100644 index 0000000..f96455e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/blaze_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/blaze_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_leaves.json similarity index 71% rename from src/hfas/resources/assets/ww_hfas/items/blaze_leaves.json rename to src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_leaves.json index 60d5e95..ead7c15 100644 --- a/src/hfas/resources/assets/ww_hfas/items/blaze_leaves.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_leaves.json @@ -1,7 +1,7 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:block/blaze_leaves", + "model": "wild_wind_wilderness:block/blaze_leaves", "tints": [ { "type": "minecraft:constant", @@ -9,4 +9,4 @@ } ] } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_log.json new file mode 100644 index 0000000..42eb1ae --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_planks.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_planks.json new file mode 100644 index 0000000..a161d91 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_pressure_plate.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_pressure_plate.json new file mode 100644 index 0000000..c84e33d --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_pressure_plate" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_sapling.json new file mode 100644 index 0000000..1f6501e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_sapling" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_sign.json new file mode 100644 index 0000000..083b62d --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/blaze_sign" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_slab.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_slab.json new file mode 100644 index 0000000..572a143 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_slab" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_stairs.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_stairs.json new file mode 100644 index 0000000..747d24d --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_stairs" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_trapdoor.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_trapdoor.json new file mode 100644 index 0000000..97d74e0 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_trapdoor_bottom" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_wood.json new file mode 100644 index 0000000..ecd8694 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/blaze_wood" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/cooked_piranha.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/cooked_piranha.json new file mode 100644 index 0000000..6879b73 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/cooked_piranha.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/cooked_piranha" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/crab_claw.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/crab_claw.json new file mode 100644 index 0000000..2a27edb --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/crab_claw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/crab_claw" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/baked_seeds.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/fang.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/items/baked_seeds.json rename to src/wilderness/resources/assets/wild_wind_wilderness/items/fang.json index c5e75b4..22b32cf 100644 --- a/src/hfas/resources/assets/ww_hfas/items/baked_seeds.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/fang.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/baked_seeds" + "model": "wild_wind_wilderness:item/fang" } } diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/mudcrab_bucket.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/mudcrab_bucket.json new file mode 100644 index 0000000..98e3e08 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/mudcrab_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/mudcrab_bucket" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/mudcrab_spawn_egg.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/mudcrab_spawn_egg.json new file mode 100644 index 0000000..a79c2fd --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/mudcrab_spawn_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/mudcrab_spawn_egg" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/muddy_pig_spawn_egg.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/muddy_pig_spawn_egg.json similarity index 100% rename from src/hfas/resources/assets/ww_hfas/items/muddy_pig_spawn_egg.json rename to src/wilderness/resources/assets/wild_wind_wilderness/items/muddy_pig_spawn_egg.json diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/omni_claw.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/omni_claw.json new file mode 100644 index 0000000..7e0d87f --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/omni_claw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/omni_claw" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/piranha.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/piranha.json new file mode 100644 index 0000000..f3487f0 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/piranha.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/piranha" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/piranha_bucket.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/piranha_bucket.json new file mode 100644 index 0000000..9a4bbe8 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/piranha_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/piranha_bucket" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/piranha_spawn_egg.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/piranha_spawn_egg.json new file mode 100644 index 0000000..f1fb643 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/piranha_spawn_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/piranha_spawn_egg" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_dirt.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_dirt.json new file mode 100644 index 0000000..304d21e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_dirt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/scorched_dirt" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_grass.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_grass.json new file mode 100644 index 0000000..ef7780c --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_grass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/scorched_grass" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_grass_block.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_grass_block.json new file mode 100644 index 0000000..f28cd7d --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_grass_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/scorched_grass_block" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_twig.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_twig.json new file mode 100644 index 0000000..209308f --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/scorched_twig.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/scorched_twig" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_boat.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_boat.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/items/soul_boat.json rename to src/wilderness/resources/assets/wild_wind_wilderness/items/soul_boat.json index e77347e..014da84 100644 --- a/src/hfas/resources/assets/ww_hfas/items/soul_boat.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_boat.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/soul_boat" + "model": "wild_wind_wilderness:item/soul_boat" } } \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_button.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_button.json new file mode 100644 index 0000000..36216a5 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_button_inventory" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_chest_boat.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_chest_boat.json new file mode 100644 index 0000000..755768e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/soul_chest_boat" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_door.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_door.json new file mode 100644 index 0000000..728ace6 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/soul_door" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_fence.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_fence.json new file mode 100644 index 0000000..bc1bf79 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_fence_inventory" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_fence_gate.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_fence_gate.json new file mode 100644 index 0000000..d375f4e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_fence_gate" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_hanging_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_hanging_sign.json new file mode 100644 index 0000000..9935c50 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:item/soul_hanging_sign" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_leaves.json similarity index 72% rename from src/hfas/resources/assets/ww_hfas/items/soul_leaves.json rename to src/wilderness/resources/assets/wild_wind_wilderness/items/soul_leaves.json index 888d0d3..eafc416 100644 --- a/src/hfas/resources/assets/ww_hfas/items/soul_leaves.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_leaves.json @@ -1,7 +1,7 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:block/soul_leaves", + "model": "wild_wind_wilderness:block/soul_leaves", "tints": [ { "type": "minecraft:constant", @@ -9,4 +9,4 @@ } ] } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_log.json new file mode 100644 index 0000000..a0e81d0 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_planks.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_planks.json new file mode 100644 index 0000000..80a7727 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_pressure_plate.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_pressure_plate.json new file mode 100644 index 0000000..73e1ec7 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_pressure_plate" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_sapling.json new file mode 100644 index 0000000..2c52caf --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_sapling" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/soul_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_sign.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/items/soul_sign.json rename to src/wilderness/resources/assets/wild_wind_wilderness/items/soul_sign.json index abbbc4f..a26e551 100644 --- a/src/hfas/resources/assets/ww_hfas/items/soul_sign.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_sign.json @@ -1,6 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "ww_hfas:item/soul_sign" + "model": "wild_wind_wilderness:item/soul_sign" } } \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_slab.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_slab.json new file mode 100644 index 0000000..c2057e4 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_slab" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_stairs.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_stairs.json new file mode 100644 index 0000000..77ccbfe --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_stairs" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_trapdoor.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_trapdoor.json new file mode 100644 index 0000000..124b065 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_trapdoor_bottom" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_wood.json new file mode 100644 index 0000000..1996242 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/soul_wood" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_blaze_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_blaze_log.json new file mode 100644 index 0000000..e6ae115 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_blaze_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/stripped_blaze_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_blaze_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_blaze_wood.json new file mode 100644 index 0000000..063c923 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_blaze_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/stripped_blaze_wood" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_soul_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_soul_log.json new file mode 100644 index 0000000..2da8301 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_soul_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/stripped_soul_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_soul_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_soul_wood.json new file mode 100644 index 0000000..24475c1 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/stripped_soul_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "wild_wind_wilderness:block/stripped_soul_wood" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/items/tipped_arrow.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/tipped_arrow.json similarity index 98% rename from src/hfas/resources/assets/ww_hfas/items/tipped_arrow.json rename to src/wilderness/resources/assets/wild_wind_wilderness/items/tipped_arrow.json index 77ba8aa..21d3dc2 100644 --- a/src/hfas/resources/assets/ww_hfas/items/tipped_arrow.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/tipped_arrow.json @@ -9,4 +9,4 @@ } ] } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/lang/en_us.json b/src/wilderness/resources/assets/wild_wind_wilderness/lang/en_us.json new file mode 100644 index 0000000..03a0169 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/lang/en_us.json @@ -0,0 +1,68 @@ +{ + "attributes.wild_wind_wilderness.extra_item_pickup_range": "Extra Item Pickup Range", + "block.wild_wind_wilderness.blaze_button": "Blaze Button", + "block.wild_wind_wilderness.blaze_door": "Blaze Door", + "block.wild_wind_wilderness.blaze_fence": "Blaze Fence", + "block.wild_wind_wilderness.blaze_fence_gate": "Blaze Fence Gate", + "block.wild_wind_wilderness.blaze_leaves": "Blaze Leaves", + "block.wild_wind_wilderness.blaze_log": "Blaze Log", + "block.wild_wind_wilderness.blaze_planks": "Blaze Planks", + "block.wild_wind_wilderness.blaze_pressure_plate": "Blaze Pressure Plate", + "block.wild_wind_wilderness.blaze_sapling": "Blaze Sapling", + "block.wild_wind_wilderness.blaze_slab": "Blaze Slab", + "block.wild_wind_wilderness.blaze_stairs": "Blaze Stairs", + "block.wild_wind_wilderness.blaze_trapdoor": "Blaze Trapdoor", + "block.wild_wind_wilderness.blaze_wood": "Blaze Wood", + "block.wild_wind_wilderness.scorched_dirt": "Scorched Dirt", + "block.wild_wind_wilderness.scorched_grass": "Scorched Grass", + "block.wild_wind_wilderness.scorched_grass_block": "Scorched Grass Block", + "block.wild_wind_wilderness.scorched_twig": "Scorched Twig", + "block.wild_wind_wilderness.soul_button": "Soul Button", + "block.wild_wind_wilderness.soul_door": "Soul Door", + "block.wild_wind_wilderness.soul_fence": "Soul Fence", + "block.wild_wind_wilderness.soul_fence_gate": "Soul Fence Gate", + "block.wild_wind_wilderness.soul_leaves": "Soul Leaves", + "block.wild_wind_wilderness.soul_log": "Soul Log", + "block.wild_wind_wilderness.soul_planks": "Soul Planks", + "block.wild_wind_wilderness.soul_pressure_plate": "Soul Pressure Plate", + "block.wild_wind_wilderness.soul_sapling": "Soul Sapling", + "block.wild_wind_wilderness.soul_slab": "Soul Slab", + "block.wild_wind_wilderness.soul_stairs": "Soul Stairs", + "block.wild_wind_wilderness.soul_trapdoor": "Soul Trapdoor", + "block.wild_wind_wilderness.soul_wood": "Soul Wood", + "block.wild_wind_wilderness.stripped_blaze_log": "Stripped Blaze Log", + "block.wild_wind_wilderness.stripped_blaze_wood": "Stripped Blaze Wood", + "block.wild_wind_wilderness.stripped_soul_log": "Stripped Soul Log", + "block.wild_wind_wilderness.stripped_soul_wood": "Stripped Soul Wood", + "effect.wild_wind_wilderness.choke": "Choke", + "effect.wild_wind_wilderness.reach": "Reach", + "effect.wild_wind_wilderness.sink": "Sink", + "entity.wild_wind_wilderness.mudcrab": "Mudcrab", + "entity.wild_wind_wilderness.muddy_pig": "Muddy Pig", + "entity.wild_wind_wilderness.piranha": "Direfish", + "item.minecraft.lingering_potion.effect.long_reach": "Lingering Potion of Reach", + "item.minecraft.lingering_potion.effect.reach": "Lingering Potion of Reach", + "item.minecraft.potion.effect.long_reach": "Potion of Reach", + "item.minecraft.potion.effect.reach": "Potion of Reach", + "item.minecraft.splash_potion.effect.long_reach": "Splash Potion of Reach", + "item.minecraft.splash_potion.effect.reach": "Splash Potion of Reach", + "item.minecraft.tipped_arrow.effect.long_reach": "Arrow of Reach", + "item.minecraft.tipped_arrow.effect.reach": "Arrow of Reach", + "item.wild_wind_wilderness.cooked_piranha": "Cooked Direfish", + "item.wild_wind_wilderness.crab_claw": "Crab Claw", + "item.wild_wind_wilderness.fang": "Fang", + "item.wild_wind_wilderness.mudcrab_bucket": "Bucket of Mudcrab", + "item.wild_wind_wilderness.mudcrab_spawn_egg": "Mudcrab Spawn Egg", + "item.wild_wind_wilderness.muddy_pig_spawn_egg": "Muddy Pig Spawn Egg", + "item.wild_wind_wilderness.omni_claw": "Omni Craw", + "item.wild_wind_wilderness.piranha": "Raw Direfish", + "item.wild_wind_wilderness.piranha_bucket": "Bucket of Direfish", + "item.wild_wind_wilderness.piranha_spawn_egg": "Direfish Spawn Egg", + "item.wild_wind_wilderness.tipped_arrow": "Arrow of Reach", + "item.wild_wind_wilderness.tipped_arrow.effect.long_reach": "Arrow of Reach", + "item.wild_wind_wilderness.tipped_arrow.effect.reach": "Arrow of Reach", + "subtitles.entity.piranha.attack": "Direfish attacks", + "subtitles.entity.piranha.death": "Direfish dies", + "mod.wild_wind.wilderness": "Wild Wind:Wilderness Update", + "entity.wild_wind_wilderness.arrow": "Arrow of Reach" +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/lang/zh_cn.json b/src/wilderness/resources/assets/wild_wind_wilderness/lang/zh_cn.json new file mode 100644 index 0000000..f0adb0d --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/lang/zh_cn.json @@ -0,0 +1,68 @@ +{ + "attributes.wild_wind_wilderness.extra_item_pickup_range": "额外物品拾取距离", + "block.wild_wind_wilderness.blaze_button": "焚烬木按钮", + "block.wild_wind_wilderness.blaze_door": "焚烬木门", + "block.wild_wind_wilderness.blaze_fence": "焚烬木栅栏", + "block.wild_wind_wilderness.blaze_fence_gate": "焚烬木栅栏门", + "block.wild_wind_wilderness.blaze_leaves": "焚烬木树叶", + "block.wild_wind_wilderness.blaze_log": "焚烬木原木", + "block.wild_wind_wilderness.blaze_planks": "焚烬木木板", + "block.wild_wind_wilderness.blaze_pressure_plate": "焚烬木压力板", + "block.wild_wind_wilderness.blaze_sapling": "焚烬木树苗", + "block.wild_wind_wilderness.blaze_slab": "焚烬木台阶", + "block.wild_wind_wilderness.blaze_stairs": "焚烬木楼梯", + "block.wild_wind_wilderness.blaze_trapdoor": "焚烬木活板门", + "block.wild_wind_wilderness.blaze_wood": "焚烬木", + "block.wild_wind_wilderness.scorched_dirt": "焦土", + "block.wild_wind_wilderness.scorched_grass": "焦灰草丛", + "block.wild_wind_wilderness.scorched_grass_block": "焦灰草方块", + "block.wild_wind_wilderness.scorched_twig": "焦灰枝条", + "block.wild_wind_wilderness.soul_button": "灵焰木按钮", + "block.wild_wind_wilderness.soul_door": "灵焰木门", + "block.wild_wind_wilderness.soul_fence": "灵焰木栅栏", + "block.wild_wind_wilderness.soul_fence_gate": "灵焰木栅栏门", + "block.wild_wind_wilderness.soul_leaves": "灵焰木树叶", + "block.wild_wind_wilderness.soul_log": "灵焰木原木", + "block.wild_wind_wilderness.soul_planks": "灵焰木木板", + "block.wild_wind_wilderness.soul_pressure_plate": "灵焰木压力板", + "block.wild_wind_wilderness.soul_sapling": "灵焰木树苗", + "block.wild_wind_wilderness.soul_slab": "灵焰木台阶", + "block.wild_wind_wilderness.soul_stairs": "灵焰木楼梯", + "block.wild_wind_wilderness.soul_trapdoor": "灵焰木活板门", + "block.wild_wind_wilderness.soul_wood": "灵焰木", + "block.wild_wind_wilderness.stripped_blaze_log": "去皮焚烬木原木", + "block.wild_wind_wilderness.stripped_blaze_wood": "去皮焚烬木", + "block.wild_wind_wilderness.stripped_soul_log": "去皮灵焰木原木", + "block.wild_wind_wilderness.stripped_soul_wood": "去皮灵焰木", + "effect.wild_wind_wilderness.choke": "窒息", + "effect.wild_wind_wilderness.reach": "延展", + "effect.wild_wind_wilderness.sink": "沉溺", + "entity.wild_wind_wilderness.mudcrab": "泥沼蟹", + "entity.wild_wind_wilderness.muddy_pig": "泥猪", + "entity.wild_wind_wilderness.piranha": "恐鱼", + "item.minecraft.lingering_potion.effect.long_reach": "滞留型延展药水", + "item.minecraft.lingering_potion.effect.reach": "滞留型延展药水", + "item.minecraft.potion.effect.long_reach": "延展药水", + "item.minecraft.potion.effect.reach": "延展药水", + "item.minecraft.splash_potion.effect.long_reach": "喷溅型延展药水", + "item.minecraft.splash_potion.effect.reach": "喷溅型延展药水", + "item.minecraft.tipped_arrow.effect.long_reach": "延展之箭", + "item.minecraft.tipped_arrow.effect.reach": "延展之箭", + "item.wild_wind_wilderness.cooked_piranha": "熟恐鱼", + "item.wild_wind_wilderness.crab_claw": "蟹钳", + "item.wild_wind_wilderness.fang": "尖牙", + "item.wild_wind_wilderness.mudcrab_bucket": "泥沼蟹桶", + "item.wild_wind_wilderness.mudcrab_spawn_egg": "泥沼蟹刷怪蛋", + "item.wild_wind_wilderness.muddy_pig_spawn_egg": "泥猪刷怪蛋", + "item.wild_wind_wilderness.omni_claw": "万用蟹钳", + "item.wild_wind_wilderness.piranha": "生恐鱼", + "item.wild_wind_wilderness.piranha_bucket": "恐鱼桶", + "item.wild_wind_wilderness.piranha_spawn_egg": "恐鱼刷怪蛋", + "item.wild_wind_wilderness.tipped_arrow": "延展之箭", + "item.wild_wind_wilderness.tipped_arrow.effect.long_reach": "延展之箭", + "item.wild_wind_wilderness.tipped_arrow.effect.reach": "延展之箭", + "subtitles.entity.piranha.attack": "恐鱼袭击", + "subtitles.entity.piranha.death": "恐鱼死亡", + "mod.wild_wind.wilderness": "原野之风:荒野更新", + "entity.wild_wind_wilderness.arrow": "延展之箭" +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_button.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_button.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_button.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_button.json index a2727b0..93209a9 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_button.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_button.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/button", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_inventory.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_button_inventory.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_button_inventory.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_button_inventory.json index 1d4dfbd..3e0ed77 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_inventory.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_button_inventory.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/button_inventory", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_pressed.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_button_pressed.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_button_pressed.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_button_pressed.json index 555f0ac..8926d1c 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_button_pressed.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_button_pressed.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/button_pressed", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_left.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_left.json new file mode 100644 index 0000000..7ac0360 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_door_bottom", + "top": "wild_wind_wilderness:block/blaze_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_left_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_left_open.json new file mode 100644 index 0000000..2c797ce --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_door_bottom", + "top": "wild_wind_wilderness:block/blaze_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_right.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_right.json new file mode 100644 index 0000000..ba29cfd --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_door_bottom", + "top": "wild_wind_wilderness:block/blaze_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_right_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_right_open.json new file mode 100644 index 0000000..6eef3d3 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_door_bottom", + "top": "wild_wind_wilderness:block/blaze_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_left.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_left.json new file mode 100644 index 0000000..4b4150f --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_door_bottom", + "top": "wild_wind_wilderness:block/blaze_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_left_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_left_open.json new file mode 100644 index 0000000..013812b --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_door_bottom", + "top": "wild_wind_wilderness:block/blaze_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_right.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_right.json new file mode 100644 index 0000000..74fa0e0 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_door_bottom", + "top": "wild_wind_wilderness:block/blaze_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_right_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_right_open.json new file mode 100644 index 0000000..5c59445 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_door_bottom", + "top": "wild_wind_wilderness:block/blaze_door_top" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate.json similarity index 55% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate.json index 323ffd7..64d3f9b 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate_open.json similarity index 56% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_open.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate_open.json index a680709..29276cc 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_open.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate_open.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate_open", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate_wall.json similarity index 56% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate_wall.json index 5be0081..c30a57f 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate_wall.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate_wall", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate_wall_open.json similarity index 58% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall_open.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate_wall_open.json index 7dc5d11..27c29b5 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_gate_wall_open.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_gate_wall_open.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate_wall_open", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_inventory.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_inventory.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_inventory.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_inventory.json index 91194e7..bf0d822 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_inventory.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_inventory.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/fence_inventory", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_post.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_post.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_post.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_post.json index 34c91e4..02d4a09 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_post.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_post.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/fence_post", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_side.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_side.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_side.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_side.json index 5304bbb..1f4c527 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_fence_side.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_fence_side.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/fence_side", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_0.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_0.json new file mode 100644 index 0000000..5f5bfb8 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_0", + "textures": { + "all": "wild_wind_wilderness:block/blaze_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_1.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_1.json new file mode 100644 index 0000000..749448e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_1", + "textures": { + "all": "wild_wind_wilderness:block/blaze_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_2.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_2.json new file mode 100644 index 0000000..dc68320 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_2", + "textures": { + "all": "wild_wind_wilderness:block/blaze_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_3.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_3.json new file mode 100644 index 0000000..797b8a6 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_attached_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_3", + "textures": { + "all": "wild_wind_wilderness:block/blaze_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_0.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_0.json new file mode 100644 index 0000000..72e8381 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_0", + "textures": { + "all": "wild_wind_wilderness:block/blaze_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_1.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_1.json new file mode 100644 index 0000000..7d4add0 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_1", + "textures": { + "all": "wild_wind_wilderness:block/blaze_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_2.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_2.json new file mode 100644 index 0000000..a9f34e6 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_2", + "textures": { + "all": "wild_wind_wilderness:block/blaze_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_3.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_3.json new file mode 100644 index 0000000..eee932a --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_hanging_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_3", + "textures": { + "all": "wild_wind_wilderness:block/blaze_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_leaves.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_leaves.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_leaves.json index 051fbe3..23d085a 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_leaves.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_leaves.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/leaves", "textures": { - "all": "ww_hfas:block/blaze_leaves" + "all": "wild_wind_wilderness:block/blaze_leaves" } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_log.json new file mode 100644 index 0000000..e392f03 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_wilderness:block/blaze_log_top", + "side": "wild_wind_wilderness:block/blaze_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_log_horizontal.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_log_horizontal.json new file mode 100644 index 0000000..086ba20 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "wild_wind_wilderness:block/blaze_log_top", + "side": "wild_wind_wilderness:block/blaze_log" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_planks.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_planks.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_planks.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_planks.json index 6a3d68c..94908b5 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_planks.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_planks.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cube_all", "textures": { - "all": "ww_hfas:block/blaze_planks" + "all": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_pressure_plate.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_pressure_plate.json index 758120b..c60c0ab 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_pressure_plate.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/pressure_plate_up", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate_down.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_pressure_plate_down.json similarity index 55% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate_down.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_pressure_plate_down.json index db8b114..1c480c6 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_pressure_plate_down.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_pressure_plate_down.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/pressure_plate_down", "textures": { - "texture": "ww_hfas:block/blaze_planks" + "texture": "wild_wind_wilderness:block/blaze_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sapling.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/models/block/blaze_sapling.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sapling.json index 8bf0462..898a488 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/blaze_sapling.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cross", "textures": { - "cross": "ww_hfas:block/blaze_sapling" + "cross": "wild_wind_wilderness:block/blaze_sapling" } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_0.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_0.json new file mode 100644 index 0000000..9bb8226 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_0", + "textures": { + "all": "wild_wind_wilderness:block/blaze_sign", + "particle": "wild_wind_wilderness:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_1.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_1.json new file mode 100644 index 0000000..46a4f93 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_1", + "textures": { + "all": "wild_wind_wilderness:block/blaze_sign", + "particle": "wild_wind_wilderness:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_2.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_2.json new file mode 100644 index 0000000..6973442 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_2", + "textures": { + "all": "wild_wind_wilderness:block/blaze_sign", + "particle": "wild_wind_wilderness:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_3.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_3.json new file mode 100644 index 0000000..167036b --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_3", + "textures": { + "all": "wild_wind_wilderness:block/blaze_sign", + "particle": "wild_wind_wilderness:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_slab.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_slab.json new file mode 100644 index 0000000..cfbd25e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_planks", + "side": "wild_wind_wilderness:block/blaze_planks", + "top": "wild_wind_wilderness:block/blaze_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_slab_top.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_slab_top.json new file mode 100644 index 0000000..185b45f --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_planks", + "side": "wild_wind_wilderness:block/blaze_planks", + "top": "wild_wind_wilderness:block/blaze_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs.json new file mode 100644 index 0000000..ca40832 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_planks", + "side": "wild_wind_wilderness:block/blaze_planks", + "top": "wild_wind_wilderness:block/blaze_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs_inner.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs_inner.json new file mode 100644 index 0000000..6a37521 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_planks", + "side": "wild_wind_wilderness:block/blaze_planks", + "top": "wild_wind_wilderness:block/blaze_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs_outer.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs_outer.json new file mode 100644 index 0000000..478809a --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "wild_wind_wilderness:block/blaze_planks", + "side": "wild_wind_wilderness:block/blaze_planks", + "top": "wild_wind_wilderness:block/blaze_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_bottom.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_bottom.json new file mode 100644 index 0000000..dcd4300 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_trapdoor_bottom", + "textures": { + "texture": "wild_wind_wilderness:block/blaze_trapdoor" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_open.json new file mode 100644 index 0000000..2b03dbd --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_trapdoor_open", + "textures": { + "texture": "wild_wind_wilderness:block/blaze_trapdoor" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_top.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_top.json new file mode 100644 index 0000000..75f0c70 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_trapdoor_top", + "textures": { + "texture": "wild_wind_wilderness:block/blaze_trapdoor" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wall_hanging_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wall_hanging_sign.json new file mode 100644 index 0000000..fdfc3fb --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wall_hanging_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_hanging_sign", + "textures": { + "all": "wild_wind_wilderness:block/blaze_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_blaze_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wall_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wall_sign.json new file mode 100644 index 0000000..4723444 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wall_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_sign", + "textures": { + "all": "wild_wind_wilderness:block/blaze_sign", + "particle": "wild_wind_wilderness:block/blaze_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wood.json new file mode 100644 index 0000000..c4a016f --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_wilderness:block/blaze_log", + "side": "wild_wind_wilderness:block/blaze_log" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/potted_blaze_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/potted_blaze_sapling.json similarity index 55% rename from src/hfas/resources/assets/ww_hfas/models/block/potted_blaze_sapling.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/potted_blaze_sapling.json index ff356e8..e2561ff 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/potted_blaze_sapling.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/potted_blaze_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/flower_pot_cross", "textures": { - "plant": "ww_hfas:block/blaze_sapling" + "plant": "wild_wind_wilderness:block/blaze_sapling" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/potted_soul_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/potted_soul_sapling.json similarity index 56% rename from src/hfas/resources/assets/ww_hfas/models/block/potted_soul_sapling.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/potted_soul_sapling.json index 5833a7c..d3c82d8 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/potted_soul_sapling.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/potted_soul_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/flower_pot_cross", "textures": { - "plant": "ww_hfas:block/soul_sapling" + "plant": "wild_wind_wilderness:block/soul_sapling" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/scorched_dirt.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_dirt.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/block/scorched_dirt.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_dirt.json index 4889d7a..13d798b 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/scorched_dirt.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_dirt.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cube_all", "textures": { - "all": "ww_hfas:block/scorched_dirt" + "all": "wild_wind_wilderness:block/scorched_dirt" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_grass.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/models/block/scorched_grass.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_grass.json index 4319fc6..816d886 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/scorched_grass.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_grass.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cross", "textures": { - "cross": "ww_hfas:block/scorched_grass" + "cross": "wild_wind_wilderness:block/scorched_grass" } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_grass_block.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_grass_block.json new file mode 100644 index 0000000..be13bcf --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_grass_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "wild_wind_wilderness:block/scorched_grass_block" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/scorched_twig.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_twig.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/models/block/scorched_twig.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_twig.json index 0da4df4..b9b573e 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/scorched_twig.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/scorched_twig.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cross", "textures": { - "cross": "ww_hfas:block/scorched_twig" + "cross": "wild_wind_wilderness:block/scorched_twig" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_button.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_button.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_button.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_button.json index ccd3e41..c241126 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_button.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_button.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/button", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_button_inventory.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_button_inventory.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_button_inventory.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_button_inventory.json index 1280d9b..05dbf63 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_button_inventory.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_button_inventory.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/button_inventory", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_button_pressed.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_button_pressed.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_button_pressed.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_button_pressed.json index 67bf9e5..d5a8a38 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_button_pressed.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_button_pressed.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/button_pressed", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_left.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_left.json new file mode 100644 index 0000000..f281480 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_door_bottom", + "top": "wild_wind_wilderness:block/soul_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_left_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_left_open.json new file mode 100644 index 0000000..a51d288 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_left_open", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_door_bottom", + "top": "wild_wind_wilderness:block/soul_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_right.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_right.json new file mode 100644 index 0000000..c177899 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_door_bottom", + "top": "wild_wind_wilderness:block/soul_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_right_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_right_open.json new file mode 100644 index 0000000..92d2249 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_bottom_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_bottom_right_open", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_door_bottom", + "top": "wild_wind_wilderness:block/soul_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_left.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_left.json new file mode 100644 index 0000000..dc2154b --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_left.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_door_bottom", + "top": "wild_wind_wilderness:block/soul_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_left_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_left_open.json new file mode 100644 index 0000000..b7409d2 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_left_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_left_open", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_door_bottom", + "top": "wild_wind_wilderness:block/soul_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_right.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_right.json new file mode 100644 index 0000000..d01e523 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_right.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_door_bottom", + "top": "wild_wind_wilderness:block/soul_door_top" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_right_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_right_open.json new file mode 100644 index 0000000..72d2328 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_door_top_right_open.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/door_top_right_open", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_door_bottom", + "top": "wild_wind_wilderness:block/soul_door_top" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate.json similarity index 55% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate.json index c860132..429bc5b 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate_open.json similarity index 57% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_open.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate_open.json index 154328c..c3c1d6f 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_open.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate_open.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate_open", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate_wall.json similarity index 57% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate_wall.json index 937e20e..a3437e9 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate_wall.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate_wall", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate_wall_open.json similarity index 58% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall_open.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate_wall_open.json index 97933ed..bd87de5 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_gate_wall_open.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_gate_wall_open.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/template_fence_gate_wall_open", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_inventory.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_inventory.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_fence_inventory.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_inventory.json index fb5de9b..5cb2904 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_inventory.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_inventory.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/fence_inventory", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_post.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_post.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_fence_post.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_post.json index e363dfe..e0126f2 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_post.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_post.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/fence_post", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_side.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_side.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_fence_side.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_side.json index 269d2dd..a3b6314 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_fence_side.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_fence_side.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/fence_side", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_0.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_0.json new file mode 100644 index 0000000..e7d4bb5 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_0", + "textures": { + "all": "wild_wind_wilderness:block/soul_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_1.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_1.json new file mode 100644 index 0000000..41355bd --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_1", + "textures": { + "all": "wild_wind_wilderness:block/soul_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_2.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_2.json new file mode 100644 index 0000000..3ceb1e1 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_2", + "textures": { + "all": "wild_wind_wilderness:block/soul_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_3.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_3.json new file mode 100644 index 0000000..e5e37d5 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_attached_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_attached_hanging_sign_rot_3", + "textures": { + "all": "wild_wind_wilderness:block/soul_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_0.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_0.json new file mode 100644 index 0000000..391b31b --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_0", + "textures": { + "all": "wild_wind_wilderness:block/soul_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_1.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_1.json new file mode 100644 index 0000000..298cca0 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_1", + "textures": { + "all": "wild_wind_wilderness:block/soul_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_2.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_2.json new file mode 100644 index 0000000..b776ba6 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_2", + "textures": { + "all": "wild_wind_wilderness:block/soul_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_3.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_3.json new file mode 100644 index 0000000..a431f7b --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_hanging_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_hanging_sign_rot_3", + "textures": { + "all": "wild_wind_wilderness:block/soul_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_leaves.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_leaves.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_leaves.json index e1f2d52..3ac7c66 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_leaves.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_leaves.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/leaves", "textures": { - "all": "ww_hfas:block/soul_leaves" + "all": "wild_wind_wilderness:block/soul_leaves" } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_log.json new file mode 100644 index 0000000..ae7d7cb --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_wilderness:block/soul_log_top", + "side": "wild_wind_wilderness:block/soul_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_log_horizontal.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_log_horizontal.json new file mode 100644 index 0000000..a23b551 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "wild_wind_wilderness:block/soul_log_top", + "side": "wild_wind_wilderness:block/soul_log" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_planks.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_planks.json similarity index 53% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_planks.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_planks.json index 705cc94..0c535c5 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_planks.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_planks.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cube_all", "textures": { - "all": "ww_hfas:block/soul_planks" + "all": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_pressure_plate.json similarity index 55% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_pressure_plate.json index 33947f4..507ef51 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_pressure_plate.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/pressure_plate_up", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate_down.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_pressure_plate_down.json similarity index 55% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate_down.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_pressure_plate_down.json index 0bbf325..330ae3a 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_pressure_plate_down.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_pressure_plate_down.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/pressure_plate_down", "textures": { - "texture": "ww_hfas:block/soul_planks" + "texture": "wild_wind_wilderness:block/soul_planks" } -} \ No newline at end of file +} diff --git a/src/hfas/resources/assets/ww_hfas/models/block/soul_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sapling.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/models/block/soul_sapling.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sapling.json index 0ad7535..efa7077 100644 --- a/src/hfas/resources/assets/ww_hfas/models/block/soul_sapling.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:block/cross", "textures": { - "cross": "ww_hfas:block/soul_sapling" + "cross": "wild_wind_wilderness:block/soul_sapling" } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_0.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_0.json new file mode 100644 index 0000000..5d176d8 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_0.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_0", + "textures": { + "all": "wild_wind_wilderness:block/soul_sign", + "particle": "wild_wind_wilderness:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_1.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_1.json new file mode 100644 index 0000000..2f39d93 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_1.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_1", + "textures": { + "all": "wild_wind_wilderness:block/soul_sign", + "particle": "wild_wind_wilderness:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_2.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_2.json new file mode 100644 index 0000000..f5facd8 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_2.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_2", + "textures": { + "all": "wild_wind_wilderness:block/soul_sign", + "particle": "wild_wind_wilderness:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_3.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_3.json new file mode 100644 index 0000000..0212116 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_sign_rot_3.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_sign_rot_3", + "textures": { + "all": "wild_wind_wilderness:block/soul_sign", + "particle": "wild_wind_wilderness:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_slab.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_slab.json new file mode 100644 index 0000000..56a8819 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_planks", + "side": "wild_wind_wilderness:block/soul_planks", + "top": "wild_wind_wilderness:block/soul_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_slab_top.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_slab_top.json new file mode 100644 index 0000000..e719b47 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_planks", + "side": "wild_wind_wilderness:block/soul_planks", + "top": "wild_wind_wilderness:block/soul_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs.json new file mode 100644 index 0000000..7f95cb2 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_planks", + "side": "wild_wind_wilderness:block/soul_planks", + "top": "wild_wind_wilderness:block/soul_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs_inner.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs_inner.json new file mode 100644 index 0000000..6fd1826 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_planks", + "side": "wild_wind_wilderness:block/soul_planks", + "top": "wild_wind_wilderness:block/soul_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs_outer.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs_outer.json new file mode 100644 index 0000000..576e38e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "wild_wind_wilderness:block/soul_planks", + "side": "wild_wind_wilderness:block/soul_planks", + "top": "wild_wind_wilderness:block/soul_planks" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_bottom.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_bottom.json new file mode 100644 index 0000000..8c2c02e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_bottom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_trapdoor_bottom", + "textures": { + "texture": "wild_wind_wilderness:block/soul_trapdoor" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_open.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_open.json new file mode 100644 index 0000000..41da92d --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_open.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_trapdoor_open", + "textures": { + "texture": "wild_wind_wilderness:block/soul_trapdoor" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_top.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_top.json new file mode 100644 index 0000000..b246108 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_trapdoor_top.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/template_trapdoor_top", + "textures": { + "texture": "wild_wind_wilderness:block/soul_trapdoor" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wall_hanging_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wall_hanging_sign.json new file mode 100644 index 0000000..ee0bcd1 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wall_hanging_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_hanging_sign", + "textures": { + "all": "wild_wind_wilderness:block/soul_hanging_sign", + "particle": "wild_wind_wilderness:block/stripped_soul_log" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wall_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wall_sign.json new file mode 100644 index 0000000..60b567e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wall_sign.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/template_wall_sign", + "textures": { + "all": "wild_wind_wilderness:block/soul_sign", + "particle": "wild_wind_wilderness:block/soul_planks" + } +} \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wood.json new file mode 100644 index 0000000..1ff6400 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_wilderness:block/soul_log", + "side": "wild_wind_wilderness:block/soul_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_log.json new file mode 100644 index 0000000..aa60b01 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_wilderness:block/stripped_blaze_log_top", + "side": "wild_wind_wilderness:block/stripped_blaze_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_log_horizontal.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_log_horizontal.json new file mode 100644 index 0000000..7e2bcf2 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "wild_wind_wilderness:block/stripped_blaze_log_top", + "side": "wild_wind_wilderness:block/stripped_blaze_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_wood.json new file mode 100644 index 0000000..ac6c82e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_blaze_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_wilderness:block/stripped_blaze_log", + "side": "wild_wind_wilderness:block/stripped_blaze_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_log.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_log.json new file mode 100644 index 0000000..058a893 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_log.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_wilderness:block/stripped_soul_log_top", + "side": "wild_wind_wilderness:block/stripped_soul_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_log_horizontal.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_log_horizontal.json new file mode 100644 index 0000000..6a0c505 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_log_horizontal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column_horizontal", + "textures": { + "end": "wild_wind_wilderness:block/stripped_soul_log_top", + "side": "wild_wind_wilderness:block/stripped_soul_log" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_wood.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_wood.json new file mode 100644 index 0000000..212b94f --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/stripped_soul_wood.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/cube_column", + "textures": { + "end": "wild_wind_wilderness:block/stripped_soul_log", + "side": "wild_wind_wilderness:block/stripped_soul_log" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy.bbmodel b/src/wilderness/resources/assets/wild_wind_wilderness/models/entity/pig/pig_muddy.bbmodel similarity index 100% rename from src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy.bbmodel rename to src/wilderness/resources/assets/wild_wind_wilderness/models/entity/pig/pig_muddy.bbmodel diff --git a/src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy_baby.bbmodel b/src/wilderness/resources/assets/wild_wind_wilderness/models/entity/pig/pig_muddy_baby.bbmodel similarity index 100% rename from src/hfas/resources/assets/ww_hfas/models/entity/pig/pig_muddy_baby.bbmodel rename to src/wilderness/resources/assets/wild_wind_wilderness/models/entity/pig/pig_muddy_baby.bbmodel diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_boat.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_boat.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/item/blaze_boat.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_boat.json index e89f7d5..e129e75 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/blaze_boat.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_boat.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/blaze_boat" + "layer0": "wild_wind_wilderness:item/blaze_boat" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_chest_boat.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_chest_boat.json similarity index 51% rename from src/hfas/resources/assets/ww_hfas/models/item/blaze_chest_boat.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_chest_boat.json index 7be8a68..7021e4f 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/blaze_chest_boat.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_chest_boat.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/blaze_chest_boat" + "layer0": "wild_wind_wilderness:item/blaze_chest_boat" } } \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_door.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_door.json new file mode 100644 index 0000000..f731b73 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_wilderness:item/blaze_door" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_hanging_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_hanging_sign.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/models/item/blaze_hanging_sign.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_hanging_sign.json index 893cef4..2661357 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/blaze_hanging_sign.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_hanging_sign.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/blaze_hanging_sign" + "layer0": "wild_wind_wilderness:item/blaze_hanging_sign" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_sapling.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/item/blaze_sapling.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_sapling.json index 4485e6e..0c4da17 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/blaze_sapling.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:block/blaze_sapling" + "layer0": "wild_wind_wilderness:block/blaze_sapling" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/blaze_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_sign.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/item/blaze_sign.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_sign.json index cb92a0e..d85a29f 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/blaze_sign.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/blaze_sign.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/blaze_sign" + "layer0": "wild_wind_wilderness:item/blaze_sign" } } \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/item/cooked_piranha.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/cooked_piranha.json new file mode 100644 index 0000000..bb1529d --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/cooked_piranha.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_wilderness:item/cooked_piranha" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/item/crab_claw.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/crab_claw.json new file mode 100644 index 0000000..40e8c10 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/crab_claw.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_wilderness:item/crab_claw" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/baked_seeds.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/fang.json similarity index 57% rename from src/hfas/resources/assets/ww_hfas/models/item/baked_seeds.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/fang.json index 992e1c7..b6227c7 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/baked_seeds.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/fang.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/baked_seeds" + "layer0": "wild_wind_wilderness:item/fang" } } diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/item/mudcrab_bucket.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/mudcrab_bucket.json new file mode 100644 index 0000000..5591e4e --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/mudcrab_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_wilderness:item/mudcrab_bucket" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/item/mudcrab_spawn_egg.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/mudcrab_spawn_egg.json new file mode 100644 index 0000000..069a63f --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/mudcrab_spawn_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_wilderness:item/mudcrab_spawn_egg" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/omni_claw.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/omni_claw.json similarity index 96% rename from src/hfas/resources/assets/ww_hfas/models/item/omni_claw.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/omni_claw.json index 6c2cb5d..2d19d84 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/omni_claw.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/omni_claw.json @@ -1,8 +1,8 @@ { "texture_size": [32, 32], "textures": { - "2": "ww_hfas:item/omni_claw", - "particle": "ww_hfas:item/omni_claw" + "2": "wild_wind_wilderness:item/omni_claw", + "particle": "wild_wind_wilderness:item/omni_claw" }, "elements": [ { diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha.json new file mode 100644 index 0000000..90a120a --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_wilderness:item/piranha" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha_bucket.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha_bucket.json new file mode 100644 index 0000000..93ceb63 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_wilderness:item/piranha_bucket" + } +} diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha_spawn_egg.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha_spawn_egg.json new file mode 100644 index 0000000..3af630c --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/piranha_spawn_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_wilderness:item/piranha_spawn_egg" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_boat.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_boat.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/item/soul_boat.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_boat.json index 85ef9eb..8877dc1 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/soul_boat.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_boat.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/soul_boat" + "layer0": "wild_wind_wilderness:item/soul_boat" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_chest_boat.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_chest_boat.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/item/soul_chest_boat.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_chest_boat.json index 97dd976..a0e3334 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/soul_chest_boat.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_chest_boat.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/soul_chest_boat" + "layer0": "wild_wind_wilderness:item/soul_chest_boat" } } \ No newline at end of file diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_door.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_door.json new file mode 100644 index 0000000..6728560 --- /dev/null +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "wild_wind_wilderness:item/soul_door" + } +} diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_hanging_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_hanging_sign.json similarity index 51% rename from src/hfas/resources/assets/ww_hfas/models/item/soul_hanging_sign.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_hanging_sign.json index ad56140..ce29064 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/soul_hanging_sign.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_hanging_sign.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/soul_hanging_sign" + "layer0": "wild_wind_wilderness:item/soul_hanging_sign" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_sapling.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_sapling.json similarity index 52% rename from src/hfas/resources/assets/ww_hfas/models/item/soul_sapling.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_sapling.json index e7a9b11..9c7be13 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/soul_sapling.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_sapling.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:block/soul_sapling" + "layer0": "wild_wind_wilderness:block/soul_sapling" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/models/item/soul_sign.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_sign.json similarity index 54% rename from src/hfas/resources/assets/ww_hfas/models/item/soul_sign.json rename to src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_sign.json index 92bdce9..f38d436 100644 --- a/src/hfas/resources/assets/ww_hfas/models/item/soul_sign.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/item/soul_sign.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "ww_hfas:item/soul_sign" + "layer0": "wild_wind_wilderness:item/soul_sign" } } \ No newline at end of file diff --git a/src/hfas/resources/assets/ww_hfas/sounds.json b/src/wilderness/resources/assets/wild_wind_wilderness/sounds.json similarity index 50% rename from src/hfas/resources/assets/ww_hfas/sounds.json rename to src/wilderness/resources/assets/wild_wind_wilderness/sounds.json index dc531b1..e6a6e17 100644 --- a/src/hfas/resources/assets/ww_hfas/sounds.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/sounds.json @@ -2,15 +2,15 @@ "entity.piranha.attack": { "subtitle": "subtitles.entity.piranha.attack", "sounds": [ - "ww_hfas:entity_piranha_attack_1", - "ww_hfas:entity_piranha_attack_2", - "ww_hfas:entity_piranha_attack_3" + "wild_wind_wilderness:entity_piranha_attack_1", + "wild_wind_wilderness:entity_piranha_attack_2", + "wild_wind_wilderness:entity_piranha_attack_3" ] }, "entity.piranha.death": { "subtitle": "subtitles.entity.piranha.death", "sounds": [ - "ww_hfas:entity_piranha_death" + "wild_wind_wilderness:entity_piranha_death" ] } } diff --git a/src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_1.ogg b/src/wilderness/resources/assets/wild_wind_wilderness/sounds/entity_piranha_attack_1.ogg similarity index 100% rename from src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_1.ogg rename to src/wilderness/resources/assets/wild_wind_wilderness/sounds/entity_piranha_attack_1.ogg diff --git a/src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_2.ogg b/src/wilderness/resources/assets/wild_wind_wilderness/sounds/entity_piranha_attack_2.ogg similarity index 100% rename from src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_2.ogg rename to src/wilderness/resources/assets/wild_wind_wilderness/sounds/entity_piranha_attack_2.ogg diff --git a/src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_3.ogg b/src/wilderness/resources/assets/wild_wind_wilderness/sounds/entity_piranha_attack_3.ogg similarity index 100% rename from src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_attack_3.ogg rename to src/wilderness/resources/assets/wild_wind_wilderness/sounds/entity_piranha_attack_3.ogg diff --git a/src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_death.ogg b/src/wilderness/resources/assets/wild_wind_wilderness/sounds/entity_piranha_death.ogg similarity index 100% rename from src/hfas/resources/assets/ww_hfas/sounds/entity_piranha_death.ogg rename to src/wilderness/resources/assets/wild_wind_wilderness/sounds/entity_piranha_death.ogg diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_door_bottom.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_door_bottom.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_door_bottom.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_door_bottom.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_door_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_door_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_door_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_door_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_leaves.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_leaves.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_leaves.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_leaves.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_log.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_log.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_log.png.mcmeta b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_log.png.mcmeta similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_log.png.mcmeta rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_log.png.mcmeta diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_log_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_log_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_log_top.png.mcmeta b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_log_top.png.mcmeta similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_log_top.png.mcmeta rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_log_top.png.mcmeta diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_planks.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_planks.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_planks.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_planks.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_sapling.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_sapling.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_sapling.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_sapling.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/blaze_trapdoor.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_trapdoor.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/blaze_trapdoor.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/blaze_trapdoor.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_door_bottom.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_door_bottom.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_door_bottom.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_door_bottom.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_door_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_door_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_door_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_door_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_leaves.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_leaves.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_leaves.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_leaves.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_log.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_log.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_log.png.mcmeta b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_log.png.mcmeta similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_log.png.mcmeta rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_log.png.mcmeta diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_log_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_log_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_log_top.png.mcmeta b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_log_top.png.mcmeta similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_log_top.png.mcmeta rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_log_top.png.mcmeta diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_planks.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_planks.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_planks.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_planks.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_sapling.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_sapling.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_sapling.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_sapling.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/cinder_trapdoor.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_trapdoor.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/cinder_trapdoor.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/cinder_trapdoor.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_door_bottom.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_door_bottom.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_door_bottom.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_door_bottom.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_door_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_door_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_door_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_door_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_leaves.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_leaves.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_leaves.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_leaves.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_log.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_log.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_log.png.mcmeta b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_log.png.mcmeta similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_log.png.mcmeta rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_log.png.mcmeta diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_log_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_log_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_log_top.png.mcmeta b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_log_top.png.mcmeta similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_log_top.png.mcmeta rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_log_top.png.mcmeta diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_planks.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_planks.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_planks.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_planks.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_sapling.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_sapling.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_sapling.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_sapling.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/ember_trapdoor.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_trapdoor.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/ember_trapdoor.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/ember_trapdoor.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/scorched_dirt.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_dirt.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/scorched_dirt.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_dirt.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_grass.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_grass.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass_block_side.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_grass_block_side.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass_block_side.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_grass_block_side.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass_block_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_grass_block_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/scorched_grass_block_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_grass_block_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_twig.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_twig.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig_wall.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_twig_wall.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/scorched_twig_wall.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/scorched_twig_wall.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_door_bottom.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_door_bottom.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_door_bottom.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_door_bottom.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_door_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_door_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_door_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_door_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_leaves.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_leaves.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_leaves.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_leaves.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_log.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_log.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_log.png.mcmeta b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_log.png.mcmeta similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_log.png.mcmeta rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_log.png.mcmeta diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_log_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_log_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_log_top.png.mcmeta b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_log_top.png.mcmeta similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_log_top.png.mcmeta rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_log_top.png.mcmeta diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_planks.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_planks.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_planks.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_planks.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_sapling.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_sapling.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_sapling.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_sapling.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/soul_trapdoor.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_trapdoor.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/soul_trapdoor.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/soul_trapdoor.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_blaze_log.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_blaze_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_blaze_log.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_blaze_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_blaze_log_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_blaze_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_blaze_log_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_blaze_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_cinder_log.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_cinder_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_cinder_log.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_cinder_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_cinder_log_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_cinder_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_cinder_log_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_cinder_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_ember_log.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_ember_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_ember_log.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_ember_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_ember_log_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_ember_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_ember_log_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_ember_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_soul_log.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_soul_log.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_soul_log.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_soul_log.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/block/stripped_soul_log_top.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_soul_log_top.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/block/stripped_soul_log_top.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/block/stripped_soul_log_top.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/boat/cinder.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/boat/cinder.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/boat/cinder.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/boat/cinder.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/boat/cinder_boat.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/boat/cinder_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/boat/cinder_boat.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/boat/cinder_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/boat/ember.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/boat/ember.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember_boat.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/boat/ember_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/boat/ember_boat.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/boat/ember_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/cinder.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/chest_boat/cinder.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/cinder.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/chest_boat/cinder.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/cinder_chest_boat.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/chest_boat/cinder_chest_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/cinder_chest_boat.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/chest_boat/cinder_chest_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/chest_boat/ember.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/chest_boat/ember.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember_chest_boat.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/chest_boat/ember_chest_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/chest_boat/ember_chest_boat.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/chest_boat/ember_chest_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/cold.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/mudcrab/cold.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/cold.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/mudcrab/cold.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/temperate.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/mudcrab/temperate.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/temperate.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/mudcrab/temperate.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/warm.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/mudcrab/warm.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/mudcrab/warm.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/mudcrab/warm.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/pig/pig_muddy.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/pig/pig_muddy.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/pig/pig_muddy.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/pig/pig_muddy.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/pig/pig_muddy_baby.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/pig/pig_muddy_baby.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/pig/pig_muddy_baby.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/pig/pig_muddy_baby.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/piranha.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/piranha.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/piranha.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/piranha.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/cinder.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/cinder.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/cinder_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/cinder_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/cinder_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/ember.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/ember.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/ember.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/ember.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/ember_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/ember_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/ember_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/ember_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/cinder.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/hanging/cinder.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/cinder.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/hanging/cinder.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/cinder_hanging_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/hanging/cinder_hanging_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/cinder_hanging_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/hanging/cinder_hanging_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/hanging/ember.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/hanging/ember.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember_hanging_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/hanging/ember_hanging_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/entity/signs/hanging/ember_hanging_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/entity/signs/hanging/ember_hanging_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/cinder.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/gui/hanging_signs/cinder.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/cinder.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/gui/hanging_signs/cinder.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/ember.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/gui/hanging_signs/ember.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/gui/hanging_signs/ember.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/gui/hanging_signs/ember.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/blaze_door.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/blaze_door.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/blaze_door.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/blaze_door.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cinder_boat.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/cinder_boat.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cinder_chest_boat.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_chest_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/cinder_chest_boat.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_chest_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cinder_door.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_door.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/cinder_door.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_door.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cinder_hanging_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_hanging_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/cinder_hanging_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_hanging_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cinder_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/cinder_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cinder_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/cooked_piranha.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cooked_piranha.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/cooked_piranha.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/cooked_piranha.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/crab_claw.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/crab_claw.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/crab_claw.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/crab_claw.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/ember_boat.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/ember_boat.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/ember_chest_boat.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_chest_boat.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/ember_chest_boat.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_chest_boat.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/ember_door.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_door.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/ember_door.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_door.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/ember_hanging_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_hanging_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/ember_hanging_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_hanging_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/ember_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/ember_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/ember_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/fang.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/fang.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/fang.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/fang.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/mudcrab_bucket.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/mudcrab_bucket.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/mudcrab_bucket.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/mudcrab_bucket.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/mudcrab_spawn_egg.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/mudcrab_spawn_egg.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/mudcrab_spawn_egg.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/mudcrab_spawn_egg.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/omni_claw.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/omni_claw.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/omni_claw.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/omni_claw.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/piranha.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/piranha.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/piranha.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/piranha.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/piranha_bucket.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/piranha_bucket.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/piranha_bucket.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/piranha_bucket.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/piranha_spawn_egg.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/piranha_spawn_egg.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/piranha_spawn_egg.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/piranha_spawn_egg.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/item/soul_door.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/item/soul_door.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/item/soul_door.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/item/soul_door.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/mob_effect/choke.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/mob_effect/choke.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/mob_effect/choke.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/mob_effect/choke.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/mob_effect/sink.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/mob_effect/sink.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/mob_effect/sink.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/mob_effect/sink.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/screens/cinder_hanging_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/screens/cinder_hanging_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/screens/cinder_hanging_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/screens/cinder_hanging_sign.png diff --git a/src/hfas/resources/assets/ww_hfas/textures/screens/ember_hanging_sign.png b/src/wilderness/resources/assets/wild_wind_wilderness/textures/screens/ember_hanging_sign.png similarity index 100% rename from src/hfas/resources/assets/ww_hfas/textures/screens/ember_hanging_sign.png rename to src/wilderness/resources/assets/wild_wind_wilderness/textures/screens/ember_hanging_sign.png diff --git a/src/wilderness/resources/data/c/tags/block/fence_gates/wooden.json b/src/wilderness/resources/data/c/tags/block/fence_gates/wooden.json new file mode 100644 index 0000000..475fb54 --- /dev/null +++ b/src/wilderness/resources/data/c/tags/block/fence_gates/wooden.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence_gate", + "wild_wind_wilderness:soul_fence_gate" + ] +} diff --git a/src/wilderness/resources/data/c/tags/block/fences.json b/src/wilderness/resources/data/c/tags/block/fences.json new file mode 100644 index 0000000..bb34953 --- /dev/null +++ b/src/wilderness/resources/data/c/tags/block/fences.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence", + "wild_wind_wilderness:soul_fence" + ] +} diff --git a/src/wilderness/resources/data/c/tags/block/fences/wooden.json b/src/wilderness/resources/data/c/tags/block/fences/wooden.json new file mode 100644 index 0000000..bb34953 --- /dev/null +++ b/src/wilderness/resources/data/c/tags/block/fences/wooden.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence", + "wild_wind_wilderness:soul_fence" + ] +} diff --git a/src/wilderness/resources/data/c/tags/block/stripped_logs.json b/src/wilderness/resources/data/c/tags/block/stripped_logs.json new file mode 100644 index 0000000..06776fb --- /dev/null +++ b/src/wilderness/resources/data/c/tags/block/stripped_logs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_soul_log" + ] +} diff --git a/src/wilderness/resources/data/c/tags/block/stripped_woods.json b/src/wilderness/resources/data/c/tags/block/stripped_woods.json new file mode 100644 index 0000000..5a2e02a --- /dev/null +++ b/src/wilderness/resources/data/c/tags/block/stripped_woods.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:stripped_blaze_wood", + "wild_wind_wilderness:stripped_soul_wood" + ] +} diff --git a/src/wilderness/resources/data/c/tags/item/animal_foods.json b/src/wilderness/resources/data/c/tags/item/animal_foods.json new file mode 100644 index 0000000..8420663 --- /dev/null +++ b/src/wilderness/resources/data/c/tags/item/animal_foods.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#wild_wind_wilderness:mudcrab_food" + ] +} diff --git a/src/wilderness/resources/data/c/tags/item/fence_gates/wooden.json b/src/wilderness/resources/data/c/tags/item/fence_gates/wooden.json new file mode 100644 index 0000000..475fb54 --- /dev/null +++ b/src/wilderness/resources/data/c/tags/item/fence_gates/wooden.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence_gate", + "wild_wind_wilderness:soul_fence_gate" + ] +} diff --git a/src/wilderness/resources/data/c/tags/item/fences/wooden.json b/src/wilderness/resources/data/c/tags/item/fences/wooden.json new file mode 100644 index 0000000..bb34953 --- /dev/null +++ b/src/wilderness/resources/data/c/tags/item/fences/wooden.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence", + "wild_wind_wilderness:soul_fence" + ] +} diff --git a/src/wilderness/resources/data/c/tags/item/foods/cooked_fish.json b/src/wilderness/resources/data/c/tags/item/foods/cooked_fish.json new file mode 100644 index 0000000..35113b1 --- /dev/null +++ b/src/wilderness/resources/data/c/tags/item/foods/cooked_fish.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_wilderness:cooked_piranha" + ] +} diff --git a/src/wilderness/resources/data/c/tags/item/stripped_logs.json b/src/wilderness/resources/data/c/tags/item/stripped_logs.json new file mode 100644 index 0000000..06776fb --- /dev/null +++ b/src/wilderness/resources/data/c/tags/item/stripped_logs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_soul_log" + ] +} diff --git a/src/wilderness/resources/data/c/tags/item/stripped_woods.json b/src/wilderness/resources/data/c/tags/item/stripped_woods.json new file mode 100644 index 0000000..5a2e02a --- /dev/null +++ b/src/wilderness/resources/data/c/tags/item/stripped_woods.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:stripped_blaze_wood", + "wild_wind_wilderness:stripped_soul_wood" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/all_hanging_signs.json b/src/wilderness/resources/data/minecraft/tags/block/all_hanging_signs.json new file mode 100644 index 0000000..97c0955 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/all_hanging_signs.json @@ -0,0 +1,20 @@ +{ + "values": [ + { + "required": false, + "id": "wild_wind_wilderness:blaze_hanging_sign" + }, + { + "required": false, + "id": "wild_wind_wilderness:blaze_wall_hanging_sign" + }, + { + "required": false, + "id": "wild_wind_wilderness:soul_hanging_sign" + }, + { + "required": false, + "id": "wild_wind_wilderness:soul_wall_hanging_sign" + } + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/all_signs.json b/src/wilderness/resources/data/minecraft/tags/block/all_signs.json new file mode 100644 index 0000000..5d234e0 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/all_signs.json @@ -0,0 +1,20 @@ +{ + "values": [ + { + "required": false, + "id": "wild_wind_wilderness:blaze_sign" + }, + { + "required": false, + "id": "wild_wind_wilderness:blaze_wall_sign" + }, + { + "required": false, + "id": "wild_wind_wilderness:soul_sign" + }, + { + "required": false, + "id": "wild_wind_wilderness:soul_wall_sign" + } + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/dirt.json b/src/wilderness/resources/data/minecraft/tags/block/dirt.json new file mode 100644 index 0000000..8702922 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/dirt.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:scorched_grass_block", + "wild_wind_wilderness:scorched_dirt" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/doors.json b/src/wilderness/resources/data/minecraft/tags/block/doors.json new file mode 100644 index 0000000..07725a9 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/doors.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_door", + "wild_wind_wilderness:soul_door" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/fence_gates.json b/src/wilderness/resources/data/minecraft/tags/block/fence_gates.json new file mode 100644 index 0000000..475fb54 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/fence_gates.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence_gate", + "wild_wind_wilderness:soul_fence_gate" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/fences.json b/src/wilderness/resources/data/minecraft/tags/block/fences.json new file mode 100644 index 0000000..bb34953 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/fences.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence", + "wild_wind_wilderness:soul_fence" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/flower_pots.json b/src/wilderness/resources/data/minecraft/tags/block/flower_pots.json new file mode 100644 index 0000000..3c34537 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/flower_pots.json @@ -0,0 +1,12 @@ +{ + "values": [ + { + "required": false, + "id": "wild_wind_wilderness:potted_blaze_sapling" + }, + { + "required": false, + "id": "wild_wind_wilderness:potted_soul_sapling" + } + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/leaves.json b/src/wilderness/resources/data/minecraft/tags/block/leaves.json new file mode 100644 index 0000000..7d4e464 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/leaves.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_leaves", + "wild_wind_wilderness:soul_leaves" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/logs.json b/src/wilderness/resources/data/minecraft/tags/block/logs.json new file mode 100644 index 0000000..422d2e7 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/logs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_log", + "wild_wind_wilderness:blaze_wood", + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_blaze_wood", + "wild_wind_wilderness:soul_log", + "wild_wind_wilderness:soul_wood", + "wild_wind_wilderness:stripped_soul_log", + "wild_wind_wilderness:stripped_soul_wood" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/logs_that_burn.json b/src/wilderness/resources/data/minecraft/tags/block/logs_that_burn.json new file mode 100644 index 0000000..422d2e7 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/logs_that_burn.json @@ -0,0 +1,12 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_log", + "wild_wind_wilderness:blaze_wood", + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_blaze_wood", + "wild_wind_wilderness:soul_log", + "wild_wind_wilderness:soul_wood", + "wild_wind_wilderness:stripped_soul_log", + "wild_wind_wilderness:stripped_soul_wood" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/mineable/axe.json b/src/wilderness/resources/data/minecraft/tags/block/mineable/axe.json new file mode 100644 index 0000000..01330ff --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/mineable/axe.json @@ -0,0 +1,30 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_log", + "wild_wind_wilderness:blaze_wood", + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_blaze_wood", + "wild_wind_wilderness:blaze_planks", + "wild_wind_wilderness:blaze_stairs", + "wild_wind_wilderness:blaze_slab", + "wild_wind_wilderness:blaze_fence", + "wild_wind_wilderness:blaze_fence_gate", + "wild_wind_wilderness:blaze_door", + "wild_wind_wilderness:blaze_trapdoor", + "wild_wind_wilderness:blaze_pressure_plate", + "wild_wind_wilderness:blaze_button", + "wild_wind_wilderness:soul_log", + "wild_wind_wilderness:soul_wood", + "wild_wind_wilderness:stripped_soul_log", + "wild_wind_wilderness:stripped_soul_wood", + "wild_wind_wilderness:soul_planks", + "wild_wind_wilderness:soul_stairs", + "wild_wind_wilderness:soul_slab", + "wild_wind_wilderness:soul_fence", + "wild_wind_wilderness:soul_fence_gate", + "wild_wind_wilderness:soul_door", + "wild_wind_wilderness:soul_trapdoor", + "wild_wind_wilderness:soul_pressure_plate", + "wild_wind_wilderness:soul_button" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/needs_stone_tool.json b/src/wilderness/resources/data/minecraft/tags/block/needs_stone_tool.json new file mode 100644 index 0000000..01330ff --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/needs_stone_tool.json @@ -0,0 +1,30 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_log", + "wild_wind_wilderness:blaze_wood", + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_blaze_wood", + "wild_wind_wilderness:blaze_planks", + "wild_wind_wilderness:blaze_stairs", + "wild_wind_wilderness:blaze_slab", + "wild_wind_wilderness:blaze_fence", + "wild_wind_wilderness:blaze_fence_gate", + "wild_wind_wilderness:blaze_door", + "wild_wind_wilderness:blaze_trapdoor", + "wild_wind_wilderness:blaze_pressure_plate", + "wild_wind_wilderness:blaze_button", + "wild_wind_wilderness:soul_log", + "wild_wind_wilderness:soul_wood", + "wild_wind_wilderness:stripped_soul_log", + "wild_wind_wilderness:stripped_soul_wood", + "wild_wind_wilderness:soul_planks", + "wild_wind_wilderness:soul_stairs", + "wild_wind_wilderness:soul_slab", + "wild_wind_wilderness:soul_fence", + "wild_wind_wilderness:soul_fence_gate", + "wild_wind_wilderness:soul_door", + "wild_wind_wilderness:soul_trapdoor", + "wild_wind_wilderness:soul_pressure_plate", + "wild_wind_wilderness:soul_button" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/overworld_natural_logs.json b/src/wilderness/resources/data/minecraft/tags/block/overworld_natural_logs.json new file mode 100644 index 0000000..d6fcb9b --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/overworld_natural_logs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_log", + "wild_wind_wilderness:soul_log" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/planks.json b/src/wilderness/resources/data/minecraft/tags/block/planks.json new file mode 100644 index 0000000..e890cbf --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/planks.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_planks", + "wild_wind_wilderness:soul_planks" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/saplings.json b/src/wilderness/resources/data/minecraft/tags/block/saplings.json new file mode 100644 index 0000000..9fb0ce6 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/saplings.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_sapling", + "wild_wind_wilderness:soul_sapling" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/trapdoors.json b/src/wilderness/resources/data/minecraft/tags/block/trapdoors.json new file mode 100644 index 0000000..f790e39 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/trapdoors.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_trapdoor", + "wild_wind_wilderness:soul_trapdoor" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/wooden_buttons.json b/src/wilderness/resources/data/minecraft/tags/block/wooden_buttons.json new file mode 100644 index 0000000..b1a8864 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/wooden_buttons.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_button", + "wild_wind_wilderness:soul_button" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/wooden_doors.json b/src/wilderness/resources/data/minecraft/tags/block/wooden_doors.json new file mode 100644 index 0000000..07725a9 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/wooden_doors.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_door", + "wild_wind_wilderness:soul_door" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/wooden_fences.json b/src/wilderness/resources/data/minecraft/tags/block/wooden_fences.json new file mode 100644 index 0000000..bb34953 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/wooden_fences.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence", + "wild_wind_wilderness:soul_fence" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/wooden_pressure_plates.json b/src/wilderness/resources/data/minecraft/tags/block/wooden_pressure_plates.json new file mode 100644 index 0000000..d86142b --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/wooden_pressure_plates.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_pressure_plate", + "wild_wind_wilderness:soul_pressure_plate" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/wooden_slabs.json b/src/wilderness/resources/data/minecraft/tags/block/wooden_slabs.json new file mode 100644 index 0000000..80178e1 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/wooden_slabs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_slab", + "wild_wind_wilderness:soul_slab" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/wooden_stairs.json b/src/wilderness/resources/data/minecraft/tags/block/wooden_stairs.json new file mode 100644 index 0000000..e710436 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/wooden_stairs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_stairs", + "wild_wind_wilderness:soul_stairs" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/block/wooden_trapdoors.json b/src/wilderness/resources/data/minecraft/tags/block/wooden_trapdoors.json new file mode 100644 index 0000000..f790e39 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/block/wooden_trapdoors.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_trapdoor", + "wild_wind_wilderness:soul_trapdoor" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/entity_type/aquatic.json b/src/wilderness/resources/data/minecraft/tags/entity_type/aquatic.json new file mode 100644 index 0000000..ad6ed8e --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/entity_type/aquatic.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:mudcrab", + "wild_wind_wilderness:piranha" + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/entity_type/arrows.json b/src/wilderness/resources/data/minecraft/tags/entity_type/arrows.json similarity index 56% rename from src/hfas/resources/data/minecraft/tags/entity_type/arrows.json rename to src/wilderness/resources/data/minecraft/tags/entity_type/arrows.json index 273784c..2ac5d59 100644 --- a/src/hfas/resources/data/minecraft/tags/entity_type/arrows.json +++ b/src/wilderness/resources/data/minecraft/tags/entity_type/arrows.json @@ -1,6 +1,6 @@ { "replace": false, "values": [ - "ww_hfas:arrow" + "wild_wind_wilderness:arrow" ] } diff --git a/src/wilderness/resources/data/minecraft/tags/entity_type/axolotl_hunt_targets.json b/src/wilderness/resources/data/minecraft/tags/entity_type/axolotl_hunt_targets.json new file mode 100644 index 0000000..5edca33 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/entity_type/axolotl_hunt_targets.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_wilderness:piranha" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json b/src/wilderness/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json new file mode 100644 index 0000000..4b64cf8 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/entity_type/can_breathe_under_water.json @@ -0,0 +1,10 @@ +{ + "values": [ + { + "id": "#wild_wind_wilderness:water_breathing", + "required": false + }, + "wild_wind_wilderness:mudcrab", + "wild_wind_wilderness:piranha" + ] +} diff --git a/src/hfas/resources/data/minecraft/tags/entity_type/can_equip_saddle.json b/src/wilderness/resources/data/minecraft/tags/entity_type/can_equip_saddle.json similarity index 53% rename from src/hfas/resources/data/minecraft/tags/entity_type/can_equip_saddle.json rename to src/wilderness/resources/data/minecraft/tags/entity_type/can_equip_saddle.json index 87065a0..0d09e46 100644 --- a/src/hfas/resources/data/minecraft/tags/entity_type/can_equip_saddle.json +++ b/src/wilderness/resources/data/minecraft/tags/entity_type/can_equip_saddle.json @@ -1,6 +1,6 @@ { "replace": false, "values": [ - "ww_hfas:muddy_pig" + "wild_wind_wilderness:muddy_pig" ] } diff --git a/src/wilderness/resources/data/minecraft/tags/entity_type/not_scary_for_pufferfish.json b/src/wilderness/resources/data/minecraft/tags/entity_type/not_scary_for_pufferfish.json new file mode 100644 index 0000000..ad6ed8e --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/entity_type/not_scary_for_pufferfish.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:mudcrab", + "wild_wind_wilderness:piranha" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/arrows.json b/src/wilderness/resources/data/minecraft/tags/item/arrows.json new file mode 100644 index 0000000..305f0da --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/arrows.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_wilderness:tipped_arrow" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/boats.json b/src/wilderness/resources/data/minecraft/tags/item/boats.json new file mode 100644 index 0000000..b54a307 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/boats.json @@ -0,0 +1,12 @@ +{ + "values": [ + { + "required": false, + "id": "wild_wind_wilderness:blaze_boat" + }, + { + "required": false, + "id": "wild_wind_wilderness:soul_boat" + } + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/buttons.json b/src/wilderness/resources/data/minecraft/tags/item/buttons.json new file mode 100644 index 0000000..b1a8864 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/buttons.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_button", + "wild_wind_wilderness:soul_button" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/cat_food.json b/src/wilderness/resources/data/minecraft/tags/item/cat_food.json new file mode 100644 index 0000000..5edca33 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/cat_food.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_wilderness:piranha" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/chest_boats.json b/src/wilderness/resources/data/minecraft/tags/item/chest_boats.json new file mode 100644 index 0000000..9a56aa9 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/chest_boats.json @@ -0,0 +1,12 @@ +{ + "values": [ + { + "required": false, + "id": "wild_wind_wilderness:blaze_chest_boat" + }, + { + "required": false, + "id": "wild_wind_wilderness:soul_chest_boat" + } + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/doors.json b/src/wilderness/resources/data/minecraft/tags/item/doors.json new file mode 100644 index 0000000..07725a9 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/doors.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_door", + "wild_wind_wilderness:soul_door" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/fence_gates.json b/src/wilderness/resources/data/minecraft/tags/item/fence_gates.json new file mode 100644 index 0000000..475fb54 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/fence_gates.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence_gate", + "wild_wind_wilderness:soul_fence_gate" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/fishes.json b/src/wilderness/resources/data/minecraft/tags/item/fishes.json new file mode 100644 index 0000000..9db5509 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/fishes.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:piranha", + "wild_wind_wilderness:cooked_piranha" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/leaves.json b/src/wilderness/resources/data/minecraft/tags/item/leaves.json new file mode 100644 index 0000000..7d4e464 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/leaves.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_leaves", + "wild_wind_wilderness:soul_leaves" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/logs.json b/src/wilderness/resources/data/minecraft/tags/item/logs.json new file mode 100644 index 0000000..422d2e7 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/logs.json @@ -0,0 +1,12 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_log", + "wild_wind_wilderness:blaze_wood", + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_blaze_wood", + "wild_wind_wilderness:soul_log", + "wild_wind_wilderness:soul_wood", + "wild_wind_wilderness:stripped_soul_log", + "wild_wind_wilderness:stripped_soul_wood" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/logs_that_burn.json b/src/wilderness/resources/data/minecraft/tags/item/logs_that_burn.json new file mode 100644 index 0000000..422d2e7 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/logs_that_burn.json @@ -0,0 +1,12 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_log", + "wild_wind_wilderness:blaze_wood", + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_blaze_wood", + "wild_wind_wilderness:soul_log", + "wild_wind_wilderness:soul_wood", + "wild_wind_wilderness:stripped_soul_log", + "wild_wind_wilderness:stripped_soul_wood" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/ocelot_food.json b/src/wilderness/resources/data/minecraft/tags/item/ocelot_food.json new file mode 100644 index 0000000..5edca33 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/ocelot_food.json @@ -0,0 +1,5 @@ +{ + "values": [ + "wild_wind_wilderness:piranha" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/planks.json b/src/wilderness/resources/data/minecraft/tags/item/planks.json new file mode 100644 index 0000000..e890cbf --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/planks.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_planks", + "wild_wind_wilderness:soul_planks" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/saplings.json b/src/wilderness/resources/data/minecraft/tags/item/saplings.json new file mode 100644 index 0000000..9fb0ce6 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/saplings.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_sapling", + "wild_wind_wilderness:soul_sapling" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/trapdoors.json b/src/wilderness/resources/data/minecraft/tags/item/trapdoors.json new file mode 100644 index 0000000..f790e39 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/trapdoors.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_trapdoor", + "wild_wind_wilderness:soul_trapdoor" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/wolf_food.json b/src/wilderness/resources/data/minecraft/tags/item/wolf_food.json new file mode 100644 index 0000000..9db5509 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/wolf_food.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:piranha", + "wild_wind_wilderness:cooked_piranha" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/wooden_buttons.json b/src/wilderness/resources/data/minecraft/tags/item/wooden_buttons.json new file mode 100644 index 0000000..b1a8864 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/wooden_buttons.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_button", + "wild_wind_wilderness:soul_button" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/wooden_doors.json b/src/wilderness/resources/data/minecraft/tags/item/wooden_doors.json new file mode 100644 index 0000000..07725a9 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/wooden_doors.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_door", + "wild_wind_wilderness:soul_door" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/wooden_fences.json b/src/wilderness/resources/data/minecraft/tags/item/wooden_fences.json new file mode 100644 index 0000000..bb34953 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/wooden_fences.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_fence", + "wild_wind_wilderness:soul_fence" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/wooden_pressure_plates.json b/src/wilderness/resources/data/minecraft/tags/item/wooden_pressure_plates.json new file mode 100644 index 0000000..d86142b --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/wooden_pressure_plates.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_pressure_plate", + "wild_wind_wilderness:soul_pressure_plate" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/wooden_slabs.json b/src/wilderness/resources/data/minecraft/tags/item/wooden_slabs.json new file mode 100644 index 0000000..80178e1 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/wooden_slabs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_slab", + "wild_wind_wilderness:soul_slab" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/wooden_stairs.json b/src/wilderness/resources/data/minecraft/tags/item/wooden_stairs.json new file mode 100644 index 0000000..e710436 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/wooden_stairs.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_stairs", + "wild_wind_wilderness:soul_stairs" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/item/wooden_trapdoors.json b/src/wilderness/resources/data/minecraft/tags/item/wooden_trapdoors.json new file mode 100644 index 0000000..f790e39 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/item/wooden_trapdoors.json @@ -0,0 +1,6 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_trapdoor", + "wild_wind_wilderness:soul_trapdoor" + ] +} diff --git a/src/wilderness/resources/data/minecraft/tags/potion/tradeable.json b/src/wilderness/resources/data/minecraft/tags/potion/tradeable.json new file mode 100644 index 0000000..82f793a --- /dev/null +++ b/src/wilderness/resources/data/minecraft/tags/potion/tradeable.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "wild_wind_wilderness:reach", + "wild_wind_wilderness:long_reach" + ] +} diff --git a/src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/cold.json b/src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/cold.json new file mode 100644 index 0000000..5f9af9f --- /dev/null +++ b/src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/cold.json @@ -0,0 +1,12 @@ +{ + "asset_id": "wild_wind_wilderness:entity/mudcrab/cold", + "spawn_conditions": [ + { + "condition": { + "type": "minecraft:biome", + "biomes": "#wild_wind_wilderness:entity_spawn/mudcrab/cold" + }, + "priority": 1 + } + ] +} diff --git a/src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/temperate.json b/src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/temperate.json new file mode 100644 index 0000000..302e094 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/temperate.json @@ -0,0 +1,8 @@ +{ + "asset_id": "wild_wind_wilderness:entity/mudcrab/temperate", + "spawn_conditions": [ + { + "priority": 0 + } + ] +} diff --git a/src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/warm.json b/src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/warm.json new file mode 100644 index 0000000..d29f835 --- /dev/null +++ b/src/wilderness/resources/data/minecraft/wild_wind_wilderness/entity_variant/mudcrab/warm.json @@ -0,0 +1,12 @@ +{ + "asset_id": "wild_wind_wilderness:entity/mudcrab/warm", + "spawn_conditions": [ + { + "condition": { + "type": "minecraft:biome", + "biomes": "#wild_wind_wilderness:entity_spawn/mudcrab/warm" + }, + "priority": 1 + } + ] +} diff --git a/src/wilderness/resources/data/neoforge/data_maps/block/strippables.json b/src/wilderness/resources/data/neoforge/data_maps/block/strippables.json new file mode 100644 index 0000000..d6d2b7b --- /dev/null +++ b/src/wilderness/resources/data/neoforge/data_maps/block/strippables.json @@ -0,0 +1,16 @@ +{ + "values": { + "wild_wind_wilderness:blaze_log": { + "stripped_block": "wild_wind_wilderness:stripped_blaze_log" + }, + "wild_wind_wilderness:blaze_wood": { + "stripped_block": "wild_wind_wilderness:stripped_blaze_wood" + }, + "wild_wind_wilderness:soul_log": { + "stripped_block": "wild_wind_wilderness:stripped_soul_log" + }, + "wild_wind_wilderness:soul_wood": { + "stripped_block": "wild_wind_wilderness:stripped_soul_wood" + } + } +} diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_planks.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_planks.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_planks.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_planks.json index df7917b..15fca56 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_planks.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_planks.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_log" + "items": "wild_wind_wilderness:blaze_log" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_planks" + "recipe": "wild_wind_wilderness:blaze_planks" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_planks" + "wild_wind_wilderness:blaze_planks" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_slab.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_slab.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_slab.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_slab.json index 09eacd2..94acc56 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_slab.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_slab.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_planks" + "items": "wild_wind_wilderness:blaze_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_slab" + "recipe": "wild_wind_wilderness:blaze_slab" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_slab" + "wild_wind_wilderness:blaze_slab" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_stairs.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_stairs.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_stairs.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_stairs.json index 64c7771..ee1649e 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_stairs.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_stairs.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_planks" + "items": "wild_wind_wilderness:blaze_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_stairs" + "recipe": "wild_wind_wilderness:blaze_stairs" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_stairs" + "wild_wind_wilderness:blaze_stairs" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_wood.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_wood.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_wood.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_wood.json index 9d0a0cf..68d990b 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/blaze_wood.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/blaze_wood.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_log" + "items": "wild_wind_wilderness:blaze_log" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_wood" + "recipe": "wild_wind_wilderness:blaze_wood" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_wood" + "wild_wind_wilderness:blaze_wood" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_planks.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_planks.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_planks.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_planks.json index d70d43e..aff116c 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_planks.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_planks.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_log" + "items": "wild_wind_wilderness:soul_log" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_planks" + "recipe": "wild_wind_wilderness:soul_planks" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_planks" + "wild_wind_wilderness:soul_planks" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_slab.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_slab.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_slab.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_slab.json index df8ae9c..59890f2 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_slab.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_slab.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_planks" + "items": "wild_wind_wilderness:soul_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_slab" + "recipe": "wild_wind_wilderness:soul_slab" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_slab" + "wild_wind_wilderness:soul_slab" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_stairs.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_stairs.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_stairs.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_stairs.json index 9fd2421..27defa3 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_stairs.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_stairs.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_planks" + "items": "wild_wind_wilderness:soul_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_stairs" + "recipe": "wild_wind_wilderness:soul_stairs" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_stairs" + "wild_wind_wilderness:soul_stairs" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_wood.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_wood.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_wood.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_wood.json index ffb1150..4c0b003 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/building_blocks/soul_wood.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/building_blocks/soul_wood.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_log" + "items": "wild_wind_wilderness:soul_log" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_wood" + "recipe": "wild_wind_wilderness:soul_wood" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_wood" + "wild_wind_wilderness:soul_wood" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_fence.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/decorations/blaze_fence.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_fence.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/decorations/blaze_fence.json index 59597f8..9f70dc3 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/blaze_fence.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/decorations/blaze_fence.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_planks" + "items": "wild_wind_wilderness:blaze_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_fence" + "recipe": "wild_wind_wilderness:blaze_fence" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_fence" + "wild_wind_wilderness:blaze_fence" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_fence.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/decorations/soul_fence.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_fence.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/decorations/soul_fence.json index ac66a91..c3a5b2b 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/decorations/soul_fence.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/decorations/soul_fence.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_planks" + "items": "wild_wind_wilderness:soul_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_fence" + "recipe": "wild_wind_wilderness:soul_fence" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_fence" + "wild_wind_wilderness:soul_fence" ] } } \ No newline at end of file diff --git a/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/food/cooked_piranha.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/food/cooked_piranha.json new file mode 100644 index 0000000..97a71dd --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/food/cooked_piranha.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_piranha": { + "conditions": { + "items": [ + { + "items": "wild_wind_wilderness:piranha" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "wild_wind_wilderness:cooked_piranha" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_piranha" + ] + ], + "rewards": { + "recipes": [ + "wild_wind_wilderness:cooked_piranha" + ] + } +} diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_button.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_button.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_button.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_button.json index 3e2a199..3edf84d 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_button.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_button.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_planks" + "items": "wild_wind_wilderness:blaze_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_button" + "recipe": "wild_wind_wilderness:blaze_button" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_button" + "wild_wind_wilderness:blaze_button" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_door.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_door.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_door.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_door.json index 7644748..9cf26e4 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_door.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_door.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_planks" + "items": "wild_wind_wilderness:blaze_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_door" + "recipe": "wild_wind_wilderness:blaze_door" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_door" + "wild_wind_wilderness:blaze_door" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_fence_gate.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_fence_gate.json similarity index 74% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_fence_gate.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_fence_gate.json index f5ce8fa..e6d53f1 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_fence_gate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_fence_gate.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_planks" + "items": "wild_wind_wilderness:blaze_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_fence_gate" + "recipe": "wild_wind_wilderness:blaze_fence_gate" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_fence_gate" + "wild_wind_wilderness:blaze_fence_gate" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_pressure_plate.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_pressure_plate.json similarity index 73% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_pressure_plate.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_pressure_plate.json index 9ad5c50..dcf19ca 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_pressure_plate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_pressure_plate.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_planks" + "items": "wild_wind_wilderness:blaze_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_pressure_plate" + "recipe": "wild_wind_wilderness:blaze_pressure_plate" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_pressure_plate" + "wild_wind_wilderness:blaze_pressure_plate" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_trapdoor.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_trapdoor.json similarity index 74% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_trapdoor.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_trapdoor.json index c368c32..e65bf97 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/blaze_trapdoor.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/blaze_trapdoor.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:blaze_planks" + "items": "wild_wind_wilderness:blaze_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:blaze_trapdoor" + "recipe": "wild_wind_wilderness:blaze_trapdoor" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:blaze_trapdoor" + "wild_wind_wilderness:blaze_trapdoor" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_button.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_button.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_button.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_button.json index dc8c182..f061e9d 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_button.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_button.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_planks" + "items": "wild_wind_wilderness:soul_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_button" + "recipe": "wild_wind_wilderness:soul_button" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_button" + "wild_wind_wilderness:soul_button" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_door.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_door.json similarity index 75% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_door.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_door.json index 9da37a6..d8b1dac 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_door.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_door.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_planks" + "items": "wild_wind_wilderness:soul_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_door" + "recipe": "wild_wind_wilderness:soul_door" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_door" + "wild_wind_wilderness:soul_door" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_fence_gate.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_fence_gate.json similarity index 74% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_fence_gate.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_fence_gate.json index cc68c82..f733215 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_fence_gate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_fence_gate.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_planks" + "items": "wild_wind_wilderness:soul_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_fence_gate" + "recipe": "wild_wind_wilderness:soul_fence_gate" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_fence_gate" + "wild_wind_wilderness:soul_fence_gate" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_pressure_plate.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_pressure_plate.json similarity index 73% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_pressure_plate.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_pressure_plate.json index fc8585b..ad71e20 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_pressure_plate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_pressure_plate.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_planks" + "items": "wild_wind_wilderness:soul_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_pressure_plate" + "recipe": "wild_wind_wilderness:soul_pressure_plate" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_pressure_plate" + "wild_wind_wilderness:soul_pressure_plate" ] } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_trapdoor.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_trapdoor.json similarity index 74% rename from src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_trapdoor.json rename to src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_trapdoor.json index 5e18497..72dc773 100644 --- a/src/hfas/resources/data/ww_hfas/advancement/recipes/redstone/soul_trapdoor.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/redstone/soul_trapdoor.json @@ -5,7 +5,7 @@ "conditions": { "items": [ { - "items": "ww_hfas:soul_planks" + "items": "wild_wind_wilderness:soul_planks" } ] }, @@ -13,7 +13,7 @@ }, "has_the_recipe": { "conditions": { - "recipe": "ww_hfas:soul_trapdoor" + "recipe": "wild_wind_wilderness:soul_trapdoor" }, "trigger": "minecraft:recipe_unlocked" } @@ -26,7 +26,7 @@ ], "rewards": { "recipes": [ - "ww_hfas:soul_trapdoor" + "wild_wind_wilderness:soul_trapdoor" ] } } \ No newline at end of file diff --git a/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/tools/omni_claw.json b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/tools/omni_claw.json new file mode 100644 index 0000000..41759aa --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/advancement/recipes/tools/omni_claw.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_crab_claw": { + "conditions": { + "items": [ + { + "items": "wild_wind_wilderness:omni_claw" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "wild_wind_wilderness:omni_claw" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe", + "has_crab_claw" + ] + ], + "rewards": { + "recipes": [ + "wild_wind_wilderness:omni_claw" + ] + } +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_button.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_button.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_button.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_button.json index eacccfa..e194b39 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_button.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_button.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_button" + "name": "wild_wind_wilderness:blaze_button" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_button" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_button" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_door.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_door.json similarity index 73% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_door.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_door.json index 66d0ff8..69f12e0 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_door.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_door.json @@ -12,18 +12,18 @@ "type": "minecraft:item", "conditions": [ { - "block": "ww_hfas:blaze_door", + "block": "wild_wind_wilderness:blaze_door", "condition": "minecraft:block_state_property", "properties": { "half": "lower" } } ], - "name": "ww_hfas:blaze_door" + "name": "wild_wind_wilderness:blaze_door" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_door" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_door" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_fence.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_fence.json index c7791f2..04c31e1 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_fence.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_fence" + "name": "wild_wind_wilderness:blaze_fence" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_fence" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_fence" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence_gate.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_fence_gate.json similarity index 67% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence_gate.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_fence_gate.json index 4108bf7..5d7df3a 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_fence_gate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_fence_gate.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_fence_gate" + "name": "wild_wind_wilderness:blaze_fence_gate" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_fence_gate" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_fence_gate" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_leaves.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_leaves.json similarity index 94% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_leaves.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_leaves.json index 142bb19..528d646 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_leaves.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_leaves.json @@ -36,7 +36,7 @@ ] } ], - "name": "ww_hfas:blaze_leaves" + "name": "wild_wind_wilderness:blaze_leaves" }, { "type": "minecraft:item", @@ -52,7 +52,7 @@ "enchantment": "minecraft:fortune" } ], - "name": "ww_hfas:blaze_sapling" + "name": "wild_wind_wilderness:blaze_sapling" } ] } @@ -126,5 +126,5 @@ "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_leaves" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_leaves" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_log.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_log.json similarity index 70% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_log.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_log.json index e615727..3ee4f65 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_log.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_log.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_log" + "name": "wild_wind_wilderness:blaze_log" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_log" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_log" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_planks.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_planks.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_planks.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_planks.json index b20003d..7ae1e04 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_planks.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_planks.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_planks" + "name": "wild_wind_wilderness:blaze_planks" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_planks" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_planks" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_pressure_plate.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_pressure_plate.json similarity index 66% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_pressure_plate.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_pressure_plate.json index 03fbb58..8a1e0e5 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_pressure_plate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_pressure_plate.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_pressure_plate" + "name": "wild_wind_wilderness:blaze_pressure_plate" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_pressure_plate" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_pressure_plate" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sapling.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_sapling.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sapling.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_sapling.json index 1245cb2..745d181 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_sapling.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_sapling.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_sapling" + "name": "wild_wind_wilderness:blaze_sapling" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_sapling" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_sapling" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_slab.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_slab.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_slab.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_slab.json index 4e599ef..153f864 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_slab.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_slab.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_slab" + "name": "wild_wind_wilderness:blaze_slab" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_slab" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_slab" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_stairs.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_stairs.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_stairs.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_stairs.json index 2e561c2..85cd619 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_stairs.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_stairs.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_stairs" + "name": "wild_wind_wilderness:blaze_stairs" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_stairs" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_stairs" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_trapdoor.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_trapdoor.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_trapdoor.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_trapdoor.json index 7225d07..3c9aae7 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_trapdoor.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_trapdoor.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_trapdoor" + "name": "wild_wind_wilderness:blaze_trapdoor" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_trapdoor" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_trapdoor" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wood.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_wood.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wood.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_wood.json index 4bcd111..22ccc03 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/blaze_wood.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/blaze_wood.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:blaze_wood" + "name": "wild_wind_wilderness:blaze_wood" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/blaze_wood" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/blaze_wood" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_dirt.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_dirt.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_dirt.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_dirt.json index c1b779f..7b1745e 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_dirt.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_dirt.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:scorched_dirt" + "name": "wild_wind_wilderness:scorched_dirt" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/scorched_dirt" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/scorched_dirt" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_grass.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_grass.json index a037703..ac263f2 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_grass.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:scorched_grass" + "name": "wild_wind_wilderness:scorched_grass" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/scorched_grass" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/scorched_grass" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass_block.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_grass_block.json similarity index 66% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass_block.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_grass_block.json index 0404662..b22ea1c 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_grass_block.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_grass_block.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:scorched_grass_block" + "name": "wild_wind_wilderness:scorched_grass_block" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/scorched_grass_block" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/scorched_grass_block" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_twig.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_twig.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_twig.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_twig.json index 36aef82..b51fb98 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/scorched_twig.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/scorched_twig.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:scorched_twig" + "name": "wild_wind_wilderness:scorched_twig" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/scorched_twig" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/scorched_twig" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_button.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_button.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_button.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_button.json index fcf2dbf..9e6b315 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_button.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_button.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_button" + "name": "wild_wind_wilderness:soul_button" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_button" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_button" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_door.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_door.json similarity index 73% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_door.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_door.json index 05fca31..8c219bc 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_door.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_door.json @@ -12,18 +12,18 @@ "type": "minecraft:item", "conditions": [ { - "block": "ww_hfas:soul_door", + "block": "wild_wind_wilderness:soul_door", "condition": "minecraft:block_state_property", "properties": { "half": "lower" } } ], - "name": "ww_hfas:soul_door" + "name": "wild_wind_wilderness:soul_door" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_door" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_door" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_fence.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_fence.json index c1a07cf..3f92064 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_fence.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_fence" + "name": "wild_wind_wilderness:soul_fence" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_fence" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_fence" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence_gate.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_fence_gate.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence_gate.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_fence_gate.json index 56c8bf8..cfd5fbf 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_fence_gate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_fence_gate.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_fence_gate" + "name": "wild_wind_wilderness:soul_fence_gate" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_fence_gate" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_fence_gate" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_leaves.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_leaves.json similarity index 94% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_leaves.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_leaves.json index 6ebea64..98bcfd8 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_leaves.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_leaves.json @@ -36,7 +36,7 @@ ] } ], - "name": "ww_hfas:soul_leaves" + "name": "wild_wind_wilderness:soul_leaves" }, { "type": "minecraft:item", @@ -52,7 +52,7 @@ "enchantment": "minecraft:fortune" } ], - "name": "ww_hfas:soul_sapling" + "name": "wild_wind_wilderness:soul_sapling" } ] } @@ -126,5 +126,5 @@ "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_leaves" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_leaves" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_log.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_log.json similarity index 70% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_log.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_log.json index 82b0242..68ea1f3 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_log.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_log.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_log" + "name": "wild_wind_wilderness:soul_log" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_log" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_log" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_planks.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_planks.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_planks.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_planks.json index 35d336c..7f57be1 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_planks.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_planks.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_planks" + "name": "wild_wind_wilderness:soul_planks" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_planks" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_planks" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_pressure_plate.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_pressure_plate.json similarity index 66% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_pressure_plate.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_pressure_plate.json index 91041d4..f3ca5d8 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_pressure_plate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_pressure_plate.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_pressure_plate" + "name": "wild_wind_wilderness:soul_pressure_plate" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_pressure_plate" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_pressure_plate" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sapling.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_sapling.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sapling.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_sapling.json index a8a4051..70554df 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_sapling.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_sapling.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_sapling" + "name": "wild_wind_wilderness:soul_sapling" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_sapling" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_sapling" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_slab.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_slab.json similarity index 70% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_slab.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_slab.json index 3d22200..c3095c2 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_slab.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_slab.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_slab" + "name": "wild_wind_wilderness:soul_slab" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_slab" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_slab" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_stairs.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_stairs.json similarity index 69% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_stairs.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_stairs.json index 69b0580..aa46989 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_stairs.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_stairs.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_stairs" + "name": "wild_wind_wilderness:soul_stairs" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_stairs" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_stairs" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_trapdoor.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_trapdoor.json similarity index 68% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_trapdoor.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_trapdoor.json index c107f7c..3bbb2df 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_trapdoor.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_trapdoor.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_trapdoor" + "name": "wild_wind_wilderness:soul_trapdoor" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_trapdoor" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_trapdoor" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wood.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_wood.json similarity index 70% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wood.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_wood.json index 75443c9..7962e63 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/soul_wood.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/soul_wood.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:soul_wood" + "name": "wild_wind_wilderness:soul_wood" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/soul_wood" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/soul_wood" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_log.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_blaze_log.json similarity index 67% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_log.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_blaze_log.json index c2ff7d3..dcfc2c0 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_log.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_blaze_log.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:stripped_blaze_log" + "name": "wild_wind_wilderness:stripped_blaze_log" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/stripped_blaze_log" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/stripped_blaze_log" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_wood.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_blaze_wood.json similarity index 66% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_wood.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_blaze_wood.json index e31f358..2660a14 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_blaze_wood.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_blaze_wood.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:stripped_blaze_wood" + "name": "wild_wind_wilderness:stripped_blaze_wood" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/stripped_blaze_wood" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/stripped_blaze_wood" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_log.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_soul_log.json similarity index 67% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_log.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_soul_log.json index f435582..ec66140 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_log.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_soul_log.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:stripped_soul_log" + "name": "wild_wind_wilderness:stripped_soul_log" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/stripped_soul_log" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/stripped_soul_log" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_wood.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_soul_wood.json similarity index 67% rename from src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_wood.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_soul_wood.json index 0159cdf..98f400c 100644 --- a/src/hfas/resources/data/ww_hfas/loot_table/blocks/stripped_soul_wood.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/blocks/stripped_soul_wood.json @@ -10,11 +10,11 @@ "entries": [ { "type": "minecraft:item", - "name": "ww_hfas:stripped_soul_wood" + "name": "wild_wind_wilderness:stripped_soul_wood" } ], "rolls": 1.0 } ], - "random_sequence": "ww_hfas:blocks/stripped_soul_wood" -} \ No newline at end of file + "random_sequence": "wild_wind_wilderness:blocks/stripped_soul_wood" +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/mudcrab.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/mudcrab.json new file mode 100644 index 0000000..f81ce12 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/mudcrab.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:entity", + "random_sequence": "wild_wind_wilderness:entities/mudcrab" +} diff --git a/src/hfas/resources/data/ww_hfas/loot_table/entities/muddy_pig.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/muddy_pig.json similarity index 100% rename from src/hfas/resources/data/ww_hfas/loot_table/entities/muddy_pig.json rename to src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/muddy_pig.json diff --git a/src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/piranha.json b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/piranha.json new file mode 100644 index 0000000..630d0c6 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/loot_table/entities/piranha.json @@ -0,0 +1,83 @@ +{ + "type": "minecraft:entity", + "pools": [ + { + "entries": [ + { + "type": "minecraft:item", + "functions": [ + { + "conditions": [ + { + "condition": "minecraft:any_of", + "terms": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:flags": { + "is_on_fire": true + } + } + }, + { + "condition": "minecraft:entity_properties", + "entity": "direct_attacker", + "predicate": { + "minecraft:equipment": { + "mainhand": { + "predicates": { + "minecraft:enchantments": [ + { + "enchantments": "#minecraft:smelts_loot" + } + ] + } + } + } + } + } + ] + } + ], + "function": "minecraft:furnace_smelt" + } + ], + "name": "wild_wind_wilderness:piranha" + } + ], + "rolls": 1.0 + }, + { + "conditions": [ + { + "chance": 0.05, + "condition": "minecraft:random_chance" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "minecraft:bone_meal" + } + ], + "rolls": 1.0 + }, + { + "conditions": [ + { + "chance": 0.05, + "condition": "minecraft:random_chance" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "wild_wind_wilderness:fang" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "wild_wind_wilderness:entities/piranha" +} diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_blaze_tree.json b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_blaze_tree.json similarity index 64% rename from src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_blaze_tree.json rename to src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_blaze_tree.json index 12df402..0f75acd 100644 --- a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_blaze_tree.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_blaze_tree.json @@ -1,6 +1,6 @@ { "type": "neoforge:add_features", "biomes": "minecraft:nether_wastes", - "features": "ww_hfas:blaze_tree_placed", + "features": "wild_wind_wilderness:blaze_tree_placed", "step": "vegetal_decoration" -} \ No newline at end of file +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_mudcrab_spawns.json b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_mudcrab_spawns.json new file mode 100644 index 0000000..514f406 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_mudcrab_spawns.json @@ -0,0 +1,10 @@ +{ + "type": "neoforge:add_spawns", + "biomes": "#c:is_swamp", + "spawners": { + "type": "wild_wind_wilderness:mudcrab", + "maxCount": 2, + "minCount": 1, + "weight": 1 + } +} diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_muddy_pig.json b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_muddy_pig.json similarity index 52% rename from src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_muddy_pig.json rename to src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_muddy_pig.json index dc51a18..30e17c5 100644 --- a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_muddy_pig.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_muddy_pig.json @@ -1,8 +1,8 @@ { "type": "neoforge:add_spawns", - "biomes": "#ww_hfas:spawns_muddy_pig", + "biomes": "#wild_wind_wilderness:spawns_muddy_pig", "spawners": { - "type": "ww_hfas:muddy_pig", + "type": "wild_wind_wilderness:muddy_pig", "weight": 10, "minCount": 2, "maxCount": 4 diff --git a/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_piranha_spawns.json b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_piranha_spawns.json new file mode 100644 index 0000000..86b96d7 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_piranha_spawns.json @@ -0,0 +1,10 @@ +{ + "type": "neoforge:add_spawns", + "biomes": "#wild_wind_wilderness:entity_spawn/piranha", + "spawners": { + "type": "wild_wind_wilderness:piranha", + "maxCount": 5, + "minCount": 1, + "weight": 8 + } +} diff --git a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_soul_tree.json b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_soul_tree.json similarity index 65% rename from src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_soul_tree.json rename to src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_soul_tree.json index 362fc7c..f291060 100644 --- a/src/hfas/resources/data/ww_hfas/neoforge/biome_modifier/add_soul_tree.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/neoforge/biome_modifier/add_soul_tree.json @@ -1,6 +1,6 @@ { "type": "neoforge:add_features", "biomes": "minecraft:soul_sand_valley", - "features": "ww_hfas:soul_tree_placed", + "features": "wild_wind_wilderness:soul_tree_placed", "step": "vegetal_decoration" -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_button.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_button.json similarity index 56% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_button.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_button.json index dc32b34..38c5b8d 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_button.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_button.json @@ -2,9 +2,9 @@ "type": "minecraft:crafting_shapeless", "category": "redstone", "ingredients": [ - "ww_hfas:blaze_planks" + "wild_wind_wilderness:blaze_planks" ], "result": { - "id": "ww_hfas:blaze_button" + "id": "wild_wind_wilderness:blaze_button" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_door.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_door.json similarity index 65% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_door.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_door.json index 76213fa..33c2bfe 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_door.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_door.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "#": "ww_hfas:blaze_planks" + "#": "wild_wind_wilderness:blaze_planks" }, "pattern": [ "##", @@ -11,6 +11,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:blaze_door" + "id": "wild_wind_wilderness:blaze_door" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_fence.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_fence.json similarity index 64% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_fence.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_fence.json index 4504271..f0d8a11 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_fence.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_fence.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "key": { "#": "minecraft:stick", - "W": "ww_hfas:blaze_planks" + "W": "wild_wind_wilderness:blaze_planks" }, "pattern": [ "W#W", @@ -10,6 +10,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:blaze_fence" + "id": "wild_wind_wilderness:blaze_fence" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_fence_gate.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_fence_gate.json similarity index 64% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_fence_gate.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_fence_gate.json index 745475a..fc73c01 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_fence_gate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_fence_gate.json @@ -3,13 +3,13 @@ "category": "redstone", "key": { "#": "minecraft:stick", - "W": "ww_hfas:blaze_planks" + "W": "wild_wind_wilderness:blaze_planks" }, "pattern": [ "#W#", "#W#" ], "result": { - "id": "ww_hfas:blaze_fence_gate" + "id": "wild_wind_wilderness:blaze_fence_gate" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_planks.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_planks.json similarity index 64% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_planks.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_planks.json index 03a10d1..53e7308 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_planks.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_planks.json @@ -3,10 +3,10 @@ "category": "building", "group": "planks", "ingredients": [ - "ww_hfas:blaze_log" + "wild_wind_wilderness:blaze_log" ], "result": { "count": 4, - "id": "ww_hfas:blaze_planks" + "id": "wild_wind_wilderness:blaze_planks" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_pressure_plate.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_pressure_plate.json similarity index 56% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_pressure_plate.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_pressure_plate.json index 3245696..c66d1bc 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_pressure_plate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_pressure_plate.json @@ -2,12 +2,12 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "#": "ww_hfas:blaze_planks" + "#": "wild_wind_wilderness:blaze_planks" }, "pattern": [ "##" ], "result": { - "id": "ww_hfas:blaze_pressure_plate" + "id": "wild_wind_wilderness:blaze_pressure_plate" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_slab.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_slab.json similarity index 62% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_slab.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_slab.json index 69b4720..c4c15e8 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_slab.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_slab.json @@ -2,13 +2,13 @@ "type": "minecraft:crafting_shaped", "category": "building", "key": { - "#": "ww_hfas:blaze_planks" + "#": "wild_wind_wilderness:blaze_planks" }, "pattern": [ "###" ], "result": { "count": 6, - "id": "ww_hfas:blaze_slab" + "id": "wild_wind_wilderness:blaze_slab" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_stairs.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_stairs.json similarity index 65% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_stairs.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_stairs.json index 52a15d9..6af5ece 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_stairs.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_stairs.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "building", "key": { - "#": "ww_hfas:blaze_planks" + "#": "wild_wind_wilderness:blaze_planks" }, "pattern": [ "# ", @@ -11,6 +11,6 @@ ], "result": { "count": 4, - "id": "ww_hfas:blaze_stairs" + "id": "wild_wind_wilderness:blaze_stairs" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_trapdoor.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_trapdoor.json similarity index 63% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_trapdoor.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_trapdoor.json index 8f0f059..511b0b9 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_trapdoor.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_trapdoor.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "#": "ww_hfas:blaze_planks" + "#": "wild_wind_wilderness:blaze_planks" }, "pattern": [ "###", @@ -10,6 +10,6 @@ ], "result": { "count": 2, - "id": "ww_hfas:blaze_trapdoor" + "id": "wild_wind_wilderness:blaze_trapdoor" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/blaze_wood.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_wood.json similarity index 64% rename from src/hfas/resources/data/ww_hfas/recipe/blaze_wood.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_wood.json index 00cfa11..0857e00 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/blaze_wood.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/blaze_wood.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "building", "key": { - "#": "ww_hfas:blaze_log" + "#": "wild_wind_wilderness:blaze_log" }, "pattern": [ "##", @@ -10,6 +10,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:blaze_wood" + "id": "wild_wind_wilderness:blaze_wood" } } \ No newline at end of file diff --git a/src/wilderness/resources/data/wild_wind_wilderness/recipe/cooked_piranha.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/cooked_piranha.json new file mode 100644 index 0000000..5da591c --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/cooked_piranha.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "category": "food", + "experience": 0.35, + "ingredient": "wild_wind_wilderness:piranha", + "result": { + "id": "wild_wind_wilderness:cooked_piranha" + } +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/recipe/omni_claw.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/omni_claw.json new file mode 100644 index 0000000..9a2be07 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/omni_claw.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "C": "wild_wind_wilderness:crab_claw", + "I": "minecraft:copper_ingot" + }, + "pattern": [ + "ICC", + "IIC", + "III" + ], + "result": { + "id": "wild_wind_wilderness:omni_claw" + } +} diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_button.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_button.json similarity index 57% rename from src/hfas/resources/data/ww_hfas/recipe/soul_button.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_button.json index 127d543..5c93d25 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_button.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_button.json @@ -2,9 +2,9 @@ "type": "minecraft:crafting_shapeless", "category": "redstone", "ingredients": [ - "ww_hfas:soul_planks" + "wild_wind_wilderness:soul_planks" ], "result": { - "id": "ww_hfas:soul_button" + "id": "wild_wind_wilderness:soul_button" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_door.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_door.json similarity index 65% rename from src/hfas/resources/data/ww_hfas/recipe/soul_door.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_door.json index 4a3515f..5bc3073 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_door.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_door.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "#": "ww_hfas:soul_planks" + "#": "wild_wind_wilderness:soul_planks" }, "pattern": [ "##", @@ -11,6 +11,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:soul_door" + "id": "wild_wind_wilderness:soul_door" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_fence.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_fence.json similarity index 64% rename from src/hfas/resources/data/ww_hfas/recipe/soul_fence.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_fence.json index d64e115..7341c3a 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_fence.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_fence.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "key": { "#": "minecraft:stick", - "W": "ww_hfas:soul_planks" + "W": "wild_wind_wilderness:soul_planks" }, "pattern": [ "W#W", @@ -10,6 +10,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:soul_fence" + "id": "wild_wind_wilderness:soul_fence" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_fence_gate.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_fence_gate.json similarity index 64% rename from src/hfas/resources/data/ww_hfas/recipe/soul_fence_gate.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_fence_gate.json index 5c0427f..3ccfe88 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_fence_gate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_fence_gate.json @@ -3,13 +3,13 @@ "category": "redstone", "key": { "#": "minecraft:stick", - "W": "ww_hfas:soul_planks" + "W": "wild_wind_wilderness:soul_planks" }, "pattern": [ "#W#", "#W#" ], "result": { - "id": "ww_hfas:soul_fence_gate" + "id": "wild_wind_wilderness:soul_fence_gate" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_planks.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_planks.json similarity index 64% rename from src/hfas/resources/data/ww_hfas/recipe/soul_planks.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_planks.json index 5170187..1b4c4b9 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_planks.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_planks.json @@ -3,10 +3,10 @@ "category": "building", "group": "planks", "ingredients": [ - "ww_hfas:soul_log" + "wild_wind_wilderness:soul_log" ], "result": { "count": 4, - "id": "ww_hfas:soul_planks" + "id": "wild_wind_wilderness:soul_planks" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_pressure_plate.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_pressure_plate.json similarity index 57% rename from src/hfas/resources/data/ww_hfas/recipe/soul_pressure_plate.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_pressure_plate.json index 5cc9c34..d86a4c1 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_pressure_plate.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_pressure_plate.json @@ -2,12 +2,12 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "#": "ww_hfas:soul_planks" + "#": "wild_wind_wilderness:soul_planks" }, "pattern": [ "##" ], "result": { - "id": "ww_hfas:soul_pressure_plate" + "id": "wild_wind_wilderness:soul_pressure_plate" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_slab.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_slab.json similarity index 62% rename from src/hfas/resources/data/ww_hfas/recipe/soul_slab.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_slab.json index 0eaf551..630741d 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_slab.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_slab.json @@ -2,13 +2,13 @@ "type": "minecraft:crafting_shaped", "category": "building", "key": { - "#": "ww_hfas:soul_planks" + "#": "wild_wind_wilderness:soul_planks" }, "pattern": [ "###" ], "result": { "count": 6, - "id": "ww_hfas:soul_slab" + "id": "wild_wind_wilderness:soul_slab" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_stairs.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_stairs.json similarity index 65% rename from src/hfas/resources/data/ww_hfas/recipe/soul_stairs.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_stairs.json index 73d24a8..fdbd428 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_stairs.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_stairs.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "building", "key": { - "#": "ww_hfas:soul_planks" + "#": "wild_wind_wilderness:soul_planks" }, "pattern": [ "# ", @@ -11,6 +11,6 @@ ], "result": { "count": 4, - "id": "ww_hfas:soul_stairs" + "id": "wild_wind_wilderness:soul_stairs" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_trapdoor.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_trapdoor.json similarity index 63% rename from src/hfas/resources/data/ww_hfas/recipe/soul_trapdoor.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_trapdoor.json index cf7531c..4afea65 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_trapdoor.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_trapdoor.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "#": "ww_hfas:soul_planks" + "#": "wild_wind_wilderness:soul_planks" }, "pattern": [ "###", @@ -10,6 +10,6 @@ ], "result": { "count": 2, - "id": "ww_hfas:soul_trapdoor" + "id": "wild_wind_wilderness:soul_trapdoor" } } \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/recipe/soul_wood.json b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_wood.json similarity index 65% rename from src/hfas/resources/data/ww_hfas/recipe/soul_wood.json rename to src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_wood.json index d43c564..ad9c237 100644 --- a/src/hfas/resources/data/ww_hfas/recipe/soul_wood.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/recipe/soul_wood.json @@ -2,7 +2,7 @@ "type": "minecraft:crafting_shaped", "category": "building", "key": { - "#": "ww_hfas:soul_log" + "#": "wild_wind_wilderness:soul_log" }, "pattern": [ "##", @@ -10,6 +10,6 @@ ], "result": { "count": 3, - "id": "ww_hfas:soul_wood" + "id": "wild_wind_wilderness:soul_wood" } } \ No newline at end of file diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/block/blaze_logs.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/blaze_logs.json new file mode 100644 index 0000000..a94e7ee --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/blaze_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_log", + "wild_wind_wilderness:blaze_wood", + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_blaze_wood" + ] +} \ No newline at end of file diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/preferred_wander_blocks.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/preferred_wander_blocks.json new file mode 100644 index 0000000..20973c3 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/preferred_wander_blocks.json @@ -0,0 +1,7 @@ +{ + "values": [ + "minecraft:mangrove_log", + "minecraft:mangrove_roots", + "minecraft:muddy_mangrove_roots" + ] +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/spawnable_in_water_ground.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/spawnable_in_water_ground.json new file mode 100644 index 0000000..020b979 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/spawnable_in_water_ground.json @@ -0,0 +1,10 @@ +{ + "values": [ + "minecraft:clay", + "minecraft:mud", + "minecraft:dirt", + "minecraft:muddy_mangrove_roots", + "#minecraft:sand", + "#c:gravels" + ] +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/spawnable_on.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/spawnable_on.json new file mode 100644 index 0000000..d448019 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/entity/mudcrab/spawnable_on.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:mud", + "minecraft:muddy_mangrove_roots" + ] +} diff --git a/src/hfas/resources/data/ww_hfas/tags/block/muddy_pig_spawnable_on.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/muddy_pig_spawnable_on.json similarity index 100% rename from src/hfas/resources/data/ww_hfas/tags/block/muddy_pig_spawnable_on.json rename to src/wilderness/resources/data/wild_wind_wilderness/tags/block/muddy_pig_spawnable_on.json diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/block/soul_logs.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/soul_logs.json new file mode 100644 index 0000000..5893cf6 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/block/soul_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_wilderness:soul_log", + "wild_wind_wilderness:soul_wood", + "wild_wind_wilderness:stripped_soul_log", + "wild_wind_wilderness:stripped_soul_wood" + ] +} \ No newline at end of file diff --git a/src/hfas/resources/data/ww_hfas/tags/entity_type/choke_affected.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/entity_type/choke_affected.json similarity index 96% rename from src/hfas/resources/data/ww_hfas/tags/entity_type/choke_affected.json rename to src/wilderness/resources/data/wild_wind_wilderness/tags/entity_type/choke_affected.json index 7b89899..6a539d5 100644 --- a/src/hfas/resources/data/ww_hfas/tags/entity_type/choke_affected.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/entity_type/choke_affected.json @@ -44,6 +44,6 @@ "minecraft:spider", "minecraft:enderman", "minecraft:piglin", - "ww_hfas:muddy_pig" + "wild_wind_wilderness:muddy_pig" ] } diff --git a/src/hfas/resources/data/ww_hfas/tags/entity_type/sink_affected.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/entity_type/sink_affected.json similarity index 96% rename from src/hfas/resources/data/ww_hfas/tags/entity_type/sink_affected.json rename to src/wilderness/resources/data/wild_wind_wilderness/tags/entity_type/sink_affected.json index df1cf35..7c111af 100644 --- a/src/hfas/resources/data/ww_hfas/tags/entity_type/sink_affected.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/entity_type/sink_affected.json @@ -42,6 +42,6 @@ "minecraft:warden", "minecraft:witch", "minecraft:piglin", - "ww_hfas:muddy_pig" + "wild_wind_wilderness:muddy_pig" ] } diff --git a/src/hfas/resources/data/ww_hfas/tags/entity_type/water_breathing.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/entity_type/water_breathing.json similarity index 78% rename from src/hfas/resources/data/ww_hfas/tags/entity_type/water_breathing.json rename to src/wilderness/resources/data/wild_wind_wilderness/tags/entity_type/water_breathing.json index c35d811..c21406b 100644 --- a/src/hfas/resources/data/ww_hfas/tags/entity_type/water_breathing.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/entity_type/water_breathing.json @@ -26,8 +26,8 @@ "minecraft:zombie_horse", "minecraft:skeleton_horse", "minecraft:wither", - { "id": "ww_hfas:mudcrab", "required": false }, - { "id": "ww_hfas:direfish", "required": false }, - { "id": "ww_hfas:piranha", "required": false } + { "id": "wild_wind_wilderness:mudcrab", "required": false }, + { "id": "wild_wind_core:direfish", "required": false }, + { "id": "wild_wind_wilderness:piranha", "required": false } ] } diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/item/blaze_logs.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/item/blaze_logs.json new file mode 100644 index 0000000..6b5c979 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/item/blaze_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_wilderness:blaze_log", + "wild_wind_wilderness:blaze_wood", + "wild_wind_wilderness:stripped_blaze_log", + "wild_wind_wilderness:stripped_blaze_wood" + ] +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/item/mudcrab_food.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/item/mudcrab_food.json new file mode 100644 index 0000000..8e86e0e --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/item/mudcrab_food.json @@ -0,0 +1,5 @@ +{ + "values": [ + "minecraft:spider_eye" + ] +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/item/soul_logs.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/item/soul_logs.json new file mode 100644 index 0000000..bccddb6 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/item/soul_logs.json @@ -0,0 +1,8 @@ +{ + "values": [ + "wild_wind_wilderness:soul_log", + "wild_wind_wilderness:soul_wood", + "wild_wind_wilderness:stripped_soul_log", + "wild_wind_wilderness:stripped_soul_wood" + ] +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/mudcrab/cold.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/mudcrab/cold.json new file mode 100644 index 0000000..6101aab --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/mudcrab/cold.json @@ -0,0 +1,17 @@ +{ + "values": [ + "minecraft:snowy_plains", + "minecraft:ice_spikes", + "minecraft:frozen_peaks", + "minecraft:jagged_peaks", + "minecraft:snowy_slopes", + "minecraft:frozen_ocean", + "minecraft:deep_frozen_ocean", + "minecraft:grove", + "minecraft:deep_dark", + "minecraft:frozen_river", + "minecraft:snowy_taiga", + "minecraft:snowy_beach", + "#minecraft:is_end" + ] +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/mudcrab/warm.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/mudcrab/warm.json new file mode 100644 index 0000000..de055ab --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/mudcrab/warm.json @@ -0,0 +1,11 @@ +{ + "values": [ + "minecraft:desert", + "minecraft:warm_ocean", + "#minecraft:is_jungle", + "#minecraft:is_savanna", + "#minecraft:is_nether", + "#minecraft:is_badlands", + "minecraft:mangrove_swamp" + ] +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/piranha.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/piranha.json new file mode 100644 index 0000000..db9efd8 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/entity_spawn/piranha.json @@ -0,0 +1,6 @@ +{ + "values": [ + "minecraft:jungle", + "#c:is_swamp" + ] +} diff --git a/src/hfas/resources/data/ww_hfas/tags/worldgen/biome/spawns_muddy_pig.json b/src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/spawns_muddy_pig.json similarity index 100% rename from src/hfas/resources/data/ww_hfas/tags/worldgen/biome/spawns_muddy_pig.json rename to src/wilderness/resources/data/wild_wind_wilderness/tags/worldgen/biome/spawns_muddy_pig.json diff --git a/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/blaze_tree.json b/src/wilderness/resources/data/wild_wind_wilderness/worldgen/configured_feature/blaze_tree.json similarity index 92% rename from src/hfas/resources/data/ww_hfas/worldgen/configured_feature/blaze_tree.json rename to src/wilderness/resources/data/wild_wind_wilderness/worldgen/configured_feature/blaze_tree.json index f2acfdf..3fdb7cc 100644 --- a/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/blaze_tree.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/worldgen/configured_feature/blaze_tree.json @@ -31,7 +31,7 @@ "foliage_provider": { "type": "minecraft:simple_state_provider", "state": { - "Name": "ww_hfas:blaze_leaves", + "Name": "wild_wind_wilderness:blaze_leaves", "Properties": { "distance": "7", "persistent": "false", @@ -52,11 +52,11 @@ "trunk_provider": { "type": "minecraft:simple_state_provider", "state": { - "Name": "ww_hfas:blaze_log", + "Name": "wild_wind_wilderness:blaze_log", "Properties": { "axis": "y" } } } } -} \ No newline at end of file +} diff --git a/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/soul_tree.json b/src/wilderness/resources/data/wild_wind_wilderness/worldgen/configured_feature/soul_tree.json similarity index 93% rename from src/hfas/resources/data/ww_hfas/worldgen/configured_feature/soul_tree.json rename to src/wilderness/resources/data/wild_wind_wilderness/worldgen/configured_feature/soul_tree.json index 9fe2d82..24fb860 100644 --- a/src/hfas/resources/data/ww_hfas/worldgen/configured_feature/soul_tree.json +++ b/src/wilderness/resources/data/wild_wind_wilderness/worldgen/configured_feature/soul_tree.json @@ -31,7 +31,7 @@ "foliage_provider": { "type": "minecraft:simple_state_provider", "state": { - "Name": "ww_hfas:soul_leaves", + "Name": "wild_wind_wilderness:soul_leaves", "Properties": { "distance": "7", "persistent": "false", @@ -52,11 +52,11 @@ "trunk_provider": { "type": "minecraft:simple_state_provider", "state": { - "Name": "ww_hfas:soul_log", + "Name": "wild_wind_wilderness:soul_log", "Properties": { "axis": "y" } } } } -} \ No newline at end of file +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/worldgen/placed_feature/blaze_tree_placed.json b/src/wilderness/resources/data/wild_wind_wilderness/worldgen/placed_feature/blaze_tree_placed.json new file mode 100644 index 0000000..39d4cb1 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/worldgen/placed_feature/blaze_tree_placed.json @@ -0,0 +1,4 @@ +{ + "feature": "wild_wind_wilderness:blaze_tree", + "placement": [] +} diff --git a/src/wilderness/resources/data/wild_wind_wilderness/worldgen/placed_feature/soul_tree_placed.json b/src/wilderness/resources/data/wild_wind_wilderness/worldgen/placed_feature/soul_tree_placed.json new file mode 100644 index 0000000..bc56f4b --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_wilderness/worldgen/placed_feature/soul_tree_placed.json @@ -0,0 +1,4 @@ +{ + "feature": "wild_wind_wilderness:soul_tree", + "placement": [] +} diff --git a/src/hfas/resources/ww_hfas.mixins.json b/src/wilderness/resources/wild_wind_wilderness.mixins.json similarity index 67% rename from src/hfas/resources/ww_hfas.mixins.json rename to src/wilderness/resources/wild_wind_wilderness.mixins.json index 158f14f..790c023 100644 --- a/src/hfas/resources/ww_hfas.mixins.json +++ b/src/wilderness/resources/wild_wind_wilderness.mixins.json @@ -1,18 +1,13 @@ { "required": true, - "package": "org.polaris2023.wildwind.hfas.mixin", + "package": "org.polaris2023.wildwind.wilderness.mixin", "compatibilityLevel": "JAVA_25", "mixins": [ - "FurnaceFuelAccessor", - "SinglePoolElementMixin", - "AbstractSkeletonMixin", - "AzaleaBlockMixin", "EnchantmentHelperMixin", "ItemStackMixin", "MobMixin", "PlayerMixin", "ServerPlayerGameModeMixin", - "CrafterBlockMixin", "EntityFluidMovementMixin", "WaterAnimalAirSupplyMixin", "IronGolemAirSupplyMixin", @@ -28,8 +23,5 @@ "overwrites": { "requireAnnotations": true }, - "client": [ - "SignRenderStateMixin", - "AzaleaSignRendererMixin" - ] + "client": [] } diff --git a/src/hfas/test/org/polaris2023/wildwind/hfas/client/MuddyPigModelTest.java b/src/wilderness/test/org/polaris2023/wildwind/wilderness/client/MuddyPigModelTest.java similarity index 98% rename from src/hfas/test/org/polaris2023/wildwind/hfas/client/MuddyPigModelTest.java rename to src/wilderness/test/org/polaris2023/wildwind/wilderness/client/MuddyPigModelTest.java index adbd5c3..b98d700 100644 --- a/src/hfas/test/org/polaris2023/wildwind/hfas/client/MuddyPigModelTest.java +++ b/src/wilderness/test/org/polaris2023/wildwind/wilderness/client/MuddyPigModelTest.java @@ -1,4 +1,4 @@ -package org.polaris2023.wildwind.hfas.client; +package org.polaris2023.wildwind.wilderness.client; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.model.animal.pig.PigModel; From ecf68295ead9663eb4107fc126ed7bfce5c76e35 Mon Sep 17 00:00:00 2001 From: cuccuc377-dev <257740650+cuccuc377-dev@users.noreply.github.com> Date: Fri, 23 Oct 2026 18:44:45 +0800 Subject: [PATCH 7/9] Add sneak-use book inspection for blocks, entities and sulfur cube physics --- CHANGE_LOG.MD | 9 + PROGRESS.md | 20 +- README.md | 8 +- docs/BOOK_INSPECTION.md | 86 +++++++++ docs/DEVELOPMENT.md | 4 +- .../inspection/BookInspectionHandler.java | 67 +++++++ .../wildwind/core/inspection/BookPages.java | 36 ++++ .../core/inspection/InspectionReport.java | 175 ++++++++++++++++++ .../core/inspection/SulfurProfile.java | 65 +++++++ .../entity_type/inspection/renewable.json | 44 +++++ .../tags/item/inspection/non_renewable.json | 15 ++ .../tags/item/inspection/renewable.json | 50 +++++ .../core/inspection/BookPagesTest.java | 22 +++ .../smoke/ClientInstallationTests.java | 10 + .../wildwind/smoke/InstallationTests.java | 7 + .../hfas/test/BookInspectionGameTests.java | 145 +++++++++++++++ .../wildwind/hfas/test/GameplayGameTests.java | 3 + .../test_instance/inspection_blocks.json | 7 + .../inspection_interactions.json | 7 + .../test_instance/inspection_sulfur.json | 7 + .../entity_type/inspection/renewable.json | 6 + 21 files changed, 783 insertions(+), 10 deletions(-) create mode 100644 docs/BOOK_INSPECTION.md create mode 100644 src/core/java/org/polaris2023/wildwind/core/inspection/BookInspectionHandler.java create mode 100644 src/core/java/org/polaris2023/wildwind/core/inspection/BookPages.java create mode 100644 src/core/java/org/polaris2023/wildwind/core/inspection/InspectionReport.java create mode 100644 src/core/java/org/polaris2023/wildwind/core/inspection/SulfurProfile.java create mode 100644 src/core/resources/data/wild_wind_core/tags/entity_type/inspection/renewable.json create mode 100644 src/core/resources/data/wild_wind_core/tags/item/inspection/non_renewable.json create mode 100644 src/core/resources/data/wild_wind_core/tags/item/inspection/renewable.json create mode 100644 src/core/test/org/polaris2023/wildwind/core/inspection/BookPagesTest.java create mode 100644 src/verification/java/org/polaris2023/wildwind/hfas/test/BookInspectionGameTests.java create mode 100644 src/verification/resources/data/wild_wind_tests/test_instance/inspection_blocks.json create mode 100644 src/verification/resources/data/wild_wind_tests/test_instance/inspection_interactions.json create mode 100644 src/verification/resources/data/wild_wind_tests/test_instance/inspection_sulfur.json create mode 100644 src/wilderness/resources/data/wild_wind_core/tags/entity_type/inspection/renewable.json diff --git a/CHANGE_LOG.MD b/CHANGE_LOG.MD index 28b5ec0..3cdd459 100644 --- a/CHANGE_LOG.MD +++ b/CHANGE_LOG.MD @@ -1,3 +1,12 @@ +# 2026-10-23 · 书与笔属性记录器 + +- 核心新增潜行右键方块/实体记录属性,保留书中原有页,剩余空间不足时不写入。 +- 支持硬度、基础爆炸抗性、工具、火焰、红石、活塞、注册 ID、燃料/加工时间、可再生名单等字段。 +- 读取当前原版硫方怪原型及实际物理属性修改器,支持数据包调整;不适用/未知项显示 ×。 +- 新增分页单元测试、3 组 GameTest,并验证核心单独安装和客户端实际字体排版。 + +--- + # 2026-10-23 · 三模组拆分 - 按最新归属拆分 `wild_wind_core`、`wild_wind_wilderness`、`wild_wind_barren`,各有入口、注册代码、资源与发行 JAR。 diff --git a/PROGRESS.md b/PROGRESS.md index 0380764..1685599 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -8,21 +8,21 @@ ## 进度总览 -**当前已交付功能清单:18 / 18 项已实现** +**当前已交付功能清单:19 / 19 项已实现** ```text -已交付功能实现 [████████████████████] 100% 18 / 18 -本地单元测试 [████████████████████] 100% 11 / 11 通过 -本地游戏测试 [████████████████████] 100% 24 / 24 通过 +已交付功能实现 [████████████████████] 100% 19 / 19 +本地单元测试 [████████████████████] 100% 12 / 12 通过 +本地游戏测试 [████████████████████] 100% 27 / 27 通过 ``` -> 功能进度条只统计下面列出的 18 项已交付内容,包含本次开发及已合并的上游功能;不代表整个模组、未来规划或人工验收全部完成。测试进度表示已有测试的通过比例,不代表代码覆盖率。完整项目的最终范围尚未确定,因此不估算总完成百分比。 +> 功能进度条只统计下面列出的 19 项已交付内容,包含本次开发及已合并的上游功能;不代表整个模组、未来规划或人工验收全部完成。测试进度表示已有测试的通过比例,不代表代码覆盖率。完整项目的最终范围尚未确定,因此不估算总完成百分比。 ## 已落实的模块划分 | 编号 | 模组 ID | 功能归属 | | --- | --- | --- | -| 0 核心 | `wild_wind_core` | 杜鹃木及功能方块、羊毛拆线、挣脱蜘蛛网、骷髅近战、耕地保护、窑炉、熔炼;另保留结构生成与七种材料 | +| 0 核心 | `wild_wind_core` | 杜鹃木及功能方块、羊毛拆线、挣脱蜘蛛网、骷髅近战、耕地保护、窑炉、熔炼;另保留结构生成与七种材料;书与笔属性记录器 | | 1 荒野更新 | `wild_wind_wilderness` | 灵焰木、焚烬木、泥猪、泥沼蟹、恐鱼、窒息、沉溺、焦灰草方块/焦土/焦灰草丛/焦灰枝条;保留延展药水箭 | | 2 瘠土更新 | `wild_wind_barren` | 仙人球 | @@ -50,12 +50,13 @@ | 16 | ✅ | 悬挂式杜鹃木告示牌 | 吊顶/墙面放置、链条及横杆行为,双面编辑、染色、发光、涂蜡;配方、掉落和燃料。 | | 17 | ✅ | 杜鹃木展示架 | 三槽整组交换;红石连接交换快捷栏 3/6/9 格;比较器输出 0–7;漏斗、存档和底部对齐设置。 | | 18 | ✅ | 延展之箭与实体 | `wild_wind_wilderness:tipped_arrow` / `wild_wind_wilderness:arrow`;普通 450 刻、长效 1200 刻;合成、交易、英雄礼物、弓弩与发射器;落地 600 刻后退化为普通箭。 | +| 19 | ✅ | 书与笔属性记录器 | 核心:潜行右键记录方块/实体属性,保留笔记并分页;缺失项 ×;实际硫方怪原型与物理参数;可再生标签扩展。 | ## 工程与验证记录 - [x] 私有仓库 `cuccuc377-dev/WildWindMod` 保留来源、代码、资源、测试及构建流程。 - [x] 三个发行模块分别编译,开发生成器与测试模组不进入发行集合。 -- [x] 11 项单元测试、24 组综合 GameTest 通过。 +- [x] 12 项单元测试、27 组综合 GameTest 通过。 - [x] 核心、核心+荒野、核心+瘠土、全部模块四种服务端安装组合通过。 - [x] 核心单独安装与全模块客户端完成资源加载,自动检查告示牌及已安装生物资源。 - [x] 数据生成与快照同步流程已建立,普通构建无需预先生成资源。 @@ -75,9 +76,12 @@ | 待统一 | 许可证元数据 | 构建属性中的许可标识与仓库分项声明有差异,待维护者决定。 | | 待验收 | 稳定发布 | 多人联机、人工视觉及长期存档测试尚未完成。 | +本次记录器验证:新增 1 项分页单元测试和 3 组 GameTest;核心独立安装和客户端实际字体排版检查通过。 + ## 功能文档索引 - [项目说明与获取命令](README.md) +- [书与笔属性记录器](docs/BOOK_INSPECTION.md) - [结构生成配置与坐标查询](docs/STRUCTURES.md) - [泥猪模型、生成与测试](docs/MUDDY_PIG.md) - [合成、状态效果、附魔和生物规则](docs/GAMEPLAY.md) @@ -90,7 +94,7 @@ | 日期 | 进度变更 | | --- | --- | -| 2026-10-23 | 建立进度文档,汇总当前 18 项已交付功能、测试结果、GitHub 构建状态及未完成事项。 | +| 2026-10-23 | 建立进度文档,汇总当前 19 项已交付功能、测试结果、GitHub 构建状态及未完成事项。 | | 2026-10-23 | 模块规划更新为 0「核心」、1「荒野更新」、2「瘠土更新」,同步中英文名称(当时为规划,现已落实)。 | | 2026-10-23 | 三个规划模组 ID 统一采用 `wild_wind_` 前缀:`wild_wind_core`、`wild_wind_wilderness`、`wild_wind_barren`(当时为规划,现已落实)。 | diff --git a/README.md b/README.md index 53ada93..94b5eca 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Minecraft **26.2 / NeoForge 26.2.0.93 / Java 25** 模组项目。当前已按功 | 编号 | 模组 | 模组 ID | 当前功能 | | --- | --- | --- | --- | -| 0 | 原野之风:核心 / Wild Wind:Core | `wild_wind_core` | 杜鹃木及告示牌、悬挂告示牌、展示架;羊毛拆线;挣脱蜘蛛网;骷髅近战;耕地保护;窑炉;熔炼魔咒;结构生成;七种普通材料 | +| 0 | 原野之风:核心 / Wild Wind:Core | `wild_wind_core` | 杜鹃木及告示牌、悬挂告示牌、展示架;羊毛拆线;挣脱蜘蛛网;骷髅近战;耕地保护;窑炉;熔炼魔咒;结构生成;七种普通材料;书与笔属性记录器 | | 1 | 原野之风:荒野更新 / Wild Wind:Wilderness Update | `wild_wind_wilderness` | 灵焰木、焚烬木;泥猪、泥沼蟹、恐鱼及相关道具;窒息、沉溺及呼吸规则;焦灰草方块、焦土、焦灰草丛、焦灰枝条;已有延展药水与延展之箭 | | 2 | 原野之风:瘠土更新 / Wild Wind:Barren Update | `wild_wind_barren` | 仙人球 | @@ -53,6 +53,12 @@ Minecraft **26.2 / NeoForge 26.2.0.93 / Java 25** 模组项目。当前已按功 七种普通材料均在核心,暂不具有食用行为:`duckweed` 浮萍、`calamari` 鱿鱼须、`cooked_calamari` 熟鱿鱼须、`cooked_egg` 煎蛋、`baked_seeds` 烤种子、`cooked_frog_legs` 熟蛙腿、`frog_legs` 生蛙腿。 +### 书与笔属性记录器(核心) + +手持书与笔,**Shift+右键方块/实体**,将属性分页追加进书中;松开 Shift 后右键阅读。记录硬度、抗性、可燃性、活塞行为、挖掘工具、注册 ID、燃料时长、可再生性及硫方怪原型/物理参数等。已有笔记保留,满页不覆盖;不适用或未知的属性显示“×”。无需管理员权限。 + +使用 `/give @s minecraft:writable_book` 获取测试用书。硫方怪分类和数值读取当前游戏数据,可再生性通过数据包标签扩展。详见 [记录器说明](docs/BOOK_INSPECTION.md)。 + ### 主要玩法 - 任意羊毛+剪刀无序合成 2 个线;返还剪刀,扣 1 点耐久并受耐久附魔影响,支持自动合成器。 diff --git a/docs/BOOK_INSPECTION.md b/docs/BOOK_INSPECTION.md new file mode 100644 index 0000000..cec29c1 --- /dev/null +++ b/docs/BOOK_INSPECTION.md @@ -0,0 +1,86 @@ +# 书与笔属性记录器 + +所属模块:**0 · 原野之风:核心(wild_wind_core)**。Minecraft 26.2 / NeoForge,使用原版书与笔,无需新物品、配方或权限。 + +## 使用 + +1. 手持原版书与笔(`minecraft:writable_book`),主手/副手均可。 +2. 按住潜行键(默认 Shift),右键方块或实体。 +3. 收到“已追加 N 页属性记录”的提示后,松开潜行,正常右键打开书阅读。 + +每次追加一份分页快照,已有笔记和书本其他组件保留。最多 100 页,剩余页数不足时整份记录不写入,并提示换书。已签名书不改写;旁观模式不记录。没有潜行时保留正常交互;记录时不会同时打开容器、交易或触发生物右键行为。 + +可用 `/give @s minecraft:writable_book` 获取测试用书。 + +## 方块字段 + +| 字段 | 取值方式 | +| --- | --- | +| 合适挖掘工具 | 检查原版镐、斧、锹、锄、剪刀和剑的实际工具组件;需正确工具掉落时同时校验掉落资格。基础工具用下界合金代表,只报告工具类型,不表示最低材料等级。无需专门工具时显示徒手,无法采集或未知显示 ×。 | +| 硬度 | 点击处当前方块状态的破坏硬度;`-1` 表示不能常规挖掘。 | +| 爆炸抗性 | 方块提供的基础爆炸抗性;不模拟特定爆炸源、实体或爆炸事件。 | +| 引燃几率/烧毁几率 | NeoForge 各面的蔓延/燃烧整数参数,非固定百分比;各面不同时显示范围,均为零显示 ×。 | +| 熔岩可燃性/是否可燃 | 方块在点击位置的 NeoForge 熔岩引燃/火焰可燃性判定,任一面成立显示“是”。 | +| 窒息生物 | 当前状态的 `isSuffocating` 判定。 | +| 红石导体/压断红石线 | 原版红石导体判定;“压断”指放在线路上方时阻断向上阶梯连接,不指破坏或直接移除红石粉。 | +| 固体方块 | 当前状态的原版 `isSolid` 判定,不等同于所有面都完整碰撞。 | +| 活塞推动行为 | 使用原版活塞可推动检查,包括黑曜石、容器、不可破坏方块、伸出活塞等特殊情况;描述单块自身,未模拟周围黏连结构与 12 格推动上限。 | +| 乐器 | 方块作为音符盒配套方块时的乐器。 | +| 方块 ID | 实际注册 ID。 | +| 烧炼时间 | 作为熔炉燃料的燃烧时长,显示秒和游戏刻;不是原料加工时间。 | +| 硫方怪原型 | 当前服务端原型注册表和物品标签的实际匹配。 | +| 最大堆叠/物品 ID | 对应方块物品的实际值;没有对应物品则显示 ×。 | +| 可再生 | 可扩展数据包标签,已知可再生为“是”,明确不可再生为“否”,未知为 ×。 | +| 烧炼加工时间 | 有匹配熔炉配方时显示其加工时长,无配方为 ×。 | + +另附维度、坐标、完整方块状态、正确工具掉落要求及硫方怪物理参数。布尔属性不成立、属性不适用或无法确认时显示 **×**,不填虚构默认值。零硬度和零抗性仍是有效数值。 + +活塞行为严格使用四种文字: + +- 不可推动,不可拉动 +- 被推动破坏,不可拉动 +- 可推动,不可拉动 +- 可推动,可拉动 + +## 实体字段 + +记录实体 ID、名称、维度和坐标、体积、火焰免疫;生物另有当前/最大生命、护甲、移速、攻击力、击退抗性和氧气。方块专属字段保留并填 ×。 + +掉落物读取自身物品 ID、最大堆叠、燃料和配方信息;普通生物不会把刷怪蛋冒充其物品 ID。硫方怪读取实际吸收物品及所属原型,并附吸收后的基础物理参数。不会读取箱子内容、命令方块命令、实体私有 NBT,也不改变目标。 + +## 硫方怪原型与物理参数 + +沿用需求图中的 13 个分类名称:弹性(橡胶球)、普通(足球)、缓慢平移(药球)、快速平移(高尔夫球)、轻盈(沙滩球)、快速滑行(冰球)、缓慢滑行(冰壶)、缓慢弹性、黏性、高阻力、爆炸、高温、默认。 + +分类从 `minecraft:sulfur_cube_archetype` 注册表匹配,不通过名称猜测材质。数据包增改标签/原型后,新的记录自动使用更新结果。模组物品只有加入对应原型标签才会归入该类,否则为“默认”;未改变硫方怪本身的行为。 + +示例:木板 → 弹性,泥巴 → 普通,铁块 → 缓慢平移,苔藓块 → 快速平移,羊毛 → 轻盈,浮冰 → 快速滑行,蘑菇块 → 缓慢滑行,石头 → 缓慢弹性,蜜脾块 → 黏性,灵魂沙 → 高阻力,TNT → 爆炸,岩浆块 → 高温。当前 26.2 普通冰和蜂蜜块不属于对应原型,不能把截图中的大类当成所有方块的逐项定义。 + +物理页列出击退抗性、弹性、摩擦力修正系数、空气阻力修正系数、水平/垂直击退修正系数、浮力、推动幅度。吸收后的属性使用原版基础属性和匹配原型的实际修改器计算,包括属性上下限;若数据包让同一物品匹配多个原型,按原版顺序叠加。推动幅度按原版玩家推动逻辑计算 `max(0, 1 - 击退抗性)`,没有吸收物品的实体为 0。 + +这些是当前版本/数据包下的吸收参数,不硬编码旧截图数值,也不代表考虑实体药水、玩家接触速度等后的完整运动轨迹。 + +## 扩展可再生名单 + +原版没有通用“可再生”属性,不能从硬度、配方或物品类别准确推断全部内容。因此使用手工维护且可被数据包覆盖的标签: + +```text +data/wild_wind_core/tags/item/inspection/renewable.json +data/wild_wind_core/tags/item/inspection/non_renewable.json +data/wild_wind_core/tags/entity_type/inspection/renewable.json +``` + +例如把模组物品加入可再生名单: + +```json +{ + "replace": false, + "values": ["your_mod:your_item"] +} +``` + +明确不可再生物品标签优先。预置常用木材、羊毛、部分可循环生成方块和常见可繁殖/自然生成生物;未收录不等于不可再生。荒野通过自己的资源包将泥猪加入实体名单,核心无需依赖荒野。 + +## 验证 + +新增 1 项分页单元测试、3 组 GameTest:方块属性与四种活塞行为、真实事件总线上的潜行/副手/旁观/满页行为,以及 12 类硫方怪加默认类的注册表匹配与实际实体属性对照。另在核心单独安装测试中读取报告,在真实客户端字体加载后检查中文、长 ID 和换行是否超出原版书页宽高。 diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 22133fd..c31cdd9 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -10,7 +10,7 @@ | `wilderness` | `src/wilderness/` | 模块 1;依赖 Core 与 GeckoLib 5.5.4 | | `barren` | `src/barren/` | 模块 2;只依赖 Core | | `datagen` | `src/datagen/` | 开发用数据生成器;加载全部模块 | -| `verification` | `src/verification/` | 开发用 24 组综合 GameTest;加载全部模块 | +| `verification` | `src/verification/` | 开发用 27 组综合 GameTest;加载全部模块 | | `smoke` | `src/smoke/` | 开发用安装组合测试;由 `testModules` 选择依赖 | 发行模块有各自的入口、注册器、Mixin、资源、元数据与 JAR。`src/templates/` 是元数据模板。辅助项目不放入发行目录。 @@ -74,3 +74,5 @@ python scripts/sync_generated_resources.py 自定义部件制箭台和旧替换配置已移除;历史代码可从 Git 历史查阅。已完成的延展药水箭在荒野中保留。 提交前运行 `git diff --check`,按改动范围执行上述测试;服务端自动测试不替代游戏内视觉、多人联机和长期存档验收。 + +核心 `inspection/` 包提供书与笔记录器,新增字段时同步维护 `BOOK_INSPECTION.md`。实体交互/书本上限/硫方怪物理参数在 `BookInspectionGameTests` 中验证。 diff --git a/src/core/java/org/polaris2023/wildwind/core/inspection/BookInspectionHandler.java b/src/core/java/org/polaris2023/wildwind/core/inspection/BookInspectionHandler.java new file mode 100644 index 0000000..536ae96 --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/inspection/BookInspectionHandler.java @@ -0,0 +1,67 @@ +package org.polaris2023.wildwind.core.inspection; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.core.component.DataComponents; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.Filterable; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.WritableBookContent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import org.polaris2023.wildwind.core.CoreMod; + +@EventBusSubscriber(modid = CoreMod.MOD_ID) +public final class BookInspectionHandler { + private BookInspectionHandler() {} + + private static boolean enabled(PlayerInteractEvent event) { + return event.getEntity().isShiftKeyDown() && !event.getEntity().isSpectator() && event.getItemStack().is(Items.WRITABLE_BOOK); + } + + @SubscribeEvent + public static void block(PlayerInteractEvent.RightClickBlock event) { + if (!enabled(event)) return; + event.setCancellationResult(InteractionResult.SUCCESS); + event.setCanceled(true); + if (event.getEntity() instanceof ServerPlayer player) { + record(player, event.getItemStack(), InspectionReport.block(player.level(), event.getPos())); + } + } + + @SubscribeEvent + public static void entity(PlayerInteractEvent.EntityInteract event) { + if (!enabled(event)) return; + event.setCancellationResult(InteractionResult.SUCCESS); + event.setCanceled(true); + if (event.getEntity() instanceof ServerPlayer player) { + record(player, event.getItemStack(), InspectionReport.entity(player.level(), event.getTarget())); + } + } + + private static void record(ServerPlayer player, ItemStack book, List rows) { + var pages = BookPages.paginate(rows); + if (!append(book, pages)) { + player.sendOverlayMessage(Component.literal("书的剩余页数不足,未写入。请换一本书与笔。")); + return; + } + player.containerMenu.broadcastChanges(); + player.sendOverlayMessage(Component.literal("已追加 " + pages.size() + " 页属性记录;松开潜行后右键阅读。")); + } + + /** All-or-nothing append, preserving existing raw/filtered pages and every other component. */ + public static boolean append(ItemStack book, List additions) { + if (!book.is(Items.WRITABLE_BOOK)) return false; + var old = book.getOrDefault(DataComponents.WRITABLE_BOOK_CONTENT, WritableBookContent.EMPTY); + if (old.pages().size() + additions.size() > WritableBookContent.MAX_PAGES + || additions.stream().anyMatch(page -> page.length() > WritableBookContent.PAGE_EDIT_LENGTH)) return false; + var pages = new ArrayList<>(old.pages()); + additions.forEach(page -> pages.add(Filterable.passThrough(page))); + book.set(DataComponents.WRITABLE_BOOK_CONTENT, new WritableBookContent(pages)); + return true; + } +} diff --git a/src/core/java/org/polaris2023/wildwind/core/inspection/BookPages.java b/src/core/java/org/polaris2023/wildwind/core/inspection/BookPages.java new file mode 100644 index 0000000..e1d8a4e --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/inspection/BookPages.java @@ -0,0 +1,36 @@ +package org.polaris2023.wildwind.core.inspection; + +import java.util.ArrayList; +import java.util.List; + +/** Conservative vanilla book layout: 108 pixels wide, 12 nine-pixel lines. */ +public final class BookPages { + private BookPages() {} + + public static List paginate(List rows) { + var lines = new ArrayList(); + for (String row : rows) { + for (String paragraph : row.split("\n", -1)) { + var line = new StringBuilder(); + int width = 0; + for (int cp : paragraph.codePoints().toArray()) { + // Default Latin glyphs fit within six pixels; reserve ten for other glyphs. + int glyph = cp >= 32 && cp < 127 ? 6 : 10; + if (width + glyph > 108) { + lines.add(line.toString()); + line.setLength(0); + width = 0; + } + if (!Character.isISOControl(cp)) line.appendCodePoint(cp); + width += glyph; + } + lines.add(line.toString()); + } + } + var pages = new ArrayList(); + for (int i = 0; i < lines.size(); i += 12) { + pages.add(String.join("\n", lines.subList(i, Math.min(i + 12, lines.size())))); + } + return List.copyOf(pages); + } +} diff --git a/src/core/java/org/polaris2023/wildwind/core/inspection/InspectionReport.java b/src/core/java/org/polaris2023/wildwind/core/inspection/InspectionReport.java new file mode 100644 index 0000000..fca499c --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/inspection/InspectionReport.java @@ -0,0 +1,175 @@ +package org.polaris2023.wildwind.core.inspection; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.ToIntFunction; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.monster.cubemob.SulfurCube; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.SingleRecipeInput; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.piston.PistonBaseBlock; +import net.minecraft.world.level.material.PushReaction; +import org.polaris2023.wildwind.core.CoreMod; + +/** Read-only snapshots; never reads container contents, private NBT or executes recipes. */ +public final class InspectionReport { + public static final TagKey RENEWABLE_ITEMS = TagKey.create(Registries.ITEM, CoreMod.id("inspection/renewable")); + public static final TagKey NON_RENEWABLE_ITEMS = TagKey.create(Registries.ITEM, CoreMod.id("inspection/non_renewable")); + public static final TagKey> RENEWABLE_ENTITIES = TagKey.create(Registries.ENTITY_TYPE, CoreMod.id("inspection/renewable")); + private static final List BLOCK_FIELDS = List.of("合适挖掘工具", "硬度", "爆炸抗性", "引燃几率", "烧毁几率", "熔岩可燃性", + "窒息生物", "红石导体", "压断红石线", "固体方块", "活塞推动行为", "乐器", "方块ID"); + private InspectionReport() {} + + public static List block(ServerLevel level, BlockPos pos) { + var state = level.getBlockState(pos); + var rows = header("方块", state.getBlock().getName().getString(), level, pos); + rows.add("合适挖掘工具:" + tools(state, level, pos)); + rows.add("硬度:" + number(state.getDestroySpeed(level, pos))); + rows.add("爆炸抗性:" + number(state.getBlock().getExplosionResistance())); + rows.add("引燃几率:" + fireValues(face -> state.getFireSpreadSpeed(level, pos, face))); + rows.add("烧毁几率:" + fireValues(face -> state.getFlammability(level, pos, face))); + rows.add("熔岩可燃性:" + flag(Arrays.stream(Direction.values()).anyMatch(face -> state.ignitedByLava(level, pos, face)))); + rows.add("窒息生物:" + flag(state.isSuffocating(level, pos))); + rows.add("红石导体:" + flag(state.isRedstoneConductor(level, pos))); + // Vanilla dust checks the conductor above it when connecting up a block step. + rows.add("压断红石线:" + flag(state.isRedstoneConductor(level, pos))); + rows.add("固体方块:" + flag(state.isSolid())); + rows.add("活塞推动行为:" + piston(state, level, pos)); + rows.add("乐器:" + instrument(state.instrument().getSerializedName())); + rows.add("方块ID:" + BuiltInRegistries.BLOCK.getKey(state.getBlock())); + var stack = state.getBlock().asItem().getDefaultInstance(); + appendItem(rows, level, stack); + rows.add("是否可燃:" + flag(Arrays.stream(Direction.values()).anyMatch(face -> state.isFlammable(level, pos, face)))); + rows.add("需正确工具掉落:" + flag(state.requiresCorrectToolForDrops())); + rows.add("方块状态:"); + var values = state.getValues().map(Object::toString).toList(); + rows.addAll(values.isEmpty() ? List.of("×") : values); + if (!stack.isEmpty()) SulfurProfile.of(level, stack).appendPhysics(rows); + return List.copyOf(rows); + } + + public static List entity(ServerLevel level, Entity target) { + var rows = header("实体", target.getName().getString(), level, target.blockPosition()); + rows.add("实体ID:" + BuiltInRegistries.ENTITY_TYPE.getKey(target.getType())); + // Keep the requested schema; block properties do not describe a mob or dropped item. + for (var field : BLOCK_FIELDS) rows.add(field + ":×"); + var stack = target instanceof ItemEntity item ? item.getItem() : ItemStack.EMPTY; + if (target instanceof SulfurCube cube) stack = cube.getItemBySlot(EquipmentSlot.BODY); + appendItem(rows, level, stack); + if (stack.isEmpty() && target.getType().builtInRegistryHolder().is(RENEWABLE_ENTITIES)) { + rows.set(rows.indexOf("可再生:×"), "可再生:是"); + } + rows.add("宽度:" + number(target.getBbWidth())); + rows.add("高度:" + number(target.getBbHeight())); + rows.add("火焰免疫:" + flag(target.fireImmune())); + if (target instanceof LivingEntity living) { + rows.add("生命值:" + number(living.getHealth())); + rows.add("最大生命值:" + number(living.getMaxHealth())); + rows.add("护甲:" + attribute(living, Attributes.ARMOR)); + rows.add("移动速度:" + attribute(living, Attributes.MOVEMENT_SPEED)); + rows.add("攻击伤害:" + attribute(living, Attributes.ATTACK_DAMAGE)); + rows.add("击退抗性:" + attribute(living, Attributes.KNOCKBACK_RESISTANCE)); + rows.add("当前氧气:" + living.getAirSupply()); + rows.add("最大氧气:" + living.getMaxAirSupply()); + } else { + for (var field : List.of("生命值", "最大生命值", "护甲", "移动速度", "攻击伤害", "击退抗性", "当前氧气", "最大氧气")) rows.add(field + ":×"); + } + if (target instanceof SulfurCube) { + rows.add("吸收物品ID:" + (stack.isEmpty() ? "×" : BuiltInRegistries.ITEM.getKey(stack.getItem()))); + if (stack.isEmpty()) rows.set(rows.indexOf("硫方怪原型:×"), "硫方怪原型:默认"); + SulfurProfile.of(level, stack).appendPhysics(rows); + } + return List.copyOf(rows); + } + + private static ArrayList header(String kind, String name, ServerLevel level, BlockPos pos) { + return new ArrayList<>(List.of("原野之风·属性记录", kind + ":" + name, + "维度:" + level.dimension().identifier(), "坐标:" + pos.getX() + "," + pos.getY() + "," + pos.getZ())); + } + + private static void appendItem(List rows, ServerLevel level, ItemStack stack) { + int fuel = stack.isEmpty() ? 0 : stack.getBurnTime(RecipeType.SMELTING, level.fuelValues()); + rows.add("烧炼时间:" + (fuel > 0 ? time(fuel) : "×")); + rows.add("硫方怪原型:" + (stack.isEmpty() ? "×" : SulfurProfile.of(level, stack).name())); + rows.add("最大堆叠:" + (stack.isEmpty() ? "×" : stack.getMaxStackSize())); + rows.add("可再生:" + (stack.is(NON_RENEWABLE_ITEMS) ? "否" : stack.is(RENEWABLE_ITEMS) ? "是" : "×")); + rows.add("物品ID:" + (stack.isEmpty() ? "×" : BuiltInRegistries.ITEM.getKey(stack.getItem()))); + var recipe = stack.isEmpty() ? "×" : level.recipeAccess().getRecipeFor(RecipeType.SMELTING, new SingleRecipeInput(stack), level) + .map(holder -> time(holder.value().cookingTime())).orElse("×"); + rows.add("烧炼加工时间:" + recipe); + } + + public static String piston(BlockState state, ServerLevel level, BlockPos pos) { + boolean canPush = Arrays.stream(Direction.values()).anyMatch(d -> PistonBaseBlock.isPushable(state, level, pos, d, true, d)); + if (!canPush) return "不可推动,不可拉动"; + if (state.getPistonPushReaction() == PushReaction.DESTROY) return "被推动破坏,不可拉动"; + boolean canPull = Arrays.stream(Direction.values()).anyMatch(d -> PistonBaseBlock.isPushable(state, level, pos, d, false, d.getOpposite())); + return canPull ? "可推动,可拉动" : "可推动,不可拉动"; + } + + private static String tools(BlockState state, ServerLevel level, BlockPos pos) { + if (state.getDestroySpeed(level, pos) < 0) return "×"; + var names = new ArrayList(); + tool(names, "镐", state, Items.NETHERITE_PICKAXE); + tool(names, "斧", state, Items.NETHERITE_AXE); + tool(names, "锹", state, Items.NETHERITE_SHOVEL); + tool(names, "锄", state, Items.NETHERITE_HOE); + tool(names, "剪刀", state, Items.SHEARS); + tool(names, "剑", state, Items.NETHERITE_SWORD); + return names.isEmpty() ? (state.requiresCorrectToolForDrops() ? "×" : "徒手") : String.join("、", names); + } + + private static void tool(List names, String name, BlockState state, Item item) { + var stack = item.getDefaultInstance(); + if (stack.getDestroySpeed(state) > 1 && (!state.requiresCorrectToolForDrops() || stack.isCorrectToolForDrops(state))) names.add(name); + } + + private static String fireValues(ToIntFunction getter) { + int min = Arrays.stream(Direction.values()).mapToInt(getter).min().orElse(0); + int max = Arrays.stream(Direction.values()).mapToInt(getter).max().orElse(0); + if (max == 0) return "×"; + return min == max ? Integer.toString(max) : min + "–" + max + "(随面)"; + } + + private static String instrument(String name) { + return switch (name) { + case "harp" -> "竖琴"; case "basedrum" -> "底鼓"; case "snare" -> "军鼓"; case "hat" -> "踩镲"; + case "bass" -> "贝斯"; case "flute" -> "长笛"; case "bell" -> "钟琴"; case "guitar" -> "吉他"; + case "chime" -> "管钟"; case "xylophone" -> "木琴"; case "iron_xylophone" -> "铁木琴"; + case "cow_bell" -> "牛铃"; case "didgeridoo" -> "迪吉里杜管"; case "bit" -> "方波"; + case "banjo" -> "班卓琴"; case "pling" -> "电钢琴"; + default -> name; + }; + } + + private static String attribute(LivingEntity entity, Holder key) { + var instance = entity.getAttribute(key); + return instance == null ? "×" : number(instance.getValue()); + } + + public static String number(double value) { + return Double.isFinite(value) ? BigDecimal.valueOf(value).setScale(4, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString() : "×"; + } + public static String flag(boolean value) { return value ? "是" : "×"; } + private static String time(int ticks) { return number(ticks / 20.0) + "秒(" + ticks + "刻)"; } +} diff --git a/src/core/java/org/polaris2023/wildwind/core/inspection/SulfurProfile.java b/src/core/java/org/polaris2023/wildwind/core/inspection/SulfurProfile.java new file mode 100644 index 0000000..fcfd312 --- /dev/null +++ b/src/core/java/org/polaris2023/wildwind/core/inspection/SulfurProfile.java @@ -0,0 +1,65 @@ +package org.polaris2023.wildwind.core.inspection; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.SulfurCubeArchetype; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.attributes.DefaultAttributes; +import net.minecraft.world.item.ItemStack; + +/** Uses the same item membership, modifier order and defaults as vanilla SulfurCube. */ +public record SulfurProfile(List> matches, boolean hasAbsorbedItem) { + private static final Map NAMES = Map.ofEntries( + Map.entry("bouncy", "弹性(橡胶球)"), Map.entry("regular", "普通(足球)"), + Map.entry("slow_flat", "缓慢平移(药球)"), Map.entry("fast_flat", "快速平移(高尔夫球)"), + Map.entry("light", "轻盈(沙滩球)"), Map.entry("fast_sliding", "快速滑行(冰球)"), + Map.entry("slow_sliding", "缓慢滑行(冰壶)"), Map.entry("slow_bouncy", "缓慢弹性"), + Map.entry("sticky", "黏性"), Map.entry("high_resistance", "高阻力"), + Map.entry("explosive", "爆炸"), Map.entry("hot", "高温")); + + public static SulfurProfile of(ServerLevel level, ItemStack stack) { + return new SulfurProfile(level.registryAccess().lookupOrThrow(Registries.SULFUR_CUBE_ARCHETYPE) + .listElements().filter(holder -> stack.is(holder.value().items())).toList(), !stack.isEmpty()); + } + + public String name() { + if (matches.isEmpty()) return "默认"; + return matches.stream().map(holder -> { + var id = holder.key().identifier(); + return id.getNamespace().equals("minecraft") ? NAMES.getOrDefault(id.getPath(), id.toString()) : id.toString(); + }).collect(Collectors.joining("、")); + } + + public double attribute(Holder attribute) { + var instance = DefaultAttributes.getSupplier(EntityTypes.SULFUR_CUBE).createInstance(ignored -> {}, attribute); + if (instance == null) return Double.NaN; + for (var holder : matches) { + for (var entry : holder.value().attributeModifiers()) { + if (entry.attribute().equals(attribute)) instance.addOrUpdateTransientModifier(entry.modifier()); + } + } + return instance.getValue(); + } + + public void appendPhysics(List rows) { + rows.add("硫方怪物理参数"); + rows.add("(当前版本/数据包)"); + rows.add("击退抗性:" + InspectionReport.number(attribute(Attributes.KNOCKBACK_RESISTANCE))); + rows.add("弹性:" + InspectionReport.number(attribute(Attributes.BOUNCINESS))); + rows.add("摩擦力修正系数:" + InspectionReport.number(attribute(Attributes.FRICTION_MODIFIER))); + rows.add("空气阻力修正系数:" + InspectionReport.number(attribute(Attributes.AIR_DRAG_MODIFIER))); + var knockback = matches.isEmpty() ? SulfurCubeArchetype.DEFAULT_KNOCKBACK_MODIFIERS + : matches.getLast().value().knockbackModifiers(); + rows.add("水平击退修正系数:" + InspectionReport.number(knockback.horizontalPower())); + rows.add("垂直击退修正系数:" + InspectionReport.number(knockback.verticalPower())); + rows.add("浮力:" + InspectionReport.flag(matches.stream().anyMatch(h -> h.value().buoyant()))); + // Vanilla playerPush derives this coefficient from resistance, only with an absorbed item. + rows.add("推动幅度:" + InspectionReport.number(hasAbsorbedItem ? Math.max(0, 1 - attribute(Attributes.KNOCKBACK_RESISTANCE)) : 0)); + } +} diff --git a/src/core/resources/data/wild_wind_core/tags/entity_type/inspection/renewable.json b/src/core/resources/data/wild_wind_core/tags/entity_type/inspection/renewable.json new file mode 100644 index 0000000..34b808a --- /dev/null +++ b/src/core/resources/data/wild_wind_core/tags/entity_type/inspection/renewable.json @@ -0,0 +1,44 @@ +{ + "replace": false, + "values": [ + "minecraft:cow", + "minecraft:pig", + "minecraft:sheep", + "minecraft:chicken", + "minecraft:mooshroom", + "minecraft:horse", + "minecraft:donkey", + "minecraft:mule", + "minecraft:rabbit", + "minecraft:wolf", + "minecraft:cat", + "minecraft:ocelot", + "minecraft:llama", + "minecraft:camel", + "minecraft:goat", + "minecraft:fox", + "minecraft:panda", + "minecraft:bee", + "minecraft:turtle", + "minecraft:frog", + "minecraft:tadpole", + "minecraft:axolotl", + "minecraft:villager", + "minecraft:iron_golem", + "minecraft:snow_golem", + "minecraft:zombie", + "minecraft:skeleton", + "minecraft:creeper", + "minecraft:spider", + "minecraft:cave_spider", + "minecraft:slime", + "minecraft:magma_cube", + "minecraft:drowned", + "minecraft:squid", + "minecraft:glow_squid", + "minecraft:cod", + "minecraft:salmon", + "minecraft:pufferfish", + "minecraft:tropical_fish" + ] +} diff --git a/src/core/resources/data/wild_wind_core/tags/item/inspection/non_renewable.json b/src/core/resources/data/wild_wind_core/tags/item/inspection/non_renewable.json new file mode 100644 index 0000000..15f807d --- /dev/null +++ b/src/core/resources/data/wild_wind_core/tags/item/inspection/non_renewable.json @@ -0,0 +1,15 @@ +{ + "replace": false, + "values": [ + "minecraft:ancient_debris", + "minecraft:netherite_scrap", + "minecraft:netherite_ingot", + "minecraft:netherite_block", + "minecraft:diamond", + "minecraft:diamond_block", + "minecraft:deepslate", + "minecraft:raw_gold_block", + "minecraft:raw_iron_block", + "minecraft:raw_copper_block" + ] +} diff --git a/src/core/resources/data/wild_wind_core/tags/item/inspection/renewable.json b/src/core/resources/data/wild_wind_core/tags/item/inspection/renewable.json new file mode 100644 index 0000000..a167881 --- /dev/null +++ b/src/core/resources/data/wild_wind_core/tags/item/inspection/renewable.json @@ -0,0 +1,50 @@ +{ + "replace": false, + "values": [ + "#minecraft:logs", + "#minecraft:planks", + "#minecraft:wool", + "#minecraft:saplings", + "#minecraft:leaves", + "#minecraft:wooden_slabs", + "#minecraft:wooden_stairs", + "#minecraft:wooden_fences", + "#minecraft:wooden_doors", + "#minecraft:wooden_trapdoors", + "#minecraft:wooden_buttons", + "#minecraft:wooden_pressure_plates", + "#minecraft:signs", + "#minecraft:hanging_signs", + "minecraft:stone", + "minecraft:cobblestone", + "minecraft:obsidian", + "minecraft:basalt", + "minecraft:blackstone", + "minecraft:ice", + "minecraft:packed_ice", + "minecraft:blue_ice", + "minecraft:snow_block", + "minecraft:clay", + "minecraft:mud", + "minecraft:dirt", + "minecraft:grass_block", + "minecraft:moss_block", + "minecraft:honey_block", + "minecraft:slime_block", + "minecraft:iron_block", + "minecraft:gold_block", + "minecraft:copper_block", + "minecraft:emerald_block", + "minecraft:redstone_block", + "minecraft:coal", + "minecraft:charcoal", + "minecraft:stick", + "minecraft:string", + "minecraft:egg", + "minecraft:cactus", + "minecraft:sugar_cane", + "minecraft:bamboo", + "minecraft:kelp", + "wild_wind_core:azalea_shelf" + ] +} diff --git a/src/core/test/org/polaris2023/wildwind/core/inspection/BookPagesTest.java b/src/core/test/org/polaris2023/wildwind/core/inspection/BookPagesTest.java new file mode 100644 index 0000000..ec9a346 --- /dev/null +++ b/src/core/test/org/polaris2023/wildwind/core/inspection/BookPagesTest.java @@ -0,0 +1,22 @@ +package org.polaris2023.wildwind.core.inspection; + +import java.util.List; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + +class BookPagesTest { + @Test + void wrapsLongMixedLanguageIdsWithoutLosingCharactersOrOverflowingPages() { + String row = "物品ID:wild_wind_wilderness:very_long_item_" + "测试".repeat(1000) + "😀"; + var pages = BookPages.paginate(List.of(row)); + assertTrue(pages.size() > 1); + assertEquals(row, String.join("", pages).replace("\n", "")); + for (String page : pages) { + assertTrue(page.length() <= 1024); + assertTrue(page.split("\n", -1).length <= 12); + for (String line : page.split("\n", -1)) { + assertTrue(line.codePoints().map(cp -> cp >= 32 && cp < 127 ? 6 : 10).sum() <= 108); + } + } + } +} diff --git a/src/smoke/java/org/polaris2023/wildwind/smoke/ClientInstallationTests.java b/src/smoke/java/org/polaris2023/wildwind/smoke/ClientInstallationTests.java index a4fd89c..42ad522 100644 --- a/src/smoke/java/org/polaris2023/wildwind/smoke/ClientInstallationTests.java +++ b/src/smoke/java/org/polaris2023/wildwind/smoke/ClientInstallationTests.java @@ -19,6 +19,16 @@ public static void tick(ClientTickEvent.Post event) { var client = Minecraft.getInstance(); if (client.gui.overlay() != null || !(client.gui.screen() instanceof TitleScreen)) return; require(client, "wild_wind_core:textures/entity/signs/azalea.png"); + // Verify conservative server pagination against the actual loaded Minecraft font. + var pages = org.polaris2023.wildwind.core.inspection.BookPages.paginate(java.util.List.of( + "原野之风·属性记录", "物品ID:wild_wind_wilderness:muddy_pig_spawn_egg", + "活塞推动行为:不可推动,不可拉动", "烧炼时间:15秒(300刻)", "空气阻力修正系数:0.01")); + for (var page : pages) { + if (client.font.wordWrapHeight(net.minecraft.network.chat.Component.literal(page), 114) > 126) throw new IllegalStateException("Inspector page exceeds book height"); + for (var line : page.split("\n")) { + if (client.font.width(line) > 114) throw new IllegalStateException("Inspector line exceeds book width: " + line); + } + } if (ModList.get().isLoaded("wild_wind_wilderness")) { require(client, "wild_wind_wilderness:textures/entity/pig/pig_muddy.png"); require(client, "wild_wind_wilderness:textures/entity/pig/pig_muddy_baby.png"); diff --git a/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java b/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java index b96247d..e37105a 100644 --- a/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java +++ b/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java @@ -48,6 +48,13 @@ private static void installation(GameTestHelper h) { } check(h, BuiltInRegistries.BLOCK.containsKey(Identifier.parse("wild_wind_barren:tiny_cactus")) == expected.contains("barren"), "Cactus belongs only to Barren"); check(h, BuiltInRegistries.BLOCK.keySet().stream().noneMatch(id -> id.getNamespace().startsWith("wild_wind_") && id.getPath().equals("fletching_table")), "Custom fletching table removed"); + var inspectionPos = h.absolutePos(new net.minecraft.core.BlockPos(2, 2, 2)); + h.getLevel().setBlockAndUpdate(inspectionPos, net.minecraft.world.level.block.Blocks.OAK_PLANKS.defaultBlockState()); + var report = org.polaris2023.wildwind.core.inspection.InspectionReport.block(h.getLevel(), inspectionPos); + check(h, report.contains("可再生:是") && report.contains("硫方怪原型:弹性(橡胶球)"), "Inspector works with only Core and its own tags"); + var book = new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.WRITABLE_BOOK); + check(h, org.polaris2023.wildwind.core.inspection.BookInspectionHandler.append(book, + org.polaris2023.wildwind.core.inspection.BookPages.paginate(report)), "Core can persist complete inspection report"); h.succeed(); } } diff --git a/src/verification/java/org/polaris2023/wildwind/hfas/test/BookInspectionGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/BookInspectionGameTests.java new file mode 100644 index 0000000..ab24278 --- /dev/null +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/BookInspectionGameTests.java @@ -0,0 +1,145 @@ +package org.polaris2023.wildwind.hfas.test; + +import java.util.List; +import java.util.stream.IntStream; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.server.network.Filterable; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.EntityTypes; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.component.WritableBookContent; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.piston.PistonBaseBlock; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import org.polaris2023.wildwind.core.inspection.BookInspectionHandler; +import org.polaris2023.wildwind.core.inspection.InspectionReport; +import org.polaris2023.wildwind.core.inspection.SulfurProfile; + +public final class BookInspectionGameTests { + private static void check(GameTestHelper h, boolean ok, String message) { h.assertTrue(ok, Component.literal(message)); } + private static void field(GameTestHelper h, List report, String row) { check(h, report.contains(row), "Missing report row: " + row + " in " + report); } + + static void blocks(GameTestHelper h) { + var level = h.getLevel(); + var pos = h.absolutePos(new BlockPos(2, 2, 2)); + level.setBlockAndUpdate(pos, Blocks.OAK_PLANKS.defaultBlockState()); + var report = InspectionReport.block(level, pos); + for (String row : List.of("方块ID:minecraft:oak_planks", "硬度:2", "爆炸抗性:3", "引燃几率:5", "烧毁几率:20", + "熔岩可燃性:是", "乐器:贝斯", "烧炼时间:15秒(300刻)", "最大堆叠:64", "可再生:是", "物品ID:minecraft:oak_planks")) field(h, report, row); + check(h, report.stream().anyMatch(row -> row.startsWith("合适挖掘工具:") && row.contains("斧")), "Planks use axes"); + level.setBlockAndUpdate(pos, Blocks.COBBLESTONE.defaultBlockState()); + report = InspectionReport.block(level, pos); + field(h, report, "引燃几率:×"); + field(h, report, "烧炼时间:×"); + field(h, report, "烧炼加工时间:10秒(200刻)"); + level.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); + field(h, InspectionReport.block(level, pos), "物品ID:×"); + field(h, InspectionReport.block(level, pos), "最大堆叠:×"); + level.setBlockAndUpdate(pos, Blocks.DIAMOND_BLOCK.defaultBlockState()); + field(h, InspectionReport.block(level, pos), "可再生:否"); + level.setBlockAndUpdate(pos, Blocks.BARRIER.defaultBlockState()); + field(h, InspectionReport.block(level, pos), "可再生:×"); + level.setBlockAndUpdate(pos, org.polaris2023.wildwind.core.block.ModBlocks.AZALEA_PLANKS.get().defaultBlockState()); + report = InspectionReport.block(level, pos); + field(h, report, "方块ID:wild_wind_core:azalea_planks"); + field(h, report, "可再生:是"); + field(h, report, "烧炼时间:15秒(300刻)"); + for (var block : List.of(Blocks.OBSIDIAN, Blocks.CHEST, Blocks.BEDROCK)) { + check(h, InspectionReport.piston(block.defaultBlockState(), level, pos).equals("不可推动,不可拉动"), "Special immovable block: " + block); + } + check(h, InspectionReport.piston(Blocks.STONE.defaultBlockState(), level, pos).equals("可推动,可拉动"), "Stone is movable"); + check(h, InspectionReport.piston(Blocks.TORCH.defaultBlockState(), level, pos).equals("被推动破坏,不可拉动"), "Torch breaks when pushed"); + check(h, InspectionReport.piston(Blocks.GLAZED_TERRACOTTA.white().defaultBlockState(), level, pos).equals("可推动,不可拉动"), "Glazed terracotta push-only"); + check(h, InspectionReport.piston(Blocks.PISTON.defaultBlockState().setValue(PistonBaseBlock.EXTENDED, true), level, pos).equals("不可推动,不可拉动"), "Extended piston immovable"); + h.succeed(); + } + + static void interactions(GameTestHelper h) { + var player = h.makeMockServerPlayerInLevel(); + var pos = h.absolutePos(new BlockPos(2, 2, 2)); + h.getLevel().setBlockAndUpdate(pos, Blocks.CHEST.defaultBlockState()); + var book = new ItemStack(Items.WRITABLE_BOOK); + var note = Filterable.passThrough("已有笔记,请保留"); + book.set(DataComponents.WRITABLE_BOOK_CONTENT, new WritableBookContent(List.of(note))); + player.setItemInHand(InteractionHand.MAIN_HAND, book); + var hit = new BlockHitResult(Vec3.atCenterOf(pos), Direction.UP, pos, false); + var normal = NeoForge.EVENT_BUS.post(new PlayerInteractEvent.RightClickBlock(player, InteractionHand.MAIN_HAND, pos, hit)); + check(h, !normal.isCanceled() && book.get(DataComponents.WRITABLE_BOOK_CONTENT).pages().size() == 1, "Normal use must remain unchanged"); + player.setShiftKeyDown(true); + var event = NeoForge.EVENT_BUS.post(new PlayerInteractEvent.RightClickBlock(player, InteractionHand.MAIN_HAND, pos, hit)); + check(h, event.isCanceled() && event.getCancellationResult() == InteractionResult.SUCCESS, "Inspector consumes interaction before opening chest/book"); + var pages = book.get(DataComponents.WRITABLE_BOOK_CONTENT).pages(); + check(h, pages.size() > 1 && pages.getFirst().equals(note), "Append preserves original page"); + check(h, pages.stream().allMatch(p -> p.raw().length() <= 1024 && p.raw().split("\n", -1).length <= 12), "Pages fit writable book limits"); + var full = new WritableBookContent(IntStream.range(0, 100).mapToObj(i -> Filterable.passThrough("note " + i)).toList()); + book.set(DataComponents.WRITABLE_BOOK_CONTENT, full); + check(h, !BookInspectionHandler.append(book, List.of("new")) && book.get(DataComponents.WRITABLE_BOOK_CONTENT).equals(full), "Full book is unchanged"); + var almostFull = new WritableBookContent(full.pages().subList(0, 99)); + book.set(DataComponents.WRITABLE_BOOK_CONTENT, almostFull); + check(h, !BookInspectionHandler.append(book, List.of("one", "two")) + && book.get(DataComponents.WRITABLE_BOOK_CONTENT).equals(almostFull), "Insufficient space never partially appends a report"); + player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); + var offhand = new ItemStack(Items.WRITABLE_BOOK); + player.setItemInHand(InteractionHand.OFF_HAND, offhand); + var cow = h.spawn(EntityTypes.COW, 3, 2, 3); + var entityEvent = NeoForge.EVENT_BUS.post(new PlayerInteractEvent.EntityInteract(player, InteractionHand.OFF_HAND, cow, Vec3.ZERO)); + check(h, entityEvent.isCanceled() && !offhand.get(DataComponents.WRITABLE_BOOK_CONTENT).pages().isEmpty(), "Offhand entity interaction writes book"); + var report = InspectionReport.entity(h.getLevel(), cow); + field(h, report, "实体ID:minecraft:cow"); field(h, report, "方块ID:×"); field(h, report, "硬度:×"); field(h, report, "最大生命值:10"); + field(h, report, "物品ID:×"); field(h, report, "可再生:是"); + var observer = h.makeMockServerPlayer(GameType.SPECTATOR); + observer.setShiftKeyDown(true); + observer.setItemInHand(InteractionHand.OFF_HAND, offhand); + var spectator = NeoForge.EVENT_BUS.post(new PlayerInteractEvent.EntityInteract(observer, InteractionHand.OFF_HAND, cow, Vec3.ZERO)); + check(h, !spectator.isCanceled(), "Spectators never write"); + var dropped = new net.minecraft.world.entity.item.ItemEntity(h.getLevel(), 0, 0, 0, new ItemStack(Items.COBBLESTONE, 12)); + var itemReport = InspectionReport.entity(h.getLevel(), dropped); + field(h, itemReport, "实体ID:minecraft:item"); + field(h, itemReport, "物品ID:minecraft:cobblestone"); + field(h, itemReport, "最大堆叠:64"); + field(h, itemReport, "生命值:×"); + check(h, !BookInspectionHandler.append(new ItemStack(Items.WRITTEN_BOOK), List.of("overwrite")), "Signed books cannot be changed"); + h.succeed(); + } + + static void sulfur(GameTestHelper h) { + var level = h.getLevel(); + var examples = List.of(Items.OAK_PLANKS, Items.MUD, Items.IRON_BLOCK, Items.MOSS_BLOCK, Items.WOOL.white(), + Items.PACKED_ICE, Items.RED_MUSHROOM_BLOCK, Items.STONE, Items.HONEYCOMB_BLOCK, Items.SOUL_SAND, Items.TNT, Items.MAGMA_BLOCK); + var names = List.of("弹性(橡胶球)", "普通(足球)", "缓慢平移(药球)", "快速平移(高尔夫球)", "轻盈(沙滩球)", + "快速滑行(冰球)", "缓慢滑行(冰壶)", "缓慢弹性", "黏性", "高阻力", "爆炸", "高温"); + var cubes = new java.util.ArrayList(); + for (int i = 0; i < examples.size(); i++) { + var stack = examples.get(i).getDefaultInstance(); + var profile = SulfurProfile.of(level, stack); + check(h, profile.name().equals(names.get(i)), "Vanilla archetype membership for " + stack + ": " + profile.name()); + var cube = h.spawn(EntityTypes.SULFUR_CUBE, 2, 2, 2); + cube.setNoAi(true); + cube.setItemSlot(EquipmentSlot.BODY, stack); + cubes.add(cube); + } + check(h, SulfurProfile.of(level, Items.STICK.getDefaultInstance()).name().equals("默认"), "Unmatched items use default archetype"); + h.runAfterDelay(3, () -> { + for (var cube : cubes) { + var profile = SulfurProfile.of(level, cube.getItemBySlot(EquipmentSlot.BODY)); + field(h, InspectionReport.entity(level, cube), "硫方怪原型:" + profile.name()); + for (var attribute : List.of(Attributes.KNOCKBACK_RESISTANCE, Attributes.BOUNCINESS, Attributes.FRICTION_MODIFIER, Attributes.AIR_DRAG_MODIFIER)) { + check(h, Math.abs(profile.attribute(attribute) - cube.getAttributeValue(attribute)) < 0.0001, "Inspector physics agrees with actual equipped sulfur cube: " + profile.name()); + } + } + h.succeed(); + }); + } +} diff --git a/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java index 992cc88..d5bc5e6 100644 --- a/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java @@ -64,6 +64,9 @@ public static void register(IEventBus bus) { tests.register("skeleton_melee", () -> SkeletonAndFarmlandGameTests::skeletonMelee); tests.register("farmland_protection", () -> SkeletonAndFarmlandGameTests::farmland); tests.register("creative_tab", () -> SkeletonAndFarmlandGameTests::creativeTab); + tests.register("inspection_blocks", () -> BookInspectionGameTests::blocks); + tests.register("inspection_interactions", () -> BookInspectionGameTests::interactions); + tests.register("inspection_sulfur", () -> BookInspectionGameTests::sulfur); tests.register(bus); } private static void check(GameTestHelper h, boolean ok, String message) { diff --git a/src/verification/resources/data/wild_wind_tests/test_instance/inspection_blocks.json b/src/verification/resources/data/wild_wind_tests/test_instance/inspection_blocks.json new file mode 100644 index 0000000..03f98a3 --- /dev/null +++ b/src/verification/resources/data/wild_wind_tests/test_instance/inspection_blocks.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "function": "wild_wind_tests:inspection_blocks", + "environment": "minecraft:default", + "structure": "wild_wind_tests:empty", + "max_ticks": 100 +} diff --git a/src/verification/resources/data/wild_wind_tests/test_instance/inspection_interactions.json b/src/verification/resources/data/wild_wind_tests/test_instance/inspection_interactions.json new file mode 100644 index 0000000..6cd8d78 --- /dev/null +++ b/src/verification/resources/data/wild_wind_tests/test_instance/inspection_interactions.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "function": "wild_wind_tests:inspection_interactions", + "environment": "minecraft:default", + "structure": "wild_wind_tests:empty", + "max_ticks": 100 +} diff --git a/src/verification/resources/data/wild_wind_tests/test_instance/inspection_sulfur.json b/src/verification/resources/data/wild_wind_tests/test_instance/inspection_sulfur.json new file mode 100644 index 0000000..7ddc9fe --- /dev/null +++ b/src/verification/resources/data/wild_wind_tests/test_instance/inspection_sulfur.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "function": "wild_wind_tests:inspection_sulfur", + "environment": "minecraft:default", + "structure": "wild_wind_tests:empty", + "max_ticks": 100 +} diff --git a/src/wilderness/resources/data/wild_wind_core/tags/entity_type/inspection/renewable.json b/src/wilderness/resources/data/wild_wind_core/tags/entity_type/inspection/renewable.json new file mode 100644 index 0000000..0d09e46 --- /dev/null +++ b/src/wilderness/resources/data/wild_wind_core/tags/entity_type/inspection/renewable.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "wild_wind_wilderness:muddy_pig" + ] +} From 589288c6eb5a5af9e07dde51bd3585d4d669893d Mon Sep 17 00:00:00 2001 From: cuccuc377-dev <257740650+cuccuc377-dev@users.noreply.github.com> Date: Sat, 24 Oct 2026 17:51:00 +0800 Subject: [PATCH 8/9] Sign inspection books and enable Melting at enchanting tables --- CHANGE_LOG.MD | 6 ++ PROGRESS.md | 10 +-- README.md | 4 +- docs/BOOK_INSPECTION.md | 8 ++- docs/DEVELOPMENT.md | 4 +- docs/GAMEPLAY.md | 1 + .../inspection/BookInspectionHandler.java | 48 ++++++++++---- .../tags/enchantment/in_enchanting_table.json | 4 ++ .../wildwind/smoke/InstallationTests.java | 5 +- .../hfas/test/BookInspectionGameTests.java | 40 ++++++++--- .../hfas/test/EnchantmentTableGameTests.java | 66 +++++++++++++++++++ .../wildwind/hfas/test/GameplayGameTests.java | 1 + .../test_instance/melting_table.json | 7 ++ 13 files changed, 169 insertions(+), 35 deletions(-) create mode 100644 src/core/resources/data/minecraft/tags/enchantment/in_enchanting_table.json create mode 100644 src/verification/java/org/polaris2023/wildwind/hfas/test/EnchantmentTableGameTests.java create mode 100644 src/verification/resources/data/wild_wind_tests/test_instance/melting_table.json diff --git a/CHANGE_LOG.MD b/CHANGE_LOG.MD index 3cdd459..b8cdf5c 100644 --- a/CHANGE_LOG.MD +++ b/CHANGE_LOG.MD @@ -1,3 +1,9 @@ +# 2026-10-24 · 署名属性书与附魔台熔炼 + +- 核心属性记录器将主手/副手的书与笔直接转换为署名书,书名显示“目标名称(注册ID)”,作者为玩家。保留原始/过滤笔记;满页不转换;已署名书不再次写入。 +- 长名称完整保存在物品显示名称中,内部标题遵守原版 32 字符上限,避免存档与同步错误。 +- 显式将熔炼加入附魔台候选标签,保留现有等级、权重及经验消耗规则。新增真实附魔台菜单测试,验证四类挖掘工具和普通书的随机获取及附魔应用。 + # 2026-10-23 · 书与笔属性记录器 - 核心新增潜行右键方块/实体记录属性,保留书中原有页,剩余空间不足时不写入。 diff --git a/PROGRESS.md b/PROGRESS.md index 1685599..8033d3a 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -1,6 +1,6 @@ # 原野之风 · 项目进度 -最后更新:**2026-10-23** +最后更新:**2026-10-24** 当前阶段:**功能开发与测试,尚未发布稳定版** @@ -13,7 +13,7 @@ ```text 已交付功能实现 [████████████████████] 100% 19 / 19 本地单元测试 [████████████████████] 100% 12 / 12 通过 -本地游戏测试 [████████████████████] 100% 27 / 27 通过 +本地游戏测试 [████████████████████] 100% 28 / 28 通过 ``` > 功能进度条只统计下面列出的 19 项已交付内容,包含本次开发及已合并的上游功能;不代表整个模组、未来规划或人工验收全部完成。测试进度表示已有测试的通过比例,不代表代码覆盖率。完整项目的最终范围尚未确定,因此不估算总完成百分比。 @@ -41,7 +41,7 @@ | 07 | ✅ | 羊毛拆线 | 任意颜色羊毛 + 剪刀无序合成 2 个线;返还剪刀,损耗 1 点耐久并受耐久附魔影响;支持自动合成器。 | | 08 | ✅ | 蜘蛛网挣脱 | 通常连续移动 30 刻、下坠进入后 160 刻破网;停止移动或离开重置;排除蜘蛛、洞穴蜘蛛、旁观玩家与飞行中的创造玩家。 | | 09 | ✅ | 沉溺、窒息与呼吸规则 | `sink` 限制名单内实体在流体中上浮;`choke` 加快缺氧;实现水下免缺氧名单、两份效果名单及蝌蚪/美西螈离水特例。 | -| 10 | ✅ | 熔炼附魔 | `melting` 按熔炉配方转换挖掘掉落,每件消耗 1 点经验;精准采集优先,时运先计算数量;整次经验不足不触发。 | +| 10 | ✅ | 熔炼附魔 | `melting` 可由附魔台随机附到挖掘工具或书;按熔炉配方转换挖掘掉落,每件消耗 1 点经验;精准采集优先,时运先计算数量;整次经验不足不触发。 | | 11 | ✅ | 骷髅近战设定 | 骷髅、流浪者、沼骸、焦骸生成时有 10% 概率使用石剑与近战 AI;后三者分别附加缓慢、中毒、虚弱。 | | 12 | ✅ | 耕地保护 | 穿戴摔落缓冲盔甲或具有缓降效果的实体落到耕地上时,不会使耕地退化。 | | 13 | ✅ | 模组专属分页 | 模组物品统一进入“原野之风”创造分页;包括药水、两种延展箭和熔炼附魔书;全局搜索可用。 | @@ -50,13 +50,13 @@ | 16 | ✅ | 悬挂式杜鹃木告示牌 | 吊顶/墙面放置、链条及横杆行为,双面编辑、染色、发光、涂蜡;配方、掉落和燃料。 | | 17 | ✅ | 杜鹃木展示架 | 三槽整组交换;红石连接交换快捷栏 3/6/9 格;比较器输出 0–7;漏斗、存档和底部对齐设置。 | | 18 | ✅ | 延展之箭与实体 | `wild_wind_wilderness:tipped_arrow` / `wild_wind_wilderness:arrow`;普通 450 刻、长效 1200 刻;合成、交易、英雄礼物、弓弩与发射器;落地 600 刻后退化为普通箭。 | -| 19 | ✅ | 书与笔属性记录器 | 核心:潜行右键记录方块/实体属性,保留笔记并分页;缺失项 ×;实际硫方怪原型与物理参数;可再生标签扩展。 | +| 19 | ✅ | 书与笔属性记录器 | 核心:潜行右键方块/实体,直接转换为署名属性书,显示“目标名称(注册ID)”,作者为玩家;保留笔记并分页,满页不转换;缺失项 ×;实际硫方怪原型与物理参数;可再生标签扩展。 | ## 工程与验证记录 - [x] 私有仓库 `cuccuc377-dev/WildWindMod` 保留来源、代码、资源、测试及构建流程。 - [x] 三个发行模块分别编译,开发生成器与测试模组不进入发行集合。 -- [x] 12 项单元测试、27 组综合 GameTest 通过。 +- [x] 12 项单元测试、28 组综合 GameTest 通过,含署名书转换和真实附魔台熔炼获取。 - [x] 核心、核心+荒野、核心+瘠土、全部模块四种服务端安装组合通过。 - [x] 核心单独安装与全模块客户端完成资源加载,自动检查告示牌及已安装生物资源。 - [x] 数据生成与快照同步流程已建立,普通构建无需预先生成资源。 diff --git a/README.md b/README.md index 94b5eca..7aea289 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Minecraft **26.2 / NeoForge 26.2.0.93 / Java 25** 模组项目。当前已按功 ### 书与笔属性记录器(核心) -手持书与笔,**Shift+右键方块/实体**,将属性分页追加进书中;松开 Shift 后右键阅读。记录硬度、抗性、可燃性、活塞行为、挖掘工具、注册 ID、燃料时长、可再生性及硫方怪原型/物理参数等。已有笔记保留,满页不覆盖;不适用或未知的属性显示“×”。无需管理员权限。 +手持书与笔,**Shift+右键方块/实体**,直接转换为署名属性书;书名为“目标名称(注册ID)”,作者为玩家,松开 Shift 后右键阅读。记录硬度、抗性、可燃性、活塞行为、挖掘工具、注册 ID、燃料时长、可再生性及硫方怪原型/物理参数等。已有笔记保留,满页不转换;署名后不可追加,下次记录需另一本书与笔。不适用或未知的属性显示“×”,无需管理员权限。 使用 `/give @s minecraft:writable_book` 获取测试用书。硫方怪分类和数值读取当前游戏数据,可再生性通过数据包标签扩展。详见 [记录器说明](docs/BOOK_INSPECTION.md)。 @@ -66,7 +66,7 @@ Minecraft **26.2 / NeoForge 26.2.0.93 / Java 25** 模组项目。当前已按功 - 骷髅、流浪者、沼骸、焦骸生成时有 10% 概率换石剑;后三者近战分别造成 30 秒缓慢 I、4 秒中毒 I、30 秒虚弱 I。 - 穿戴摔落缓冲盔甲或具有缓降效果时,落到耕地不会踩坏耕地。 - 窑炉使用原版熔炉外观,每 100 刻烧炼一件符合条件的材料,支持漏斗、比较器、经验、命名及锁定,新生成石匠屋增加窑炉。 -- 熔炼按实际掉落先结算时运;精准采集优先,不进行熔炼。每件消耗 1 点经验,整次经验不足则不触发。 +- 熔炼 I 可通过附魔台随机获得,适用于挖掘工具,也可附到普通书上。按实际掉落先结算时运;精准采集优先,不进行熔炼。每件消耗 1 点经验,整次经验不足则不触发。 - 泥猪在沼泽与红树林沼泽自然生成,权重 10、每群 2–4 只;使用原版猪的动画、声音与基础行为,支持繁殖。 - 沉溺限制名单内生物在流体中上浮;窒息加快名单内生物水下缺氧,蝌蚪/美西螈仅离水时生效。完整名单见玩法文档。 diff --git a/docs/BOOK_INSPECTION.md b/docs/BOOK_INSPECTION.md index cec29c1..61a5b5f 100644 --- a/docs/BOOK_INSPECTION.md +++ b/docs/BOOK_INSPECTION.md @@ -6,9 +6,11 @@ 1. 手持原版书与笔(`minecraft:writable_book`),主手/副手均可。 2. 按住潜行键(默认 Shift),右键方块或实体。 -3. 收到“已追加 N 页属性记录”的提示后,松开潜行,正常右键打开书阅读。 +3. 手中的书与笔直接变为原版署名书(`minecraft:written_book`),收到“已生成署名属性书”的提示后,松开潜行,正常右键阅读。 -每次追加一份分页快照,已有笔记和书本其他组件保留。最多 100 页,剩余页数不足时整份记录不写入,并提示换书。已签名书不改写;旁观模式不记录。没有潜行时保留正常交互;记录时不会同时打开容器、交易或触发生物右键行为。 +书名为 `方块名(方块ID)`,实体使用 `实体类型名(实体ID)`,作者为记录玩家。显示名称随客户端语言翻译,例如 `石头(minecraft:stone)`;实体自定义昵称仍可在正文查看。原版序列化书名最多 32 个字符,超长书名仅截短内部标题,物品显示名称和正文中的完整 ID 保留。 + +一次使用将当前手中的书与笔转换为署名书,不另外赠送一本。属性快照追加到已有笔记之后,保留原页的原始/过滤文本和其他组件,生成第 0 代原本。最多 100 页,剩余页数不足时不转换、不写入,并提示换书。署名书不可继续追加,下一次记录需要另一本书与笔;旁观模式不记录。没有潜行时保留正常交互;记录时不会同时打开容器、交易或触发生物右键行为。 可用 `/give @s minecraft:writable_book` 获取测试用书。 @@ -83,4 +85,4 @@ data/wild_wind_core/tags/entity_type/inspection/renewable.json ## 验证 -新增 1 项分页单元测试、3 组 GameTest:方块属性与四种活塞行为、真实事件总线上的潜行/副手/旁观/满页行为,以及 12 类硫方怪加默认类的注册表匹配与实际实体属性对照。另在核心单独安装测试中读取报告,在真实客户端字体加载后检查中文、长 ID 和换行是否超出原版书页宽高。 +1 项分页单元测试、3 组 GameTest:方块属性与四种活塞行为;真实事件总线上的潜行/副手/旁观/满页行为、署名转换、作者与书名、原始/过滤笔记保留、长标题序列化;以及 12 类硫方怪加默认类的注册表匹配与实际实体属性对照。另在核心单独安装测试中生成署名书,在真实客户端字体加载后检查中文、长 ID 和换行是否超出原版书页宽高。 diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index c31cdd9..9b8a405 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -10,7 +10,7 @@ | `wilderness` | `src/wilderness/` | 模块 1;依赖 Core 与 GeckoLib 5.5.4 | | `barren` | `src/barren/` | 模块 2;只依赖 Core | | `datagen` | `src/datagen/` | 开发用数据生成器;加载全部模块 | -| `verification` | `src/verification/` | 开发用 27 组综合 GameTest;加载全部模块 | +| `verification` | `src/verification/` | 开发用 28 组综合 GameTest;加载全部模块 | | `smoke` | `src/smoke/` | 开发用安装组合测试;由 `testModules` 选择依赖 | 发行模块有各自的入口、注册器、Mixin、资源、元数据与 JAR。`src/templates/` 是元数据模板。辅助项目不放入发行目录。 @@ -75,4 +75,4 @@ python scripts/sync_generated_resources.py 提交前运行 `git diff --check`,按改动范围执行上述测试;服务端自动测试不替代游戏内视觉、多人联机和长期存档验收。 -核心 `inspection/` 包提供书与笔记录器,新增字段时同步维护 `BOOK_INSPECTION.md`。实体交互/书本上限/硫方怪物理参数在 `BookInspectionGameTests` 中验证。 +核心 `inspection/` 包提供书与笔记录器,新增字段时同步维护 `BOOK_INSPECTION.md`。实体交互/署名书转换/书本上限/硫方怪物理参数在 `BookInspectionGameTests` 中验证。`EnchantmentTableGameTests` 使用真实附魔台菜单验证熔炼候选、随机预览和最终工具/书本附魔。 diff --git a/docs/GAMEPLAY.md b/docs/GAMEPLAY.md index 192ee47..79a8516 100644 --- a/docs/GAMEPLAY.md +++ b/docs/GAMEPLAY.md @@ -101,6 +101,7 @@ ## 熔炼附魔 - ID:`wild_wind_core:melting`,中文「熔炼」,英文「Melting」,最高 I 级。 +- 获取:加入原版 `minecraft:in_enchanting_table` 标签;附魔台可随机给镐、斧、锹、锄等 `#minecraft:enchantable/mining` 工具附加熔炼,也可生成熔炼附魔书。沿用原版书架、等级、青金石和随机抽取规则,不保证每次出现;可使用 15 个有效书架的 30 级选项尝试。附魔权重为 2。 - 支持 `minecraft:enchantable/mining` 标签中的工具,包括镐、斧、锹、锄与剪刀。 - 加入原版非宝藏附魔标签,沿用原版相应的附魔台、附魔书交易及随机附魔入口。 - 手持工具执行 `/enchant @s wild_wind_core:melting 1` 可直接添加。 diff --git a/src/core/java/org/polaris2023/wildwind/core/inspection/BookInspectionHandler.java b/src/core/java/org/polaris2023/wildwind/core/inspection/BookInspectionHandler.java index 536ae96..60ad432 100644 --- a/src/core/java/org/polaris2023/wildwind/core/inspection/BookInspectionHandler.java +++ b/src/core/java/org/polaris2023/wildwind/core/inspection/BookInspectionHandler.java @@ -3,13 +3,16 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.Filterable; import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.component.WritableBookContent; +import net.minecraft.world.item.component.WrittenBookContent; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; @@ -29,7 +32,9 @@ public static void block(PlayerInteractEvent.RightClickBlock event) { event.setCancellationResult(InteractionResult.SUCCESS); event.setCanceled(true); if (event.getEntity() instanceof ServerPlayer player) { - record(player, event.getItemStack(), InspectionReport.block(player.level(), event.getPos())); + var block = player.level().getBlockState(event.getPos()).getBlock(); + var name = block.getName().copy().append("(" + BuiltInRegistries.BLOCK.getKey(block) + ")"); + record(player, event.getHand(), name, InspectionReport.block(player.level(), event.getPos())); } } @@ -39,29 +44,46 @@ public static void entity(PlayerInteractEvent.EntityInteract event) { event.setCancellationResult(InteractionResult.SUCCESS); event.setCanceled(true); if (event.getEntity() instanceof ServerPlayer player) { - record(player, event.getItemStack(), InspectionReport.entity(player.level(), event.getTarget())); + var target = event.getTarget(); + var name = target.getType().getDescription().copy().append("(" + BuiltInRegistries.ENTITY_TYPE.getKey(target.getType()) + ")"); + record(player, event.getHand(), name, InspectionReport.entity(player.level(), target)); } } - private static void record(ServerPlayer player, ItemStack book, List rows) { + private static void record(ServerPlayer player, InteractionHand hand, Component name, List rows) { var pages = BookPages.paginate(rows); - if (!append(book, pages)) { + var signed = sign(player.getItemInHand(hand), pages, name, player.getGameProfile().name()); + if (signed.isEmpty()) { player.sendOverlayMessage(Component.literal("书的剩余页数不足,未写入。请换一本书与笔。")); return; } + player.setItemInHand(hand, signed); player.containerMenu.broadcastChanges(); - player.sendOverlayMessage(Component.literal("已追加 " + pages.size() + " 页属性记录;松开潜行后右键阅读。")); + player.sendOverlayMessage(Component.literal("已生成署名属性书;松开潜行后右键阅读。")); } - /** All-or-nothing append, preserving existing raw/filtered pages and every other component. */ - public static boolean append(ItemStack book, List additions) { - if (!book.is(Items.WRITABLE_BOOK)) return false; + /** Prepare a signed copy without mutating the source; an empty result means no room or wrong item. */ + public static ItemStack sign(ItemStack book, List additions, Component name, String author) { + if (!book.is(Items.WRITABLE_BOOK)) return ItemStack.EMPTY; var old = book.getOrDefault(DataComponents.WRITABLE_BOOK_CONTENT, WritableBookContent.EMPTY); if (old.pages().size() + additions.size() > WritableBookContent.MAX_PAGES - || additions.stream().anyMatch(page -> page.length() > WritableBookContent.PAGE_EDIT_LENGTH)) return false; - var pages = new ArrayList<>(old.pages()); - additions.forEach(page -> pages.add(Filterable.passThrough(page))); - book.set(DataComponents.WRITABLE_BOOK_CONTENT, new WritableBookContent(pages)); - return true; + || additions.stream().anyMatch(page -> page.length() > WritableBookContent.PAGE_EDIT_LENGTH)) return ItemStack.EMPTY; + var pages = new ArrayList>(); + old.pages().forEach(page -> pages.add(page.map(Component::literal))); + additions.forEach(page -> pages.add(Filterable.passThrough(Component.literal(page)))); + // Vanilla's serialized title is limited to 32 characters. Keep the complete localized + // label as the display name and the full ID in the report, even for long mod IDs. + String title = name.getString(); + if (title.length() > WrittenBookContent.TITLE_MAX_LENGTH) { + int end = WrittenBookContent.TITLE_MAX_LENGTH; + if (Character.isHighSurrogate(title.charAt(end - 1))) end--; + title = title.substring(0, end); + } + var signed = book.transmuteCopy(Items.WRITTEN_BOOK); + signed.remove(DataComponents.WRITABLE_BOOK_CONTENT); + signed.set(DataComponents.WRITTEN_BOOK_CONTENT, + new WrittenBookContent(Filterable.passThrough(title), author, 0, List.copyOf(pages), true)); + signed.set(DataComponents.CUSTOM_NAME, name.copy()); + return signed; } } diff --git a/src/core/resources/data/minecraft/tags/enchantment/in_enchanting_table.json b/src/core/resources/data/minecraft/tags/enchantment/in_enchanting_table.json new file mode 100644 index 0000000..0dc395d --- /dev/null +++ b/src/core/resources/data/minecraft/tags/enchantment/in_enchanting_table.json @@ -0,0 +1,4 @@ +{ + "replace": false, + "values": ["wild_wind_core:melting"] +} diff --git a/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java b/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java index e37105a..c0fd676 100644 --- a/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java +++ b/src/smoke/java/org/polaris2023/wildwind/smoke/InstallationTests.java @@ -53,8 +53,9 @@ private static void installation(GameTestHelper h) { var report = org.polaris2023.wildwind.core.inspection.InspectionReport.block(h.getLevel(), inspectionPos); check(h, report.contains("可再生:是") && report.contains("硫方怪原型:弹性(橡胶球)"), "Inspector works with only Core and its own tags"); var book = new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.WRITABLE_BOOK); - check(h, org.polaris2023.wildwind.core.inspection.BookInspectionHandler.append(book, - org.polaris2023.wildwind.core.inspection.BookPages.paginate(report)), "Core can persist complete inspection report"); + var signed = org.polaris2023.wildwind.core.inspection.BookInspectionHandler.sign(book, + org.polaris2023.wildwind.core.inspection.BookPages.paginate(report), Component.literal("Oak Planks(minecraft:oak_planks)"), "test"); + check(h, signed.is(net.minecraft.world.item.Items.WRITTEN_BOOK), "Core can persist complete signed inspection report"); h.succeed(); } } diff --git a/src/verification/java/org/polaris2023/wildwind/hfas/test/BookInspectionGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/BookInspectionGameTests.java index ab24278..43b1642 100644 --- a/src/verification/java/org/polaris2023/wildwind/hfas/test/BookInspectionGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/BookInspectionGameTests.java @@ -71,7 +71,7 @@ static void interactions(GameTestHelper h) { var pos = h.absolutePos(new BlockPos(2, 2, 2)); h.getLevel().setBlockAndUpdate(pos, Blocks.CHEST.defaultBlockState()); var book = new ItemStack(Items.WRITABLE_BOOK); - var note = Filterable.passThrough("已有笔记,请保留"); + var note = new Filterable<>("已有笔记,请保留", java.util.Optional.of("过滤后的笔记")); book.set(DataComponents.WRITABLE_BOOK_CONTENT, new WritableBookContent(List.of(note))); player.setItemInHand(InteractionHand.MAIN_HAND, book); var hit = new BlockHitResult(Vec3.atCenterOf(pos), Direction.UP, pos, false); @@ -80,22 +80,36 @@ static void interactions(GameTestHelper h) { player.setShiftKeyDown(true); var event = NeoForge.EVENT_BUS.post(new PlayerInteractEvent.RightClickBlock(player, InteractionHand.MAIN_HAND, pos, hit)); check(h, event.isCanceled() && event.getCancellationResult() == InteractionResult.SUCCESS, "Inspector consumes interaction before opening chest/book"); - var pages = book.get(DataComponents.WRITABLE_BOOK_CONTENT).pages(); - check(h, pages.size() > 1 && pages.getFirst().equals(note), "Append preserves original page"); - check(h, pages.stream().allMatch(p -> p.raw().length() <= 1024 && p.raw().split("\n", -1).length <= 12), "Pages fit writable book limits"); + var signed = player.getItemInHand(InteractionHand.MAIN_HAND); + check(h, signed.is(Items.WRITTEN_BOOK) && !signed.has(DataComponents.WRITABLE_BOOK_CONTENT), "Held book becomes signed book without editable pages"); + var content = signed.get(DataComponents.WRITTEN_BOOK_CONTENT); + var pages = content.pages(); + check(h, pages.size() > 1 && pages.getFirst().equals(note.map(Component::literal)), "Signing preserves raw and filtered notes"); + check(h, content.author().equals(player.getGameProfile().name()) && content.generation() == 0 && content.resolved(), "Player is author of original literal snapshot"); + String chestName = Blocks.CHEST.getName().getString() + "(minecraft:chest)"; + check(h, content.title().raw().equals(chestName) && signed.getHoverName().getString().equals(chestName), "Signed title includes block name and ID"); + check(h, pages.stream().allMatch(p -> p.raw().getString().length() <= 1024 && p.raw().getString().split("\n", -1).length <= 12), "Pages fit book layout limits"); + var repeated = NeoForge.EVENT_BUS.post(new PlayerInteractEvent.RightClickBlock(player, InteractionHand.MAIN_HAND, pos, hit)); + check(h, !repeated.isCanceled() && player.getItemInHand(InteractionHand.MAIN_HAND) == signed, "Signed book is never inspected again"); var full = new WritableBookContent(IntStream.range(0, 100).mapToObj(i -> Filterable.passThrough("note " + i)).toList()); book.set(DataComponents.WRITABLE_BOOK_CONTENT, full); - check(h, !BookInspectionHandler.append(book, List.of("new")) && book.get(DataComponents.WRITABLE_BOOK_CONTENT).equals(full), "Full book is unchanged"); + player.setItemInHand(InteractionHand.MAIN_HAND, book); + NeoForge.EVENT_BUS.post(new PlayerInteractEvent.RightClickBlock(player, InteractionHand.MAIN_HAND, pos, hit)); + check(h, player.getItemInHand(InteractionHand.MAIN_HAND) == book && book.get(DataComponents.WRITABLE_BOOK_CONTENT).equals(full), "Full held book is unchanged"); var almostFull = new WritableBookContent(full.pages().subList(0, 99)); book.set(DataComponents.WRITABLE_BOOK_CONTENT, almostFull); - check(h, !BookInspectionHandler.append(book, List.of("one", "two")) + check(h, BookInspectionHandler.sign(book, List.of("one", "two"), Component.literal("test"), "author").isEmpty() && book.get(DataComponents.WRITABLE_BOOK_CONTENT).equals(almostFull), "Insufficient space never partially appends a report"); player.setItemInHand(InteractionHand.MAIN_HAND, ItemStack.EMPTY); var offhand = new ItemStack(Items.WRITABLE_BOOK); player.setItemInHand(InteractionHand.OFF_HAND, offhand); var cow = h.spawn(EntityTypes.COW, 3, 2, 3); var entityEvent = NeoForge.EVENT_BUS.post(new PlayerInteractEvent.EntityInteract(player, InteractionHand.OFF_HAND, cow, Vec3.ZERO)); - check(h, entityEvent.isCanceled() && !offhand.get(DataComponents.WRITABLE_BOOK_CONTENT).pages().isEmpty(), "Offhand entity interaction writes book"); + var signedEntity = player.getItemInHand(InteractionHand.OFF_HAND); + check(h, entityEvent.isCanceled() && signedEntity.is(Items.WRITTEN_BOOK) + && !signedEntity.get(DataComponents.WRITTEN_BOOK_CONTENT).pages().isEmpty() + && signedEntity.getHoverName().getString().equals(cow.getType().getDescription().getString() + "(minecraft:cow)") + && player.getItemInHand(InteractionHand.MAIN_HAND).isEmpty(), "Offhand entity interaction replaces only the offhand book"); var report = InspectionReport.entity(h.getLevel(), cow); field(h, report, "实体ID:minecraft:cow"); field(h, report, "方块ID:×"); field(h, report, "硬度:×"); field(h, report, "最大生命值:10"); field(h, report, "物品ID:×"); field(h, report, "可再生:是"); @@ -110,7 +124,17 @@ static void interactions(GameTestHelper h) { field(h, itemReport, "物品ID:minecraft:cobblestone"); field(h, itemReport, "最大堆叠:64"); field(h, itemReport, "生命值:×"); - check(h, !BookInspectionHandler.append(new ItemStack(Items.WRITTEN_BOOK), List.of("overwrite")), "Signed books cannot be changed"); + check(h, BookInspectionHandler.sign(signedEntity, List.of("overwrite"), Component.literal("test"), "author").isEmpty(), "Signed books cannot be changed"); + var longName = Component.literal("杜鹃木悬挂式告示牌(wild_wind_core:azalea_hanging_sign)"); + var longBook = BookInspectionHandler.sign(offhand, List.of("report"), longName, "author"); + check(h, longBook.getHoverName().equals(longName), "Full name and long ID are preserved for display"); + var longContent = longBook.get(DataComponents.WRITTEN_BOOK_CONTENT); + check(h, longContent.title().raw().length() <= 32 + && net.minecraft.world.item.component.WrittenBookContent.CODEC.encodeStart( + h.getLevel().registryAccess().createSerializationContext(com.mojang.serialization.JsonOps.INSTANCE), longContent).isSuccess(), + "Long titles serialize within vanilla limits"); + var unicodeBook = BookInspectionHandler.sign(offhand, List.of("report"), Component.literal("x".repeat(31) + "😀(minecraft:stone)"), "author"); + check(h, unicodeBook.get(DataComponents.WRITTEN_BOOK_CONTENT).title().raw().equals("x".repeat(31)), "Title truncation preserves surrogate pairs"); h.succeed(); } diff --git a/src/verification/java/org/polaris2023/wildwind/hfas/test/EnchantmentTableGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/EnchantmentTableGameTests.java new file mode 100644 index 0000000..ad82e89 --- /dev/null +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/EnchantmentTableGameTests.java @@ -0,0 +1,66 @@ +package org.polaris2023.wildwind.hfas.test; + +import java.util.List; +import net.minecraft.core.BlockPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.Registries; +import net.minecraft.gametest.framework.GameTestHelper; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.EnchantmentTags; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.EnchantmentMenu; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.EnchantingTableBlock; +import org.polaris2023.wildwind.core.enchantment.MeltingEnchantment; + +public final class EnchantmentTableGameTests { + private static void check(GameTestHelper h, boolean ok, String message) { + h.assertTrue(ok, Component.literal(message)); + } + + static void melting(GameTestHelper h) { + var level = h.getLevel(); + var registry = level.registryAccess().lookupOrThrow(Registries.ENCHANTMENT); + var melting = registry.getOrThrow(MeltingEnchantment.MELTING); + var tablePool = registry.getOrThrow(EnchantmentTags.IN_ENCHANTING_TABLE); + check(h, tablePool.contains(melting), "Melting belongs to the real enchanting-table pool"); + for (var item : List.of(Items.DIAMOND_CHESTPLATE, Items.DIAMOND_SWORD)) { + check(h, EnchantmentHelper.getAvailableEnchantmentResults(30, new ItemStack(item), tablePool.stream()) + .stream().noneMatch(e -> e.enchantment().equals(melting)), "Melting is not offered for " + item); + } + + var player = h.makeMockServerPlayerInLevel(); + var pos = h.absolutePos(new BlockPos(3, 2, 3)); + level.setBlockAndUpdate(pos, Blocks.ENCHANTING_TABLE.defaultBlockState()); + for (var offset : EnchantingTableBlock.BOOKSHELF_OFFSETS) { + level.setBlockAndUpdate(pos.offset(offset), Blocks.BOOKSHELF.defaultBlockState()); + } + int meltingId = registry.asHolderIdMap().getId(melting); + for (var item : List.of(Items.DIAMOND_PICKAXE, Items.DIAMOND_AXE, Items.DIAMOND_SHOVEL, Items.DIAMOND_HOE, Items.BOOK)) { + boolean obtained = false; + var menu = new EnchantmentMenu(1, player.getInventory(), ContainerLevelAccess.create(level, pos)); + menu.getSlot(1).set(new ItemStack(Items.LAPIS_LAZULI, 64)); + // Data slot 3 is vanilla's synchronized enchantment seed. Fixed seeds make the + // test reproducible while exercising real offers and the menu's apply path. + for (int seed = 0; seed < 2048 && !obtained; seed++) { + menu.setData(3, seed); + menu.getSlot(0).set(new ItemStack(item)); + for (int slot = 0; slot < 3; slot++) { + if (menu.enchantClue[slot] != meltingId) continue; + check(h, menu.clickMenuButton(player, slot), "Enchanting-table offer can be selected"); + var result = menu.getSlot(0).getItem(); + var enchantments = result.get(item == Items.BOOK ? DataComponents.STORED_ENCHANTMENTS : DataComponents.ENCHANTMENTS); + check(h, enchantments != null && enchantments.getLevel(melting) == 1, "Table actually applies Melting I"); + check(h, item != Items.BOOK || result.is(Items.ENCHANTED_BOOK), "Table transforms a normal book"); + obtained = true; + break; + } + } + check(h, obtained, "Melting can be randomly obtained from the table on " + item); + } + h.succeed(); + } +} diff --git a/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java b/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java index d5bc5e6..ba2bc64 100644 --- a/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java +++ b/src/verification/java/org/polaris2023/wildwind/hfas/test/GameplayGameTests.java @@ -60,6 +60,7 @@ public static void register(IEventBus bus) { tests.register("cobweb_timers", () -> GameplayGameTests::cobwebTimers); tests.register("cobweb_tick_event", () -> GameplayGameTests::cobwebTickEvent); tests.register("melting", () -> GameplayGameTests::melting); + tests.register("melting_table", () -> EnchantmentTableGameTests::melting); tests.register("skeleton_spawns", () -> SkeletonAndFarmlandGameTests::skeletonSpawns); tests.register("skeleton_melee", () -> SkeletonAndFarmlandGameTests::skeletonMelee); tests.register("farmland_protection", () -> SkeletonAndFarmlandGameTests::farmland); diff --git a/src/verification/resources/data/wild_wind_tests/test_instance/melting_table.json b/src/verification/resources/data/wild_wind_tests/test_instance/melting_table.json new file mode 100644 index 0000000..6cd028a --- /dev/null +++ b/src/verification/resources/data/wild_wind_tests/test_instance/melting_table.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "function": "wild_wind_tests:melting_table", + "environment": "minecraft:default", + "structure": "wild_wind_tests:empty", + "max_ticks": 100 +} From eb12f4fed5472c9be5c51606141fff201b873968 Mon Sep 17 00:00:00 2001 From: cuccuc377-dev <257740650+cuccuc377-dev@users.noreply.github.com> Date: Sat, 24 Oct 2026 18:28:05 +0800 Subject: [PATCH 9/9] Render mod leaves using original texture colors --- CHANGE_LOG.MD | 5 +++++ PROGRESS.md | 2 +- README.md | 1 + .../wildwind/hfas/datagen/provider/ModModelProvider.java | 8 ++++---- .../polaris2023/wildwind/wilderness/block/ModBlocks.java | 6 ++++-- .../assets/wild_wind_wilderness/items/blaze_leaves.json | 8 +------- .../assets/wild_wind_wilderness/items/soul_leaves.json | 8 +------- .../wild_wind_wilderness/models/block/blaze_leaves.json | 2 +- .../wild_wind_wilderness/models/block/soul_leaves.json | 2 +- 9 files changed, 19 insertions(+), 23 deletions(-) diff --git a/CHANGE_LOG.MD b/CHANGE_LOG.MD index b8cdf5c..1e3dc15 100644 --- a/CHANGE_LOG.MD +++ b/CHANGE_LOG.MD @@ -1,3 +1,8 @@ +# 2026-10-24 · 树叶使用贴图原色 + +- 荒野的焚烬木与灵焰木树叶改用无染色方块模型,移除物品的固定橙色/青色叠色;材质按贴图原色显示,保留透明像素和正常光照。 +- 飘落叶片不再读取群系叶色,分别使用固定橙色/青色。同步修改模型生成器,重新生成资源时保留这一规则。 + # 2026-10-24 · 署名属性书与附魔台熔炼 - 核心属性记录器将主手/副手的书与笔直接转换为署名书,书名显示“目标名称(注册ID)”,作者为玩家。保留原始/过滤笔记;满页不转换;已署名书不再次写入。 diff --git a/PROGRESS.md b/PROGRESS.md index 8033d3a..3dc6b5a 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -34,7 +34,7 @@ | --- | --- | --- | --- | | 01 | ✅ | 版本升级与模块拆分 | 适配 Minecraft 26.2 / NeoForge;按最新归属输出三个独立模组,保留结构配置命名空间。 | | 02 | ✅ | 可配置结构生成 | JSON 定义结构,独立 NBT 模板目录;支持群系、间距、概率、高度、旋转和地形条件;提供列表、已生成结构最近坐标查询与生成位置搜索。 | -| 03 | ✅ | 木材与植物基础内容 | 焚烬木、灵焰木、杜鹃木基础方块套件;树木配置、去皮、配方及部分燃料;已有植物方块注册。其他木材配套及视觉整理见下方待办。 | +| 03 | ✅ | 木材与植物基础内容 | 焚烬木、灵焰木、杜鹃木基础方块套件;树木配置、去皮、配方及部分燃料;已有植物方块注册。模组树叶的方块/物品使用贴图原色,落叶粒子固定颜色。其他木材配套及视觉整理见下方待办。 | | 04 | ✅ | 泥猪 | 成年/幼年模型和贴图,原版猪动画与音效,繁殖与刷怪蛋,沼泽和红树林沼泽自然生成。ID:`wild_wind_wilderness:muddy_pig`。 | | 05 | ✅ | 上游生物与道具整合 | 合并泥沼蟹、恐鱼、生物桶、刷怪蛋、万用蟹钳及延展药水;食人鱼显示名改为恐鱼,保留 `piranha` 路径,但新命名空间不自动兼容旧存档。 | | 06 | ✅ | 七种普通物品 | 浮萍、鱿鱼须、熟鱿鱼须、煎蛋、烤种子、熟蛙腿、生蛙腿;图标与翻译齐备,按当前要求全部作为普通材料注册。 | diff --git a/README.md b/README.md index 7aea289..6830e77 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ Minecraft **26.2 / NeoForge 26.2.0.93 / Java 25** 模组项目。当前已按功 - 窑炉使用原版熔炉外观,每 100 刻烧炼一件符合条件的材料,支持漏斗、比较器、经验、命名及锁定,新生成石匠屋增加窑炉。 - 熔炼 I 可通过附魔台随机获得,适用于挖掘工具,也可附到普通书上。按实际掉落先结算时运;精准采集优先,不进行熔炼。每件消耗 1 点经验,整次经验不足则不触发。 - 泥猪在沼泽与红树林沼泽自然生成,权重 10、每群 2–4 只;使用原版猪的动画、声音与基础行为,支持繁殖。 +- 焚烬木、灵焰木树叶的方块和物品按贴图原色显示,不叠加群系或固定染色;落叶粒子分别固定为橙色、青色。保留正常光照与阴影。 - 沉溺限制名单内生物在流体中上浮;窒息加快名单内生物水下缺氧,蝌蚪/美西螈仅离水时生效。完整名单见玩法文档。 ## 配置结构生成 diff --git a/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java index 65bd64d..35773e1 100644 --- a/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java +++ b/src/datagen/java/org/polaris2023/wildwind/hfas/datagen/provider/ModModelProvider.java @@ -65,8 +65,8 @@ protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerat org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_PRESSURE_PLATE.get(), org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_BUTTON.get() ); - // 焚烬木树叶 - 橙色染色 - blockModels.createTintedLeaves(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LEAVES.get(), TexturedModel.LEAVES, 0xFF8000); + // 贴图已包含颜色;方块和物品均不叠加染色。 + createSimpleBlock(blockModels, org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_LEAVES.get()); // 焚烬木树苗 blockModels.createCrossBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.BLAZE_SAPLING.get(), BlockModelGenerators.PlantType.NOT_TINTED); @@ -86,8 +86,8 @@ protected void registerModels(BlockModelGenerators blockModels, ItemModelGenerat org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_PRESSURE_PLATE.get(), org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_BUTTON.get() ); - // 灵焰木树叶 - 青色染色 - blockModels.createTintedLeaves(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LEAVES.get(), TexturedModel.LEAVES, 0x00FFFF); + // 与焚烬木树叶一致,保留贴图原色。 + createSimpleBlock(blockModels, org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_LEAVES.get()); // 灵焰木树苗 blockModels.createCrossBlock(org.polaris2023.wildwind.wilderness.block.ModBlocks.SOUL_SAPLING.get(), BlockModelGenerators.PlantType.NOT_TINTED); diff --git a/src/wilderness/java/org/polaris2023/wildwind/wilderness/block/ModBlocks.java b/src/wilderness/java/org/polaris2023/wildwind/wilderness/block/ModBlocks.java index 3da6f1b..729d416 100644 --- a/src/wilderness/java/org/polaris2023/wildwind/wilderness/block/ModBlocks.java +++ b/src/wilderness/java/org/polaris2023/wildwind/wilderness/block/ModBlocks.java @@ -145,7 +145,8 @@ public class ModBlocks { public static final DeferredBlock BLAZE_LEAVES = BLOCKS.registerBlock( "blaze_leaves", - p -> new TintedParticleLeavesBlock(0.01F,p + p -> new UntintedParticleLeavesBlock(0.01F, + net.minecraft.core.particles.ColorParticleOption.create(net.minecraft.core.particles.ParticleTypes.TINTED_LEAVES, 0xFFFF8000), p .mapColor(MapColor.COLOR_ORANGE) .strength(0.2F) .sound(SoundType.GRASS) @@ -269,7 +270,8 @@ public class ModBlocks { public static final DeferredBlock SOUL_LEAVES = BLOCKS.registerBlock( "soul_leaves", - p -> new TintedParticleLeavesBlock(0.01F, p + p -> new UntintedParticleLeavesBlock(0.01F, + net.minecraft.core.particles.ColorParticleOption.create(net.minecraft.core.particles.ParticleTypes.TINTED_LEAVES, 0xFF00FFFF), p .mapColor(MapColor.COLOR_CYAN) .strength(0.2F) .sound(SoundType.GRASS) diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_leaves.json index ead7c15..0f3e79a 100644 --- a/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_leaves.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/blaze_leaves.json @@ -1,12 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "wild_wind_wilderness:block/blaze_leaves", - "tints": [ - { - "type": "minecraft:constant", - "value": -32768 - } - ] + "model": "wild_wind_wilderness:block/blaze_leaves" } } diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_leaves.json index eafc416..3bb275a 100644 --- a/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_leaves.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/items/soul_leaves.json @@ -1,12 +1,6 @@ { "model": { "type": "minecraft:model", - "model": "wild_wind_wilderness:block/soul_leaves", - "tints": [ - { - "type": "minecraft:constant", - "value": -16711681 - } - ] + "model": "wild_wind_wilderness:block/soul_leaves" } } diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_leaves.json index 23d085a..9c780b0 100644 --- a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_leaves.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/blaze_leaves.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:block/leaves", + "parent": "minecraft:block/cube_all", "textures": { "all": "wild_wind_wilderness:block/blaze_leaves" } diff --git a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_leaves.json b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_leaves.json index 3ac7c66..63842c4 100644 --- a/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_leaves.json +++ b/src/wilderness/resources/assets/wild_wind_wilderness/models/block/soul_leaves.json @@ -1,5 +1,5 @@ { - "parent": "minecraft:block/leaves", + "parent": "minecraft:block/cube_all", "textures": { "all": "wild_wind_wilderness:block/soul_leaves" }