From b042bc4eac2590afe2dfa6f2559cbab8720d156a Mon Sep 17 00:00:00 2001 From: PinkGoosik Date: Mon, 22 Jan 2024 14:09:44 +0500 Subject: [PATCH] initial multiloader commit --- .github/workflows/build.yml | 38 ++-- .github/workflows/publish-curseforge.yml | 49 ----- .github/workflows/publish-github.yml | 26 --- .github/workflows/publish-modrinth.yml | 49 ----- .gitignore | 40 ++-- README.md | 2 +- build.gradle | 114 ++++++----- common/build.gradle | 16 ++ common/src/main/java/winterly/Winterly.java | 18 ++ .../block/CommonFrozenFlowerBlock.java | 177 +++++++++++++++++ .../block/CommonFrozenGrassBlock.java | 59 ++++++ .../winterly/block/GarlandLightsBlock.java | 81 ++++++++ .../java/winterly/block/GiftBoxBlock.java | 140 +++++++++++++ .../main/java/winterly/block/IcicleBlock.java | 120 +++++++++++ .../winterly/block/SnowballWallBlock.java | 41 ++++ .../java/winterly/block/SnowguyBlock.java | 57 ++++++ .../winterly/block/base/BasePaneBlock.java | 10 + .../winterly/block/base/BaseStairsBlock.java | 11 ++ .../block/entity/GiftBoxBlockEntity.java | 38 ++++ .../block/entity/GiftBoxBlockEntityData.java | 12 ++ .../winterly/client/WinterlyModelLayers.java | 14 ++ .../winterly/client/model/SantaHatModel.java | 40 ++++ .../winterly/client/model/ScarfModel.java | 39 ++++ .../winterly/client/model/WinterlyModels.java | 10 +- .../render/DecorationFeatureRenderer.java | 26 +++ .../client/render/MobDecorationRenderer.java | 16 ++ .../client/render/MobDecorationRenderers.java | 0 .../client/render/SantaHatRenderer.java | 25 +++ .../winterly/client/render/ScarfRenderer.java | 25 +++ .../winterly/config/WinterlyClientConfig.java | 18 +- .../winterly/config/WinterlyClothConfig.java | 0 .../java/winterly/config/WinterlyConfig.java | 2 +- .../java/winterly/data/CachedFlowers.java | 49 +++++ .../main/java/winterly/data/GiftBoxData.java | 48 +++++ .../java/winterly/extension/DecoratedMob.java | 0 .../winterly/item/CommonSantaHatItem.java | 29 +++ .../java/winterly/item/CommonScarfItem.java | 30 +++ .../winterly/item/tool/CryomarbleAxeItem.java | 22 +++ .../winterly/item/tool/CryomarbleHoeItem.java | 21 ++ .../item/tool/CryomarblePickaxeItem.java | 22 +++ .../item/tool/CryomarbleShovelItem.java | 22 +++ .../item/tool/CryomarbleSwordItem.java | 21 ++ .../java/winterly/mixin/WinterlyMixins.java | 0 .../mixin/common/BlockStateMixin.java | 58 ++++++ .../mixin/common/FreezeTopLayerMixin.java | 58 ++++++ .../mixin/common/MiningToolItemMixin.java | 56 ++++++ .../mixin/common/ServerWorldMixin.java | 42 ++++ .../mixin/common/SkeletonExtension.java | 77 ++++++++ .../winterly/mixin/common/SnowBlockMixin.java | 37 ++++ .../mixin/common/SnowyBlockMixin.java | 14 +- .../mixin/common/SpreadableBlockMixin.java | 23 +++ .../mixin/common/ZombieExtension.java | 77 ++++++++ .../registry/CommonWinterlyBlockEntities.java | 8 + .../registry/CommonWinterlyBlocks.java | 52 +++++ .../registry/CommonWinterlyItems.java | 44 +++++ .../main/java/winterly/util/HolidayUtils.java | 16 ++ .../java/winterly/util/UpdateChecker.java | 13 +- .../winterly/worldgen/CryomarbleFeature.java | 57 ++++++ .../worldgen/UndergroundIcicleFeature.java | 45 +++++ .../winterly/blockstates/black_gift_box.json | 0 .../winterly/blockstates/blue_gift_box.json | 0 .../blockstates/cryomarble_block.json | 0 .../winterly/blockstates/cyan_gift_box.json | 0 .../winterly/blockstates/dense_snow.json | 0 .../winterly/blockstates/dense_snow_slab.json | 0 .../blockstates/dense_snow_stairs.json | 0 .../winterly/blockstates/frozen_flower.json | 0 .../winterly/blockstates/frozen_grass.json | 0 .../winterly/blockstates/garland_lights.json | 0 .../winterly/blockstates/green_gift_box.json | 0 .../assets/winterly/blockstates/icicle.json | 0 .../winterly/blockstates/icicle_bars.json | 0 .../winterly/blockstates/icicle_block.json | 0 .../winterly/blockstates/icicle_pane.json | 0 .../winterly/blockstates/orange_gift_box.json | 0 .../blockstates/packed_icicle_block.json | 0 .../winterly/blockstates/purple_gift_box.json | 0 .../blockstates/rainy_garland_lights.json | 0 .../blockstates/raw_cryomarble_shard.json | 0 .../winterly/blockstates/red_gift_box.json | 0 .../winterly/blockstates/snow_brick_slab.json | 0 .../blockstates/snow_brick_stairs.json | 0 .../winterly/blockstates/snow_bricks.json | 0 .../winterly/blockstates/snowball_wall.json | 0 .../assets/winterly/blockstates/snowguy.json | 0 .../winterly/blockstates/white_gift_box.json | 0 .../winterly/blockstates/yellow_gift_box.json | 0 .../main/resources/assets/winterly/icon.png | Bin .../resources/assets/winterly/lang/en_us.json | 3 +- .../resources/assets/winterly/lang/ru_ru.json | 3 +- .../resources/assets/winterly/lang/zh_cn.json | 1 - .../block/base/garland_lights_model.json | 1 + .../models/block/base/gift_box_model.json | 6 +- .../winterly/models/block/black_gift_box.json | 0 .../winterly/models/block/blue_gift_box.json | 0 .../models/block/cryomarble_block.json | 0 .../winterly/models/block/cyan_gift_box.json | 0 .../winterly/models/block/dense_snow.json | 0 .../models/block/dense_snow_slab.json | 0 .../models/block/dense_snow_slab_top.json | 0 .../models/block/dense_snow_stairs.json | 0 .../models/block/dense_snow_stairs_inner.json | 0 .../models/block/dense_snow_stairs_outer.json | 0 .../winterly/models/block/frozen_flower.json | 1 + .../models/block/frozen_flower_10.json | 1 + .../models/block/frozen_flower_12.json | 1 + .../models/block/frozen_flower_14.json | 1 + .../models/block/frozen_flower_2.json | 1 + .../models/block/frozen_flower_4.json | 1 + .../models/block/frozen_flower_6.json | 1 + .../models/block/frozen_flower_8.json | 1 + .../models/block/frozen_grass_10.json | 1 + .../models/block/frozen_grass_12.json | 1 + .../models/block/frozen_grass_14.json | 1 + .../winterly/models/block/frozen_grass_2.json | 1 + .../winterly/models/block/frozen_grass_4.json | 1 + .../winterly/models/block/frozen_grass_6.json | 1 + .../winterly/models/block/frozen_grass_8.json | 1 + .../winterly/models/block/garland_lights.json | 0 .../winterly/models/block/green_gift_box.json | 0 .../winterly/models/block/icicle_1.json | 1 + .../winterly/models/block/icicle_2.json | 1 + .../winterly/models/block/icicle_3.json | 1 + .../models/block/icicle_bars_cap.json | 1 + .../models/block/icicle_bars_cap_alt.json | 1 + .../models/block/icicle_bars_post.json | 1 + .../models/block/icicle_bars_post_ends.json | 1 + .../models/block/icicle_bars_side.json | 1 + .../models/block/icicle_bars_side_alt.json | 1 + .../winterly/models/block/icicle_block.json | 1 + .../models/block/icicle_pane_noside.json | 1 + .../models/block/icicle_pane_noside_alt.json | 1 + .../models/block/icicle_pane_post.json | 1 + .../models/block/icicle_pane_side.json | 1 + .../models/block/icicle_pane_side_alt.json | 1 + .../models/block/orange_gift_box.json | 0 .../models/block/packed_icicle_block.json | 0 .../models/block/purple_gift_box.json | 0 .../models/block/rainy_garland_lights.json | 0 .../models/block/raw_cryomarble_shard.json | 1 + .../winterly/models/block/red_gift_box.json | 0 .../models/block/snow_brick_slab.json | 0 .../models/block/snow_brick_slab_top.json | 0 .../models/block/snow_brick_stairs.json | 0 .../models/block/snow_brick_stairs_inner.json | 0 .../models/block/snow_brick_stairs_outer.json | 0 .../winterly/models/block/snow_bricks.json | 0 .../winterly/models/block/snowball_wall.json | 0 .../assets/winterly/models/block/snowguy.json | 1 + .../winterly/models/block/white_gift_box.json | 0 .../models/block/yellow_gift_box.json | 0 .../winterly/models/item/black_gift_box.json | 0 .../winterly/models/item/blue_candy_cane.json | 0 .../winterly/models/item/blue_gift_box.json | 0 .../winterly/models/item/blue_santa_hat.json | 0 .../winterly/models/item/blue_scarf.json | 0 .../winterly/models/item/cryomarble.json | 0 .../winterly/models/item/cryomarble_axe.json | 0 .../models/item/cryomarble_block.json | 0 .../winterly/models/item/cryomarble_hoe.json | 0 .../models/item/cryomarble_pickaxe.json | 0 .../models/item/cryomarble_shard.json | 0 .../models/item/cryomarble_shovel.json | 0 .../models/item/cryomarble_sword.json | 0 .../winterly/models/item/cyan_gift_box.json | 0 .../winterly/models/item/dense_snow.json | 0 .../winterly/models/item/dense_snow_slab.json | 0 .../models/item/dense_snow_stairs.json | 0 .../winterly/models/item/frozen_flower.json | 0 .../winterly/models/item/frozen_grass.json | 0 .../winterly/models/item/garland_lights.json | 0 .../models/item/green_candy_cane.json | 0 .../winterly/models/item/green_gift_box.json | 0 .../winterly/models/item/green_scarf.json | 0 .../assets/winterly/models/item/icicle.json | 0 .../winterly/models/item/icicle_bars.json | 0 .../winterly/models/item/icicle_block.json | 0 .../winterly/models/item/icicle_pane.json | 1 + .../winterly/models/item/orange_gift_box.json | 0 .../models/item/packed_icicle_block.json | 0 .../winterly/models/item/purple_gift_box.json | 0 .../winterly/models/item/rainbow_scarf.json | 0 .../models/item/rainy_garland_lights.json | 0 .../models/item/raw_cryomarble_shard.json | 0 .../winterly/models/item/red_candy_cane.json | 0 .../winterly/models/item/red_gift_box.json | 0 .../winterly/models/item/red_santa_hat.json | 0 .../winterly/models/item/red_scarf.json | 0 .../winterly/models/item/snow_brick_slab.json | 0 .../models/item/snow_brick_stairs.json | 0 .../winterly/models/item/snow_bricks.json | 0 .../winterly/models/item/snowball_wall.json | 0 .../assets/winterly/models/item/snowguy.json | 0 .../winterly/models/item/white_gift_box.json | 0 .../winterly/models/item/white_scarf.json | 0 .../winterly/models/item/yellow_gift_box.json | 0 .../textures/block/black_gift_box.png | Bin .../block/black_gift_box_particle.png | Bin .../winterly/textures/block/blue_gift_box.png | Bin .../textures/block/blue_gift_box_particle.png | Bin .../textures/block/cryomarble_block.png | Bin .../winterly/textures/block/cyan_gift_box.png | Bin .../textures/block/cyan_gift_box_particle.png | Bin .../winterly/textures/block/dense_snow.png | Bin .../winterly/textures/block/frozen_flower.png | Bin .../winterly/textures/block/frozen_grass.png | Bin .../textures/block/garland_lights.png | Bin .../textures/block/garland_lights.png.mcmeta | 0 .../textures/block/green_gift_box.png | Bin .../block/green_gift_box_particle.png | Bin .../winterly/textures/block/icicle_1.png | Bin .../winterly/textures/block/icicle_2.png | Bin .../winterly/textures/block/icicle_3.png | Bin .../winterly/textures/block/icicle_bars.png | Bin .../winterly/textures/block/icicle_block.png | Bin .../textures/block/orange_gift_box.png | Bin .../block/orange_gift_box_particle.png | Bin .../textures/block/packed_icicle_block.png | Bin .../textures/block/purple_gift_box.png | Bin .../block/purple_gift_box_particle.png | Bin .../textures/block/rainy_garland_lights.png | Bin .../block/rainy_garland_lights.png.mcmeta | 0 .../textures/block/raw_cryomarble_shard.png | Bin .../winterly/textures/block/red_gift_box.png | Bin .../textures/block/red_gift_box_particle.png | Bin .../winterly/textures/block/snow_bricks.png | Bin .../winterly/textures/block/snowball_wall.png | Bin .../winterly/textures/block/snowguy_model.png | Bin .../textures/block/white_gift_box.png | Bin .../block/white_gift_box_particle.png | Bin .../textures/block/yellow_gift_box.png | Bin .../block/yellow_gift_box_particle.png | Bin .../textures/entity/blue_santa_hat.png | Bin .../winterly/textures/entity/blue_scarf.png | Bin .../winterly/textures/entity/green_scarf.png | Bin .../textures/entity/rainbow_scarf.png | Bin .../textures/entity/red_santa_hat.png | Bin .../winterly/textures/entity/red_scarf.png | Bin .../winterly/textures/entity/white_scarf.png | Bin .../assets/winterly/textures/gui/icons.png | Bin .../textures/item/blue_candy_cane.png | Bin .../winterly/textures/item/blue_santa_hat.png | Bin .../winterly/textures/item/blue_scarf.png | Bin .../winterly/textures/item/cryomarble.png | Bin .../winterly/textures/item/cryomarble_axe.png | Bin .../winterly/textures/item/cryomarble_hoe.png | Bin .../textures/item/cryomarble_pickaxe.png | Bin .../textures/item/cryomarble_shard.png | Bin .../textures/item/cryomarble_shovel.png | Bin .../textures/item/cryomarble_sword.png | Bin .../textures/item/green_candy_cane.png | Bin .../winterly/textures/item/green_scarf.png | Bin .../assets/winterly/textures/item/icicle.png | Bin .../winterly/textures/item/rainbow_scarf.png | Bin .../winterly/textures/item/red_candy_cane.png | Bin .../winterly/textures/item/red_santa_hat.png | Bin .../winterly/textures/item/red_scarf.png | Bin .../assets/winterly/textures/item/snowguy.png | Bin .../winterly/textures/item/white_scarf.png | Bin .../tags/blocks/beacon_base_blocks.json | 0 .../mangrove_roots_can_grow_through.json | 0 .../tags/blocks/mineable/pickaxe.json | 0 .../tags/blocks/mineable/shovel.json | 0 .../data/minecraft/tags/blocks/slabs.json | 0 .../data/minecraft/tags/blocks/snow.json | 0 .../data/minecraft/tags/blocks/stairs.json | 0 .../loot_tables/blocks/cryomarble_block.json | 0 .../loot_tables/blocks/dense_snow.json | 0 .../loot_tables/blocks/dense_snow_slab.json | 0 .../loot_tables/blocks/dense_snow_stairs.json | 0 .../loot_tables/blocks/frozen_flower.json | 0 .../loot_tables/blocks/frozen_grass.json | 0 .../loot_tables/blocks/garland_lights.json | 0 .../winterly/loot_tables/blocks/icicle.json | 0 .../loot_tables/blocks/icicle_bars.json | 0 .../loot_tables/blocks/icicle_block.json | 0 .../loot_tables/blocks/icicle_pane.json | 0 .../blocks/packed_icicle_block.json | 0 .../blocks/rainy_garland_lights.json | 0 .../blocks/raw_cryomarble_shard.json | 0 .../loot_tables/blocks/snow_brick_slab.json | 0 .../loot_tables/blocks/snow_brick_stairs.json | 0 .../loot_tables/blocks/snow_bricks.json | 0 .../loot_tables/blocks/snowball_wall.json | 0 .../winterly/loot_tables/blocks/snowguy.json | 0 .../data/winterly/recipes/black_gift_box.json | 0 .../winterly/recipes/blue_candy_cane.json | 0 .../data/winterly/recipes/blue_gift_box.json | 0 .../data/winterly/recipes/blue_santa_hat.json | 0 .../data/winterly/recipes/blue_scarf.json | 0 .../data/winterly/recipes/cryomarble.json | 0 .../data/winterly/recipes/cryomarble_axe.json | 0 .../winterly/recipes/cryomarble_block.json | 0 .../cryomarble_from_cryomarble_block.json | 0 .../data/winterly/recipes/cryomarble_hoe.json | 0 .../winterly/recipes/cryomarble_pickaxe.json | 0 .../winterly/recipes/cryomarble_shovel.json | 0 .../winterly/recipes/cryomarble_sword.json | 0 .../data/winterly/recipes/cyan_gift_box.json | 0 .../data/winterly/recipes/dense_snow.json | 0 .../winterly/recipes/dense_snow_slab.json | 0 .../winterly/recipes/dense_snow_stairs.json | 0 .../data/winterly/recipes/garland_lights.json | 0 .../winterly/recipes/green_candy_cane.json | 0 .../data/winterly/recipes/green_gift_box.json | 0 .../data/winterly/recipes/green_scarf.json | 0 .../data/winterly/recipes/icicle_1.json | 0 .../data/winterly/recipes/icicle_2.json | 0 .../data/winterly/recipes/icicle_3.json | 0 .../data/winterly/recipes/icicle_bars.json | 0 .../data/winterly/recipes/icicle_block.json | 0 .../recipes/icicle_from_icicle_block.json | 0 .../data/winterly/recipes/icicle_pane.json | 0 .../winterly/recipes/orange_gift_box.json | 0 .../winterly/recipes/packed_icicle_block.json | 0 .../winterly/recipes/purple_gift_box.json | 0 .../data/winterly/recipes/rainbow_scarf.json | 0 .../recipes/rainy_garland_lights.json | 0 .../data/winterly/recipes/red_candy_cane.json | 0 .../data/winterly/recipes/red_gift_box.json | 0 .../data/winterly/recipes/red_santa_hat.json | 0 .../data/winterly/recipes/red_scarf.json | 0 .../winterly/recipes/snow_brick_slab.json | 0 .../winterly/recipes/snow_brick_stairs.json | 0 .../data/winterly/recipes/snow_bricks.json | 0 .../data/winterly/recipes/snowball_wall.json | 0 .../data/winterly/recipes/snowguy.json | 0 .../data/winterly/recipes/white_gift_box.json | 0 .../data/winterly/recipes/white_scarf.json | 0 .../winterly/recipes/yellow_gift_box.json | 0 .../data/winterly/tags/blocks/gift_boxes.json | 0 .../data/winterly/tags/items/candy_canes.json | 0 .../data/winterly/tags/items/scarfs.json | 0 .../configured_feature/cryomarble.json | 0 .../underground_icicle.json | 0 .../worldgen/placed_feature/cryomarble.json | 0 .../placed_feature/underground_icicle.json | 0 .../resources/winterly-common.mixins.json | 1 - .../src/main/resources/winterly.accesswidener | 2 + fabric/build.gradle | 90 +++++++++ .../java/winterly/fabric/WinterlyFabric.java | 56 ++++++ .../fabric/block/FrozenFlowerBlock.java | 40 ++++ .../fabric/block/FrozenGrassBlock.java | 32 +++ .../fabric/client/WinterlyFabricClient.java | 63 ++++++ .../compat/WinterlyModMenuIntegration.java | 2 +- .../compat/WinterlyOwoLibIntegration.java | 18 +- .../fabric}/data/WinterlyComponents.java | 2 +- .../java/winterly/fabric/data/WorldData.java | 58 ++++++ .../winterly/fabric/item/SantaHatItem.java | 39 ++++ .../java/winterly/fabric/item/ScarfItem.java | 39 ++++ .../mixin/client/ArmorRendererMixin.java | 49 +++++ .../registry/WinterlyBlockEntities.java | 23 ++- .../fabric/registry/WinterlyBlocks.java | 81 ++++++++ .../fabric/registry/WinterlyFeatures.java | 52 +++++ .../fabric/registry/WinterlyItems.java | 53 +++++ .../data/trinkets/entities/winterly.json | 0 .../trinkets/tags/items/chest/necklace.json | 0 .../data/trinkets/tags/items/head/hat.json | 0 .../src}/main/resources/fabric.mod.json | 28 +-- .../src/main/resources/winterly.mixins.json | 14 ++ gradle.properties | 35 +++- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 43462 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- gradlew | 35 ++-- gradlew.bat | 1 + neoforge/build.gradle | 82 ++++++++ neoforge/gradle.properties | 1 + .../winterly/neoforge/WinterlyNeoforge.java | 99 ++++++++++ .../neoforge/block/BaseTransparentBlock.java | 10 + .../data/WinterlyDataAttachments.java | 39 ++++ .../winterly/neoforge/data/WorldData.java | 61 ++++++ .../winterly/neoforge/item/SantaHatItem.java | 57 ++++++ .../winterly/neoforge/item/ScarfItem.java | 57 ++++++ .../registry/WinterlyBlockEntities.java | 40 ++++ .../neoforge/registry/WinterlyBlocks.java | 86 ++++++++ .../neoforge/registry/WinterlyFeatures.java | 20 ++ .../neoforge/registry/WinterlyItems.java | 62 ++++++ .../src/main/resources/META-INF/mods.toml | 18 ++ .../data/curios/tags/items/curio.json | 12 ++ .../winterly/curios/entities/winterly.json | 11 ++ .../neoforge/biome_modifier/cryomarble.json | 6 + .../biome_modifier/underground_icicle.json | 6 + neoforge/src/main/resources/pack.mcmeta | 6 + .../src/main/resources/winterly.mixins.json | 13 ++ settings.gradle | 30 ++- src/main/java/winterly/Winterly.java | 63 ------ .../winterly/block/FrozenFlowerBlock.java | 187 ------------------ .../java/winterly/block/FrozenGrassBlock.java | 67 ------- .../winterly/block/GarlandLightsBlock.java | 81 -------- .../java/winterly/block/GiftBoxBlock.java | 132 ------------- src/main/java/winterly/block/IcicleBlock.java | 116 ----------- .../winterly/block/SnowballWallBlock.java | 41 ---- .../java/winterly/block/SnowguyBlock.java | 57 ------ .../winterly/block/base/BasePaneBlock.java | 10 - .../winterly/block/base/BaseStairsBlock.java | 11 -- .../block/entity/GiftBoxBlockEntity.java | 33 ---- .../java/winterly/client/WinterlyClient.java | 56 ------ .../winterly/client/WinterlyModelLayers.java | 22 --- .../winterly/client/model/SantaHatModel.java | 34 ---- .../winterly/client/model/ScarfModel.java | 32 --- .../render/DecorationFeatureRenderer.java | 26 --- .../client/render/MobDecorationRenderer.java | 16 -- .../client/render/SantaHatRenderer.java | 25 --- .../winterly/client/render/ScarfRenderer.java | 25 --- .../java/winterly/data/CachedFlowers.java | 40 ---- src/main/java/winterly/data/GiftBoxData.java | 47 ----- src/main/java/winterly/data/WorldData.java | 58 ------ src/main/java/winterly/item/SantaHatItem.java | 55 ------ src/main/java/winterly/item/ScarfItem.java | 55 ------ .../winterly/item/tool/CryomarbleAxeItem.java | 21 -- .../winterly/item/tool/CryomarbleHoeItem.java | 21 -- .../item/tool/CryomarblePickaxeItem.java | 21 -- .../item/tool/CryomarbleShovelItem.java | 21 -- .../item/tool/CryomarbleSwordItem.java | 21 -- .../mixin/client/ArmorRendererMixin.java | 50 ----- .../mixin/common/BlockStateMixin.java | 58 ------ .../mixin/common/FreezeTopLayerMixin.java | 54 ----- .../mixin/common/MiningToolItemMixin.java | 56 ------ .../mixin/common/ServerWorldMixin.java | 42 ---- .../mixin/common/SkeletonExtension.java | 77 -------- .../winterly/mixin/common/SnowBlockMixin.java | 37 ---- .../mixin/common/SpreadableBlockMixin.java | 23 --- .../mixin/common/ZombieExtension.java | 77 -------- .../winterly/registry/WinterlyBlocks.java | 87 -------- .../winterly/registry/WinterlyFeatures.java | 46 ----- .../java/winterly/registry/WinterlyItems.java | 63 ------ src/main/java/winterly/util/HolidayUtils.java | 13 -- .../winterly/worldgen/CryomarbleFeature.java | 57 ------ .../worldgen/UndergroundIcicleFeature.java | 45 ----- src/main/resources/winterly.accesswidener | 2 - 430 files changed, 3518 insertions(+), 2498 deletions(-) delete mode 100644 .github/workflows/publish-curseforge.yml delete mode 100644 .github/workflows/publish-github.yml delete mode 100644 .github/workflows/publish-modrinth.yml create mode 100644 common/build.gradle create mode 100644 common/src/main/java/winterly/Winterly.java create mode 100644 common/src/main/java/winterly/block/CommonFrozenFlowerBlock.java create mode 100644 common/src/main/java/winterly/block/CommonFrozenGrassBlock.java create mode 100644 common/src/main/java/winterly/block/GarlandLightsBlock.java create mode 100644 common/src/main/java/winterly/block/GiftBoxBlock.java create mode 100644 common/src/main/java/winterly/block/IcicleBlock.java create mode 100644 common/src/main/java/winterly/block/SnowballWallBlock.java create mode 100644 common/src/main/java/winterly/block/SnowguyBlock.java create mode 100644 common/src/main/java/winterly/block/base/BasePaneBlock.java create mode 100644 common/src/main/java/winterly/block/base/BaseStairsBlock.java create mode 100644 common/src/main/java/winterly/block/entity/GiftBoxBlockEntity.java create mode 100644 common/src/main/java/winterly/block/entity/GiftBoxBlockEntityData.java create mode 100644 common/src/main/java/winterly/client/WinterlyModelLayers.java create mode 100644 common/src/main/java/winterly/client/model/SantaHatModel.java create mode 100644 common/src/main/java/winterly/client/model/ScarfModel.java rename {src => common/src}/main/java/winterly/client/model/WinterlyModels.java (53%) create mode 100644 common/src/main/java/winterly/client/render/DecorationFeatureRenderer.java create mode 100644 common/src/main/java/winterly/client/render/MobDecorationRenderer.java rename {src => common/src}/main/java/winterly/client/render/MobDecorationRenderers.java (100%) create mode 100644 common/src/main/java/winterly/client/render/SantaHatRenderer.java create mode 100644 common/src/main/java/winterly/client/render/ScarfRenderer.java rename {src => common/src}/main/java/winterly/config/WinterlyClientConfig.java (86%) rename {src => common/src}/main/java/winterly/config/WinterlyClothConfig.java (100%) rename {src => common/src}/main/java/winterly/config/WinterlyConfig.java (93%) create mode 100644 common/src/main/java/winterly/data/CachedFlowers.java create mode 100644 common/src/main/java/winterly/data/GiftBoxData.java rename {src => common/src}/main/java/winterly/extension/DecoratedMob.java (100%) create mode 100644 common/src/main/java/winterly/item/CommonSantaHatItem.java create mode 100644 common/src/main/java/winterly/item/CommonScarfItem.java create mode 100644 common/src/main/java/winterly/item/tool/CryomarbleAxeItem.java create mode 100644 common/src/main/java/winterly/item/tool/CryomarbleHoeItem.java create mode 100644 common/src/main/java/winterly/item/tool/CryomarblePickaxeItem.java create mode 100644 common/src/main/java/winterly/item/tool/CryomarbleShovelItem.java create mode 100644 common/src/main/java/winterly/item/tool/CryomarbleSwordItem.java rename {src => common/src}/main/java/winterly/mixin/WinterlyMixins.java (100%) create mode 100644 common/src/main/java/winterly/mixin/common/BlockStateMixin.java create mode 100644 common/src/main/java/winterly/mixin/common/FreezeTopLayerMixin.java create mode 100644 common/src/main/java/winterly/mixin/common/MiningToolItemMixin.java create mode 100644 common/src/main/java/winterly/mixin/common/ServerWorldMixin.java create mode 100644 common/src/main/java/winterly/mixin/common/SkeletonExtension.java create mode 100644 common/src/main/java/winterly/mixin/common/SnowBlockMixin.java rename {src => common/src}/main/java/winterly/mixin/common/SnowyBlockMixin.java (50%) create mode 100644 common/src/main/java/winterly/mixin/common/SpreadableBlockMixin.java create mode 100644 common/src/main/java/winterly/mixin/common/ZombieExtension.java create mode 100644 common/src/main/java/winterly/registry/CommonWinterlyBlockEntities.java create mode 100644 common/src/main/java/winterly/registry/CommonWinterlyBlocks.java create mode 100644 common/src/main/java/winterly/registry/CommonWinterlyItems.java create mode 100644 common/src/main/java/winterly/util/HolidayUtils.java rename {src => common/src}/main/java/winterly/util/UpdateChecker.java (89%) create mode 100644 common/src/main/java/winterly/worldgen/CryomarbleFeature.java create mode 100644 common/src/main/java/winterly/worldgen/UndergroundIcicleFeature.java rename {src => common/src}/main/resources/assets/winterly/blockstates/black_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/blue_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/cryomarble_block.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/cyan_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/dense_snow.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/dense_snow_slab.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/dense_snow_stairs.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/frozen_flower.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/frozen_grass.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/garland_lights.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/green_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/icicle.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/icicle_bars.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/icicle_block.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/icicle_pane.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/orange_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/packed_icicle_block.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/purple_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/rainy_garland_lights.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/raw_cryomarble_shard.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/red_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/snow_brick_slab.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/snow_brick_stairs.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/snow_bricks.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/snowball_wall.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/snowguy.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/white_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/blockstates/yellow_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/icon.png (100%) rename {src => common/src}/main/resources/assets/winterly/lang/en_us.json (97%) rename {src => common/src}/main/resources/assets/winterly/lang/ru_ru.json (97%) rename {src => common/src}/main/resources/assets/winterly/lang/zh_cn.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/base/garland_lights_model.json (94%) rename {src => common/src}/main/resources/assets/winterly/models/block/base/gift_box_model.json (98%) rename {src => common/src}/main/resources/assets/winterly/models/block/black_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/blue_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/cryomarble_block.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/cyan_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/dense_snow.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/dense_snow_slab.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/dense_snow_slab_top.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/dense_snow_stairs.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/dense_snow_stairs_inner.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/dense_snow_stairs_outer.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_flower.json (95%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_flower_10.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_flower_12.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_flower_14.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_flower_2.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_flower_4.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_flower_6.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_flower_8.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_grass_10.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_grass_12.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_grass_14.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_grass_2.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_grass_4.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_grass_6.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/frozen_grass_8.json (97%) rename {src => common/src}/main/resources/assets/winterly/models/block/garland_lights.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/green_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_1.json (72%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_2.json (72%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_3.json (72%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_bars_cap.json (79%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_bars_cap_alt.json (80%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_bars_post.json (77%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_bars_post_ends.json (77%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_bars_side.json (79%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_bars_side_alt.json (80%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_block.json (69%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_pane_noside.json (72%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_pane_noside_alt.json (73%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_pane_post.json (78%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_pane_side.json (78%) rename {src => common/src}/main/resources/assets/winterly/models/block/icicle_pane_side_alt.json (79%) rename {src => common/src}/main/resources/assets/winterly/models/block/orange_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/packed_icicle_block.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/purple_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/rainy_garland_lights.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/raw_cryomarble_shard.json (74%) rename {src => common/src}/main/resources/assets/winterly/models/block/red_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/snow_brick_slab.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/snow_brick_slab_top.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/snow_brick_stairs.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/snow_brick_stairs_inner.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/snow_brick_stairs_outer.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/snow_bricks.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/snowball_wall.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/snowguy.json (99%) rename {src => common/src}/main/resources/assets/winterly/models/block/white_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/block/yellow_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/black_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/blue_candy_cane.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/blue_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/blue_santa_hat.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/blue_scarf.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/cryomarble.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/cryomarble_axe.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/cryomarble_block.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/cryomarble_hoe.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/cryomarble_pickaxe.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/cryomarble_shard.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/cryomarble_shovel.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/cryomarble_sword.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/cyan_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/dense_snow.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/dense_snow_slab.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/dense_snow_stairs.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/frozen_flower.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/frozen_grass.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/garland_lights.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/green_candy_cane.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/green_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/green_scarf.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/icicle.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/icicle_bars.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/icicle_block.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/icicle_pane.json (69%) rename {src => common/src}/main/resources/assets/winterly/models/item/orange_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/packed_icicle_block.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/purple_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/rainbow_scarf.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/rainy_garland_lights.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/raw_cryomarble_shard.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/red_candy_cane.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/red_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/red_santa_hat.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/red_scarf.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/snow_brick_slab.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/snow_brick_stairs.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/snow_bricks.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/snowball_wall.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/snowguy.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/white_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/white_scarf.json (100%) rename {src => common/src}/main/resources/assets/winterly/models/item/yellow_gift_box.json (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/black_gift_box.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/black_gift_box_particle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/blue_gift_box.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/blue_gift_box_particle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/cryomarble_block.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/cyan_gift_box.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/cyan_gift_box_particle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/dense_snow.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/frozen_flower.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/frozen_grass.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/garland_lights.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/garland_lights.png.mcmeta (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/green_gift_box.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/green_gift_box_particle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/icicle_1.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/icicle_2.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/icicle_3.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/icicle_bars.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/icicle_block.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/orange_gift_box.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/orange_gift_box_particle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/packed_icicle_block.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/purple_gift_box.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/purple_gift_box_particle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/rainy_garland_lights.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/rainy_garland_lights.png.mcmeta (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/raw_cryomarble_shard.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/red_gift_box.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/red_gift_box_particle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/snow_bricks.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/snowball_wall.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/snowguy_model.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/white_gift_box.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/white_gift_box_particle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/yellow_gift_box.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/block/yellow_gift_box_particle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/entity/blue_santa_hat.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/entity/blue_scarf.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/entity/green_scarf.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/entity/rainbow_scarf.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/entity/red_santa_hat.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/entity/red_scarf.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/entity/white_scarf.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/gui/icons.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/blue_candy_cane.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/blue_santa_hat.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/blue_scarf.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/cryomarble.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/cryomarble_axe.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/cryomarble_hoe.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/cryomarble_pickaxe.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/cryomarble_shard.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/cryomarble_shovel.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/cryomarble_sword.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/green_candy_cane.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/green_scarf.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/icicle.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/rainbow_scarf.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/red_candy_cane.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/red_santa_hat.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/red_scarf.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/snowguy.png (100%) rename {src => common/src}/main/resources/assets/winterly/textures/item/white_scarf.png (100%) rename {src => common/src}/main/resources/data/minecraft/tags/blocks/beacon_base_blocks.json (100%) rename {src => common/src}/main/resources/data/minecraft/tags/blocks/mangrove_roots_can_grow_through.json (100%) rename {src => common/src}/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json (100%) rename {src => common/src}/main/resources/data/minecraft/tags/blocks/mineable/shovel.json (100%) rename {src => common/src}/main/resources/data/minecraft/tags/blocks/slabs.json (100%) rename {src => common/src}/main/resources/data/minecraft/tags/blocks/snow.json (100%) rename {src => common/src}/main/resources/data/minecraft/tags/blocks/stairs.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/cryomarble_block.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/dense_snow.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/dense_snow_slab.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/dense_snow_stairs.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/frozen_flower.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/frozen_grass.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/garland_lights.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/icicle.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/icicle_bars.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/icicle_block.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/icicle_pane.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/packed_icicle_block.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/rainy_garland_lights.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/raw_cryomarble_shard.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/snow_brick_slab.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/snow_brick_stairs.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/snow_bricks.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/snowball_wall.json (100%) rename {src => common/src}/main/resources/data/winterly/loot_tables/blocks/snowguy.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/black_gift_box.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/blue_candy_cane.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/blue_gift_box.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/blue_santa_hat.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/blue_scarf.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/cryomarble.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/cryomarble_axe.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/cryomarble_block.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/cryomarble_from_cryomarble_block.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/cryomarble_hoe.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/cryomarble_pickaxe.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/cryomarble_shovel.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/cryomarble_sword.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/cyan_gift_box.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/dense_snow.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/dense_snow_slab.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/dense_snow_stairs.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/garland_lights.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/green_candy_cane.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/green_gift_box.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/green_scarf.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/icicle_1.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/icicle_2.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/icicle_3.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/icicle_bars.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/icicle_block.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/icicle_from_icicle_block.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/icicle_pane.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/orange_gift_box.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/packed_icicle_block.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/purple_gift_box.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/rainbow_scarf.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/rainy_garland_lights.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/red_candy_cane.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/red_gift_box.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/red_santa_hat.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/red_scarf.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/snow_brick_slab.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/snow_brick_stairs.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/snow_bricks.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/snowball_wall.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/snowguy.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/white_gift_box.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/white_scarf.json (100%) rename {src => common/src}/main/resources/data/winterly/recipes/yellow_gift_box.json (100%) rename {src => common/src}/main/resources/data/winterly/tags/blocks/gift_boxes.json (100%) rename {src => common/src}/main/resources/data/winterly/tags/items/candy_canes.json (100%) rename {src => common/src}/main/resources/data/winterly/tags/items/scarfs.json (100%) rename {src => common/src}/main/resources/data/winterly/worldgen/configured_feature/cryomarble.json (100%) rename {src => common/src}/main/resources/data/winterly/worldgen/configured_feature/underground_icicle.json (100%) rename {src => common/src}/main/resources/data/winterly/worldgen/placed_feature/cryomarble.json (100%) rename {src => common/src}/main/resources/data/winterly/worldgen/placed_feature/underground_icicle.json (100%) rename src/main/resources/winterly.mixins.json => common/src/main/resources/winterly-common.mixins.json (94%) create mode 100644 common/src/main/resources/winterly.accesswidener create mode 100644 fabric/build.gradle create mode 100644 fabric/src/main/java/winterly/fabric/WinterlyFabric.java create mode 100644 fabric/src/main/java/winterly/fabric/block/FrozenFlowerBlock.java create mode 100644 fabric/src/main/java/winterly/fabric/block/FrozenGrassBlock.java create mode 100644 fabric/src/main/java/winterly/fabric/client/WinterlyFabricClient.java rename {src/main/java/winterly => fabric/src/main/java/winterly/fabric}/compat/WinterlyModMenuIntegration.java (93%) rename {src/main/java/winterly => fabric/src/main/java/winterly/fabric}/compat/WinterlyOwoLibIntegration.java (60%) rename {src/main/java/winterly => fabric/src/main/java/winterly/fabric}/data/WinterlyComponents.java (95%) create mode 100644 fabric/src/main/java/winterly/fabric/data/WorldData.java create mode 100644 fabric/src/main/java/winterly/fabric/item/SantaHatItem.java create mode 100644 fabric/src/main/java/winterly/fabric/item/ScarfItem.java create mode 100644 fabric/src/main/java/winterly/fabric/mixin/client/ArmorRendererMixin.java rename {src/main/java/winterly => fabric/src/main/java/winterly/fabric}/registry/WinterlyBlockEntities.java (51%) create mode 100644 fabric/src/main/java/winterly/fabric/registry/WinterlyBlocks.java create mode 100644 fabric/src/main/java/winterly/fabric/registry/WinterlyFeatures.java create mode 100644 fabric/src/main/java/winterly/fabric/registry/WinterlyItems.java rename {src => fabric/src}/main/resources/data/trinkets/entities/winterly.json (100%) rename {src => fabric/src}/main/resources/data/trinkets/tags/items/chest/necklace.json (100%) rename {src => fabric/src}/main/resources/data/trinkets/tags/items/head/hat.json (100%) rename {src => fabric/src}/main/resources/fabric.mod.json (58%) create mode 100644 fabric/src/main/resources/winterly.mixins.json create mode 100644 neoforge/build.gradle create mode 100644 neoforge/gradle.properties create mode 100644 neoforge/src/main/java/winterly/neoforge/WinterlyNeoforge.java create mode 100644 neoforge/src/main/java/winterly/neoforge/block/BaseTransparentBlock.java create mode 100644 neoforge/src/main/java/winterly/neoforge/data/WinterlyDataAttachments.java create mode 100644 neoforge/src/main/java/winterly/neoforge/data/WorldData.java create mode 100644 neoforge/src/main/java/winterly/neoforge/item/SantaHatItem.java create mode 100644 neoforge/src/main/java/winterly/neoforge/item/ScarfItem.java create mode 100644 neoforge/src/main/java/winterly/neoforge/registry/WinterlyBlockEntities.java create mode 100644 neoforge/src/main/java/winterly/neoforge/registry/WinterlyBlocks.java create mode 100644 neoforge/src/main/java/winterly/neoforge/registry/WinterlyFeatures.java create mode 100644 neoforge/src/main/java/winterly/neoforge/registry/WinterlyItems.java create mode 100644 neoforge/src/main/resources/META-INF/mods.toml create mode 100644 neoforge/src/main/resources/data/curios/tags/items/curio.json create mode 100644 neoforge/src/main/resources/data/winterly/curios/entities/winterly.json create mode 100644 neoforge/src/main/resources/data/winterly/neoforge/biome_modifier/cryomarble.json create mode 100644 neoforge/src/main/resources/data/winterly/neoforge/biome_modifier/underground_icicle.json create mode 100644 neoforge/src/main/resources/pack.mcmeta create mode 100644 neoforge/src/main/resources/winterly.mixins.json delete mode 100644 src/main/java/winterly/Winterly.java delete mode 100644 src/main/java/winterly/block/FrozenFlowerBlock.java delete mode 100644 src/main/java/winterly/block/FrozenGrassBlock.java delete mode 100644 src/main/java/winterly/block/GarlandLightsBlock.java delete mode 100644 src/main/java/winterly/block/GiftBoxBlock.java delete mode 100644 src/main/java/winterly/block/IcicleBlock.java delete mode 100644 src/main/java/winterly/block/SnowballWallBlock.java delete mode 100644 src/main/java/winterly/block/SnowguyBlock.java delete mode 100644 src/main/java/winterly/block/base/BasePaneBlock.java delete mode 100644 src/main/java/winterly/block/base/BaseStairsBlock.java delete mode 100644 src/main/java/winterly/block/entity/GiftBoxBlockEntity.java delete mode 100644 src/main/java/winterly/client/WinterlyClient.java delete mode 100644 src/main/java/winterly/client/WinterlyModelLayers.java delete mode 100644 src/main/java/winterly/client/model/SantaHatModel.java delete mode 100644 src/main/java/winterly/client/model/ScarfModel.java delete mode 100644 src/main/java/winterly/client/render/DecorationFeatureRenderer.java delete mode 100644 src/main/java/winterly/client/render/MobDecorationRenderer.java delete mode 100644 src/main/java/winterly/client/render/SantaHatRenderer.java delete mode 100644 src/main/java/winterly/client/render/ScarfRenderer.java delete mode 100644 src/main/java/winterly/data/CachedFlowers.java delete mode 100644 src/main/java/winterly/data/GiftBoxData.java delete mode 100644 src/main/java/winterly/data/WorldData.java delete mode 100644 src/main/java/winterly/item/SantaHatItem.java delete mode 100644 src/main/java/winterly/item/ScarfItem.java delete mode 100644 src/main/java/winterly/item/tool/CryomarbleAxeItem.java delete mode 100644 src/main/java/winterly/item/tool/CryomarbleHoeItem.java delete mode 100644 src/main/java/winterly/item/tool/CryomarblePickaxeItem.java delete mode 100644 src/main/java/winterly/item/tool/CryomarbleShovelItem.java delete mode 100644 src/main/java/winterly/item/tool/CryomarbleSwordItem.java delete mode 100644 src/main/java/winterly/mixin/client/ArmorRendererMixin.java delete mode 100644 src/main/java/winterly/mixin/common/BlockStateMixin.java delete mode 100644 src/main/java/winterly/mixin/common/FreezeTopLayerMixin.java delete mode 100644 src/main/java/winterly/mixin/common/MiningToolItemMixin.java delete mode 100644 src/main/java/winterly/mixin/common/ServerWorldMixin.java delete mode 100644 src/main/java/winterly/mixin/common/SkeletonExtension.java delete mode 100644 src/main/java/winterly/mixin/common/SnowBlockMixin.java delete mode 100644 src/main/java/winterly/mixin/common/SpreadableBlockMixin.java delete mode 100644 src/main/java/winterly/mixin/common/ZombieExtension.java delete mode 100644 src/main/java/winterly/registry/WinterlyBlocks.java delete mode 100644 src/main/java/winterly/registry/WinterlyFeatures.java delete mode 100644 src/main/java/winterly/registry/WinterlyItems.java delete mode 100644 src/main/java/winterly/util/HolidayUtils.java delete mode 100644 src/main/java/winterly/worldgen/CryomarbleFeature.java delete mode 100644 src/main/java/winterly/worldgen/UndergroundIcicleFeature.java delete mode 100644 src/main/resources/winterly.accesswidener diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d5cc731..8d5df03 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,31 +1,41 @@ -name: build -on: [ pull_request, push ] +# Automatically build the project and run any configured tests for every push and submitted pull request. +# This can help catch issues that only occur on certain platforms or Java versions, and provides a first line of defense against bad commits. + +name: Build Winterly +on: [pull_request, push] jobs: build: strategy: matrix: - java: [ 17 ] - os: [ ubuntu-22.04 ] + # Use these Java versions + java: [ + 17, # Current Java LTS & minimum supported by Minecraft + ] + # Run on these operating systems + os: [windows-latest, macos-latest, ubuntu-latest] runs-on: ${{ matrix.os }} steps: - - name: Checkout repository - uses: actions/checkout@v3 - - name: Validate gradle wrapper + - name: Checkout Repository + uses: actions/checkout@v4 + - name: Validate Gradle Wrapper uses: gradle/wrapper-validation-action@v1 - name: Setup JDK ${{ matrix.java }} - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: ${{ matrix.java }} - distribution: 'microsoft' - - name: Make gradle wrapper executable + distribution: 'zulu' + cache: gradle + - name: Make Gradle Wrapper Executable if: ${{ runner.os != 'Windows' }} run: chmod +x ./gradlew - - name: build + - name: Build run: ./gradlew build - name: Capture build artifacts - if: ${{ runner.os == 'Linux' && matrix.java == '17' }} - uses: actions/upload-artifact@v3 + if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS + uses: actions/upload-artifact@v4 with: name: Artifacts - path: build/libs/ + path: | + fabric/build/libs/ + neoforge/build/libs/ diff --git a/.github/workflows/publish-curseforge.yml b/.github/workflows/publish-curseforge.yml deleted file mode 100644 index a2aa82a..0000000 --- a/.github/workflows/publish-curseforge.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: publish-curseforge - -on: - release: - types: - - published - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - name: Set up JDK 17 - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Change wrapper permissions - run: chmod +x ./gradlew - - name: Build artifacts - run: ./gradlew build - - name: publish artifacts - uses: Kir-Antipov/mc-publish@v3.3.0 - with: - curseforge-id: 552628 - curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} - - files: | - build/libs/!(*-@(dev|sources|javadoc)).jar - build/libs/*-@(dev|sources|javadoc).jar - - version-type: beta - loaders: | - fabric - quilt - - game-version-filter: releases - - dependencies: | - fabric-api - cloth-config - trinkets - - java: | - 17 - - retry-attempts: 2 - retry-delay: 10000 - fail-mode: fail diff --git a/.github/workflows/publish-github.yml b/.github/workflows/publish-github.yml deleted file mode 100644 index a249d69..0000000 --- a/.github/workflows/publish-github.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: publish-github - -on: - release: - types: - - published - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - name: Set up JDK 17 - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Change wrapper permissions - run: chmod +x ./gradlew - - name: Build artifacts - run: ./gradlew build - - name: Upload assets to GitHub - uses: AButler/upload-release-assets@v2.0 - with: - files: 'build/libs/*' - repo-token: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/publish-modrinth.yml b/.github/workflows/publish-modrinth.yml deleted file mode 100644 index 4e3644c..0000000 --- a/.github/workflows/publish-modrinth.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: publish-modrinth - -on: - release: - types: - - published - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout sources - uses: actions/checkout@v2 - - name: Set up JDK 17 - uses: actions/setup-java@v1 - with: - java-version: 17 - - name: Change wrapper permissions - run: chmod +x ./gradlew - - name: Build artifacts - run: ./gradlew build - - name: publish artifacts - uses: Kir-Antipov/mc-publish@v3.3.0 - with: - modrinth-id: CEvDfomf - modrinth-token: ${{ secrets.MODRINTH_TOKEN }} - - files: | - build/libs/!(*-@(dev|sources|javadoc)).jar - build/libs/*-@(dev|sources|javadoc).jar - - version-type: beta - loaders: | - fabric - quilt - - game-version-filter: releases - - dependencies: | - fabric-api - cloth-config - trinkets - - java: | - 17 - - retry-attempts: 2 - retry-delay: 10000 - fail-mode: fail diff --git a/.gitignore b/.gitignore index 4010a36..8dee9d1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,42 +1,40 @@ -# gradle - +# Gradle .gradle/ build/ out/ +output/ classes/ +libs/ -# brachyura - -.brachyura/ -buildscript/build/ - -# eclipse - +# Eclipse *.launch +.classpath +.project -# idea - +# IntelliJ IDEA .idea/ *.iml *.ipr *.iws -# vscode - +# Visual Studio Code .settings/ .vscode/ bin/ -.classpath -.project - -# macos +# macOS *.DS_Store -# fabric - +# Minecraft/Fabric run/ -# netbeans +# Java +hs_err_*.log +replay_*.log +*.hprof +*.jfr -netbeans/ \ No newline at end of file +# Misc +.metadata +.settings +.architectury-transformer \ No newline at end of file diff --git a/README.md b/README.md index e92c2c9..d9508ff 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Winterly - + [![CurseForge Downloads](https://cf.way2muchnoise.eu/full_winterly_downloads.svg)](https://curseforge.com/minecraft/mc-mods/winterly) [![MC Versions](https://cf.way2muchnoise.eu/versions/winterly.svg)](https://curseforge.com/minecraft/mc-mods/winterly) diff --git a/build.gradle b/build.gradle index 61cdc8a..d965887 100644 --- a/build.gradle +++ b/build.gradle @@ -1,73 +1,79 @@ plugins { - id "fabric-loom" version "1.4-SNAPSHOT" + id "architectury-plugin" version "3.4-SNAPSHOT" + id "dev.architectury.loom" version "1.4-SNAPSHOT" apply false } -version = project.mod_version -group = project.maven_group - -repositories { - maven { - url "https://api.modrinth.com/maven" - content { includeGroup "maven.modrinth" } - } - maven { url "https://maven.ladysnake.org/releases" } //CCA - maven { url "https://maven.terraformersmc.com" } //trinkets - maven { url "https://maven.wispforest.io" } //owo-lib - maven { url "https://maven.shedaniel.me/" } //cloth-config +architectury { + minecraft = rootProject.minecraft_version } -dependencies { - minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" +subprojects { + apply plugin: "dev.architectury.loom" - modImplementation "net.fabricmc:fabric-loader:${project.fabric_loader}" - modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api}" - modImplementation "dev.emi:trinkets:${project.trinkets_version}" + loom { + silentMojangMappingsLicense() + } - // we don't include these because trinkets already does it - modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-base:${project.cca_version}" - modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-entity:${project.cca_version}" + dependencies { + minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" + mappings loom.officialMojangMappings() + } - modImplementation include("dev.onyxstudios.cardinal-components-api:cardinal-components-world:${project.cca_version}") + repositories { + maven { + name "NeoForged" + url "https://maven.neoforged.net/releases/" + } + } - // use modApi when owo lib is compatible with mc version - modApi "io.wispforest:owo-lib:${project.owo_lib}" + processResources { + def expandProps = [ + "name": rootProject.mod_name, + "version": rootProject.mod_version, + "description": rootProject.mod_description, + "id": rootProject.mod_id, + "homepage_url": rootProject.homepage_url, + "sources_url": rootProject.sources_url, + "issue_tracker_url": rootProject.issue_tracker_url, + "license": rootProject.license, + "minecraft_version": rootProject.minecraft_version, + "minecraft_version_range": rootProject.minecraft_version_range, + "minecraft_version_range_fabric": rootProject.minecraft_version_range_fabric, + "fabric_loader_version": rootProject.fabric_loader_version, + "fabric_version": rootProject.fabric_api_version, + "neoforge_version": rootProject.neoforge_version, + "neoforge_version_range": rootProject.neoforge_version_range + ] - modApi("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config}") { exclude(group: "net.fabricmc.fabric-api") } - modApi "com.terraformersmc:modmenu:${project.modmenu_version}" + filesMatching(['pack.mcmeta', 'fabric.mod.json', 'META-INF/mods.toml', '*.mixins.json']) { + expand expandProps + } - modLocalRuntime "maven.modrinth:here-be-no-dragons:1.0.0" - modLocalRuntime "dev.emi:emi-fabric:1.0.29+1.20.4" + inputs.properties(expandProps) + } } -loom { - accessWidenerPath = file("src/main/resources/winterly.accesswidener") -} +allprojects { + apply plugin: "java" + apply plugin: "architectury-plugin" + apply plugin: "maven-publish" -base { - archivesName = project.archives_base_name -} + base { + archivesName = rootProject.archives_base_name + } -processResources { - inputs.property "version", project.version - filesMatching("fabric.mod.json") { - expand "version": project.version - } -} + version = rootProject.mod_version + group = rootProject.maven_group -tasks.withType(JavaCompile).configureEach { - it.options.encoding = "UTF-8" - it.options.release = 17 -} + repositories { + } -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - withSourcesJar() -} + tasks.withType(JavaCompile) { + options.encoding = "UTF-8" + options.release = 17 + } -jar { - from("LICENSE") { - rename { "${it}_${project.base.archivesName.get()}"} - } + java { + withSourcesJar() + } } diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 0000000..64e73f8 --- /dev/null +++ b/common/build.gradle @@ -0,0 +1,16 @@ +architectury { + common(rootProject.enabled_platforms.split(",")) +} + +loom { + accessWidenerPath = file("src/main/resources/${project(":common").properties.mod_id}.accesswidener") +} + +dependencies { + // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies + // Do NOT use other classes from fabric loader + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + modCompileOnly ("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config}") { exclude(group: "net.fabricmc.fabric-api") } + // Remove the next line if you don't want to depend on the API + //modApi "dev.architectury:architectury:${rootProject.architectury_version}" +} diff --git a/common/src/main/java/winterly/Winterly.java b/common/src/main/java/winterly/Winterly.java new file mode 100644 index 0000000..0d0b971 --- /dev/null +++ b/common/src/main/java/winterly/Winterly.java @@ -0,0 +1,18 @@ +package winterly; + +import net.minecraft.resources.ResourceLocation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import winterly.config.WinterlyClothConfig; +import winterly.config.WinterlyConfig; + +public class Winterly { + public static final String MOD_ID = "winterly"; + public static final Logger LOGGER = LoggerFactory.getLogger("Winterly"); + public static WinterlyConfig config = WinterlyClothConfig.init(); + + public static ResourceLocation id(String path) { + return new ResourceLocation(MOD_ID, path); + } + +} diff --git a/common/src/main/java/winterly/block/CommonFrozenFlowerBlock.java b/common/src/main/java/winterly/block/CommonFrozenFlowerBlock.java new file mode 100644 index 0000000..200c6e1 --- /dev/null +++ b/common/src/main/java/winterly/block/CommonFrozenFlowerBlock.java @@ -0,0 +1,177 @@ +package winterly.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; +import winterly.data.CachedFlowers; +import winterly.registry.CommonWinterlyBlocks; + +import java.util.Objects; + +@SuppressWarnings("deprecation") +public class CommonFrozenFlowerBlock extends Block { + public static final IntegerProperty LAYERS = IntegerProperty.create("layers", 0, 8); + public static final BooleanProperty PERSISTENT = BlockStateProperties.PERSISTENT; + + protected static final VoxelShape[] LAYERS_TO_SHAPE = new VoxelShape[] { + Block.box(5.0, 0.0, 5.0, 11.0, 10.0, 11.0), + Block.box(0.0, 0.0, 0.0, 16.0, 2.0, 16.0), + Block.box(0.0, 0.0, 0.0, 16.0, 4.0, 16.0), + Block.box(0.0, 0.0, 0.0, 16.0, 6.0, 16.0), + Block.box(0.0, 0.0, 0.0, 16.0, 8.0, 16.0), + Block.box(0.0, 0.0, 0.0, 16.0, 10.0, 16.0), + Block.box(0.0, 0.0, 0.0, 16.0, 12.0, 16.0), + Block.box(0.0, 0.0, 0.0, 16.0, 14.0, 16.0), + Block.box(0.0, 0.0, 0.0, 16.0, 16.0, 16.0) + }; + + public CommonFrozenFlowerBlock(Properties settings) { + super(settings); + this.registerDefaultState(this.stateDefinition.any().setValue(LAYERS, 0).setValue(PERSISTENT, false)); + } + + @Override + public SoundType getSoundType(BlockState state) { + if(state.getValue(LAYERS) == 0) { + return SoundType.GRASS; + } + else { + return SoundType.SNOW; + } + } + + @Override + public boolean isPathfindable(BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { + if(type.equals(PathComputationType.LAND)) { + return state.getValue(LAYERS) < 5; + } + else return false; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return LAYERS_TO_SHAPE[state.getValue(LAYERS)]; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + if(state.getValue(LAYERS).equals(0) || state.getValue(LAYERS).equals(1)) { + return Shapes.empty(); + } + else { + return LAYERS_TO_SHAPE[state.getValue(LAYERS) - 1]; + } + } + + @Override + public VoxelShape getBlockSupportShape(BlockState state, BlockGetter world, BlockPos pos) { + return LAYERS_TO_SHAPE[state.getValue(LAYERS)]; + } + + @Override + public VoxelShape getVisualShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return LAYERS_TO_SHAPE[state.getValue(LAYERS)]; + } + + @Override + public boolean useShapeForLightOcclusion(BlockState state) { + return true; + } + + @Override + public float getShadeBrightness(BlockState state, BlockGetter world, BlockPos pos) { + return state.getValue(LAYERS) == 8 ? 0.2F : 1.0F; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + BlockPos down = pos.below(); + return this.canPlantOnTop(world.getBlockState(down)); + } + + protected boolean canPlantOnTop(BlockState floor) { + return floor.is(BlockTags.DIRT) || floor.is(Blocks.FARMLAND); + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + return !state.canSurvive(world, pos) ? Blocks.AIR.defaultBlockState() : super.updateShape(state, direction, neighborState, world, pos, neighborPos); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { + if (world.getBrightness(LightLayer.BLOCK, pos) > 11) { + dropResources(state, world, pos); + if(state.getValue(LAYERS) != 0) { + var cachedFlower = CachedFlowers.getFlower(world, pos); + world.setBlockAndUpdate(pos, Objects.requireNonNullElse(cachedFlower, this).defaultBlockState()); + } + } + } + + @Override + public void destroy(LevelAccessor world, BlockPos pos, BlockState state) { + super.destroy(world, pos, state); + + if(state.getValue(LAYERS) != 0 && world instanceof ServerLevel server) { + var cachedFlower = CachedFlowers.getFlower(server, pos); + world.setBlock(pos, Objects.requireNonNullElse(cachedFlower, this).defaultBlockState(), Block.UPDATE_ALL); + } + } + + @Override + public boolean canBeReplaced(BlockState state, BlockPlaceContext context) { + int layers = state.getValue(LAYERS); + + if(layers == 8) { + return false; + } + if(context.getItemInHand().is(Blocks.SNOW.asItem())) { + if(layers == 0) { + return true; + } + else { + return context.getClickedFace() == Direction.UP; + } + } + return false; + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + BlockState state = ctx.getLevel().getBlockState(ctx.getClickedPos()); + if(state.is(Blocks.SNOW) || state.is(CommonWinterlyBlocks.FROZEN_GRASS)) { + return defaultBlockState().setValue(LAYERS, 1).setValue(PERSISTENT, true); + } + else { + return super.getStateForPlacement(ctx); + } + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(LAYERS); + builder.add(PERSISTENT); + } +} diff --git a/common/src/main/java/winterly/block/CommonFrozenGrassBlock.java b/common/src/main/java/winterly/block/CommonFrozenGrassBlock.java new file mode 100644 index 0000000..0f45c62 --- /dev/null +++ b/common/src/main/java/winterly/block/CommonFrozenGrassBlock.java @@ -0,0 +1,59 @@ +package winterly.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; + +public class CommonFrozenGrassBlock extends SnowLayerBlock { + public static final BooleanProperty PERSISTENT = BlockStateProperties.PERSISTENT; + + public CommonFrozenGrassBlock(Properties settings) { + super(settings); + this.registerDefaultState(this.stateDefinition.any().setValue(LAYERS, 1).setValue(PERSISTENT, false)); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(PERSISTENT); + } + + @Override + public boolean canBeReplaced(BlockState state, BlockPlaceContext context) { + int layers = state.getValue(LAYERS); + + if(layers == 8 || context.getItemInHand().is(this.asItem())) { + return false; + } + if(context.getItemInHand().is(Blocks.SNOW.asItem())) { + return context.getClickedFace() == Direction.UP; + } + + return layers == 1; + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { + if (world.getBrightness(LightLayer.BLOCK, pos) > 11) { + dropResources(state, world, pos); + world.setBlockAndUpdate(pos, Blocks.SHORT_GRASS.defaultBlockState()); + } + } + + @Override + public void destroy(LevelAccessor world, BlockPos pos, BlockState state) { + super.destroy(world, pos, state); + world.setBlock(pos, Blocks.SHORT_GRASS.defaultBlockState(), Block.UPDATE_ALL); + } +} diff --git a/common/src/main/java/winterly/block/GarlandLightsBlock.java b/common/src/main/java/winterly/block/GarlandLightsBlock.java new file mode 100644 index 0000000..7cc729c --- /dev/null +++ b/common/src/main/java/winterly/block/GarlandLightsBlock.java @@ -0,0 +1,81 @@ +package winterly.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; + +@SuppressWarnings("deprecation") +public class GarlandLightsBlock extends Block { + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; + + private static final VoxelShape EAST_SHAPE = box(0, 3, 0, 1, 13, 16); + private static final VoxelShape WEST_SHAPE = box(15, 3, 0, 16, 13, 16); + private static final VoxelShape SOUTH_SHAPE = box(0, 3, 0, 16, 13, 1); + private static final VoxelShape NORTH_SHAPE = box(0, 3, 15, 16, 13, 16); + + public GarlandLightsBlock(Properties settings) { + super(settings); + this.registerDefaultState(defaultBlockState().setValue(FACING, Direction.NORTH)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return switch (state.getValue(FACING)) { + case NORTH -> NORTH_SHAPE; + case SOUTH -> SOUTH_SHAPE; + case WEST -> WEST_SHAPE; + default -> EAST_SHAPE; + }; + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + Direction direction = state.getValue(FACING); + return this.canPlaceOn(world, pos.relative(direction.getOpposite())); + } + + private boolean canPlaceOn(BlockGetter world, BlockPos pos) { + BlockState state = world.getBlockState(pos); + return !state.isAir(); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + if (!ctx.replacingClickedOnBlock()) { + BlockState state = ctx.getLevel().getBlockState(ctx.getClickedPos().relative(ctx.getClickedFace().getOpposite())); + if (state.is(this) && state.getValue(FACING) == ctx.getClickedFace()) { + return null; + } + } + + BlockState state = this.defaultBlockState(); + LevelReader world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + + for(Direction direction : ctx.getNearestLookingDirections()) { + if (direction.getAxis().isHorizontal()) { + state = state.setValue(FACING, direction.getOpposite()); + if (state.canSurvive(world, pos)) { + return state; + } + } + } + return null; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } +} diff --git a/common/src/main/java/winterly/block/GiftBoxBlock.java b/common/src/main/java/winterly/block/GiftBoxBlock.java new file mode 100644 index 0000000..2dea296 --- /dev/null +++ b/common/src/main/java/winterly/block/GiftBoxBlock.java @@ -0,0 +1,140 @@ +package winterly.block; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.locale.Language; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +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.ShulkerBoxBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; +import winterly.Winterly; +import winterly.block.entity.GiftBoxBlockEntity; +import winterly.block.entity.GiftBoxBlockEntityData; +import winterly.data.GiftBoxData; + +import java.util.List; + +@SuppressWarnings("deprecation") +public class GiftBoxBlock extends Block implements EntityBlock { + public static final VoxelShape SHAPE = box(4, 0, 4, 12, 8, 12); + + public GiftBoxBlock(Properties settings) { + super(settings); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { + return new GiftBoxBlockEntity(pos, state); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return GiftBoxBlock.SHAPE; + } + + @Override + public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { + super.setPlacedBy(world, pos, state, placer, stack); + + if(world.getBlockEntity(pos) instanceof GiftBoxBlockEntityData entity) { + entity.load(stack.getOrCreateTag()); + } + } + + @Override + public BlockState playerWillDestroy(Level world, BlockPos pos, BlockState state, Player player) { + super.playerWillDestroy(world, pos, state, player); + + if(!world.isClientSide && world.getBlockEntity(pos) instanceof GiftBoxBlockEntityData entity) { + ItemStack stack = player.getItemInHand(InteractionHand.MAIN_HAND); + if(!EnchantmentHelper.getEnchantments(stack).containsKey(Enchantments.SILK_TOUCH)) { + if(entity.getStacks().isEmpty()) { + popResource(world, pos, new ItemStack(this.asItem())); + } + else { + entity.getStacks().forEach(st -> popResource(world, pos, st)); + } + } + else { + ItemStack box = new ItemStack(this); + + if(!entity.getStacks().isEmpty()) { + var nbt = new CompoundTag(); + entity.saveAdditional(nbt); + box.setTag(nbt); + } + popResource(world, pos, box); + } + } + return state; + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if(!world.isClientSide && world.getBlockEntity(pos) instanceof GiftBoxBlockEntityData entity) { + var stack = player.getItemInHand(hand); + + if(!stack.isEmpty() && entity.getStacks().size() < Winterly.config.getGiftBoxCapacity()) { + if(stack.getItem() instanceof BlockItem blockItem) { + if(blockItem.getBlock() instanceof ShulkerBoxBlock || blockItem.getBlock() instanceof GiftBoxBlock) { + return InteractionResult.PASS; + } + } + entity.getStacks().add(stack.copy()); + player.setItemInHand(hand, ItemStack.EMPTY); + world.playSound(null, pos, SoundEvents.BUNDLE_INSERT, SoundSource.BLOCKS, 1, 1); + return InteractionResult.SUCCESS; + } + } + return super.use(state, world, pos, player, hand, hit); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable BlockGetter world, List tooltip, TooltipFlag options) { + super.appendHoverText(stack, world, tooltip, options); + + if(stack.getOrCreateTag().contains("giftBoxData")) { + var gift = GiftBoxData.fromNbt(stack.getOrCreateTag().getCompound("giftBoxData")); + + gift.stacks.forEach(st -> { + String name = Language.getInstance().getOrDefault(st.getDescriptionId()); + tooltip.add(Component.nullToEmpty("- " + name + " x" + st.getCount()).toFlatList(Style.EMPTY.withColor(ChatFormatting.GRAY)).get(0)); + }); + } + else { + Language lang = Language.getInstance(); + String key = "description.winterly.gift_box."; + + for(int i = 0; i <= 32; i++) { + if(lang.has(key + i)) { + tooltip.add(Component.translatable(key + i).toFlatList(Style.EMPTY.withColor(ChatFormatting.GRAY)).get(0)); + } + if(!lang.has(key + (i + 1))) { + break; + } + } + } + } +} diff --git a/common/src/main/java/winterly/block/IcicleBlock.java b/common/src/main/java/winterly/block/IcicleBlock.java new file mode 100644 index 0000000..b7d9703 --- /dev/null +++ b/common/src/main/java/winterly/block/IcicleBlock.java @@ -0,0 +1,120 @@ +package winterly.block; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.LevelAccessor; +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.block.Mirror; +import net.minecraft.world.level.block.Rotation; +import net.minecraft.world.level.block.SimpleWaterloggedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; +import winterly.registry.CommonWinterlyBlocks; + +import java.util.List; + +@SuppressWarnings("deprecation") +public class IcicleBlock extends Block implements SimpleWaterloggedBlock { + public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; + public static final DirectionProperty FACING = BlockStateProperties.FACING; + + public static final VoxelShape NORTH_SHAPE = box(3, 3, 9, 13, 13, 16); + public static final VoxelShape SOUTH_SHAPE = box(3, 3, 0, 13, 13, 7); + public static final VoxelShape EAST_SHAPE = box(0, 3, 3, 7, 13, 13); + public static final VoxelShape WEST_SHAPE = box(13, 3, 3, 16, 13, 13); + public static final VoxelShape UP_SHAPE = box(3, 0, 3, 13, 7, 13); + public static final VoxelShape DOWN_SHAPE = box(3, 9, 3, 13, 16, 13); + + public IcicleBlock(Properties settings) { + super(settings); + this.registerDefaultState(this.defaultBlockState().setValue(WATERLOGGED, Boolean.FALSE).setValue(FACING, Direction.DOWN)); + } + + @Override + public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { + Direction direction = state.getValue(FACING); + BlockPos blockPos = pos.relative(direction.getOpposite()); + BlockState blockState = world.getBlockState(blockPos); + return !blockState.isAir() && !blockState.is(this); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + Direction direction = state.getValue(FACING); + return switch (direction) { + case NORTH -> NORTH_SHAPE; + case SOUTH -> SOUTH_SHAPE; + case EAST -> EAST_SHAPE; + case WEST -> WEST_SHAPE; + case DOWN -> DOWN_SHAPE; + default -> UP_SHAPE; + }; + } + + @Override + public BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { + if (state.getValue(WATERLOGGED)) { + world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + } + return direction == state.getValue(FACING).getOpposite() && !state.canSurvive(world, pos) + ? Blocks.AIR.defaultBlockState() + : super.updateShape(state, direction, neighborState, world, pos, neighborPos); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + LevelAccessor world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + return this.defaultBlockState() + .setValue(WATERLOGGED, world.getFluidState(pos).getType() == Fluids.WATER) + .setValue(FACING, ctx.getClickedFace()); + } + + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); + } + + @Override + public FluidState getFluidState(BlockState state) { + return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(WATERLOGGED, FACING); + } + + @Environment(EnvType.CLIENT) + @Override + public void appendHoverText(ItemStack stack, @Nullable BlockGetter world, List tooltip, TooltipFlag options) { + if(this.equals(CommonWinterlyBlocks.ICICLE)) { + tooltip.add(Component.translatable("tag.winterly.placeable").withStyle(ChatFormatting.GRAY)); + } + super.appendHoverText(stack, world, tooltip, options); + } +} diff --git a/common/src/main/java/winterly/block/SnowballWallBlock.java b/common/src/main/java/winterly/block/SnowballWallBlock.java new file mode 100644 index 0000000..b4d179b --- /dev/null +++ b/common/src/main/java/winterly/block/SnowballWallBlock.java @@ -0,0 +1,41 @@ +package winterly.block; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; + +@SuppressWarnings("deprecation") +public class SnowballWallBlock extends HorizontalDirectionalBlock { + private static final VoxelShape SHAPE = box(4, 0, 4, 12, 12, 12); + + public SnowballWallBlock(Properties settings) { + super(settings); + } + + @Override + protected MapCodec codec() { + return null; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } +} diff --git a/common/src/main/java/winterly/block/SnowguyBlock.java b/common/src/main/java/winterly/block/SnowguyBlock.java new file mode 100644 index 0000000..b323b11 --- /dev/null +++ b/common/src/main/java/winterly/block/SnowguyBlock.java @@ -0,0 +1,57 @@ +package winterly.block; + +import com.mojang.serialization.MapCodec; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.HorizontalDirectionalBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +@SuppressWarnings("deprecation") +public class SnowguyBlock extends HorizontalDirectionalBlock { + public static final VoxelShape SHAPE = box(4, 0, 4, 12, 14, 12); + + public SnowguyBlock(Properties settings) { + super(settings); + } + + @Override + protected MapCodec codec() { + return null; + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) { + return SHAPE; + } + + @Override + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + builder.add(FACING); + } + + @Environment(EnvType.CLIENT) + @Override + public void appendHoverText(ItemStack stack, @Nullable BlockGetter world, List tooltip, TooltipFlag options) { + tooltip.add(Component.translatable("tag.winterly.placeable").withStyle(ChatFormatting.GRAY)); + super.appendHoverText(stack, world, tooltip, options); + } +} diff --git a/common/src/main/java/winterly/block/base/BasePaneBlock.java b/common/src/main/java/winterly/block/base/BasePaneBlock.java new file mode 100644 index 0000000..d736ad8 --- /dev/null +++ b/common/src/main/java/winterly/block/base/BasePaneBlock.java @@ -0,0 +1,10 @@ +package winterly.block.base; + +import net.minecraft.world.level.block.IronBarsBlock; + +public class BasePaneBlock extends IronBarsBlock { + + public BasePaneBlock(Properties settings) { + super(settings); + } +} diff --git a/common/src/main/java/winterly/block/base/BaseStairsBlock.java b/common/src/main/java/winterly/block/base/BaseStairsBlock.java new file mode 100644 index 0000000..9baa8b2 --- /dev/null +++ b/common/src/main/java/winterly/block/base/BaseStairsBlock.java @@ -0,0 +1,11 @@ +package winterly.block.base; + +import net.minecraft.world.level.block.StairBlock; +import net.minecraft.world.level.block.state.BlockState; + +public class BaseStairsBlock extends StairBlock { + + public BaseStairsBlock(BlockState base, Properties settings) { + super(base, settings); + } +} diff --git a/common/src/main/java/winterly/block/entity/GiftBoxBlockEntity.java b/common/src/main/java/winterly/block/entity/GiftBoxBlockEntity.java new file mode 100644 index 0000000..ed2acac --- /dev/null +++ b/common/src/main/java/winterly/block/entity/GiftBoxBlockEntity.java @@ -0,0 +1,38 @@ +package winterly.block.entity; + +import winterly.data.GiftBoxData; +import winterly.registry.CommonWinterlyBlockEntities; + +import java.util.ArrayList; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public class GiftBoxBlockEntity extends BlockEntity implements GiftBoxBlockEntityData { + public ArrayList stacks = new ArrayList<>(); + + public GiftBoxBlockEntity(BlockPos pos, BlockState state) { + super(CommonWinterlyBlockEntities.GIFT_BOX_BLOCK_ENTITY, pos, state); + } + + @Override + public ArrayList getStacks() { + return this.stacks; + } + + @Override + public void saveAdditional(CompoundTag nbt) { + super.saveAdditional(nbt); + nbt.put("giftBoxData", GiftBoxData.toNbt(this)); + } + + @Override + public void load(CompoundTag nbt) { + super.load(nbt); + var data = GiftBoxData.fromNbt(nbt.getCompound("giftBoxData")); + this.stacks = data.stacks; + } + +} diff --git a/common/src/main/java/winterly/block/entity/GiftBoxBlockEntityData.java b/common/src/main/java/winterly/block/entity/GiftBoxBlockEntityData.java new file mode 100644 index 0000000..3fe98e6 --- /dev/null +++ b/common/src/main/java/winterly/block/entity/GiftBoxBlockEntityData.java @@ -0,0 +1,12 @@ +package winterly.block.entity; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; + +public interface GiftBoxBlockEntityData { + ArrayList getStacks(); + void saveAdditional(CompoundTag nbt); + void load(CompoundTag nbt); +} diff --git a/common/src/main/java/winterly/client/WinterlyModelLayers.java b/common/src/main/java/winterly/client/WinterlyModelLayers.java new file mode 100644 index 0000000..6a8ecc4 --- /dev/null +++ b/common/src/main/java/winterly/client/WinterlyModelLayers.java @@ -0,0 +1,14 @@ +package winterly.client; + +import net.minecraft.client.model.geom.ModelLayerLocation; + +import static winterly.Winterly.id; + +public class WinterlyModelLayers { + public static final ModelLayerLocation SANTA_HAT_LAYER = of("santa_hat"); + public static final ModelLayerLocation SCARF_LAYER = of("scarf"); + + private static ModelLayerLocation of(String name){ + return new ModelLayerLocation(id(name), "main"); + } +} diff --git a/common/src/main/java/winterly/client/model/SantaHatModel.java b/common/src/main/java/winterly/client/model/SantaHatModel.java new file mode 100644 index 0000000..a80a600 --- /dev/null +++ b/common/src/main/java/winterly/client/model/SantaHatModel.java @@ -0,0 +1,40 @@ +package winterly.client.model; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.*; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.model.geom.PartPose; +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; +import net.minecraft.client.renderer.RenderType; + +public class SantaHatModel extends Model { + public final ModelPart hat; + + public SantaHatModel(ModelPart root) { + super(RenderType::entityCutoutNoCull); + this.hat = root.getChild("hat"); + } + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition hat = modelPartData.addOrReplaceChild("hat", CubeListBuilder.create().texOffs(27, 14).addBox(-4.0F, -8.0F, 7.0F, 3.0F, 3.0F, 3.0F), PartPose.offset(0.0F, 24.0F, 0.0F)); + + hat.addOrReplaceChild("cube_1", CubeListBuilder.create().texOffs(0, 27).addBox(-3.0F, -5.0F, 0.0F, 6.0F, 4.0F, 8.0F), PartPose.offsetAndRotation(0.0F, -8.0F, 0.0F, -0.3491F, 0.0F, 0.0F)); + hat.addOrReplaceChild("cube_2", CubeListBuilder.create().texOffs(0, 14).addBox(-4.5F, -3.0F, -3.5F, 9.0F, 4.0F, 9.0F), PartPose.offsetAndRotation(0.0F, -8.0F, 0.0F, -0.5236F, 0.0F, 0.0F)); + hat.addOrReplaceChild("cube_3", CubeListBuilder.create().texOffs(0, 0).addBox(-5.5F, 0.0F, -4.5F, 11.0F, 3.0F, 11.0F), PartPose.offsetAndRotation(0.0F, -8.0F, 0.0F, -0.2618F, 0.0F, 0.0F)); + + return LayerDefinition.create(modelData, 64, 64); + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float r, float g, float b, float a) { + ImmutableList.of(this.hat).forEach((part) -> part.render(matrices, vertices, light, overlay, r, g, b, a)); + } +} diff --git a/common/src/main/java/winterly/client/model/ScarfModel.java b/common/src/main/java/winterly/client/model/ScarfModel.java new file mode 100644 index 0000000..40ff91e --- /dev/null +++ b/common/src/main/java/winterly/client/model/ScarfModel.java @@ -0,0 +1,39 @@ +package winterly.client.model; + +import com.google.common.collect.ImmutableList; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.*; +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; +import net.minecraft.client.renderer.RenderType; + +public class ScarfModel extends Model { + public final ModelPart scarf; + + public ScarfModel(ModelPart root) { + super(RenderType::entityCutoutNoCull); + this.scarf = root.getChild("scarf"); + } + + public static LayerDefinition getTexturedModelData() { + MeshDefinition modelData = new MeshDefinition(); + PartDefinition modelPartData = modelData.getRoot(); + + PartDefinition scarf = modelPartData.addOrReplaceChild("scarf", CubeListBuilder.create().texOffs(0, 0).addBox(-5.0F, -1.0F, -5.0F, 10.0F, 3.0F, 10.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); + scarf.addOrReplaceChild("back_hanger", CubeListBuilder.create().texOffs(0, 13).addBox(-5.0F, 3.0F, 3.0F, 5.0F, 16.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.rotation(0.3491F, 0.0F, 0.0F)); + scarf.addOrReplaceChild("front_hanger", CubeListBuilder.create().texOffs(0, 13).addBox(-1.0F, 2.0F, -4.0F, 5.0F, 16.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.rotation(0.0F, -0.2618F, 0.0F)); + + return LayerDefinition.create(modelData, 64, 64); + } + + @Override + public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, float r, float g, float b, float a) { + ImmutableList.of(this.scarf).forEach((part) -> part.render(matrices, vertices, light, overlay, r, g, b, a)); + } +} diff --git a/src/main/java/winterly/client/model/WinterlyModels.java b/common/src/main/java/winterly/client/model/WinterlyModels.java similarity index 53% rename from src/main/java/winterly/client/model/WinterlyModels.java rename to common/src/main/java/winterly/client/model/WinterlyModels.java index 9103190..f41c51b 100644 --- a/src/main/java/winterly/client/model/WinterlyModels.java +++ b/common/src/main/java/winterly/client/model/WinterlyModels.java @@ -1,15 +1,15 @@ package winterly.client.model; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.EntityModelLayer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.model.geom.ModelPart; import winterly.client.WinterlyModelLayers; public class WinterlyModels { public static final ScarfModel SCARF_MODEL = new ScarfModel(getModelPart(WinterlyModelLayers.SCARF_LAYER)); public static final SantaHatModel SANTA_HAT_MODEL = new SantaHatModel(getModelPart(WinterlyModelLayers.SANTA_HAT_LAYER)); - public static ModelPart getModelPart(EntityModelLayer layer){ - return MinecraftClient.getInstance().getEntityModelLoader().getModelPart(layer); + public static ModelPart getModelPart(ModelLayerLocation layer){ + return Minecraft.getInstance().getEntityModels().bakeLayer(layer); } } diff --git a/common/src/main/java/winterly/client/render/DecorationFeatureRenderer.java b/common/src/main/java/winterly/client/render/DecorationFeatureRenderer.java new file mode 100644 index 0000000..b0f1636 --- /dev/null +++ b/common/src/main/java/winterly/client/render/DecorationFeatureRenderer.java @@ -0,0 +1,26 @@ +package winterly.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.entity.LivingEntity; +import winterly.extension.DecoratedMob; + +public class DecorationFeatureRenderer> extends RenderLayer { + + public DecorationFeatureRenderer(RenderLayerParent context) { + super(context); + } + + @Override + public void render(PoseStack matrices, MultiBufferSource vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + if(entity instanceof DecoratedMob decorated) { + if(decorated.winterly$decorated()) { + MobDecorationRenderer renderer = MobDecorationRenderers.getRenderer(decorated.winterly$getIndex()); + renderer.render(this.getParentModel(), matrices, vertexConsumers, light, entity, limbAngle, limbDistance, tickDelta, animationProgress, headYaw, headPitch); + } + } + } +} diff --git a/common/src/main/java/winterly/client/render/MobDecorationRenderer.java b/common/src/main/java/winterly/client/render/MobDecorationRenderer.java new file mode 100644 index 0000000..211b690 --- /dev/null +++ b/common/src/main/java/winterly/client/render/MobDecorationRenderer.java @@ -0,0 +1,16 @@ +package winterly.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.world.entity.LivingEntity; + +public abstract class MobDecorationRenderer { + public final String texture; + + public MobDecorationRenderer(String texture) { + this.texture = texture; + } + + abstract public void render(HumanoidModel contextModel, PoseStack matrices, MultiBufferSource vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch); +} diff --git a/src/main/java/winterly/client/render/MobDecorationRenderers.java b/common/src/main/java/winterly/client/render/MobDecorationRenderers.java similarity index 100% rename from src/main/java/winterly/client/render/MobDecorationRenderers.java rename to common/src/main/java/winterly/client/render/MobDecorationRenderers.java diff --git a/common/src/main/java/winterly/client/render/SantaHatRenderer.java b/common/src/main/java/winterly/client/render/SantaHatRenderer.java new file mode 100644 index 0000000..40a9ddd --- /dev/null +++ b/common/src/main/java/winterly/client/render/SantaHatRenderer.java @@ -0,0 +1,25 @@ +package winterly.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import winterly.Winterly; +import winterly.client.model.WinterlyModels; + +public class SantaHatRenderer extends MobDecorationRenderer { + + public SantaHatRenderer(String texture) { + super(texture); + } + + @Override + public void render(HumanoidModel contextModel, PoseStack matrices, MultiBufferSource vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + WinterlyModels.SANTA_HAT_MODEL.hat.copyFrom(contextModel.head); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderType.entityCutout(Winterly.id("textures/entity/" + texture + ".png"))); + WinterlyModels.SANTA_HAT_MODEL.renderToBuffer(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } +} diff --git a/common/src/main/java/winterly/client/render/ScarfRenderer.java b/common/src/main/java/winterly/client/render/ScarfRenderer.java new file mode 100644 index 0000000..48c597d --- /dev/null +++ b/common/src/main/java/winterly/client/render/ScarfRenderer.java @@ -0,0 +1,25 @@ +package winterly.client.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import winterly.Winterly; +import winterly.client.model.WinterlyModels; + +public class ScarfRenderer extends MobDecorationRenderer { + + public ScarfRenderer(String texture) { + super(texture); + } + + @Override + public void render(HumanoidModel contextModel, PoseStack matrices, MultiBufferSource vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + WinterlyModels.SCARF_MODEL.scarf.copyFrom(contextModel.body); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderType.entityCutout(Winterly.id("textures/entity/" + texture + ".png"))); + WinterlyModels.SCARF_MODEL.renderToBuffer(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } +} diff --git a/src/main/java/winterly/config/WinterlyClientConfig.java b/common/src/main/java/winterly/config/WinterlyClientConfig.java similarity index 86% rename from src/main/java/winterly/config/WinterlyClientConfig.java rename to common/src/main/java/winterly/config/WinterlyClientConfig.java index b752e15..e09e985 100644 --- a/src/main/java/winterly/config/WinterlyClientConfig.java +++ b/common/src/main/java/winterly/config/WinterlyClientConfig.java @@ -6,8 +6,8 @@ import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.text.Text; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; import winterly.Winterly; @Environment(EnvType.CLIENT) @@ -30,10 +30,10 @@ public static void setupEntries(ConfigCategory category, ConfigEntryBuilder buil .setSaveConsumer(newValue -> config.maxGiftBoxCapacity = newValue) .build()); - category.addEntry(builder.startBooleanToggle(text("option.update_checker_enabled"), config.updateCheckerEnabled) - .setDefaultValue(true) - .setSaveConsumer(newValue -> config.updateCheckerEnabled = newValue) - .build()); +// category.addEntry(builder.startBooleanToggle(text("option.update_checker_enabled"), config.updateCheckerEnabled) +// .setDefaultValue(true) +// .setSaveConsumer(newValue -> config.updateCheckerEnabled = newValue) +// .build()); category.addEntry(builder.startBooleanToggle(text("option.generate_underground_icicles"), config.generateUndergroundIcicles) .setDefaultValue(true) @@ -56,7 +56,7 @@ public static void setupEntries(ConfigCategory category, ConfigEntryBuilder buil .build()); category.addEntry(builder.startBooleanToggle(text("option.mob_decorations.enabled"), config.mobDecorations.enabled) - .setDefaultValue(false) + .setDefaultValue(true) .setSaveConsumer(newValue -> config.mobDecorations.enabled = newValue) .build()); @@ -71,7 +71,7 @@ public static void setupEntries(ConfigCategory category, ConfigEntryBuilder buil .build()); } - private static Text text(String key) { - return Text.translatable("config.winterly." + key); + private static Component text(String key) { + return Component.translatable("config.winterly." + key); } } diff --git a/src/main/java/winterly/config/WinterlyClothConfig.java b/common/src/main/java/winterly/config/WinterlyClothConfig.java similarity index 100% rename from src/main/java/winterly/config/WinterlyClothConfig.java rename to common/src/main/java/winterly/config/WinterlyClothConfig.java diff --git a/src/main/java/winterly/config/WinterlyConfig.java b/common/src/main/java/winterly/config/WinterlyConfig.java similarity index 93% rename from src/main/java/winterly/config/WinterlyConfig.java rename to common/src/main/java/winterly/config/WinterlyConfig.java index 6dc1233..f93275b 100644 --- a/src/main/java/winterly/config/WinterlyConfig.java +++ b/common/src/main/java/winterly/config/WinterlyConfig.java @@ -14,7 +14,7 @@ public int getGiftBoxCapacity() { } public static class MobDecorationsConfig { - public boolean enabled = false; + public boolean enabled = true; public boolean onlyInWinter = true; public int chance = 15; } diff --git a/common/src/main/java/winterly/data/CachedFlowers.java b/common/src/main/java/winterly/data/CachedFlowers.java new file mode 100644 index 0000000..f6d316d --- /dev/null +++ b/common/src/main/java/winterly/data/CachedFlowers.java @@ -0,0 +1,49 @@ +package winterly.data; + +import org.jetbrains.annotations.Nullable; + +import java.util.LinkedHashMap; +import java.util.Map; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; + +public class CachedFlowers { + public static CachedFlowers instance = new CachedFlowers(); + + public Map, Map> data = new LinkedHashMap<>(); + + public static Block getFlower(Level world, BlockPos pos) { + return instance.getFlowerImpl(world, pos); + } + + @Nullable + public Block getFlowerImpl(Level world, BlockPos pos) { + var map = data.get(world.dimension()); + if(map != null) { + return map.get(pos); + } + else { + var newMap = new LinkedHashMap(); + data.put(world.dimension(), newMap); + return null; + } + } + + public static void cacheFlower(Level world, BlockPos pos, Block flower) { + instance.cacheFlowerImpl(world, pos, flower); + } + + public void cacheFlowerImpl(Level world, BlockPos pos, Block flower) { + var map = data.get(world.dimension()); + if(map != null) { + map.put(pos, flower); + } + else { + var newMap = new LinkedHashMap(); + newMap.put(pos, flower); + data.put(world.dimension(), newMap); + } + } +} diff --git a/common/src/main/java/winterly/data/GiftBoxData.java b/common/src/main/java/winterly/data/GiftBoxData.java new file mode 100644 index 0000000..307c44f --- /dev/null +++ b/common/src/main/java/winterly/data/GiftBoxData.java @@ -0,0 +1,48 @@ +package winterly.data; + +import winterly.block.entity.GiftBoxBlockEntity; + +import java.util.ArrayList; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import winterly.block.entity.GiftBoxBlockEntityData; + +public class GiftBoxData { + public ArrayList stacks = new ArrayList<>(); + + public static GiftBoxData fromNbt(CompoundTag nbt) { + GiftBoxData gift = new GiftBoxData(); + + int size = nbt.getInt("size"); + for(int i = 0; i < size; i++) { + CompoundTag entryNbt = nbt.getCompound(String.valueOf(i)); + + var item = BuiltInRegistries.ITEM.getOptional(new ResourceLocation(entryNbt.getString("item"))); + if(item.isPresent()) { + ItemStack temp = new ItemStack(item.get(), entryNbt.getInt("count")); + temp.setTag((CompoundTag)entryNbt.get("nbt")); + gift.stacks.add(temp); + } + } + + return gift; + } + + public static CompoundTag toNbt(GiftBoxBlockEntityData entity) { + CompoundTag nbt = new CompoundTag(); + nbt.putInt("size", entity.getStacks().size()); + + for(int i = 0; i < entity.getStacks().size(); i++) { + ItemStack stack = entity.getStacks().get(i); + CompoundTag entryNbt = new CompoundTag(); + entryNbt.putString("item", BuiltInRegistries.ITEM.getKey(stack.getItem()).toString()); + entryNbt.put("nbt", stack.getOrCreateTag()); + entryNbt.putInt("count", stack.getCount()); + + nbt.put(Integer.toString(i), entryNbt); + } + return nbt; + } +} diff --git a/src/main/java/winterly/extension/DecoratedMob.java b/common/src/main/java/winterly/extension/DecoratedMob.java similarity index 100% rename from src/main/java/winterly/extension/DecoratedMob.java rename to common/src/main/java/winterly/extension/DecoratedMob.java diff --git a/common/src/main/java/winterly/item/CommonSantaHatItem.java b/common/src/main/java/winterly/item/CommonSantaHatItem.java new file mode 100644 index 0000000..cb92187 --- /dev/null +++ b/common/src/main/java/winterly/item/CommonSantaHatItem.java @@ -0,0 +1,29 @@ +package winterly.item; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import java.util.List; + +public class CommonSantaHatItem extends Item { + public final String color; + + public CommonSantaHatItem(Item.Properties settings, String color) { + super(settings); + this.color = color; + } + + @Environment(EnvType.CLIENT) + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { + tooltip.add(Component.translatable("tag.winterly.cosmetic").withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.nullToEmpty(" ")); + super.appendHoverText(stack, world, tooltip, context); + } +} diff --git a/common/src/main/java/winterly/item/CommonScarfItem.java b/common/src/main/java/winterly/item/CommonScarfItem.java new file mode 100644 index 0000000..93e6bdc --- /dev/null +++ b/common/src/main/java/winterly/item/CommonScarfItem.java @@ -0,0 +1,30 @@ +package winterly.item; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class CommonScarfItem extends Item { + public final String color; + + public CommonScarfItem(Item.Properties settings, String color) { + super(settings); + this.color = color; + } + + @Environment(EnvType.CLIENT) + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { + tooltip.add(Component.translatable("tag.winterly.cosmetic").withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.nullToEmpty(" ")); + super.appendHoverText(stack, world, tooltip, context); + } +} diff --git a/common/src/main/java/winterly/item/tool/CryomarbleAxeItem.java b/common/src/main/java/winterly/item/tool/CryomarbleAxeItem.java new file mode 100644 index 0000000..3f51116 --- /dev/null +++ b/common/src/main/java/winterly/item/tool/CryomarbleAxeItem.java @@ -0,0 +1,22 @@ +package winterly.item.tool; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.AxeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; + +public class CryomarbleAxeItem extends AxeItem { + + public CryomarbleAxeItem(Tier material, float attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 0)); + return super.hurtEnemy(stack, target, attacker); + } +} + diff --git a/common/src/main/java/winterly/item/tool/CryomarbleHoeItem.java b/common/src/main/java/winterly/item/tool/CryomarbleHoeItem.java new file mode 100644 index 0000000..ca1c653 --- /dev/null +++ b/common/src/main/java/winterly/item/tool/CryomarbleHoeItem.java @@ -0,0 +1,21 @@ +package winterly.item.tool; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.HoeItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; + +public class CryomarbleHoeItem extends HoeItem { + + public CryomarbleHoeItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 0)); + return super.hurtEnemy(stack, target, attacker); + } +} diff --git a/common/src/main/java/winterly/item/tool/CryomarblePickaxeItem.java b/common/src/main/java/winterly/item/tool/CryomarblePickaxeItem.java new file mode 100644 index 0000000..f5d7504 --- /dev/null +++ b/common/src/main/java/winterly/item/tool/CryomarblePickaxeItem.java @@ -0,0 +1,22 @@ +package winterly.item.tool; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.PickaxeItem; +import net.minecraft.world.item.Tier; + +public class CryomarblePickaxeItem extends PickaxeItem { + + public CryomarblePickaxeItem(Tier material, int attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 0)); + return super.hurtEnemy(stack, target, attacker); + } +} + diff --git a/common/src/main/java/winterly/item/tool/CryomarbleShovelItem.java b/common/src/main/java/winterly/item/tool/CryomarbleShovelItem.java new file mode 100644 index 0000000..d1ef523 --- /dev/null +++ b/common/src/main/java/winterly/item/tool/CryomarbleShovelItem.java @@ -0,0 +1,22 @@ +package winterly.item.tool; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ShovelItem; +import net.minecraft.world.item.Tier; + +public class CryomarbleShovelItem extends ShovelItem { + + public CryomarbleShovelItem(Tier material, float attackDamage, float attackSpeed, Properties settings) { + super(material, attackDamage, attackSpeed, settings); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 0)); + return super.hurtEnemy(stack, target, attacker); + } +} + diff --git a/common/src/main/java/winterly/item/tool/CryomarbleSwordItem.java b/common/src/main/java/winterly/item/tool/CryomarbleSwordItem.java new file mode 100644 index 0000000..58478d6 --- /dev/null +++ b/common/src/main/java/winterly/item/tool/CryomarbleSwordItem.java @@ -0,0 +1,21 @@ +package winterly.item.tool; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.Tier; + +public class CryomarbleSwordItem extends SwordItem { + + public CryomarbleSwordItem(Tier toolMaterial, int attackDamage, float attackSpeed, Properties settings) { + super(toolMaterial, attackDamage, attackSpeed, settings); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + target.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, 60, 0)); + return super.hurtEnemy(stack, target, attacker); + } +} diff --git a/src/main/java/winterly/mixin/WinterlyMixins.java b/common/src/main/java/winterly/mixin/WinterlyMixins.java similarity index 100% rename from src/main/java/winterly/mixin/WinterlyMixins.java rename to common/src/main/java/winterly/mixin/WinterlyMixins.java diff --git a/common/src/main/java/winterly/mixin/common/BlockStateMixin.java b/common/src/main/java/winterly/mixin/common/BlockStateMixin.java new file mode 100644 index 0000000..736efb1 --- /dev/null +++ b/common/src/main/java/winterly/mixin/common/BlockStateMixin.java @@ -0,0 +1,58 @@ +package winterly.mixin.common; + +import com.google.common.collect.ImmutableMap; +import com.mojang.serialization.MapCodec; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.StateHolder; +import net.minecraft.world.level.block.state.properties.Property; +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; +import winterly.block.CommonFrozenFlowerBlock; +import winterly.registry.CommonWinterlyBlocks; + +@Mixin(BlockBehaviour.BlockStateBase.class) +public abstract class BlockStateMixin extends StateHolder { + + protected BlockStateMixin(Block owner, ImmutableMap, Comparable> entries, MapCodec codec) { + super(owner, entries, codec); + } + + @Shadow + public abstract boolean is(Block block); + + @Shadow + @Final + private float destroySpeed; + + @Inject(method = "getDestroySpeed", at = @At("HEAD"), cancellable = true) + void getHardness(BlockGetter world, BlockPos pos, CallbackInfoReturnable cir) { + if(is(CommonWinterlyBlocks.FROZEN_FLOWER)) { + if(getValue(CommonFrozenFlowerBlock.LAYERS) == 0) { + cir.setReturnValue(0.0F); + } + else { + cir.setReturnValue(destroySpeed); + } + } + } + + @Inject(method = "requiresCorrectToolForDrops", at = @At("HEAD"), cancellable = true) + void isToolRequired(CallbackInfoReturnable cir) { + if(is(CommonWinterlyBlocks.FROZEN_FLOWER)) { + if(getValue(CommonFrozenFlowerBlock.LAYERS) == 0) { + cir.setReturnValue(false); + } + else { + cir.setReturnValue(true); + } + } + } +} diff --git a/common/src/main/java/winterly/mixin/common/FreezeTopLayerMixin.java b/common/src/main/java/winterly/mixin/common/FreezeTopLayerMixin.java new file mode 100644 index 0000000..a72472d --- /dev/null +++ b/common/src/main/java/winterly/mixin/common/FreezeTopLayerMixin.java @@ -0,0 +1,58 @@ +package winterly.mixin.common; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FlowerBlock; +import net.minecraft.world.level.block.SnowyDirtBlock; +import net.minecraft.world.level.block.TallFlowerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.SnowAndFreezeFeature; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import winterly.Winterly; +import winterly.block.CommonFrozenFlowerBlock; +import winterly.registry.CommonWinterlyBlocks; + +@Mixin(SnowAndFreezeFeature.class) +public abstract class FreezeTopLayerMixin { + + @Redirect(method = "place", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/biome/Biome;shouldSnow(Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;)Z")) + boolean canSetIce(Biome biome, LevelReader view, BlockPos pos) { + + if(!biome.warmEnoughToRain(pos) && (pos.getY() >= view.getMinBuildHeight() && pos.getY() < view.getMaxBuildHeight() && view.getBrightness(LightLayer.BLOCK, pos) < 10)) { + BlockState state = view.getBlockState(pos); + if(view instanceof WorldGenLevel world) { + + if (Winterly.config.generateFrozenGrass && (state.is(Blocks.SHORT_GRASS) || state.is(Blocks.FERN) || state.is(Blocks.LARGE_FERN) || state.is(Blocks.TALL_GRASS))) { + world.setBlock(pos, CommonWinterlyBlocks.FROZEN_GRASS.defaultBlockState(), 3); + BlockState floor = world.getBlockState(pos.below()); + if (floor.hasProperty(SnowyDirtBlock.SNOWY)) { + world.setBlock(pos.below(), floor.setValue(SnowyDirtBlock.SNOWY, Boolean.TRUE), 2); + } + if(state.is(Blocks.LARGE_FERN) || state.is(Blocks.TALL_GRASS)) { + world.setBlock(pos.above(), Blocks.AIR.defaultBlockState(), 2); + } + return false; + } + else if(Winterly.config.generateFrozenFlowers && (state.getBlock() instanceof FlowerBlock || state.getBlock() instanceof TallFlowerBlock)) { + world.setBlock(pos, CommonWinterlyBlocks.FROZEN_FLOWER.defaultBlockState().setValue(CommonFrozenFlowerBlock.LAYERS, 1), 3); + BlockState floor = world.getBlockState(pos.below()); + if (floor.hasProperty(SnowyDirtBlock.SNOWY)) { + world.setBlock(pos.below(), floor.setValue(SnowyDirtBlock.SNOWY, Boolean.TRUE), 2); + } + if(state.getBlock() instanceof TallFlowerBlock) { + world.setBlock(pos.above(), Blocks.AIR.defaultBlockState(), 2); + } + return false; + } + } + } + + return biome.shouldSnow(view, pos); + } +} diff --git a/common/src/main/java/winterly/mixin/common/MiningToolItemMixin.java b/common/src/main/java/winterly/mixin/common/MiningToolItemMixin.java new file mode 100644 index 0000000..8de4ae1 --- /dev/null +++ b/common/src/main/java/winterly/mixin/common/MiningToolItemMixin.java @@ -0,0 +1,56 @@ +package winterly.mixin.common; + +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.DiggerItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +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; +import winterly.block.CommonFrozenFlowerBlock; +import winterly.registry.CommonWinterlyBlocks; + +@Mixin(DiggerItem.class) +public abstract class MiningToolItemMixin { + + @Shadow + @Final + private TagKey blocks; + + @Shadow + @Final + protected float speed; + + @Inject(method = "isCorrectToolForDrops", at = @At("HEAD"), cancellable = true) + void isSuitableFor(BlockState state, CallbackInfoReturnable cir) { + if(blocks.equals(BlockTags.MINEABLE_WITH_SHOVEL)) { + if(state.is(CommonWinterlyBlocks.FROZEN_FLOWER)) { + if(state.getValue(CommonFrozenFlowerBlock.LAYERS) != 0) { + cir.setReturnValue(true); + } + else { + cir.setReturnValue(false); + } + } + } + } + + @Inject(method = "getDestroySpeed", at = @At("HEAD"), cancellable = true) + void getMiningSpeedMultiplier(ItemStack stack, BlockState state, CallbackInfoReturnable cir) { + if(blocks.equals(BlockTags.MINEABLE_WITH_SHOVEL)) { + if(state.is(CommonWinterlyBlocks.FROZEN_FLOWER)) { + if(state.getValue(CommonFrozenFlowerBlock.LAYERS) != 0) { + cir.setReturnValue(speed); + } + else { + cir.setReturnValue(1.0F); + } + } + } + } +} diff --git a/common/src/main/java/winterly/mixin/common/ServerWorldMixin.java b/common/src/main/java/winterly/mixin/common/ServerWorldMixin.java new file mode 100644 index 0000000..8e0aafd --- /dev/null +++ b/common/src/main/java/winterly/mixin/common/ServerWorldMixin.java @@ -0,0 +1,42 @@ +package winterly.mixin.common; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FlowerBlock; +import net.minecraft.world.level.block.state.BlockState; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import winterly.Winterly; +import winterly.block.CommonFrozenFlowerBlock; +import winterly.data.CachedFlowers; +import winterly.registry.CommonWinterlyBlocks; + +@Mixin(ServerLevel.class) +public abstract class ServerWorldMixin { + + @Redirect(method = "tickPrecipitation", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/biome/Biome;shouldSnow(Lnet/minecraft/world/level/LevelReader;Lnet/minecraft/core/BlockPos;)Z")) + boolean canSetSnow(Biome biome, LevelReader view, BlockPos pos) { + + if(!biome.warmEnoughToRain(pos) && (pos.getY() >= view.getMinBuildHeight() && pos.getY() < view.getMaxBuildHeight() && view.getBrightness(LightLayer.BLOCK, pos) < 10)) { + BlockState state = view.getBlockState(pos); + if(view instanceof Level world) { + if (state.is(Blocks.SHORT_GRASS) && Winterly.config.generateFrozenGrass) { + world.setBlockAndUpdate(pos, CommonWinterlyBlocks.FROZEN_GRASS.defaultBlockState()); + return false; + } + else if(state.getBlock() instanceof FlowerBlock && Winterly.config.generateFrozenFlowers) { + world.setBlockAndUpdate(pos, CommonWinterlyBlocks.FROZEN_FLOWER.defaultBlockState().setValue(CommonFrozenFlowerBlock.LAYERS, 1)); + CachedFlowers.cacheFlower(((Level) view), pos, state.getBlock()); + return false; + } + } + } + return biome.shouldSnow(view, pos); + } +} diff --git a/common/src/main/java/winterly/mixin/common/SkeletonExtension.java b/common/src/main/java/winterly/mixin/common/SkeletonExtension.java new file mode 100644 index 0000000..c1e7fe9 --- /dev/null +++ b/common/src/main/java/winterly/mixin/common/SkeletonExtension.java @@ -0,0 +1,77 @@ +package winterly.mixin.common; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.monster.AbstractSkeleton; +import net.minecraft.world.entity.monster.Skeleton; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +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; +import winterly.Winterly; +import winterly.extension.DecoratedMob; +import winterly.util.HolidayUtils; + +@Mixin(Skeleton.class) +public abstract class SkeletonExtension extends AbstractSkeleton implements DecoratedMob { + private static final EntityDataAccessor winterly$DECORATED = SynchedEntityData.defineId(Skeleton.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor winterly$INDEX = SynchedEntityData.defineId(Skeleton.class, EntityDataSerializers.INT); + + protected SkeletonExtension(EntityType entityType, Level world) { + super(entityType, world); + } + + @Override + public boolean winterly$decorated() { + return getEntityData().get(winterly$DECORATED); + } + + @Override + public int winterly$getIndex() { + return getEntityData().get(winterly$INDEX); + } + + @Inject(method = "defineSynchedData", at = @At("TAIL")) + void initData(CallbackInfo ci) { + getEntityData().define(winterly$DECORATED, false); + getEntityData().define(winterly$INDEX, 0); + } + + @Inject(method = "addAdditionalSaveData", at = @At("TAIL")) + void write(CompoundTag nbt, CallbackInfo ci) { + nbt.putBoolean("WinterlyDecorated", getEntityData().get(winterly$DECORATED)); + nbt.putInt("WinterlyIndex", getEntityData().get(winterly$INDEX)); + } + + @Inject(method = "readAdditionalSaveData", at = @At("TAIL")) + void read(CompoundTag nbt, CallbackInfo ci) { + getEntityData().set(winterly$DECORATED, nbt.getBoolean("WinterlyDecorated")); + getEntityData().set(winterly$INDEX, nbt.getInt("WinterlyIndex")); + } + + @Override + public SpawnGroupData finalizeSpawn(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityNbt){ + entityData = super.finalizeSpawn(world, difficulty, spawnReason, entityData, entityNbt); + if(!spawnReason.equals(MobSpawnType.SPAWNER) && !spawnReason.equals(MobSpawnType.CHUNK_GENERATION)) { + if(Winterly.config.mobDecorations.enabled && HolidayUtils.isWinterHolidays() || !Winterly.config.mobDecorations.onlyInWinter) { + if(!this.level().dimension().equals(Level.NETHER)) { + int chance = Winterly.config.mobDecorations.chance; + if(chance > 0 && Math.random() < (double)chance / 100) { + getEntityData().set(winterly$DECORATED, true); + getEntityData().set(winterly$INDEX, world.getRandom().nextInt(5)); + } + } + } + } + return entityData; + } + +} diff --git a/common/src/main/java/winterly/mixin/common/SnowBlockMixin.java b/common/src/main/java/winterly/mixin/common/SnowBlockMixin.java new file mode 100644 index 0000000..d49d53e --- /dev/null +++ b/common/src/main/java/winterly/mixin/common/SnowBlockMixin.java @@ -0,0 +1,37 @@ +package winterly.mixin.common; + +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FlowerBlock; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import winterly.block.CommonFrozenFlowerBlock; +import winterly.block.CommonFrozenGrassBlock; +import winterly.registry.CommonWinterlyBlocks; + +@Mixin(SnowLayerBlock.class) +public abstract class SnowBlockMixin { + + @Inject(method = "getStateForPlacement", at = @At("HEAD"), cancellable = true) + void getPlacementState(BlockPlaceContext ctx, CallbackInfoReturnable cir) { + BlockState state = ctx.getLevel().getBlockState(ctx.getClickedPos()); + if(state.is(CommonWinterlyBlocks.FROZEN_GRASS)) { + int layers = state.getValue(SnowLayerBlock.LAYERS); + cir.setReturnValue(state.setValue(SnowLayerBlock.LAYERS, Math.min(8, layers + 1)).setValue(CommonFrozenGrassBlock.PERSISTENT, true)); + } + else if(state.is(CommonWinterlyBlocks.FROZEN_FLOWER)) { + int layers = state.getValue(CommonFrozenFlowerBlock.LAYERS); + cir.setReturnValue(state.setValue(CommonFrozenFlowerBlock.LAYERS, Math.min(8, layers + 1)).setValue(CommonFrozenGrassBlock.PERSISTENT, true)); + } + else if(state.is(Blocks.SHORT_GRASS)) { + cir.setReturnValue(CommonWinterlyBlocks.FROZEN_GRASS.defaultBlockState().setValue(CommonFrozenGrassBlock.PERSISTENT, true)); + } + else if(state.getBlock() instanceof FlowerBlock) { + cir.setReturnValue(CommonWinterlyBlocks.FROZEN_FLOWER.defaultBlockState().setValue(CommonFrozenFlowerBlock.LAYERS, 1).setValue(CommonFrozenFlowerBlock.PERSISTENT, true)); + } + } +} diff --git a/src/main/java/winterly/mixin/common/SnowyBlockMixin.java b/common/src/main/java/winterly/mixin/common/SnowyBlockMixin.java similarity index 50% rename from src/main/java/winterly/mixin/common/SnowyBlockMixin.java rename to common/src/main/java/winterly/mixin/common/SnowyBlockMixin.java index c6b4b2f..a8df495 100644 --- a/src/main/java/winterly/mixin/common/SnowyBlockMixin.java +++ b/common/src/main/java/winterly/mixin/common/SnowyBlockMixin.java @@ -1,20 +1,20 @@ package winterly.mixin.common; -import net.minecraft.block.BlockState; -import net.minecraft.block.SnowyBlock; +import net.minecraft.world.level.block.SnowyDirtBlock; +import net.minecraft.world.level.block.state.BlockState; 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; -import winterly.block.FrozenFlowerBlock; -import winterly.registry.WinterlyBlocks; +import winterly.block.CommonFrozenFlowerBlock; +import winterly.registry.CommonWinterlyBlocks; -@Mixin(SnowyBlock.class) +@Mixin(SnowyDirtBlock.class) public abstract class SnowyBlockMixin { - @Inject(method = "isSnow", at = @At("HEAD"), cancellable = true) + @Inject(method = "isSnowySetting", at = @At("HEAD"), cancellable = true) private static void iSnow(BlockState state, CallbackInfoReturnable cir) { - if(state.isOf(WinterlyBlocks.FROZEN_FLOWER) && state.get(FrozenFlowerBlock.LAYERS) >= 1) { + if(state.is(CommonWinterlyBlocks.FROZEN_FLOWER) && state.getValue(CommonFrozenFlowerBlock.LAYERS) >= 1) { cir.setReturnValue(true); } } diff --git a/common/src/main/java/winterly/mixin/common/SpreadableBlockMixin.java b/common/src/main/java/winterly/mixin/common/SpreadableBlockMixin.java new file mode 100644 index 0000000..8b373c0 --- /dev/null +++ b/common/src/main/java/winterly/mixin/common/SpreadableBlockMixin.java @@ -0,0 +1,23 @@ +package winterly.mixin.common; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.SpreadingSnowyDirtBlock; +import net.minecraft.world.level.block.state.BlockState; +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; +import winterly.registry.CommonWinterlyBlocks; + +@Mixin(SpreadingSnowyDirtBlock.class) +public abstract class SpreadableBlockMixin { + + @Inject(method = "canBeGrass", at = @At("HEAD"), cancellable = true) + private static void canSurvive(BlockState state, LevelReader world, BlockPos pos, CallbackInfoReturnable cir) { + BlockState up = world.getBlockState(pos.above()); + if(up.is(CommonWinterlyBlocks.FROZEN_GRASS) || up.is(CommonWinterlyBlocks.FROZEN_FLOWER)) { + cir.setReturnValue(true); + } + } +} diff --git a/common/src/main/java/winterly/mixin/common/ZombieExtension.java b/common/src/main/java/winterly/mixin/common/ZombieExtension.java new file mode 100644 index 0000000..bf1b1d1 --- /dev/null +++ b/common/src/main/java/winterly/mixin/common/ZombieExtension.java @@ -0,0 +1,77 @@ +package winterly.mixin.common; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.Zombie; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.ServerLevelAccessor; +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; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import winterly.Winterly; +import winterly.extension.DecoratedMob; +import winterly.util.HolidayUtils; + +@Mixin(Zombie.class) +public abstract class ZombieExtension extends Monster implements DecoratedMob { + private static final EntityDataAccessor winterly$DECORATED = SynchedEntityData.defineId(Zombie.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor winterly$INDEX = SynchedEntityData.defineId(Zombie.class, EntityDataSerializers.INT); + + protected ZombieExtension(EntityType entityType, Level world) { + super(entityType, world); + } + + @Override + public boolean winterly$decorated() { + return getEntityData().get(winterly$DECORATED); + } + + @Override + public int winterly$getIndex() { + return getEntityData().get(winterly$INDEX); + } + + @Inject(method = "defineSynchedData", at = @At("TAIL")) + void initData(CallbackInfo ci) { + getEntityData().define(winterly$DECORATED, false); + getEntityData().define(winterly$INDEX, 0); + } + + @Inject(method = "addAdditionalSaveData", at = @At("TAIL")) + void write(CompoundTag nbt, CallbackInfo ci) { + nbt.putBoolean("WinterlyDecorated", getEntityData().get(winterly$DECORATED)); + nbt.putInt("WinterlyIndex", getEntityData().get(winterly$INDEX)); + } + + @Inject(method = "readAdditionalSaveData", at = @At("TAIL")) + void read(CompoundTag nbt, CallbackInfo ci) { + getEntityData().set(winterly$DECORATED, nbt.getBoolean("WinterlyDecorated")); + getEntityData().set(winterly$INDEX, nbt.getInt("WinterlyIndex")); + } + + @Inject(method = "finalizeSpawn", at = @At("RETURN")) + void initialize(ServerLevelAccessor world, DifficultyInstance difficulty, MobSpawnType spawnReason, SpawnGroupData entityData, CompoundTag entityNbt, CallbackInfoReturnable cir) { + if(!spawnReason.equals(MobSpawnType.SPAWNER) && !spawnReason.equals(MobSpawnType.CHUNK_GENERATION) && !isBaby()) { + if(Winterly.config.mobDecorations.enabled && HolidayUtils.isWinterHolidays() || !Winterly.config.mobDecorations.onlyInWinter) { + if(!this.level().dimension().equals(Level.NETHER)) { + int chance = Winterly.config.mobDecorations.chance; + if(chance > 0 && Math.random() < (double)chance / 100) { + getEntityData().set(winterly$DECORATED, true); + getEntityData().set(winterly$INDEX, world.getRandom().nextInt(5)); + } + } + + } + } + } + +} diff --git a/common/src/main/java/winterly/registry/CommonWinterlyBlockEntities.java b/common/src/main/java/winterly/registry/CommonWinterlyBlockEntities.java new file mode 100644 index 0000000..6655380 --- /dev/null +++ b/common/src/main/java/winterly/registry/CommonWinterlyBlockEntities.java @@ -0,0 +1,8 @@ +package winterly.registry; + +import net.minecraft.world.level.block.entity.BlockEntityType; +import winterly.block.entity.GiftBoxBlockEntity; + +public class CommonWinterlyBlockEntities { + public static BlockEntityType GIFT_BOX_BLOCK_ENTITY; +} diff --git a/common/src/main/java/winterly/registry/CommonWinterlyBlocks.java b/common/src/main/java/winterly/registry/CommonWinterlyBlocks.java new file mode 100644 index 0000000..4ab3550 --- /dev/null +++ b/common/src/main/java/winterly/registry/CommonWinterlyBlocks.java @@ -0,0 +1,52 @@ +package winterly.registry; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; + +import java.util.LinkedHashMap; +import java.util.Map; + +@SuppressWarnings("unused") +public abstract class CommonWinterlyBlocks { + public static final Map ITEMS = new LinkedHashMap<>(); + public static final Map BLOCKS = new LinkedHashMap<>(); + +// public static final Block RED_SOCK = add("red_sock", new SockBlock(copyOf(CANDLE).sounds(BlockSoundGroup.WOOL))); +// public static final Block GREEN_SOCK = add("green_sock", new SockBlock(copyOf(CANDLE).sounds(BlockSoundGroup.WOOL))); +// public static final Block BLUE_SOCK = add("blue_sock", new SockBlock(copyOf(CANDLE).sounds(BlockSoundGroup.WOOL))); + + public static Block ICICLE; + public static Block ICICLE_BLOCK; + public static Block PACKED_ICICLE_BLOCK; + public static Block ICICLE_PANE; + public static Block ICICLE_BARS; + public static Block CRYOMARBLE_BLOCK; + public static Block SNOWGUY; + public static Block SNOWBALL_WALL; + public static Block DENSE_SNOW; + public static Block DENSE_SNOW_STAIRS; + public static Block DENSE_SNOW_SLAB; + + public static Block SNOW_BRICKS; + public static Block SNOW_BRICK_STAIRS; + public static Block SNOW_BRICK_SLAB; + public static Block FROZEN_GRASS; + public static Block FROZEN_FLOWER; + + public static Block RAW_CRYOMARBLE_SHARD; + + public static Block RED_GIFT_BOX; + public static Block ORANGE_GIFT_BOX; + public static Block YELLOW_GIFT_BOX; + public static Block GREEN_GIFT_BOX; + public static Block CYAN_GIFT_BOX; + public static Block BLUE_GIFT_BOX; + public static Block PURPLE_GIFT_BOX; + public static Block BLACK_GIFT_BOX; + public static Block WHITE_GIFT_BOX; + + public static Block GARLAND_LIGHTS; + public static Block RAINY_GARLAND_LIGHTS; + +} diff --git a/common/src/main/java/winterly/registry/CommonWinterlyItems.java b/common/src/main/java/winterly/registry/CommonWinterlyItems.java new file mode 100644 index 0000000..d316d9f --- /dev/null +++ b/common/src/main/java/winterly/registry/CommonWinterlyItems.java @@ -0,0 +1,44 @@ +package winterly.registry; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; + +import java.util.LinkedHashMap; +import java.util.Map; + +@SuppressWarnings("unused") +public class CommonWinterlyItems { + public static final Map ITEMS = new LinkedHashMap<>(); + + // public static final Item GINGERBREAD_MAN = add("gingerbread_man", new Item(settings().food(new FoodComponent.Builder().hunger(3).saturationModifier(0.5F).build()))); +// public static final Item EDIBLE_SNOW = add("edible_snow", new Item(settings().food(new FoodComponent.Builder().hunger(1).saturationModifier(0.1F).statusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 120, 0), 0.5F).statusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 120, 1), 0.5F).build()))); +// public static final Item PISS_SNOW = add("yellow_snow", new Item(settings().food(new FoodComponent.Builder().hunger(1).saturationModifier(0F).statusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 200, 0), 0.9F).statusEffect(new StatusEffectInstance(StatusEffects.POISON, 80, 1), 0.8F).build()))); + public static Item RED_CANDY_CANE; + public static Item GREEN_CANDY_CANE; + public static Item BLUE_CANDY_CANE; +// public static final Item YELLOW_CANDY_CANE = add("yellow_candy_cane", new Item(settings().food(new FoodComponent.Builder().hunger(2).saturationModifier(0.1F).snack().build()))); +// public static final Item CANDY_CANE = add("candy_cane", new Item(settings().food(new FoodComponent.Builder().hunger(2).saturationModifier(0.1F).snack().build()))); +// public static final Item MULLED_WINE = add("mulled_wine", new Item(settings().food(new FoodComponent.Builder().hunger(4).saturationModifier(0.2F).build()))); +// public static final Item EGGNOG = add("eggnog", new Item(settings().food(new FoodComponent.Builder().hunger(2).saturationModifier(0.4F).statusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 200, 0), 0.2F).build()))); +// public static final Item COCOA = add("cocoa", new Item(settings().food(new FoodComponent.Builder().hunger(4).saturationModifier(0.5F).build()))); +// public static final Item KIDS_CHAMPAGNE = add("kids_champagne", new Item(settings().food(new FoodComponent.Builder().hunger(10).saturationModifier(0.1F).statusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 100, 0), 0.3F).statusEffect(new StatusEffectInstance(StatusEffects.ABSORPTION, 400, 0), 0.3F).statusEffect(new StatusEffectInstance(StatusEffects.INSTANT_HEALTH, 0, 0), 0.3F).build()))); + + public static Item CRYOMARBLE_SHARD; + public static Item CRYOMARBLE; + + public static Item CRYOMARBLE_SWORD; + public static Item CRYOMARBLE_SHOVEL; + public static Item CRYOMARBLE_PICKAXE; + public static Item CRYOMARBLE_AXE; + public static Item CRYOMARBLE_HOE; + + public static Item RED_SANTA_HAT; + public static Item BLUE_SANTA_HAT; + + public static Item WHITE_SCARF; + public static Item RED_SCARF; + public static Item GREEN_SCARF; + public static Item BLUE_SCARF; + public static Item RAINBOW_SCARF; +} + diff --git a/common/src/main/java/winterly/util/HolidayUtils.java b/common/src/main/java/winterly/util/HolidayUtils.java new file mode 100644 index 0000000..7bd46b7 --- /dev/null +++ b/common/src/main/java/winterly/util/HolidayUtils.java @@ -0,0 +1,16 @@ +package winterly.util; + +import java.time.LocalDate; + +public final class HolidayUtils { + + public static boolean isWinterHolidays() { + LocalDate date = LocalDate.now(); + int month = date.getMonth().getValue(); + + if(month == 12 && date.getDayOfMonth() >= 25) { + return true; + } + return month == 1 && date.getDayOfMonth() <= 7; + } +} diff --git a/src/main/java/winterly/util/UpdateChecker.java b/common/src/main/java/winterly/util/UpdateChecker.java similarity index 89% rename from src/main/java/winterly/util/UpdateChecker.java rename to common/src/main/java/winterly/util/UpdateChecker.java index 36f9867..d83b94b 100644 --- a/src/main/java/winterly/util/UpdateChecker.java +++ b/common/src/main/java/winterly/util/UpdateChecker.java @@ -5,8 +5,9 @@ import com.google.gson.annotations.SerializedName; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.SharedConstants; -import net.minecraft.text.Text; -import net.minecraft.util.Language; +import net.minecraft.locale.Language; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; import winterly.Winterly; import java.io.FileNotFoundException; @@ -28,7 +29,7 @@ public class UpdateChecker { private static Instant lastCheck = Instant.now().minus(4, ChronoUnit.HOURS); private static String cachedLatest = "0"; public static boolean updated = false; - public static Text text = null; + public static MutableComponent text = null; public static boolean check() { if(Winterly.config.updateCheckerEnabled) { @@ -39,12 +40,12 @@ public static boolean check() { var remoteNum = Integer.parseInt(remote.replaceAll("\\.", "")); if(remoteNum > localNum) { - String temp = Language.getInstance().get("itemGroup.winterly.items.button.updated"); + String temp = Language.getInstance().getOrDefault("itemGroup.winterly.items.button.updated"); temp = temp.replaceAll("%local_version%", local); temp = temp.replaceAll("%remote_version%", remote); - text = Text.of(temp); + text = Component.literal(temp); updated = true; } } @@ -90,7 +91,7 @@ static Optional> getModrinthVersions() { var array = new ArrayList(); Arrays.asList(versions).forEach(version -> { - if(version.gameVersions.contains(SharedConstants.getGameVersion().getName())) array.add(version); + if(version.gameVersions.contains(SharedConstants.getCurrentVersion().getName())) array.add(version); }); return Optional.of(array); diff --git a/common/src/main/java/winterly/worldgen/CryomarbleFeature.java b/common/src/main/java/winterly/worldgen/CryomarbleFeature.java new file mode 100644 index 0000000..fecfc35 --- /dev/null +++ b/common/src/main/java/winterly/worldgen/CryomarbleFeature.java @@ -0,0 +1,57 @@ +package winterly.worldgen; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import winterly.Winterly; +import winterly.block.IcicleBlock; +import winterly.registry.CommonWinterlyBlocks; + +public class CryomarbleFeature extends Feature { + + public CryomarbleFeature() { + super(NoneFeatureConfiguration.CODEC); + } + + @Override + public boolean place(FeaturePlaceContext context) { + if(!Winterly.config.generateCryomarble) return false; + WorldGenLevel world = context.level(); + BlockPos origin = context.origin(); + + for(int i = -20; i < 20; i++) { + BlockPos newOrigin = new BlockPos(origin.getX(), i, origin.getZ()); + if(world.getBlockState(newOrigin).isAir()) { + origin = newOrigin; + break; + } + } + if(context.random().nextInt(16) != 0) return false; + + int spawned = 0; + + for(int x = -3; x < 3; x++) { + for(int z = -3; z < 3; z++) { + for(int y = -3; y < 3; y++) { + int xPos = origin.getX() + x; + int zPos = origin.getZ() + z; + int yPos = origin.getY() + y; + BlockPos pos = new BlockPos(xPos, yPos, zPos); + if(context.random().nextInt(Math.abs(x) + Math.abs(y) + Math.abs(z) + 1) == 0) { + if(world.isEmptyBlock(pos) && isStone(world.getBlockState(pos.below()))) { + if(spawned < 3) { + world.setBlock(pos, CommonWinterlyBlocks.RAW_CRYOMARBLE_SHARD.defaultBlockState().setValue(IcicleBlock.FACING, Direction.UP), Block.UPDATE_ALL); + spawned++; + }else return true; + } + } + } + } + } + return true; + } +} diff --git a/common/src/main/java/winterly/worldgen/UndergroundIcicleFeature.java b/common/src/main/java/winterly/worldgen/UndergroundIcicleFeature.java new file mode 100644 index 0000000..08e1448 --- /dev/null +++ b/common/src/main/java/winterly/worldgen/UndergroundIcicleFeature.java @@ -0,0 +1,45 @@ +package winterly.worldgen; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import winterly.Winterly; +import winterly.registry.CommonWinterlyBlocks; + +public class UndergroundIcicleFeature extends Feature { + + public UndergroundIcicleFeature() { + super(NoneFeatureConfiguration.CODEC); + } + + @Override + public boolean place(FeaturePlaceContext context) { + if(!Winterly.config.generateUndergroundIcicles) return false; + boolean generated = false; + int randomY = context.random().nextInt(100) - 50; + + for (int x = 0; x < 10; x++) { + for (int z = 0; z < 10; z++) { + for (int y = 0; y < 10; y++) { + int xPos = context.origin().getX() + x; + int zPos = context.origin().getZ() + z; + int yPos = randomY + y; + BlockPos pos = new BlockPos(xPos, yPos, zPos); + WorldGenLevel world = context.level(); + if(context.random().nextInt(4) == 0) { + if(world.isEmptyBlock(pos)) { + if(isStone(world.getBlockState(pos.above()))) { + world.setBlock(pos, CommonWinterlyBlocks.ICICLE.defaultBlockState(), Block.UPDATE_ALL); + generated = true; + } + } + } + } + } + } + return generated; + } +} diff --git a/src/main/resources/assets/winterly/blockstates/black_gift_box.json b/common/src/main/resources/assets/winterly/blockstates/black_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/black_gift_box.json rename to common/src/main/resources/assets/winterly/blockstates/black_gift_box.json diff --git a/src/main/resources/assets/winterly/blockstates/blue_gift_box.json b/common/src/main/resources/assets/winterly/blockstates/blue_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/blue_gift_box.json rename to common/src/main/resources/assets/winterly/blockstates/blue_gift_box.json diff --git a/src/main/resources/assets/winterly/blockstates/cryomarble_block.json b/common/src/main/resources/assets/winterly/blockstates/cryomarble_block.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/cryomarble_block.json rename to common/src/main/resources/assets/winterly/blockstates/cryomarble_block.json diff --git a/src/main/resources/assets/winterly/blockstates/cyan_gift_box.json b/common/src/main/resources/assets/winterly/blockstates/cyan_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/cyan_gift_box.json rename to common/src/main/resources/assets/winterly/blockstates/cyan_gift_box.json diff --git a/src/main/resources/assets/winterly/blockstates/dense_snow.json b/common/src/main/resources/assets/winterly/blockstates/dense_snow.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/dense_snow.json rename to common/src/main/resources/assets/winterly/blockstates/dense_snow.json diff --git a/src/main/resources/assets/winterly/blockstates/dense_snow_slab.json b/common/src/main/resources/assets/winterly/blockstates/dense_snow_slab.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/dense_snow_slab.json rename to common/src/main/resources/assets/winterly/blockstates/dense_snow_slab.json diff --git a/src/main/resources/assets/winterly/blockstates/dense_snow_stairs.json b/common/src/main/resources/assets/winterly/blockstates/dense_snow_stairs.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/dense_snow_stairs.json rename to common/src/main/resources/assets/winterly/blockstates/dense_snow_stairs.json diff --git a/src/main/resources/assets/winterly/blockstates/frozen_flower.json b/common/src/main/resources/assets/winterly/blockstates/frozen_flower.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/frozen_flower.json rename to common/src/main/resources/assets/winterly/blockstates/frozen_flower.json diff --git a/src/main/resources/assets/winterly/blockstates/frozen_grass.json b/common/src/main/resources/assets/winterly/blockstates/frozen_grass.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/frozen_grass.json rename to common/src/main/resources/assets/winterly/blockstates/frozen_grass.json diff --git a/src/main/resources/assets/winterly/blockstates/garland_lights.json b/common/src/main/resources/assets/winterly/blockstates/garland_lights.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/garland_lights.json rename to common/src/main/resources/assets/winterly/blockstates/garland_lights.json diff --git a/src/main/resources/assets/winterly/blockstates/green_gift_box.json b/common/src/main/resources/assets/winterly/blockstates/green_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/green_gift_box.json rename to common/src/main/resources/assets/winterly/blockstates/green_gift_box.json diff --git a/src/main/resources/assets/winterly/blockstates/icicle.json b/common/src/main/resources/assets/winterly/blockstates/icicle.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/icicle.json rename to common/src/main/resources/assets/winterly/blockstates/icicle.json diff --git a/src/main/resources/assets/winterly/blockstates/icicle_bars.json b/common/src/main/resources/assets/winterly/blockstates/icicle_bars.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/icicle_bars.json rename to common/src/main/resources/assets/winterly/blockstates/icicle_bars.json diff --git a/src/main/resources/assets/winterly/blockstates/icicle_block.json b/common/src/main/resources/assets/winterly/blockstates/icicle_block.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/icicle_block.json rename to common/src/main/resources/assets/winterly/blockstates/icicle_block.json diff --git a/src/main/resources/assets/winterly/blockstates/icicle_pane.json b/common/src/main/resources/assets/winterly/blockstates/icicle_pane.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/icicle_pane.json rename to common/src/main/resources/assets/winterly/blockstates/icicle_pane.json diff --git a/src/main/resources/assets/winterly/blockstates/orange_gift_box.json b/common/src/main/resources/assets/winterly/blockstates/orange_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/orange_gift_box.json rename to common/src/main/resources/assets/winterly/blockstates/orange_gift_box.json diff --git a/src/main/resources/assets/winterly/blockstates/packed_icicle_block.json b/common/src/main/resources/assets/winterly/blockstates/packed_icicle_block.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/packed_icicle_block.json rename to common/src/main/resources/assets/winterly/blockstates/packed_icicle_block.json diff --git a/src/main/resources/assets/winterly/blockstates/purple_gift_box.json b/common/src/main/resources/assets/winterly/blockstates/purple_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/purple_gift_box.json rename to common/src/main/resources/assets/winterly/blockstates/purple_gift_box.json diff --git a/src/main/resources/assets/winterly/blockstates/rainy_garland_lights.json b/common/src/main/resources/assets/winterly/blockstates/rainy_garland_lights.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/rainy_garland_lights.json rename to common/src/main/resources/assets/winterly/blockstates/rainy_garland_lights.json diff --git a/src/main/resources/assets/winterly/blockstates/raw_cryomarble_shard.json b/common/src/main/resources/assets/winterly/blockstates/raw_cryomarble_shard.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/raw_cryomarble_shard.json rename to common/src/main/resources/assets/winterly/blockstates/raw_cryomarble_shard.json diff --git a/src/main/resources/assets/winterly/blockstates/red_gift_box.json b/common/src/main/resources/assets/winterly/blockstates/red_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/red_gift_box.json rename to common/src/main/resources/assets/winterly/blockstates/red_gift_box.json diff --git a/src/main/resources/assets/winterly/blockstates/snow_brick_slab.json b/common/src/main/resources/assets/winterly/blockstates/snow_brick_slab.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/snow_brick_slab.json rename to common/src/main/resources/assets/winterly/blockstates/snow_brick_slab.json diff --git a/src/main/resources/assets/winterly/blockstates/snow_brick_stairs.json b/common/src/main/resources/assets/winterly/blockstates/snow_brick_stairs.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/snow_brick_stairs.json rename to common/src/main/resources/assets/winterly/blockstates/snow_brick_stairs.json diff --git a/src/main/resources/assets/winterly/blockstates/snow_bricks.json b/common/src/main/resources/assets/winterly/blockstates/snow_bricks.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/snow_bricks.json rename to common/src/main/resources/assets/winterly/blockstates/snow_bricks.json diff --git a/src/main/resources/assets/winterly/blockstates/snowball_wall.json b/common/src/main/resources/assets/winterly/blockstates/snowball_wall.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/snowball_wall.json rename to common/src/main/resources/assets/winterly/blockstates/snowball_wall.json diff --git a/src/main/resources/assets/winterly/blockstates/snowguy.json b/common/src/main/resources/assets/winterly/blockstates/snowguy.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/snowguy.json rename to common/src/main/resources/assets/winterly/blockstates/snowguy.json diff --git a/src/main/resources/assets/winterly/blockstates/white_gift_box.json b/common/src/main/resources/assets/winterly/blockstates/white_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/white_gift_box.json rename to common/src/main/resources/assets/winterly/blockstates/white_gift_box.json diff --git a/src/main/resources/assets/winterly/blockstates/yellow_gift_box.json b/common/src/main/resources/assets/winterly/blockstates/yellow_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/blockstates/yellow_gift_box.json rename to common/src/main/resources/assets/winterly/blockstates/yellow_gift_box.json diff --git a/src/main/resources/assets/winterly/icon.png b/common/src/main/resources/assets/winterly/icon.png similarity index 100% rename from src/main/resources/assets/winterly/icon.png rename to common/src/main/resources/assets/winterly/icon.png diff --git a/src/main/resources/assets/winterly/lang/en_us.json b/common/src/main/resources/assets/winterly/lang/en_us.json similarity index 97% rename from src/main/resources/assets/winterly/lang/en_us.json rename to common/src/main/resources/assets/winterly/lang/en_us.json index f9cc3c1..2dced3f 100644 --- a/src/main/resources/assets/winterly/lang/en_us.json +++ b/common/src/main/resources/assets/winterly/lang/en_us.json @@ -63,12 +63,11 @@ "config.winterly.title": "Winterly Config", "config.winterly.general": "General", "config.winterly.option.max_gift_box_capacity": "Max Gift Box Capacity", - "config.winterly.option.update_checker_enabled": "Update Checker Enabled", "config.winterly.option.generate_underground_icicles": "Generate Underground Icicles", "config.winterly.option.generate_cryomarble": "Generate Cryomarble", "config.winterly.option.generate_frozen_grass": "Generate Frozen Grass", "config.winterly.option.generate_frozen_flowers": "Generate Frozen Flowers", "config.winterly.option.mob_decorations.enabled": "Mob Decorations Enabled", - "config.winterly.option.mob_decorations.only_in_winter": "Mob Decorations Only in Winter", + "config.winterly.option.mob_decorations.only_in_winter": "Mob Decorations Only in Winter Holidays", "config.winterly.option.mob_decorations.chance": "Mob Decorations Chance" } diff --git a/src/main/resources/assets/winterly/lang/ru_ru.json b/common/src/main/resources/assets/winterly/lang/ru_ru.json similarity index 97% rename from src/main/resources/assets/winterly/lang/ru_ru.json rename to common/src/main/resources/assets/winterly/lang/ru_ru.json index 1c10f2d..28671b7 100644 --- a/src/main/resources/assets/winterly/lang/ru_ru.json +++ b/common/src/main/resources/assets/winterly/lang/ru_ru.json @@ -63,12 +63,11 @@ "config.winterly.title": "Настройки Winterly", "config.winterly.general": "Общее", "config.winterly.option.max_gift_box_capacity": "Максимальная вместимость подарочной коробки", - "config.winterly.option.update_checker_enabled": "Проверка обновлений включена", "config.winterly.option.generate_underground_icicles": "Генерировать подземные сосульки", "config.winterly.option.generate_cryomarble": "Генерировать криомрамор", "config.winterly.option.generate_frozen_grass": "Генерировать замороженную траву", "config.winterly.option.generate_frozen_flowers": "Генерировать замороженные цветы", "config.winterly.option.mob_decorations.enabled": "Украшения мобов включены", - "config.winterly.option.mob_decorations.only_in_winter": "Украшать мобов только зимой", + "config.winterly.option.mob_decorations.only_in_winter": "Украшать мобов только в зимние праздники", "config.winterly.option.mob_decorations.chance": "Шанс украсить моба" } diff --git a/src/main/resources/assets/winterly/lang/zh_cn.json b/common/src/main/resources/assets/winterly/lang/zh_cn.json similarity index 97% rename from src/main/resources/assets/winterly/lang/zh_cn.json rename to common/src/main/resources/assets/winterly/lang/zh_cn.json index be69d26..af23a78 100644 --- a/src/main/resources/assets/winterly/lang/zh_cn.json +++ b/common/src/main/resources/assets/winterly/lang/zh_cn.json @@ -63,7 +63,6 @@ "config.winterly.title": "Winterly配置", "config.winterly.general": "常规", "config.winterly.option.max_gift_box_capacity": "Max Gift Box Capacity", - "config.winterly.option.update_checker_enabled": "Update Checker Enabled", "config.winterly.option.generate_underground_icicles": "Generate Underground Icicles", "config.winterly.option.generate_cryomarble": "Generate Cryomarble", "config.winterly.option.generate_frozen_grass": "Generate Frozen Grass", diff --git a/src/main/resources/assets/winterly/models/block/base/garland_lights_model.json b/common/src/main/resources/assets/winterly/models/block/base/garland_lights_model.json similarity index 94% rename from src/main/resources/assets/winterly/models/block/base/garland_lights_model.json rename to common/src/main/resources/assets/winterly/models/block/base/garland_lights_model.json index baf6c9c..e90937a 100644 --- a/src/main/resources/assets/winterly/models/block/base/garland_lights_model.json +++ b/common/src/main/resources/assets/winterly/models/block/base/garland_lights_model.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "ambientocclusion": false, "textures": { "lights": "winterly:block/garland_lights", diff --git a/src/main/resources/assets/winterly/models/block/base/gift_box_model.json b/common/src/main/resources/assets/winterly/models/block/base/gift_box_model.json similarity index 98% rename from src/main/resources/assets/winterly/models/block/base/gift_box_model.json rename to common/src/main/resources/assets/winterly/models/block/base/gift_box_model.json index e1f5ec5..96a293f 100644 --- a/src/main/resources/assets/winterly/models/block/base/gift_box_model.json +++ b/common/src/main/resources/assets/winterly/models/block/base/gift_box_model.json @@ -1,9 +1,7 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", - "texture_size": [ - 32, - 32 - ], + "texture_size": [32, 32], "textures": { "box": "winterly:block/black_gift_box", "particle": "winterly:block/black_gift_box_particle" diff --git a/src/main/resources/assets/winterly/models/block/black_gift_box.json b/common/src/main/resources/assets/winterly/models/block/black_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/black_gift_box.json rename to common/src/main/resources/assets/winterly/models/block/black_gift_box.json diff --git a/src/main/resources/assets/winterly/models/block/blue_gift_box.json b/common/src/main/resources/assets/winterly/models/block/blue_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/blue_gift_box.json rename to common/src/main/resources/assets/winterly/models/block/blue_gift_box.json diff --git a/src/main/resources/assets/winterly/models/block/cryomarble_block.json b/common/src/main/resources/assets/winterly/models/block/cryomarble_block.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/cryomarble_block.json rename to common/src/main/resources/assets/winterly/models/block/cryomarble_block.json diff --git a/src/main/resources/assets/winterly/models/block/cyan_gift_box.json b/common/src/main/resources/assets/winterly/models/block/cyan_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/cyan_gift_box.json rename to common/src/main/resources/assets/winterly/models/block/cyan_gift_box.json diff --git a/src/main/resources/assets/winterly/models/block/dense_snow.json b/common/src/main/resources/assets/winterly/models/block/dense_snow.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/dense_snow.json rename to common/src/main/resources/assets/winterly/models/block/dense_snow.json diff --git a/src/main/resources/assets/winterly/models/block/dense_snow_slab.json b/common/src/main/resources/assets/winterly/models/block/dense_snow_slab.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/dense_snow_slab.json rename to common/src/main/resources/assets/winterly/models/block/dense_snow_slab.json diff --git a/src/main/resources/assets/winterly/models/block/dense_snow_slab_top.json b/common/src/main/resources/assets/winterly/models/block/dense_snow_slab_top.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/dense_snow_slab_top.json rename to common/src/main/resources/assets/winterly/models/block/dense_snow_slab_top.json diff --git a/src/main/resources/assets/winterly/models/block/dense_snow_stairs.json b/common/src/main/resources/assets/winterly/models/block/dense_snow_stairs.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/dense_snow_stairs.json rename to common/src/main/resources/assets/winterly/models/block/dense_snow_stairs.json diff --git a/src/main/resources/assets/winterly/models/block/dense_snow_stairs_inner.json b/common/src/main/resources/assets/winterly/models/block/dense_snow_stairs_inner.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/dense_snow_stairs_inner.json rename to common/src/main/resources/assets/winterly/models/block/dense_snow_stairs_inner.json diff --git a/src/main/resources/assets/winterly/models/block/dense_snow_stairs_outer.json b/common/src/main/resources/assets/winterly/models/block/dense_snow_stairs_outer.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/dense_snow_stairs_outer.json rename to common/src/main/resources/assets/winterly/models/block/dense_snow_stairs_outer.json diff --git a/src/main/resources/assets/winterly/models/block/frozen_flower.json b/common/src/main/resources/assets/winterly/models/block/frozen_flower.json similarity index 95% rename from src/main/resources/assets/winterly/models/block/frozen_flower.json rename to common/src/main/resources/assets/winterly/models/block/frozen_flower.json index 9139695..17b0ecc 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_flower.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_flower.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "flower": "winterly:block/frozen_flower", diff --git a/src/main/resources/assets/winterly/models/block/frozen_flower_10.json b/common/src/main/resources/assets/winterly/models/block/frozen_flower_10.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_flower_10.json rename to common/src/main/resources/assets/winterly/models/block/frozen_flower_10.json index 76648b2..5859fed 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_flower_10.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_flower_10.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "flower": "winterly:block/frozen_flower", diff --git a/src/main/resources/assets/winterly/models/block/frozen_flower_12.json b/common/src/main/resources/assets/winterly/models/block/frozen_flower_12.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_flower_12.json rename to common/src/main/resources/assets/winterly/models/block/frozen_flower_12.json index 2165d8b..9153d9a 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_flower_12.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_flower_12.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "flower": "winterly:block/frozen_flower", diff --git a/src/main/resources/assets/winterly/models/block/frozen_flower_14.json b/common/src/main/resources/assets/winterly/models/block/frozen_flower_14.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_flower_14.json rename to common/src/main/resources/assets/winterly/models/block/frozen_flower_14.json index 762a46e..4d81a6a 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_flower_14.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_flower_14.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "flower": "winterly:block/frozen_flower", diff --git a/src/main/resources/assets/winterly/models/block/frozen_flower_2.json b/common/src/main/resources/assets/winterly/models/block/frozen_flower_2.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_flower_2.json rename to common/src/main/resources/assets/winterly/models/block/frozen_flower_2.json index e3c6c06..a554e72 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_flower_2.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_flower_2.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "flower": "winterly:block/frozen_flower", diff --git a/src/main/resources/assets/winterly/models/block/frozen_flower_4.json b/common/src/main/resources/assets/winterly/models/block/frozen_flower_4.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_flower_4.json rename to common/src/main/resources/assets/winterly/models/block/frozen_flower_4.json index 76a8ed6..5983dc9 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_flower_4.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_flower_4.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "flower": "winterly:block/frozen_flower", diff --git a/src/main/resources/assets/winterly/models/block/frozen_flower_6.json b/common/src/main/resources/assets/winterly/models/block/frozen_flower_6.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_flower_6.json rename to common/src/main/resources/assets/winterly/models/block/frozen_flower_6.json index 8d65b50..7442469 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_flower_6.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_flower_6.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "flower": "winterly:block/frozen_flower", diff --git a/src/main/resources/assets/winterly/models/block/frozen_flower_8.json b/common/src/main/resources/assets/winterly/models/block/frozen_flower_8.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_flower_8.json rename to common/src/main/resources/assets/winterly/models/block/frozen_flower_8.json index b6b3e1a..5ebf6f8 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_flower_8.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_flower_8.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "flower": "winterly:block/frozen_flower", diff --git a/src/main/resources/assets/winterly/models/block/frozen_grass_10.json b/common/src/main/resources/assets/winterly/models/block/frozen_grass_10.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_grass_10.json rename to common/src/main/resources/assets/winterly/models/block/frozen_grass_10.json index 175a16a..b18c15a 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_grass_10.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_grass_10.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "grass": "winterly:block/frozen_grass", diff --git a/src/main/resources/assets/winterly/models/block/frozen_grass_12.json b/common/src/main/resources/assets/winterly/models/block/frozen_grass_12.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_grass_12.json rename to common/src/main/resources/assets/winterly/models/block/frozen_grass_12.json index acc2a45..13d5a5d 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_grass_12.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_grass_12.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "grass": "winterly:block/frozen_grass", diff --git a/src/main/resources/assets/winterly/models/block/frozen_grass_14.json b/common/src/main/resources/assets/winterly/models/block/frozen_grass_14.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_grass_14.json rename to common/src/main/resources/assets/winterly/models/block/frozen_grass_14.json index 4b76bb1..28e9c4a 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_grass_14.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_grass_14.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "grass": "winterly:block/frozen_grass", diff --git a/src/main/resources/assets/winterly/models/block/frozen_grass_2.json b/common/src/main/resources/assets/winterly/models/block/frozen_grass_2.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_grass_2.json rename to common/src/main/resources/assets/winterly/models/block/frozen_grass_2.json index c954a03..c815672 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_grass_2.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_grass_2.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "grass": "winterly:block/frozen_grass", diff --git a/src/main/resources/assets/winterly/models/block/frozen_grass_4.json b/common/src/main/resources/assets/winterly/models/block/frozen_grass_4.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_grass_4.json rename to common/src/main/resources/assets/winterly/models/block/frozen_grass_4.json index bb265b3..380d880 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_grass_4.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_grass_4.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "grass": "winterly:block/frozen_grass", diff --git a/src/main/resources/assets/winterly/models/block/frozen_grass_6.json b/common/src/main/resources/assets/winterly/models/block/frozen_grass_6.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_grass_6.json rename to common/src/main/resources/assets/winterly/models/block/frozen_grass_6.json index 144afbc..7573a54 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_grass_6.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_grass_6.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "grass": "winterly:block/frozen_grass", diff --git a/src/main/resources/assets/winterly/models/block/frozen_grass_8.json b/common/src/main/resources/assets/winterly/models/block/frozen_grass_8.json similarity index 97% rename from src/main/resources/assets/winterly/models/block/frozen_grass_8.json rename to common/src/main/resources/assets/winterly/models/block/frozen_grass_8.json index 0b39ce2..a998eb6 100644 --- a/src/main/resources/assets/winterly/models/block/frozen_grass_8.json +++ b/common/src/main/resources/assets/winterly/models/block/frozen_grass_8.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "credit": "Made in Blockbench by PinkGoosik", "textures": { "grass": "winterly:block/frozen_grass", diff --git a/src/main/resources/assets/winterly/models/block/garland_lights.json b/common/src/main/resources/assets/winterly/models/block/garland_lights.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/garland_lights.json rename to common/src/main/resources/assets/winterly/models/block/garland_lights.json diff --git a/src/main/resources/assets/winterly/models/block/green_gift_box.json b/common/src/main/resources/assets/winterly/models/block/green_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/green_gift_box.json rename to common/src/main/resources/assets/winterly/models/block/green_gift_box.json diff --git a/src/main/resources/assets/winterly/models/block/icicle_1.json b/common/src/main/resources/assets/winterly/models/block/icicle_1.json similarity index 72% rename from src/main/resources/assets/winterly/models/block/icicle_1.json rename to common/src/main/resources/assets/winterly/models/block/icicle_1.json index 74445ec..c2a39ed 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_1.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_1.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/tinted_cross", "textures": { "cross": "winterly:block/icicle_1" diff --git a/src/main/resources/assets/winterly/models/block/icicle_2.json b/common/src/main/resources/assets/winterly/models/block/icicle_2.json similarity index 72% rename from src/main/resources/assets/winterly/models/block/icicle_2.json rename to common/src/main/resources/assets/winterly/models/block/icicle_2.json index adce84a..0987d09 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_2.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_2.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/tinted_cross", "textures": { "cross": "winterly:block/icicle_2" diff --git a/src/main/resources/assets/winterly/models/block/icicle_3.json b/common/src/main/resources/assets/winterly/models/block/icicle_3.json similarity index 72% rename from src/main/resources/assets/winterly/models/block/icicle_3.json rename to common/src/main/resources/assets/winterly/models/block/icicle_3.json index b453962..f64910f 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_3.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_3.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/tinted_cross", "textures": { "cross": "winterly:block/icicle_3" diff --git a/src/main/resources/assets/winterly/models/block/icicle_bars_cap.json b/common/src/main/resources/assets/winterly/models/block/icicle_bars_cap.json similarity index 79% rename from src/main/resources/assets/winterly/models/block/icicle_bars_cap.json rename to common/src/main/resources/assets/winterly/models/block/icicle_bars_cap.json index cebd4ac..a1decf2 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_bars_cap.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_bars_cap.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/iron_bars_cap", "textures": { "bars": "winterly:block/icicle_bars", diff --git a/src/main/resources/assets/winterly/models/block/icicle_bars_cap_alt.json b/common/src/main/resources/assets/winterly/models/block/icicle_bars_cap_alt.json similarity index 80% rename from src/main/resources/assets/winterly/models/block/icicle_bars_cap_alt.json rename to common/src/main/resources/assets/winterly/models/block/icicle_bars_cap_alt.json index 2793d31..390ce7d 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_bars_cap_alt.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_bars_cap_alt.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/iron_bars_cap_alt", "textures": { "bars": "winterly:block/icicle_bars", diff --git a/src/main/resources/assets/winterly/models/block/icicle_bars_post.json b/common/src/main/resources/assets/winterly/models/block/icicle_bars_post.json similarity index 77% rename from src/main/resources/assets/winterly/models/block/icicle_bars_post.json rename to common/src/main/resources/assets/winterly/models/block/icicle_bars_post.json index c23ddfd..ae72f79 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_bars_post.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_bars_post.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/iron_bars_post", "textures": { "bars": "winterly:block/icicle_bars", diff --git a/src/main/resources/assets/winterly/models/block/icicle_bars_post_ends.json b/common/src/main/resources/assets/winterly/models/block/icicle_bars_post_ends.json similarity index 77% rename from src/main/resources/assets/winterly/models/block/icicle_bars_post_ends.json rename to common/src/main/resources/assets/winterly/models/block/icicle_bars_post_ends.json index 67045ab..609d960 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_bars_post_ends.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_bars_post_ends.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/iron_bars_post_ends", "textures": { "edge": "winterly:block/icicle_bars", diff --git a/src/main/resources/assets/winterly/models/block/icicle_bars_side.json b/common/src/main/resources/assets/winterly/models/block/icicle_bars_side.json similarity index 79% rename from src/main/resources/assets/winterly/models/block/icicle_bars_side.json rename to common/src/main/resources/assets/winterly/models/block/icicle_bars_side.json index 6d4a6a4..2cb9fcd 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_bars_side.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_bars_side.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/iron_bars_side", "textures": { "bars": "winterly:block/icicle_bars", diff --git a/src/main/resources/assets/winterly/models/block/icicle_bars_side_alt.json b/common/src/main/resources/assets/winterly/models/block/icicle_bars_side_alt.json similarity index 80% rename from src/main/resources/assets/winterly/models/block/icicle_bars_side_alt.json rename to common/src/main/resources/assets/winterly/models/block/icicle_bars_side_alt.json index fa9573f..c313920 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_bars_side_alt.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_bars_side_alt.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/iron_bars_side_alt", "textures": { "bars": "winterly:block/icicle_bars", diff --git a/src/main/resources/assets/winterly/models/block/icicle_block.json b/common/src/main/resources/assets/winterly/models/block/icicle_block.json similarity index 69% rename from src/main/resources/assets/winterly/models/block/icicle_block.json rename to common/src/main/resources/assets/winterly/models/block/icicle_block.json index 591b54e..12af2ff 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_block.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_block.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:translucent", "parent": "block/cube_all", "textures": { "all": "winterly:block/icicle_block" diff --git a/src/main/resources/assets/winterly/models/block/icicle_pane_noside.json b/common/src/main/resources/assets/winterly/models/block/icicle_pane_noside.json similarity index 72% rename from src/main/resources/assets/winterly/models/block/icicle_pane_noside.json rename to common/src/main/resources/assets/winterly/models/block/icicle_pane_noside.json index 3a1319f..476a6a0 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_pane_noside.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_pane_noside.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:translucent", "parent": "block/template_glass_pane_noside", "textures": { "pane": "winterly:block/icicle_block" diff --git a/src/main/resources/assets/winterly/models/block/icicle_pane_noside_alt.json b/common/src/main/resources/assets/winterly/models/block/icicle_pane_noside_alt.json similarity index 73% rename from src/main/resources/assets/winterly/models/block/icicle_pane_noside_alt.json rename to common/src/main/resources/assets/winterly/models/block/icicle_pane_noside_alt.json index dcae39f..c9b7912 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_pane_noside_alt.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_pane_noside_alt.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:translucent", "parent": "block/template_glass_pane_noside_alt", "textures": { "pane": "winterly:block/icicle_block" diff --git a/src/main/resources/assets/winterly/models/block/icicle_pane_post.json b/common/src/main/resources/assets/winterly/models/block/icicle_pane_post.json similarity index 78% rename from src/main/resources/assets/winterly/models/block/icicle_pane_post.json rename to common/src/main/resources/assets/winterly/models/block/icicle_pane_post.json index d87d740..8112da9 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_pane_post.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_pane_post.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:translucent", "parent": "block/template_glass_pane_post", "textures": { "pane": "winterly:block/icicle_block", diff --git a/src/main/resources/assets/winterly/models/block/icicle_pane_side.json b/common/src/main/resources/assets/winterly/models/block/icicle_pane_side.json similarity index 78% rename from src/main/resources/assets/winterly/models/block/icicle_pane_side.json rename to common/src/main/resources/assets/winterly/models/block/icicle_pane_side.json index c34241f..d387c81 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_pane_side.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_pane_side.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:translucent", "parent": "block/template_glass_pane_side", "textures": { "pane": "winterly:block/icicle_block", diff --git a/src/main/resources/assets/winterly/models/block/icicle_pane_side_alt.json b/common/src/main/resources/assets/winterly/models/block/icicle_pane_side_alt.json similarity index 79% rename from src/main/resources/assets/winterly/models/block/icicle_pane_side_alt.json rename to common/src/main/resources/assets/winterly/models/block/icicle_pane_side_alt.json index 00cb631..d1a76cf 100644 --- a/src/main/resources/assets/winterly/models/block/icicle_pane_side_alt.json +++ b/common/src/main/resources/assets/winterly/models/block/icicle_pane_side_alt.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:translucent", "parent": "block/template_glass_pane_side_alt", "textures": { "pane": "winterly:block/icicle_block", diff --git a/src/main/resources/assets/winterly/models/block/orange_gift_box.json b/common/src/main/resources/assets/winterly/models/block/orange_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/orange_gift_box.json rename to common/src/main/resources/assets/winterly/models/block/orange_gift_box.json diff --git a/src/main/resources/assets/winterly/models/block/packed_icicle_block.json b/common/src/main/resources/assets/winterly/models/block/packed_icicle_block.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/packed_icicle_block.json rename to common/src/main/resources/assets/winterly/models/block/packed_icicle_block.json diff --git a/src/main/resources/assets/winterly/models/block/purple_gift_box.json b/common/src/main/resources/assets/winterly/models/block/purple_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/purple_gift_box.json rename to common/src/main/resources/assets/winterly/models/block/purple_gift_box.json diff --git a/src/main/resources/assets/winterly/models/block/rainy_garland_lights.json b/common/src/main/resources/assets/winterly/models/block/rainy_garland_lights.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/rainy_garland_lights.json rename to common/src/main/resources/assets/winterly/models/block/rainy_garland_lights.json diff --git a/src/main/resources/assets/winterly/models/block/raw_cryomarble_shard.json b/common/src/main/resources/assets/winterly/models/block/raw_cryomarble_shard.json similarity index 74% rename from src/main/resources/assets/winterly/models/block/raw_cryomarble_shard.json rename to common/src/main/resources/assets/winterly/models/block/raw_cryomarble_shard.json index 312d3d2..5b3f88b 100644 --- a/src/main/resources/assets/winterly/models/block/raw_cryomarble_shard.json +++ b/common/src/main/resources/assets/winterly/models/block/raw_cryomarble_shard.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "parent": "block/tinted_cross", "textures": { "cross": "winterly:block/raw_cryomarble_shard" diff --git a/src/main/resources/assets/winterly/models/block/red_gift_box.json b/common/src/main/resources/assets/winterly/models/block/red_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/red_gift_box.json rename to common/src/main/resources/assets/winterly/models/block/red_gift_box.json diff --git a/src/main/resources/assets/winterly/models/block/snow_brick_slab.json b/common/src/main/resources/assets/winterly/models/block/snow_brick_slab.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/snow_brick_slab.json rename to common/src/main/resources/assets/winterly/models/block/snow_brick_slab.json diff --git a/src/main/resources/assets/winterly/models/block/snow_brick_slab_top.json b/common/src/main/resources/assets/winterly/models/block/snow_brick_slab_top.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/snow_brick_slab_top.json rename to common/src/main/resources/assets/winterly/models/block/snow_brick_slab_top.json diff --git a/src/main/resources/assets/winterly/models/block/snow_brick_stairs.json b/common/src/main/resources/assets/winterly/models/block/snow_brick_stairs.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/snow_brick_stairs.json rename to common/src/main/resources/assets/winterly/models/block/snow_brick_stairs.json diff --git a/src/main/resources/assets/winterly/models/block/snow_brick_stairs_inner.json b/common/src/main/resources/assets/winterly/models/block/snow_brick_stairs_inner.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/snow_brick_stairs_inner.json rename to common/src/main/resources/assets/winterly/models/block/snow_brick_stairs_inner.json diff --git a/src/main/resources/assets/winterly/models/block/snow_brick_stairs_outer.json b/common/src/main/resources/assets/winterly/models/block/snow_brick_stairs_outer.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/snow_brick_stairs_outer.json rename to common/src/main/resources/assets/winterly/models/block/snow_brick_stairs_outer.json diff --git a/src/main/resources/assets/winterly/models/block/snow_bricks.json b/common/src/main/resources/assets/winterly/models/block/snow_bricks.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/snow_bricks.json rename to common/src/main/resources/assets/winterly/models/block/snow_bricks.json diff --git a/src/main/resources/assets/winterly/models/block/snowball_wall.json b/common/src/main/resources/assets/winterly/models/block/snowball_wall.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/snowball_wall.json rename to common/src/main/resources/assets/winterly/models/block/snowball_wall.json diff --git a/src/main/resources/assets/winterly/models/block/snowguy.json b/common/src/main/resources/assets/winterly/models/block/snowguy.json similarity index 99% rename from src/main/resources/assets/winterly/models/block/snowguy.json rename to common/src/main/resources/assets/winterly/models/block/snowguy.json index 8e8654e..bc33496 100644 --- a/src/main/resources/assets/winterly/models/block/snowguy.json +++ b/common/src/main/resources/assets/winterly/models/block/snowguy.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:cutout", "textures": { "guy": "winterly:block/snowguy_model", "particle": "winterly:block/snow_bricks" diff --git a/src/main/resources/assets/winterly/models/block/white_gift_box.json b/common/src/main/resources/assets/winterly/models/block/white_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/white_gift_box.json rename to common/src/main/resources/assets/winterly/models/block/white_gift_box.json diff --git a/src/main/resources/assets/winterly/models/block/yellow_gift_box.json b/common/src/main/resources/assets/winterly/models/block/yellow_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/block/yellow_gift_box.json rename to common/src/main/resources/assets/winterly/models/block/yellow_gift_box.json diff --git a/src/main/resources/assets/winterly/models/item/black_gift_box.json b/common/src/main/resources/assets/winterly/models/item/black_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/black_gift_box.json rename to common/src/main/resources/assets/winterly/models/item/black_gift_box.json diff --git a/src/main/resources/assets/winterly/models/item/blue_candy_cane.json b/common/src/main/resources/assets/winterly/models/item/blue_candy_cane.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/blue_candy_cane.json rename to common/src/main/resources/assets/winterly/models/item/blue_candy_cane.json diff --git a/src/main/resources/assets/winterly/models/item/blue_gift_box.json b/common/src/main/resources/assets/winterly/models/item/blue_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/blue_gift_box.json rename to common/src/main/resources/assets/winterly/models/item/blue_gift_box.json diff --git a/src/main/resources/assets/winterly/models/item/blue_santa_hat.json b/common/src/main/resources/assets/winterly/models/item/blue_santa_hat.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/blue_santa_hat.json rename to common/src/main/resources/assets/winterly/models/item/blue_santa_hat.json diff --git a/src/main/resources/assets/winterly/models/item/blue_scarf.json b/common/src/main/resources/assets/winterly/models/item/blue_scarf.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/blue_scarf.json rename to common/src/main/resources/assets/winterly/models/item/blue_scarf.json diff --git a/src/main/resources/assets/winterly/models/item/cryomarble.json b/common/src/main/resources/assets/winterly/models/item/cryomarble.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/cryomarble.json rename to common/src/main/resources/assets/winterly/models/item/cryomarble.json diff --git a/src/main/resources/assets/winterly/models/item/cryomarble_axe.json b/common/src/main/resources/assets/winterly/models/item/cryomarble_axe.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/cryomarble_axe.json rename to common/src/main/resources/assets/winterly/models/item/cryomarble_axe.json diff --git a/src/main/resources/assets/winterly/models/item/cryomarble_block.json b/common/src/main/resources/assets/winterly/models/item/cryomarble_block.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/cryomarble_block.json rename to common/src/main/resources/assets/winterly/models/item/cryomarble_block.json diff --git a/src/main/resources/assets/winterly/models/item/cryomarble_hoe.json b/common/src/main/resources/assets/winterly/models/item/cryomarble_hoe.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/cryomarble_hoe.json rename to common/src/main/resources/assets/winterly/models/item/cryomarble_hoe.json diff --git a/src/main/resources/assets/winterly/models/item/cryomarble_pickaxe.json b/common/src/main/resources/assets/winterly/models/item/cryomarble_pickaxe.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/cryomarble_pickaxe.json rename to common/src/main/resources/assets/winterly/models/item/cryomarble_pickaxe.json diff --git a/src/main/resources/assets/winterly/models/item/cryomarble_shard.json b/common/src/main/resources/assets/winterly/models/item/cryomarble_shard.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/cryomarble_shard.json rename to common/src/main/resources/assets/winterly/models/item/cryomarble_shard.json diff --git a/src/main/resources/assets/winterly/models/item/cryomarble_shovel.json b/common/src/main/resources/assets/winterly/models/item/cryomarble_shovel.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/cryomarble_shovel.json rename to common/src/main/resources/assets/winterly/models/item/cryomarble_shovel.json diff --git a/src/main/resources/assets/winterly/models/item/cryomarble_sword.json b/common/src/main/resources/assets/winterly/models/item/cryomarble_sword.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/cryomarble_sword.json rename to common/src/main/resources/assets/winterly/models/item/cryomarble_sword.json diff --git a/src/main/resources/assets/winterly/models/item/cyan_gift_box.json b/common/src/main/resources/assets/winterly/models/item/cyan_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/cyan_gift_box.json rename to common/src/main/resources/assets/winterly/models/item/cyan_gift_box.json diff --git a/src/main/resources/assets/winterly/models/item/dense_snow.json b/common/src/main/resources/assets/winterly/models/item/dense_snow.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/dense_snow.json rename to common/src/main/resources/assets/winterly/models/item/dense_snow.json diff --git a/src/main/resources/assets/winterly/models/item/dense_snow_slab.json b/common/src/main/resources/assets/winterly/models/item/dense_snow_slab.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/dense_snow_slab.json rename to common/src/main/resources/assets/winterly/models/item/dense_snow_slab.json diff --git a/src/main/resources/assets/winterly/models/item/dense_snow_stairs.json b/common/src/main/resources/assets/winterly/models/item/dense_snow_stairs.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/dense_snow_stairs.json rename to common/src/main/resources/assets/winterly/models/item/dense_snow_stairs.json diff --git a/src/main/resources/assets/winterly/models/item/frozen_flower.json b/common/src/main/resources/assets/winterly/models/item/frozen_flower.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/frozen_flower.json rename to common/src/main/resources/assets/winterly/models/item/frozen_flower.json diff --git a/src/main/resources/assets/winterly/models/item/frozen_grass.json b/common/src/main/resources/assets/winterly/models/item/frozen_grass.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/frozen_grass.json rename to common/src/main/resources/assets/winterly/models/item/frozen_grass.json diff --git a/src/main/resources/assets/winterly/models/item/garland_lights.json b/common/src/main/resources/assets/winterly/models/item/garland_lights.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/garland_lights.json rename to common/src/main/resources/assets/winterly/models/item/garland_lights.json diff --git a/src/main/resources/assets/winterly/models/item/green_candy_cane.json b/common/src/main/resources/assets/winterly/models/item/green_candy_cane.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/green_candy_cane.json rename to common/src/main/resources/assets/winterly/models/item/green_candy_cane.json diff --git a/src/main/resources/assets/winterly/models/item/green_gift_box.json b/common/src/main/resources/assets/winterly/models/item/green_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/green_gift_box.json rename to common/src/main/resources/assets/winterly/models/item/green_gift_box.json diff --git a/src/main/resources/assets/winterly/models/item/green_scarf.json b/common/src/main/resources/assets/winterly/models/item/green_scarf.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/green_scarf.json rename to common/src/main/resources/assets/winterly/models/item/green_scarf.json diff --git a/src/main/resources/assets/winterly/models/item/icicle.json b/common/src/main/resources/assets/winterly/models/item/icicle.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/icicle.json rename to common/src/main/resources/assets/winterly/models/item/icicle.json diff --git a/src/main/resources/assets/winterly/models/item/icicle_bars.json b/common/src/main/resources/assets/winterly/models/item/icicle_bars.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/icicle_bars.json rename to common/src/main/resources/assets/winterly/models/item/icicle_bars.json diff --git a/src/main/resources/assets/winterly/models/item/icicle_block.json b/common/src/main/resources/assets/winterly/models/item/icicle_block.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/icicle_block.json rename to common/src/main/resources/assets/winterly/models/item/icicle_block.json diff --git a/src/main/resources/assets/winterly/models/item/icicle_pane.json b/common/src/main/resources/assets/winterly/models/item/icicle_pane.json similarity index 69% rename from src/main/resources/assets/winterly/models/item/icicle_pane.json rename to common/src/main/resources/assets/winterly/models/item/icicle_pane.json index 10ff442..aaafcde 100644 --- a/src/main/resources/assets/winterly/models/item/icicle_pane.json +++ b/common/src/main/resources/assets/winterly/models/item/icicle_pane.json @@ -1,4 +1,5 @@ { + "render_type": "minecraft:translucent", "parent": "item/generated", "textures": { "layer0": "winterly:block/icicle_block" diff --git a/src/main/resources/assets/winterly/models/item/orange_gift_box.json b/common/src/main/resources/assets/winterly/models/item/orange_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/orange_gift_box.json rename to common/src/main/resources/assets/winterly/models/item/orange_gift_box.json diff --git a/src/main/resources/assets/winterly/models/item/packed_icicle_block.json b/common/src/main/resources/assets/winterly/models/item/packed_icicle_block.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/packed_icicle_block.json rename to common/src/main/resources/assets/winterly/models/item/packed_icicle_block.json diff --git a/src/main/resources/assets/winterly/models/item/purple_gift_box.json b/common/src/main/resources/assets/winterly/models/item/purple_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/purple_gift_box.json rename to common/src/main/resources/assets/winterly/models/item/purple_gift_box.json diff --git a/src/main/resources/assets/winterly/models/item/rainbow_scarf.json b/common/src/main/resources/assets/winterly/models/item/rainbow_scarf.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/rainbow_scarf.json rename to common/src/main/resources/assets/winterly/models/item/rainbow_scarf.json diff --git a/src/main/resources/assets/winterly/models/item/rainy_garland_lights.json b/common/src/main/resources/assets/winterly/models/item/rainy_garland_lights.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/rainy_garland_lights.json rename to common/src/main/resources/assets/winterly/models/item/rainy_garland_lights.json diff --git a/src/main/resources/assets/winterly/models/item/raw_cryomarble_shard.json b/common/src/main/resources/assets/winterly/models/item/raw_cryomarble_shard.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/raw_cryomarble_shard.json rename to common/src/main/resources/assets/winterly/models/item/raw_cryomarble_shard.json diff --git a/src/main/resources/assets/winterly/models/item/red_candy_cane.json b/common/src/main/resources/assets/winterly/models/item/red_candy_cane.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/red_candy_cane.json rename to common/src/main/resources/assets/winterly/models/item/red_candy_cane.json diff --git a/src/main/resources/assets/winterly/models/item/red_gift_box.json b/common/src/main/resources/assets/winterly/models/item/red_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/red_gift_box.json rename to common/src/main/resources/assets/winterly/models/item/red_gift_box.json diff --git a/src/main/resources/assets/winterly/models/item/red_santa_hat.json b/common/src/main/resources/assets/winterly/models/item/red_santa_hat.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/red_santa_hat.json rename to common/src/main/resources/assets/winterly/models/item/red_santa_hat.json diff --git a/src/main/resources/assets/winterly/models/item/red_scarf.json b/common/src/main/resources/assets/winterly/models/item/red_scarf.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/red_scarf.json rename to common/src/main/resources/assets/winterly/models/item/red_scarf.json diff --git a/src/main/resources/assets/winterly/models/item/snow_brick_slab.json b/common/src/main/resources/assets/winterly/models/item/snow_brick_slab.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/snow_brick_slab.json rename to common/src/main/resources/assets/winterly/models/item/snow_brick_slab.json diff --git a/src/main/resources/assets/winterly/models/item/snow_brick_stairs.json b/common/src/main/resources/assets/winterly/models/item/snow_brick_stairs.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/snow_brick_stairs.json rename to common/src/main/resources/assets/winterly/models/item/snow_brick_stairs.json diff --git a/src/main/resources/assets/winterly/models/item/snow_bricks.json b/common/src/main/resources/assets/winterly/models/item/snow_bricks.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/snow_bricks.json rename to common/src/main/resources/assets/winterly/models/item/snow_bricks.json diff --git a/src/main/resources/assets/winterly/models/item/snowball_wall.json b/common/src/main/resources/assets/winterly/models/item/snowball_wall.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/snowball_wall.json rename to common/src/main/resources/assets/winterly/models/item/snowball_wall.json diff --git a/src/main/resources/assets/winterly/models/item/snowguy.json b/common/src/main/resources/assets/winterly/models/item/snowguy.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/snowguy.json rename to common/src/main/resources/assets/winterly/models/item/snowguy.json diff --git a/src/main/resources/assets/winterly/models/item/white_gift_box.json b/common/src/main/resources/assets/winterly/models/item/white_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/white_gift_box.json rename to common/src/main/resources/assets/winterly/models/item/white_gift_box.json diff --git a/src/main/resources/assets/winterly/models/item/white_scarf.json b/common/src/main/resources/assets/winterly/models/item/white_scarf.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/white_scarf.json rename to common/src/main/resources/assets/winterly/models/item/white_scarf.json diff --git a/src/main/resources/assets/winterly/models/item/yellow_gift_box.json b/common/src/main/resources/assets/winterly/models/item/yellow_gift_box.json similarity index 100% rename from src/main/resources/assets/winterly/models/item/yellow_gift_box.json rename to common/src/main/resources/assets/winterly/models/item/yellow_gift_box.json diff --git a/src/main/resources/assets/winterly/textures/block/black_gift_box.png b/common/src/main/resources/assets/winterly/textures/block/black_gift_box.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/black_gift_box.png rename to common/src/main/resources/assets/winterly/textures/block/black_gift_box.png diff --git a/src/main/resources/assets/winterly/textures/block/black_gift_box_particle.png b/common/src/main/resources/assets/winterly/textures/block/black_gift_box_particle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/black_gift_box_particle.png rename to common/src/main/resources/assets/winterly/textures/block/black_gift_box_particle.png diff --git a/src/main/resources/assets/winterly/textures/block/blue_gift_box.png b/common/src/main/resources/assets/winterly/textures/block/blue_gift_box.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/blue_gift_box.png rename to common/src/main/resources/assets/winterly/textures/block/blue_gift_box.png diff --git a/src/main/resources/assets/winterly/textures/block/blue_gift_box_particle.png b/common/src/main/resources/assets/winterly/textures/block/blue_gift_box_particle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/blue_gift_box_particle.png rename to common/src/main/resources/assets/winterly/textures/block/blue_gift_box_particle.png diff --git a/src/main/resources/assets/winterly/textures/block/cryomarble_block.png b/common/src/main/resources/assets/winterly/textures/block/cryomarble_block.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/cryomarble_block.png rename to common/src/main/resources/assets/winterly/textures/block/cryomarble_block.png diff --git a/src/main/resources/assets/winterly/textures/block/cyan_gift_box.png b/common/src/main/resources/assets/winterly/textures/block/cyan_gift_box.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/cyan_gift_box.png rename to common/src/main/resources/assets/winterly/textures/block/cyan_gift_box.png diff --git a/src/main/resources/assets/winterly/textures/block/cyan_gift_box_particle.png b/common/src/main/resources/assets/winterly/textures/block/cyan_gift_box_particle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/cyan_gift_box_particle.png rename to common/src/main/resources/assets/winterly/textures/block/cyan_gift_box_particle.png diff --git a/src/main/resources/assets/winterly/textures/block/dense_snow.png b/common/src/main/resources/assets/winterly/textures/block/dense_snow.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/dense_snow.png rename to common/src/main/resources/assets/winterly/textures/block/dense_snow.png diff --git a/src/main/resources/assets/winterly/textures/block/frozen_flower.png b/common/src/main/resources/assets/winterly/textures/block/frozen_flower.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/frozen_flower.png rename to common/src/main/resources/assets/winterly/textures/block/frozen_flower.png diff --git a/src/main/resources/assets/winterly/textures/block/frozen_grass.png b/common/src/main/resources/assets/winterly/textures/block/frozen_grass.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/frozen_grass.png rename to common/src/main/resources/assets/winterly/textures/block/frozen_grass.png diff --git a/src/main/resources/assets/winterly/textures/block/garland_lights.png b/common/src/main/resources/assets/winterly/textures/block/garland_lights.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/garland_lights.png rename to common/src/main/resources/assets/winterly/textures/block/garland_lights.png diff --git a/src/main/resources/assets/winterly/textures/block/garland_lights.png.mcmeta b/common/src/main/resources/assets/winterly/textures/block/garland_lights.png.mcmeta similarity index 100% rename from src/main/resources/assets/winterly/textures/block/garland_lights.png.mcmeta rename to common/src/main/resources/assets/winterly/textures/block/garland_lights.png.mcmeta diff --git a/src/main/resources/assets/winterly/textures/block/green_gift_box.png b/common/src/main/resources/assets/winterly/textures/block/green_gift_box.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/green_gift_box.png rename to common/src/main/resources/assets/winterly/textures/block/green_gift_box.png diff --git a/src/main/resources/assets/winterly/textures/block/green_gift_box_particle.png b/common/src/main/resources/assets/winterly/textures/block/green_gift_box_particle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/green_gift_box_particle.png rename to common/src/main/resources/assets/winterly/textures/block/green_gift_box_particle.png diff --git a/src/main/resources/assets/winterly/textures/block/icicle_1.png b/common/src/main/resources/assets/winterly/textures/block/icicle_1.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/icicle_1.png rename to common/src/main/resources/assets/winterly/textures/block/icicle_1.png diff --git a/src/main/resources/assets/winterly/textures/block/icicle_2.png b/common/src/main/resources/assets/winterly/textures/block/icicle_2.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/icicle_2.png rename to common/src/main/resources/assets/winterly/textures/block/icicle_2.png diff --git a/src/main/resources/assets/winterly/textures/block/icicle_3.png b/common/src/main/resources/assets/winterly/textures/block/icicle_3.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/icicle_3.png rename to common/src/main/resources/assets/winterly/textures/block/icicle_3.png diff --git a/src/main/resources/assets/winterly/textures/block/icicle_bars.png b/common/src/main/resources/assets/winterly/textures/block/icicle_bars.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/icicle_bars.png rename to common/src/main/resources/assets/winterly/textures/block/icicle_bars.png diff --git a/src/main/resources/assets/winterly/textures/block/icicle_block.png b/common/src/main/resources/assets/winterly/textures/block/icicle_block.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/icicle_block.png rename to common/src/main/resources/assets/winterly/textures/block/icicle_block.png diff --git a/src/main/resources/assets/winterly/textures/block/orange_gift_box.png b/common/src/main/resources/assets/winterly/textures/block/orange_gift_box.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/orange_gift_box.png rename to common/src/main/resources/assets/winterly/textures/block/orange_gift_box.png diff --git a/src/main/resources/assets/winterly/textures/block/orange_gift_box_particle.png b/common/src/main/resources/assets/winterly/textures/block/orange_gift_box_particle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/orange_gift_box_particle.png rename to common/src/main/resources/assets/winterly/textures/block/orange_gift_box_particle.png diff --git a/src/main/resources/assets/winterly/textures/block/packed_icicle_block.png b/common/src/main/resources/assets/winterly/textures/block/packed_icicle_block.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/packed_icicle_block.png rename to common/src/main/resources/assets/winterly/textures/block/packed_icicle_block.png diff --git a/src/main/resources/assets/winterly/textures/block/purple_gift_box.png b/common/src/main/resources/assets/winterly/textures/block/purple_gift_box.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/purple_gift_box.png rename to common/src/main/resources/assets/winterly/textures/block/purple_gift_box.png diff --git a/src/main/resources/assets/winterly/textures/block/purple_gift_box_particle.png b/common/src/main/resources/assets/winterly/textures/block/purple_gift_box_particle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/purple_gift_box_particle.png rename to common/src/main/resources/assets/winterly/textures/block/purple_gift_box_particle.png diff --git a/src/main/resources/assets/winterly/textures/block/rainy_garland_lights.png b/common/src/main/resources/assets/winterly/textures/block/rainy_garland_lights.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/rainy_garland_lights.png rename to common/src/main/resources/assets/winterly/textures/block/rainy_garland_lights.png diff --git a/src/main/resources/assets/winterly/textures/block/rainy_garland_lights.png.mcmeta b/common/src/main/resources/assets/winterly/textures/block/rainy_garland_lights.png.mcmeta similarity index 100% rename from src/main/resources/assets/winterly/textures/block/rainy_garland_lights.png.mcmeta rename to common/src/main/resources/assets/winterly/textures/block/rainy_garland_lights.png.mcmeta diff --git a/src/main/resources/assets/winterly/textures/block/raw_cryomarble_shard.png b/common/src/main/resources/assets/winterly/textures/block/raw_cryomarble_shard.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/raw_cryomarble_shard.png rename to common/src/main/resources/assets/winterly/textures/block/raw_cryomarble_shard.png diff --git a/src/main/resources/assets/winterly/textures/block/red_gift_box.png b/common/src/main/resources/assets/winterly/textures/block/red_gift_box.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/red_gift_box.png rename to common/src/main/resources/assets/winterly/textures/block/red_gift_box.png diff --git a/src/main/resources/assets/winterly/textures/block/red_gift_box_particle.png b/common/src/main/resources/assets/winterly/textures/block/red_gift_box_particle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/red_gift_box_particle.png rename to common/src/main/resources/assets/winterly/textures/block/red_gift_box_particle.png diff --git a/src/main/resources/assets/winterly/textures/block/snow_bricks.png b/common/src/main/resources/assets/winterly/textures/block/snow_bricks.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/snow_bricks.png rename to common/src/main/resources/assets/winterly/textures/block/snow_bricks.png diff --git a/src/main/resources/assets/winterly/textures/block/snowball_wall.png b/common/src/main/resources/assets/winterly/textures/block/snowball_wall.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/snowball_wall.png rename to common/src/main/resources/assets/winterly/textures/block/snowball_wall.png diff --git a/src/main/resources/assets/winterly/textures/block/snowguy_model.png b/common/src/main/resources/assets/winterly/textures/block/snowguy_model.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/snowguy_model.png rename to common/src/main/resources/assets/winterly/textures/block/snowguy_model.png diff --git a/src/main/resources/assets/winterly/textures/block/white_gift_box.png b/common/src/main/resources/assets/winterly/textures/block/white_gift_box.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/white_gift_box.png rename to common/src/main/resources/assets/winterly/textures/block/white_gift_box.png diff --git a/src/main/resources/assets/winterly/textures/block/white_gift_box_particle.png b/common/src/main/resources/assets/winterly/textures/block/white_gift_box_particle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/white_gift_box_particle.png rename to common/src/main/resources/assets/winterly/textures/block/white_gift_box_particle.png diff --git a/src/main/resources/assets/winterly/textures/block/yellow_gift_box.png b/common/src/main/resources/assets/winterly/textures/block/yellow_gift_box.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/yellow_gift_box.png rename to common/src/main/resources/assets/winterly/textures/block/yellow_gift_box.png diff --git a/src/main/resources/assets/winterly/textures/block/yellow_gift_box_particle.png b/common/src/main/resources/assets/winterly/textures/block/yellow_gift_box_particle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/block/yellow_gift_box_particle.png rename to common/src/main/resources/assets/winterly/textures/block/yellow_gift_box_particle.png diff --git a/src/main/resources/assets/winterly/textures/entity/blue_santa_hat.png b/common/src/main/resources/assets/winterly/textures/entity/blue_santa_hat.png similarity index 100% rename from src/main/resources/assets/winterly/textures/entity/blue_santa_hat.png rename to common/src/main/resources/assets/winterly/textures/entity/blue_santa_hat.png diff --git a/src/main/resources/assets/winterly/textures/entity/blue_scarf.png b/common/src/main/resources/assets/winterly/textures/entity/blue_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/entity/blue_scarf.png rename to common/src/main/resources/assets/winterly/textures/entity/blue_scarf.png diff --git a/src/main/resources/assets/winterly/textures/entity/green_scarf.png b/common/src/main/resources/assets/winterly/textures/entity/green_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/entity/green_scarf.png rename to common/src/main/resources/assets/winterly/textures/entity/green_scarf.png diff --git a/src/main/resources/assets/winterly/textures/entity/rainbow_scarf.png b/common/src/main/resources/assets/winterly/textures/entity/rainbow_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/entity/rainbow_scarf.png rename to common/src/main/resources/assets/winterly/textures/entity/rainbow_scarf.png diff --git a/src/main/resources/assets/winterly/textures/entity/red_santa_hat.png b/common/src/main/resources/assets/winterly/textures/entity/red_santa_hat.png similarity index 100% rename from src/main/resources/assets/winterly/textures/entity/red_santa_hat.png rename to common/src/main/resources/assets/winterly/textures/entity/red_santa_hat.png diff --git a/src/main/resources/assets/winterly/textures/entity/red_scarf.png b/common/src/main/resources/assets/winterly/textures/entity/red_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/entity/red_scarf.png rename to common/src/main/resources/assets/winterly/textures/entity/red_scarf.png diff --git a/src/main/resources/assets/winterly/textures/entity/white_scarf.png b/common/src/main/resources/assets/winterly/textures/entity/white_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/entity/white_scarf.png rename to common/src/main/resources/assets/winterly/textures/entity/white_scarf.png diff --git a/src/main/resources/assets/winterly/textures/gui/icons.png b/common/src/main/resources/assets/winterly/textures/gui/icons.png similarity index 100% rename from src/main/resources/assets/winterly/textures/gui/icons.png rename to common/src/main/resources/assets/winterly/textures/gui/icons.png diff --git a/src/main/resources/assets/winterly/textures/item/blue_candy_cane.png b/common/src/main/resources/assets/winterly/textures/item/blue_candy_cane.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/blue_candy_cane.png rename to common/src/main/resources/assets/winterly/textures/item/blue_candy_cane.png diff --git a/src/main/resources/assets/winterly/textures/item/blue_santa_hat.png b/common/src/main/resources/assets/winterly/textures/item/blue_santa_hat.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/blue_santa_hat.png rename to common/src/main/resources/assets/winterly/textures/item/blue_santa_hat.png diff --git a/src/main/resources/assets/winterly/textures/item/blue_scarf.png b/common/src/main/resources/assets/winterly/textures/item/blue_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/blue_scarf.png rename to common/src/main/resources/assets/winterly/textures/item/blue_scarf.png diff --git a/src/main/resources/assets/winterly/textures/item/cryomarble.png b/common/src/main/resources/assets/winterly/textures/item/cryomarble.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/cryomarble.png rename to common/src/main/resources/assets/winterly/textures/item/cryomarble.png diff --git a/src/main/resources/assets/winterly/textures/item/cryomarble_axe.png b/common/src/main/resources/assets/winterly/textures/item/cryomarble_axe.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/cryomarble_axe.png rename to common/src/main/resources/assets/winterly/textures/item/cryomarble_axe.png diff --git a/src/main/resources/assets/winterly/textures/item/cryomarble_hoe.png b/common/src/main/resources/assets/winterly/textures/item/cryomarble_hoe.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/cryomarble_hoe.png rename to common/src/main/resources/assets/winterly/textures/item/cryomarble_hoe.png diff --git a/src/main/resources/assets/winterly/textures/item/cryomarble_pickaxe.png b/common/src/main/resources/assets/winterly/textures/item/cryomarble_pickaxe.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/cryomarble_pickaxe.png rename to common/src/main/resources/assets/winterly/textures/item/cryomarble_pickaxe.png diff --git a/src/main/resources/assets/winterly/textures/item/cryomarble_shard.png b/common/src/main/resources/assets/winterly/textures/item/cryomarble_shard.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/cryomarble_shard.png rename to common/src/main/resources/assets/winterly/textures/item/cryomarble_shard.png diff --git a/src/main/resources/assets/winterly/textures/item/cryomarble_shovel.png b/common/src/main/resources/assets/winterly/textures/item/cryomarble_shovel.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/cryomarble_shovel.png rename to common/src/main/resources/assets/winterly/textures/item/cryomarble_shovel.png diff --git a/src/main/resources/assets/winterly/textures/item/cryomarble_sword.png b/common/src/main/resources/assets/winterly/textures/item/cryomarble_sword.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/cryomarble_sword.png rename to common/src/main/resources/assets/winterly/textures/item/cryomarble_sword.png diff --git a/src/main/resources/assets/winterly/textures/item/green_candy_cane.png b/common/src/main/resources/assets/winterly/textures/item/green_candy_cane.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/green_candy_cane.png rename to common/src/main/resources/assets/winterly/textures/item/green_candy_cane.png diff --git a/src/main/resources/assets/winterly/textures/item/green_scarf.png b/common/src/main/resources/assets/winterly/textures/item/green_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/green_scarf.png rename to common/src/main/resources/assets/winterly/textures/item/green_scarf.png diff --git a/src/main/resources/assets/winterly/textures/item/icicle.png b/common/src/main/resources/assets/winterly/textures/item/icicle.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/icicle.png rename to common/src/main/resources/assets/winterly/textures/item/icicle.png diff --git a/src/main/resources/assets/winterly/textures/item/rainbow_scarf.png b/common/src/main/resources/assets/winterly/textures/item/rainbow_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/rainbow_scarf.png rename to common/src/main/resources/assets/winterly/textures/item/rainbow_scarf.png diff --git a/src/main/resources/assets/winterly/textures/item/red_candy_cane.png b/common/src/main/resources/assets/winterly/textures/item/red_candy_cane.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/red_candy_cane.png rename to common/src/main/resources/assets/winterly/textures/item/red_candy_cane.png diff --git a/src/main/resources/assets/winterly/textures/item/red_santa_hat.png b/common/src/main/resources/assets/winterly/textures/item/red_santa_hat.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/red_santa_hat.png rename to common/src/main/resources/assets/winterly/textures/item/red_santa_hat.png diff --git a/src/main/resources/assets/winterly/textures/item/red_scarf.png b/common/src/main/resources/assets/winterly/textures/item/red_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/red_scarf.png rename to common/src/main/resources/assets/winterly/textures/item/red_scarf.png diff --git a/src/main/resources/assets/winterly/textures/item/snowguy.png b/common/src/main/resources/assets/winterly/textures/item/snowguy.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/snowguy.png rename to common/src/main/resources/assets/winterly/textures/item/snowguy.png diff --git a/src/main/resources/assets/winterly/textures/item/white_scarf.png b/common/src/main/resources/assets/winterly/textures/item/white_scarf.png similarity index 100% rename from src/main/resources/assets/winterly/textures/item/white_scarf.png rename to common/src/main/resources/assets/winterly/textures/item/white_scarf.png diff --git a/src/main/resources/data/minecraft/tags/blocks/beacon_base_blocks.json b/common/src/main/resources/data/minecraft/tags/blocks/beacon_base_blocks.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/beacon_base_blocks.json rename to common/src/main/resources/data/minecraft/tags/blocks/beacon_base_blocks.json diff --git a/src/main/resources/data/minecraft/tags/blocks/mangrove_roots_can_grow_through.json b/common/src/main/resources/data/minecraft/tags/blocks/mangrove_roots_can_grow_through.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/mangrove_roots_can_grow_through.json rename to common/src/main/resources/data/minecraft/tags/blocks/mangrove_roots_can_grow_through.json diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/common/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json rename to common/src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json diff --git a/src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json b/common/src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json rename to common/src/main/resources/data/minecraft/tags/blocks/mineable/shovel.json diff --git a/src/main/resources/data/minecraft/tags/blocks/slabs.json b/common/src/main/resources/data/minecraft/tags/blocks/slabs.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/slabs.json rename to common/src/main/resources/data/minecraft/tags/blocks/slabs.json diff --git a/src/main/resources/data/minecraft/tags/blocks/snow.json b/common/src/main/resources/data/minecraft/tags/blocks/snow.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/snow.json rename to common/src/main/resources/data/minecraft/tags/blocks/snow.json diff --git a/src/main/resources/data/minecraft/tags/blocks/stairs.json b/common/src/main/resources/data/minecraft/tags/blocks/stairs.json similarity index 100% rename from src/main/resources/data/minecraft/tags/blocks/stairs.json rename to common/src/main/resources/data/minecraft/tags/blocks/stairs.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/cryomarble_block.json b/common/src/main/resources/data/winterly/loot_tables/blocks/cryomarble_block.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/cryomarble_block.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/cryomarble_block.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/dense_snow.json b/common/src/main/resources/data/winterly/loot_tables/blocks/dense_snow.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/dense_snow.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/dense_snow.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/dense_snow_slab.json b/common/src/main/resources/data/winterly/loot_tables/blocks/dense_snow_slab.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/dense_snow_slab.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/dense_snow_slab.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/dense_snow_stairs.json b/common/src/main/resources/data/winterly/loot_tables/blocks/dense_snow_stairs.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/dense_snow_stairs.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/dense_snow_stairs.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/frozen_flower.json b/common/src/main/resources/data/winterly/loot_tables/blocks/frozen_flower.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/frozen_flower.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/frozen_flower.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/frozen_grass.json b/common/src/main/resources/data/winterly/loot_tables/blocks/frozen_grass.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/frozen_grass.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/frozen_grass.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/garland_lights.json b/common/src/main/resources/data/winterly/loot_tables/blocks/garland_lights.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/garland_lights.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/garland_lights.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/icicle.json b/common/src/main/resources/data/winterly/loot_tables/blocks/icicle.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/icicle.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/icicle.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/icicle_bars.json b/common/src/main/resources/data/winterly/loot_tables/blocks/icicle_bars.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/icicle_bars.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/icicle_bars.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/icicle_block.json b/common/src/main/resources/data/winterly/loot_tables/blocks/icicle_block.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/icicle_block.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/icicle_block.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/icicle_pane.json b/common/src/main/resources/data/winterly/loot_tables/blocks/icicle_pane.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/icicle_pane.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/icicle_pane.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/packed_icicle_block.json b/common/src/main/resources/data/winterly/loot_tables/blocks/packed_icicle_block.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/packed_icicle_block.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/packed_icicle_block.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/rainy_garland_lights.json b/common/src/main/resources/data/winterly/loot_tables/blocks/rainy_garland_lights.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/rainy_garland_lights.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/rainy_garland_lights.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/raw_cryomarble_shard.json b/common/src/main/resources/data/winterly/loot_tables/blocks/raw_cryomarble_shard.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/raw_cryomarble_shard.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/raw_cryomarble_shard.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/snow_brick_slab.json b/common/src/main/resources/data/winterly/loot_tables/blocks/snow_brick_slab.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/snow_brick_slab.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/snow_brick_slab.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/snow_brick_stairs.json b/common/src/main/resources/data/winterly/loot_tables/blocks/snow_brick_stairs.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/snow_brick_stairs.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/snow_brick_stairs.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/snow_bricks.json b/common/src/main/resources/data/winterly/loot_tables/blocks/snow_bricks.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/snow_bricks.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/snow_bricks.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/snowball_wall.json b/common/src/main/resources/data/winterly/loot_tables/blocks/snowball_wall.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/snowball_wall.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/snowball_wall.json diff --git a/src/main/resources/data/winterly/loot_tables/blocks/snowguy.json b/common/src/main/resources/data/winterly/loot_tables/blocks/snowguy.json similarity index 100% rename from src/main/resources/data/winterly/loot_tables/blocks/snowguy.json rename to common/src/main/resources/data/winterly/loot_tables/blocks/snowguy.json diff --git a/src/main/resources/data/winterly/recipes/black_gift_box.json b/common/src/main/resources/data/winterly/recipes/black_gift_box.json similarity index 100% rename from src/main/resources/data/winterly/recipes/black_gift_box.json rename to common/src/main/resources/data/winterly/recipes/black_gift_box.json diff --git a/src/main/resources/data/winterly/recipes/blue_candy_cane.json b/common/src/main/resources/data/winterly/recipes/blue_candy_cane.json similarity index 100% rename from src/main/resources/data/winterly/recipes/blue_candy_cane.json rename to common/src/main/resources/data/winterly/recipes/blue_candy_cane.json diff --git a/src/main/resources/data/winterly/recipes/blue_gift_box.json b/common/src/main/resources/data/winterly/recipes/blue_gift_box.json similarity index 100% rename from src/main/resources/data/winterly/recipes/blue_gift_box.json rename to common/src/main/resources/data/winterly/recipes/blue_gift_box.json diff --git a/src/main/resources/data/winterly/recipes/blue_santa_hat.json b/common/src/main/resources/data/winterly/recipes/blue_santa_hat.json similarity index 100% rename from src/main/resources/data/winterly/recipes/blue_santa_hat.json rename to common/src/main/resources/data/winterly/recipes/blue_santa_hat.json diff --git a/src/main/resources/data/winterly/recipes/blue_scarf.json b/common/src/main/resources/data/winterly/recipes/blue_scarf.json similarity index 100% rename from src/main/resources/data/winterly/recipes/blue_scarf.json rename to common/src/main/resources/data/winterly/recipes/blue_scarf.json diff --git a/src/main/resources/data/winterly/recipes/cryomarble.json b/common/src/main/resources/data/winterly/recipes/cryomarble.json similarity index 100% rename from src/main/resources/data/winterly/recipes/cryomarble.json rename to common/src/main/resources/data/winterly/recipes/cryomarble.json diff --git a/src/main/resources/data/winterly/recipes/cryomarble_axe.json b/common/src/main/resources/data/winterly/recipes/cryomarble_axe.json similarity index 100% rename from src/main/resources/data/winterly/recipes/cryomarble_axe.json rename to common/src/main/resources/data/winterly/recipes/cryomarble_axe.json diff --git a/src/main/resources/data/winterly/recipes/cryomarble_block.json b/common/src/main/resources/data/winterly/recipes/cryomarble_block.json similarity index 100% rename from src/main/resources/data/winterly/recipes/cryomarble_block.json rename to common/src/main/resources/data/winterly/recipes/cryomarble_block.json diff --git a/src/main/resources/data/winterly/recipes/cryomarble_from_cryomarble_block.json b/common/src/main/resources/data/winterly/recipes/cryomarble_from_cryomarble_block.json similarity index 100% rename from src/main/resources/data/winterly/recipes/cryomarble_from_cryomarble_block.json rename to common/src/main/resources/data/winterly/recipes/cryomarble_from_cryomarble_block.json diff --git a/src/main/resources/data/winterly/recipes/cryomarble_hoe.json b/common/src/main/resources/data/winterly/recipes/cryomarble_hoe.json similarity index 100% rename from src/main/resources/data/winterly/recipes/cryomarble_hoe.json rename to common/src/main/resources/data/winterly/recipes/cryomarble_hoe.json diff --git a/src/main/resources/data/winterly/recipes/cryomarble_pickaxe.json b/common/src/main/resources/data/winterly/recipes/cryomarble_pickaxe.json similarity index 100% rename from src/main/resources/data/winterly/recipes/cryomarble_pickaxe.json rename to common/src/main/resources/data/winterly/recipes/cryomarble_pickaxe.json diff --git a/src/main/resources/data/winterly/recipes/cryomarble_shovel.json b/common/src/main/resources/data/winterly/recipes/cryomarble_shovel.json similarity index 100% rename from src/main/resources/data/winterly/recipes/cryomarble_shovel.json rename to common/src/main/resources/data/winterly/recipes/cryomarble_shovel.json diff --git a/src/main/resources/data/winterly/recipes/cryomarble_sword.json b/common/src/main/resources/data/winterly/recipes/cryomarble_sword.json similarity index 100% rename from src/main/resources/data/winterly/recipes/cryomarble_sword.json rename to common/src/main/resources/data/winterly/recipes/cryomarble_sword.json diff --git a/src/main/resources/data/winterly/recipes/cyan_gift_box.json b/common/src/main/resources/data/winterly/recipes/cyan_gift_box.json similarity index 100% rename from src/main/resources/data/winterly/recipes/cyan_gift_box.json rename to common/src/main/resources/data/winterly/recipes/cyan_gift_box.json diff --git a/src/main/resources/data/winterly/recipes/dense_snow.json b/common/src/main/resources/data/winterly/recipes/dense_snow.json similarity index 100% rename from src/main/resources/data/winterly/recipes/dense_snow.json rename to common/src/main/resources/data/winterly/recipes/dense_snow.json diff --git a/src/main/resources/data/winterly/recipes/dense_snow_slab.json b/common/src/main/resources/data/winterly/recipes/dense_snow_slab.json similarity index 100% rename from src/main/resources/data/winterly/recipes/dense_snow_slab.json rename to common/src/main/resources/data/winterly/recipes/dense_snow_slab.json diff --git a/src/main/resources/data/winterly/recipes/dense_snow_stairs.json b/common/src/main/resources/data/winterly/recipes/dense_snow_stairs.json similarity index 100% rename from src/main/resources/data/winterly/recipes/dense_snow_stairs.json rename to common/src/main/resources/data/winterly/recipes/dense_snow_stairs.json diff --git a/src/main/resources/data/winterly/recipes/garland_lights.json b/common/src/main/resources/data/winterly/recipes/garland_lights.json similarity index 100% rename from src/main/resources/data/winterly/recipes/garland_lights.json rename to common/src/main/resources/data/winterly/recipes/garland_lights.json diff --git a/src/main/resources/data/winterly/recipes/green_candy_cane.json b/common/src/main/resources/data/winterly/recipes/green_candy_cane.json similarity index 100% rename from src/main/resources/data/winterly/recipes/green_candy_cane.json rename to common/src/main/resources/data/winterly/recipes/green_candy_cane.json diff --git a/src/main/resources/data/winterly/recipes/green_gift_box.json b/common/src/main/resources/data/winterly/recipes/green_gift_box.json similarity index 100% rename from src/main/resources/data/winterly/recipes/green_gift_box.json rename to common/src/main/resources/data/winterly/recipes/green_gift_box.json diff --git a/src/main/resources/data/winterly/recipes/green_scarf.json b/common/src/main/resources/data/winterly/recipes/green_scarf.json similarity index 100% rename from src/main/resources/data/winterly/recipes/green_scarf.json rename to common/src/main/resources/data/winterly/recipes/green_scarf.json diff --git a/src/main/resources/data/winterly/recipes/icicle_1.json b/common/src/main/resources/data/winterly/recipes/icicle_1.json similarity index 100% rename from src/main/resources/data/winterly/recipes/icicle_1.json rename to common/src/main/resources/data/winterly/recipes/icicle_1.json diff --git a/src/main/resources/data/winterly/recipes/icicle_2.json b/common/src/main/resources/data/winterly/recipes/icicle_2.json similarity index 100% rename from src/main/resources/data/winterly/recipes/icicle_2.json rename to common/src/main/resources/data/winterly/recipes/icicle_2.json diff --git a/src/main/resources/data/winterly/recipes/icicle_3.json b/common/src/main/resources/data/winterly/recipes/icicle_3.json similarity index 100% rename from src/main/resources/data/winterly/recipes/icicle_3.json rename to common/src/main/resources/data/winterly/recipes/icicle_3.json diff --git a/src/main/resources/data/winterly/recipes/icicle_bars.json b/common/src/main/resources/data/winterly/recipes/icicle_bars.json similarity index 100% rename from src/main/resources/data/winterly/recipes/icicle_bars.json rename to common/src/main/resources/data/winterly/recipes/icicle_bars.json diff --git a/src/main/resources/data/winterly/recipes/icicle_block.json b/common/src/main/resources/data/winterly/recipes/icicle_block.json similarity index 100% rename from src/main/resources/data/winterly/recipes/icicle_block.json rename to common/src/main/resources/data/winterly/recipes/icicle_block.json diff --git a/src/main/resources/data/winterly/recipes/icicle_from_icicle_block.json b/common/src/main/resources/data/winterly/recipes/icicle_from_icicle_block.json similarity index 100% rename from src/main/resources/data/winterly/recipes/icicle_from_icicle_block.json rename to common/src/main/resources/data/winterly/recipes/icicle_from_icicle_block.json diff --git a/src/main/resources/data/winterly/recipes/icicle_pane.json b/common/src/main/resources/data/winterly/recipes/icicle_pane.json similarity index 100% rename from src/main/resources/data/winterly/recipes/icicle_pane.json rename to common/src/main/resources/data/winterly/recipes/icicle_pane.json diff --git a/src/main/resources/data/winterly/recipes/orange_gift_box.json b/common/src/main/resources/data/winterly/recipes/orange_gift_box.json similarity index 100% rename from src/main/resources/data/winterly/recipes/orange_gift_box.json rename to common/src/main/resources/data/winterly/recipes/orange_gift_box.json diff --git a/src/main/resources/data/winterly/recipes/packed_icicle_block.json b/common/src/main/resources/data/winterly/recipes/packed_icicle_block.json similarity index 100% rename from src/main/resources/data/winterly/recipes/packed_icicle_block.json rename to common/src/main/resources/data/winterly/recipes/packed_icicle_block.json diff --git a/src/main/resources/data/winterly/recipes/purple_gift_box.json b/common/src/main/resources/data/winterly/recipes/purple_gift_box.json similarity index 100% rename from src/main/resources/data/winterly/recipes/purple_gift_box.json rename to common/src/main/resources/data/winterly/recipes/purple_gift_box.json diff --git a/src/main/resources/data/winterly/recipes/rainbow_scarf.json b/common/src/main/resources/data/winterly/recipes/rainbow_scarf.json similarity index 100% rename from src/main/resources/data/winterly/recipes/rainbow_scarf.json rename to common/src/main/resources/data/winterly/recipes/rainbow_scarf.json diff --git a/src/main/resources/data/winterly/recipes/rainy_garland_lights.json b/common/src/main/resources/data/winterly/recipes/rainy_garland_lights.json similarity index 100% rename from src/main/resources/data/winterly/recipes/rainy_garland_lights.json rename to common/src/main/resources/data/winterly/recipes/rainy_garland_lights.json diff --git a/src/main/resources/data/winterly/recipes/red_candy_cane.json b/common/src/main/resources/data/winterly/recipes/red_candy_cane.json similarity index 100% rename from src/main/resources/data/winterly/recipes/red_candy_cane.json rename to common/src/main/resources/data/winterly/recipes/red_candy_cane.json diff --git a/src/main/resources/data/winterly/recipes/red_gift_box.json b/common/src/main/resources/data/winterly/recipes/red_gift_box.json similarity index 100% rename from src/main/resources/data/winterly/recipes/red_gift_box.json rename to common/src/main/resources/data/winterly/recipes/red_gift_box.json diff --git a/src/main/resources/data/winterly/recipes/red_santa_hat.json b/common/src/main/resources/data/winterly/recipes/red_santa_hat.json similarity index 100% rename from src/main/resources/data/winterly/recipes/red_santa_hat.json rename to common/src/main/resources/data/winterly/recipes/red_santa_hat.json diff --git a/src/main/resources/data/winterly/recipes/red_scarf.json b/common/src/main/resources/data/winterly/recipes/red_scarf.json similarity index 100% rename from src/main/resources/data/winterly/recipes/red_scarf.json rename to common/src/main/resources/data/winterly/recipes/red_scarf.json diff --git a/src/main/resources/data/winterly/recipes/snow_brick_slab.json b/common/src/main/resources/data/winterly/recipes/snow_brick_slab.json similarity index 100% rename from src/main/resources/data/winterly/recipes/snow_brick_slab.json rename to common/src/main/resources/data/winterly/recipes/snow_brick_slab.json diff --git a/src/main/resources/data/winterly/recipes/snow_brick_stairs.json b/common/src/main/resources/data/winterly/recipes/snow_brick_stairs.json similarity index 100% rename from src/main/resources/data/winterly/recipes/snow_brick_stairs.json rename to common/src/main/resources/data/winterly/recipes/snow_brick_stairs.json diff --git a/src/main/resources/data/winterly/recipes/snow_bricks.json b/common/src/main/resources/data/winterly/recipes/snow_bricks.json similarity index 100% rename from src/main/resources/data/winterly/recipes/snow_bricks.json rename to common/src/main/resources/data/winterly/recipes/snow_bricks.json diff --git a/src/main/resources/data/winterly/recipes/snowball_wall.json b/common/src/main/resources/data/winterly/recipes/snowball_wall.json similarity index 100% rename from src/main/resources/data/winterly/recipes/snowball_wall.json rename to common/src/main/resources/data/winterly/recipes/snowball_wall.json diff --git a/src/main/resources/data/winterly/recipes/snowguy.json b/common/src/main/resources/data/winterly/recipes/snowguy.json similarity index 100% rename from src/main/resources/data/winterly/recipes/snowguy.json rename to common/src/main/resources/data/winterly/recipes/snowguy.json diff --git a/src/main/resources/data/winterly/recipes/white_gift_box.json b/common/src/main/resources/data/winterly/recipes/white_gift_box.json similarity index 100% rename from src/main/resources/data/winterly/recipes/white_gift_box.json rename to common/src/main/resources/data/winterly/recipes/white_gift_box.json diff --git a/src/main/resources/data/winterly/recipes/white_scarf.json b/common/src/main/resources/data/winterly/recipes/white_scarf.json similarity index 100% rename from src/main/resources/data/winterly/recipes/white_scarf.json rename to common/src/main/resources/data/winterly/recipes/white_scarf.json diff --git a/src/main/resources/data/winterly/recipes/yellow_gift_box.json b/common/src/main/resources/data/winterly/recipes/yellow_gift_box.json similarity index 100% rename from src/main/resources/data/winterly/recipes/yellow_gift_box.json rename to common/src/main/resources/data/winterly/recipes/yellow_gift_box.json diff --git a/src/main/resources/data/winterly/tags/blocks/gift_boxes.json b/common/src/main/resources/data/winterly/tags/blocks/gift_boxes.json similarity index 100% rename from src/main/resources/data/winterly/tags/blocks/gift_boxes.json rename to common/src/main/resources/data/winterly/tags/blocks/gift_boxes.json diff --git a/src/main/resources/data/winterly/tags/items/candy_canes.json b/common/src/main/resources/data/winterly/tags/items/candy_canes.json similarity index 100% rename from src/main/resources/data/winterly/tags/items/candy_canes.json rename to common/src/main/resources/data/winterly/tags/items/candy_canes.json diff --git a/src/main/resources/data/winterly/tags/items/scarfs.json b/common/src/main/resources/data/winterly/tags/items/scarfs.json similarity index 100% rename from src/main/resources/data/winterly/tags/items/scarfs.json rename to common/src/main/resources/data/winterly/tags/items/scarfs.json diff --git a/src/main/resources/data/winterly/worldgen/configured_feature/cryomarble.json b/common/src/main/resources/data/winterly/worldgen/configured_feature/cryomarble.json similarity index 100% rename from src/main/resources/data/winterly/worldgen/configured_feature/cryomarble.json rename to common/src/main/resources/data/winterly/worldgen/configured_feature/cryomarble.json diff --git a/src/main/resources/data/winterly/worldgen/configured_feature/underground_icicle.json b/common/src/main/resources/data/winterly/worldgen/configured_feature/underground_icicle.json similarity index 100% rename from src/main/resources/data/winterly/worldgen/configured_feature/underground_icicle.json rename to common/src/main/resources/data/winterly/worldgen/configured_feature/underground_icicle.json diff --git a/src/main/resources/data/winterly/worldgen/placed_feature/cryomarble.json b/common/src/main/resources/data/winterly/worldgen/placed_feature/cryomarble.json similarity index 100% rename from src/main/resources/data/winterly/worldgen/placed_feature/cryomarble.json rename to common/src/main/resources/data/winterly/worldgen/placed_feature/cryomarble.json diff --git a/src/main/resources/data/winterly/worldgen/placed_feature/underground_icicle.json b/common/src/main/resources/data/winterly/worldgen/placed_feature/underground_icicle.json similarity index 100% rename from src/main/resources/data/winterly/worldgen/placed_feature/underground_icicle.json rename to common/src/main/resources/data/winterly/worldgen/placed_feature/underground_icicle.json diff --git a/src/main/resources/winterly.mixins.json b/common/src/main/resources/winterly-common.mixins.json similarity index 94% rename from src/main/resources/winterly.mixins.json rename to common/src/main/resources/winterly-common.mixins.json index 47dadab..5f03295 100644 --- a/src/main/resources/winterly.mixins.json +++ b/common/src/main/resources/winterly-common.mixins.json @@ -15,7 +15,6 @@ "common.ZombieExtension" ], "client": [ - "client.ArmorRendererMixin" ], "injectors": { "defaultRequire": 1 diff --git a/common/src/main/resources/winterly.accesswidener b/common/src/main/resources/winterly.accesswidener new file mode 100644 index 0000000..babb8fe --- /dev/null +++ b/common/src/main/resources/winterly.accesswidener @@ -0,0 +1,2 @@ +accessWidener v1 named +accessible method net/minecraft/world/level/biome/Biome getTemperature (Lnet/minecraft/core/BlockPos;)F diff --git a/fabric/build.gradle b/fabric/build.gradle new file mode 100644 index 0000000..8a3b154 --- /dev/null +++ b/fabric/build.gradle @@ -0,0 +1,90 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" +} + +architectury { + platformSetupLoomIde() + fabric() +} + +base { + archivesName = "${rootProject.archives_base_name}-fabric" +} + +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentFabric.extendsFrom common +} + +repositories { + maven { + url "https://api.modrinth.com/maven" + content { includeGroup "maven.modrinth" } + } + maven { url "https://maven.ladysnake.org/releases" } //CCA + maven { url "https://maven.terraformersmc.com" } //trinkets + maven { url "https://maven.wispforest.io" } //owo-lib + maven { url "https://maven.shedaniel.me/" } //cloth-config +} + +dependencies { + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" + modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" + // Remove the next line if you don't want to depend on the API + //modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" + + modImplementation "dev.emi:trinkets:${project.trinkets_version}" + modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-base:${project.cca_version}" + modImplementation "dev.onyxstudios.cardinal-components-api:cardinal-components-entity:${project.cca_version}" + modImplementation include("dev.onyxstudios.cardinal-components-api:cardinal-components-world:${project.cca_version}") + modApi "io.wispforest:owo-lib:${project.owo_lib}" + modApi("me.shedaniel.cloth:cloth-config-fabric:${project.cloth_config}") { exclude(group: "net.fabricmc.fabric-api") } + modApi "com.terraformersmc:modmenu:${project.modmenu_version}" + + modLocalRuntime "maven.modrinth:here-be-no-dragons:1.0.0" + modLocalRuntime "dev.emi:emi-fabric:1.0.29+1.20.4" + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +shadowJar { + exclude "architectury.common.json" + + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" +} + +remapJar { + injectAccessWidener = true + input.set shadowJar.archiveFile + dependsOn shadowJar +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} + diff --git a/fabric/src/main/java/winterly/fabric/WinterlyFabric.java b/fabric/src/main/java/winterly/fabric/WinterlyFabric.java new file mode 100644 index 0000000..543514a --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/WinterlyFabric.java @@ -0,0 +1,56 @@ +package winterly.fabric; + +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; +import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.CreativeModeTab; +import winterly.Winterly; +import winterly.config.WinterlyClothConfig; +import winterly.fabric.compat.WinterlyOwoLibIntegration; +import winterly.fabric.registry.WinterlyBlockEntities; +import winterly.fabric.registry.WinterlyBlocks; +import winterly.registry.CommonWinterlyBlocks; +import winterly.fabric.registry.WinterlyFeatures; +import winterly.fabric.registry.WinterlyItems; +import winterly.registry.CommonWinterlyItems; + +public class WinterlyFabric implements ModInitializer { + public static CreativeModeTab itemGroup; + + @Override + public void onInitialize() { + itemGroup = createItemGroup(); + WinterlyItems.init(); + + WinterlyBlocks.init(); + WinterlyBlockEntities.init(); + WinterlyFeatures.init(); + + if(FabricLoader.getInstance().isModLoaded("owo")) { + WinterlyOwoLibIntegration.initItemGroup(); + ItemGroupEvents.modifyEntriesEvent(BuiltInRegistries.CREATIVE_MODE_TAB.getResourceKey(itemGroup).get()).register(entries -> { + CommonWinterlyItems.ITEMS.forEach((id, item) -> entries.accept(item.getDefaultInstance())); + CommonWinterlyBlocks.ITEMS.forEach((id, item) -> entries.accept(item.getDefaultInstance())); + }); + } + } + + private static CreativeModeTab createItemGroup() { + if(FabricLoader.getInstance().isModLoaded("owo")) { + return WinterlyOwoLibIntegration.createItemGroup(); + } + var group = FabricItemGroup.builder().title(Component.translatable("itemGroup.winterly.items")) + .icon(() -> CommonWinterlyBlocks.SNOWGUY.asItem().getDefaultInstance()) + .displayItems((displayContext, entries) -> { + CommonWinterlyItems.ITEMS.forEach((id, item) -> entries.accept(item.getDefaultInstance())); + CommonWinterlyBlocks.ITEMS.forEach((id, item) -> entries.accept(item.getDefaultInstance())); + }).build(); + Registry.register(BuiltInRegistries.CREATIVE_MODE_TAB, Winterly.id("items"), group); + return group; + } + +} diff --git a/fabric/src/main/java/winterly/fabric/block/FrozenFlowerBlock.java b/fabric/src/main/java/winterly/fabric/block/FrozenFlowerBlock.java new file mode 100644 index 0000000..26d45a1 --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/block/FrozenFlowerBlock.java @@ -0,0 +1,40 @@ +package winterly.fabric.block; + +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.state.BlockState; +import winterly.block.CommonFrozenFlowerBlock; +import winterly.data.CachedFlowers; + +import java.util.Objects; + +public class FrozenFlowerBlock extends CommonFrozenFlowerBlock { + + public FrozenFlowerBlock(Properties settings) { + super(settings); + } + + @SuppressWarnings("deprecation") + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { + if (world.getBrightness(LightLayer.BLOCK, pos) > 11) { + dropResources(state, world, pos); + if(state.getValue(LAYERS) != 0) { + var cachedFlower = CachedFlowers.getFlower(world, pos); + world.setBlockAndUpdate(pos, Objects.requireNonNullElse(cachedFlower, this).defaultBlockState()); + } + } + else if(FabricLoader.getInstance().isModLoaded("seasons")) { + if(!state.getValue(PERSISTENT) && world.getBrightness(LightLayer.SKY, pos) > 0 && world.getBiome(pos).value().getTemperature(pos) >= 0.15F) { + dropResources(state, world, pos); + if(state.getValue(LAYERS) != 0) { + var cachedFlower = CachedFlowers.getFlower(world, pos); + world.setBlockAndUpdate(pos, Objects.requireNonNullElse(cachedFlower, this).defaultBlockState()); + } + } + } + } +} diff --git a/fabric/src/main/java/winterly/fabric/block/FrozenGrassBlock.java b/fabric/src/main/java/winterly/fabric/block/FrozenGrassBlock.java new file mode 100644 index 0000000..f3f9fbe --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/block/FrozenGrassBlock.java @@ -0,0 +1,32 @@ +package winterly.fabric.block; + +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import winterly.block.CommonFrozenGrassBlock; + +public class FrozenGrassBlock extends CommonFrozenGrassBlock { + + public FrozenGrassBlock(Properties settings) { + super(settings); + } + + @SuppressWarnings("deprecation") + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { + if (world.getBrightness(LightLayer.BLOCK, pos) > 11) { + dropResources(state, world, pos); + world.setBlockAndUpdate(pos, Blocks.SHORT_GRASS.defaultBlockState()); + } + else if(FabricLoader.getInstance().isModLoaded("seasons")) { + if(!state.getValue(PERSISTENT) && world.getBrightness(LightLayer.SKY, pos) > 0 && world.getBiome(pos).value().getTemperature(pos) >= 0.15F) { + dropResources(state, world, pos); + world.setBlockAndUpdate(pos, Blocks.SHORT_GRASS.defaultBlockState()); + } + } + } +} diff --git a/fabric/src/main/java/winterly/fabric/client/WinterlyFabricClient.java b/fabric/src/main/java/winterly/fabric/client/WinterlyFabricClient.java new file mode 100644 index 0000000..b14e4fb --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/client/WinterlyFabricClient.java @@ -0,0 +1,63 @@ +package winterly.fabric.client; + +import dev.emi.trinkets.api.client.TrinketRenderer; +import dev.emi.trinkets.api.client.TrinketRendererRegistry; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; +import net.fabricmc.fabric.api.client.rendering.v1.LivingEntityFeatureRendererRegistrationCallback; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.DrownedRenderer; +import net.minecraft.client.renderer.entity.SkeletonRenderer; +import net.minecraft.client.renderer.entity.ZombieRenderer; +import winterly.block.*; +import winterly.client.WinterlyModelLayers; +import winterly.client.model.SantaHatModel; +import winterly.client.model.ScarfModel; +import winterly.client.render.DecorationFeatureRenderer; +import winterly.client.render.MobDecorationRenderers; +import winterly.registry.CommonWinterlyBlocks; +import winterly.registry.CommonWinterlyItems; + +import static net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry.registerModelLayer; + +public class WinterlyFabricClient implements ClientModInitializer { + + @Override + public void onInitializeClient() { + registerModelLayer(WinterlyModelLayers.SANTA_HAT_LAYER, SantaHatModel::getTexturedModelData); + registerModelLayer(WinterlyModelLayers.SCARF_LAYER, ScarfModel::getTexturedModelData); + + MobDecorationRenderers.init(); + + BlockRenderLayerMap map = BlockRenderLayerMap.INSTANCE; + CommonWinterlyBlocks.BLOCKS.forEach((id, block) -> { + if(block instanceof GiftBoxBlock) map.putBlock(block, RenderType.cutout()); + if(block instanceof GarlandLightsBlock) map.putBlock(block, RenderType.cutout()); + if(block instanceof SnowguyBlock) map.putBlock(block, RenderType.cutout()); + if(block instanceof IcicleBlock) map.putBlock(block, RenderType.cutout()); + if(block instanceof CommonFrozenGrassBlock) map.putBlock(block, RenderType.cutout()); + if(block instanceof CommonFrozenFlowerBlock) map.putBlock(block, RenderType.cutout()); + }); + map.putBlock(CommonWinterlyBlocks.ICICLE_BLOCK, RenderType.translucent()); + map.putBlock(CommonWinterlyBlocks.ICICLE_PANE, RenderType.translucent()); + map.putBlock(CommonWinterlyBlocks.ICICLE_BARS, RenderType.cutout()); + + CommonWinterlyItems.ITEMS.forEach((id, item) -> { + if(item instanceof TrinketRenderer renderer) TrinketRendererRegistry.registerRenderer(item, renderer); + }); + + LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper, context) -> { + if(entityRenderer instanceof ZombieRenderer renderer) { + registrationHelper.register(new DecorationFeatureRenderer<>(renderer)); + } + if(entityRenderer instanceof DrownedRenderer renderer) { + registrationHelper.register(new DecorationFeatureRenderer<>(renderer)); + } + if(entityRenderer instanceof SkeletonRenderer renderer) { + registrationHelper.register(new DecorationFeatureRenderer<>(renderer)); + } + }); + + } + +} diff --git a/src/main/java/winterly/compat/WinterlyModMenuIntegration.java b/fabric/src/main/java/winterly/fabric/compat/WinterlyModMenuIntegration.java similarity index 93% rename from src/main/java/winterly/compat/WinterlyModMenuIntegration.java rename to fabric/src/main/java/winterly/fabric/compat/WinterlyModMenuIntegration.java index 92c4ca0..5db00ea 100644 --- a/src/main/java/winterly/compat/WinterlyModMenuIntegration.java +++ b/fabric/src/main/java/winterly/fabric/compat/WinterlyModMenuIntegration.java @@ -1,4 +1,4 @@ -package winterly.compat; +package winterly.fabric.compat; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; diff --git a/src/main/java/winterly/compat/WinterlyOwoLibIntegration.java b/fabric/src/main/java/winterly/fabric/compat/WinterlyOwoLibIntegration.java similarity index 60% rename from src/main/java/winterly/compat/WinterlyOwoLibIntegration.java rename to fabric/src/main/java/winterly/fabric/compat/WinterlyOwoLibIntegration.java index fd61611..6adc56d 100644 --- a/src/main/java/winterly/compat/WinterlyOwoLibIntegration.java +++ b/fabric/src/main/java/winterly/fabric/compat/WinterlyOwoLibIntegration.java @@ -1,19 +1,19 @@ -package winterly.compat; +package winterly.fabric.compat; import io.wispforest.owo.itemgroup.Icon; import io.wispforest.owo.itemgroup.OwoItemGroup; import io.wispforest.owo.itemgroup.gui.ItemGroupButton; -import net.minecraft.item.ItemGroup; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.CreativeModeTab; import winterly.Winterly; -import winterly.registry.WinterlyBlocks; -import winterly.util.UpdateChecker; +import winterly.fabric.WinterlyFabric; +import winterly.registry.CommonWinterlyBlocks; public class WinterlyOwoLibIntegration { - public static final Identifier ICONS_TEXTURE = Winterly.id("textures/gui/icons.png"); + public static final ResourceLocation ICONS_TEXTURE = Winterly.id("textures/gui/icons.png"); - public static ItemGroup createItemGroup() { - return OwoItemGroup.builder(Winterly.id("items"), () -> Icon.of(WinterlyBlocks.SNOWGUY)) + public static CreativeModeTab createItemGroup() { + return OwoItemGroup.builder(Winterly.id("items"), () -> Icon.of(CommonWinterlyBlocks.SNOWGUY)) .initializer(group -> { group.addButton(ItemGroupButton.link(group, Icon.of(ICONS_TEXTURE, 0, 0, 64, 64), "discord", "https://discord.gg/DcemWeskeZ")); // if(UpdateChecker.check()) { @@ -23,7 +23,7 @@ public static ItemGroup createItemGroup() { } public static void initItemGroup() { - if(Winterly.itemGroup instanceof OwoItemGroup owoItemGroup) { + if(WinterlyFabric.itemGroup instanceof OwoItemGroup owoItemGroup) { owoItemGroup.initialize(); } } diff --git a/src/main/java/winterly/data/WinterlyComponents.java b/fabric/src/main/java/winterly/fabric/data/WinterlyComponents.java similarity index 95% rename from src/main/java/winterly/data/WinterlyComponents.java rename to fabric/src/main/java/winterly/fabric/data/WinterlyComponents.java index 6857afb..56897da 100644 --- a/src/main/java/winterly/data/WinterlyComponents.java +++ b/fabric/src/main/java/winterly/fabric/data/WinterlyComponents.java @@ -1,4 +1,4 @@ -package winterly.data; +package winterly.fabric.data; import dev.onyxstudios.cca.api.v3.component.ComponentKey; import dev.onyxstudios.cca.api.v3.component.ComponentRegistryV3; diff --git a/fabric/src/main/java/winterly/fabric/data/WorldData.java b/fabric/src/main/java/winterly/fabric/data/WorldData.java new file mode 100644 index 0000000..1057e77 --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/data/WorldData.java @@ -0,0 +1,58 @@ +package winterly.fabric.data; + +import dev.onyxstudios.cca.api.v3.component.ComponentV3; +import java.util.LinkedHashMap; +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import winterly.data.CachedFlowers; + +public class WorldData implements ComponentV3 { + + public Level world; + + public WorldData(Level world) { + this.world = world; + } + + @Override + public void readFromNbt(CompoundTag tag) { + CachedFlowers.instance.data = new LinkedHashMap<>(); + var cachedFlowerNbt = tag.getCompound("cachedFlower"); + + if(!cachedFlowerNbt.isEmpty()) { + int size = cachedFlowerNbt.getInt("size"); + + for(int i = 0; i < size; i++) { + CompoundTag entry = cachedFlowerNbt.getCompound(String.valueOf(i)); + BlockPos pos = new BlockPos(entry.getInt("x"), entry.getInt("y"), entry.getInt("z")); + var block = BuiltInRegistries.BLOCK.getOptional(new ResourceLocation(entry.getString("block"))); + block.ifPresent(bl -> CachedFlowers.cacheFlower(world, pos, bl)); + } + } + } + + @Override + public void writeToNbt(CompoundTag tag) { + CompoundTag cachedFlowerNbt = new CompoundTag(); + var map = CachedFlowers.instance.data.get(world.dimension()); + if(map != null) { + cachedFlowerNbt.putInt("size", map.size()); + int index = -1; + + for(var entry : map.entrySet()) { + index++; + CompoundTag entryNbt = new CompoundTag(); + entryNbt.putInt("x", entry.getKey().getX()); + entryNbt.putInt("y", entry.getKey().getY()); + entryNbt.putInt("z", entry.getKey().getZ()); + entryNbt.putString("block", BuiltInRegistries.BLOCK.getKey(entry.getValue()).toString()); + cachedFlowerNbt.put(String.valueOf(index), entryNbt); + } + tag.put("cachedFlower", cachedFlowerNbt); + } + + } +} diff --git a/fabric/src/main/java/winterly/fabric/item/SantaHatItem.java b/fabric/src/main/java/winterly/fabric/item/SantaHatItem.java new file mode 100644 index 0000000..dd49cd2 --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/item/SantaHatItem.java @@ -0,0 +1,39 @@ +package winterly.fabric.item; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import dev.emi.trinkets.api.SlotReference; +import dev.emi.trinkets.api.Trinket; +import dev.emi.trinkets.api.TrinketsApi; +import dev.emi.trinkets.api.client.TrinketRenderer; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import winterly.Winterly; +import winterly.client.model.WinterlyModels; +import winterly.item.CommonSantaHatItem; + +public class SantaHatItem extends CommonSantaHatItem implements Trinket, TrinketRenderer { + + public SantaHatItem(Item.Properties settings, String color) { + super(settings, color); + TrinketsApi.registerTrinket(this, this); + } + + @Environment(EnvType.CLIENT) + @Override + public void render(ItemStack stack, SlotReference slotReference, EntityModel contextModel, PoseStack matrices, MultiBufferSource vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + if(contextModel instanceof HumanoidModel biped) { + WinterlyModels.SANTA_HAT_MODEL.hat.copyFrom(biped.head); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderType.entityCutout(Winterly.id("textures/entity/" + color + "_santa_hat.png"))); + WinterlyModels.SANTA_HAT_MODEL.renderToBuffer(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/fabric/src/main/java/winterly/fabric/item/ScarfItem.java b/fabric/src/main/java/winterly/fabric/item/ScarfItem.java new file mode 100644 index 0000000..f1682c1 --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/item/ScarfItem.java @@ -0,0 +1,39 @@ +package winterly.fabric.item; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import dev.emi.trinkets.api.SlotReference; +import dev.emi.trinkets.api.Trinket; +import dev.emi.trinkets.api.TrinketsApi; +import dev.emi.trinkets.api.client.TrinketRenderer; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import winterly.Winterly; +import winterly.client.model.WinterlyModels; +import winterly.item.CommonScarfItem; + +public class ScarfItem extends CommonScarfItem implements Trinket, TrinketRenderer { + + public ScarfItem(Item.Properties settings, String color) { + super(settings, color); + TrinketsApi.registerTrinket(this, this); + } + + @Environment(EnvType.CLIENT) + @Override + public void render(ItemStack stack, SlotReference slotReference, EntityModel contextModel, PoseStack matrices, MultiBufferSource vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { + if(contextModel instanceof HumanoidModel biped){ + WinterlyModels.SCARF_MODEL.scarf.copyFrom(biped.body); + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderType.entityCutout(Winterly.id("textures/entity/" + color + "_scarf.png"))); + WinterlyModels.SCARF_MODEL.renderToBuffer(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/fabric/src/main/java/winterly/fabric/mixin/client/ArmorRendererMixin.java b/fabric/src/main/java/winterly/fabric/mixin/client/ArmorRendererMixin.java new file mode 100644 index 0000000..e03210f --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/mixin/client/ArmorRendererMixin.java @@ -0,0 +1,49 @@ +package winterly.fabric.mixin.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.emi.trinkets.api.SlotReference; +import dev.emi.trinkets.api.TrinketComponent; +import dev.emi.trinkets.api.TrinketsApi; +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; +import winterly.fabric.item.SantaHatItem; +import java.util.Optional; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.util.Tuple; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +@Mixin(HumanoidArmorLayer.class) +public abstract class ArmorRendererMixin , A extends HumanoidModel> extends RenderLayer { + + public ArmorRendererMixin(RenderLayerParent context) { + super(context); + } + + @Inject(method = "renderArmorPiece", at = @At("HEAD"), cancellable = true) + void render(PoseStack matrices, MultiBufferSource vertexConsumers, T entity, EquipmentSlot armorSlot, int light, A model, CallbackInfo ci) { + if(entity instanceof Player player) { + if(armorSlot.equals(EquipmentSlot.HEAD)) { + if(winterly$hasHatOn(player)) ci.cancel(); + } + } + } + + boolean winterly$hasHatOn(Player player) { + Optional component = TrinketsApi.getTrinketComponent(player); + if(component.isPresent()) { + for(Tuple pair : component.get().getAllEquipped()) { + if(pair.getB().getItem() instanceof SantaHatItem) return true; + } + } + return false; + } +} diff --git a/src/main/java/winterly/registry/WinterlyBlockEntities.java b/fabric/src/main/java/winterly/fabric/registry/WinterlyBlockEntities.java similarity index 51% rename from src/main/java/winterly/registry/WinterlyBlockEntities.java rename to fabric/src/main/java/winterly/fabric/registry/WinterlyBlockEntities.java index 6efb106..3efe4fe 100644 --- a/src/main/java/winterly/registry/WinterlyBlockEntities.java +++ b/fabric/src/main/java/winterly/fabric/registry/WinterlyBlockEntities.java @@ -1,31 +1,30 @@ -package winterly.registry; +package winterly.fabric.registry; import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; import winterly.Winterly; import winterly.block.GiftBoxBlock; import winterly.block.entity.GiftBoxBlockEntity; +import winterly.registry.CommonWinterlyBlocks; +import static winterly.registry.CommonWinterlyBlockEntities.*; import java.util.ArrayList; public class WinterlyBlockEntities { - public static final BlockEntityType GIFT_BOX_BLOCK_ENTITY = Registry.register( - Registries.BLOCK_ENTITY_TYPE, - Winterly.id("gift_box"), - FabricBlockEntityTypeBuilder.create(GiftBoxBlockEntity::new, getGiftBoxes()).build() - ); - public static void init() { - + GIFT_BOX_BLOCK_ENTITY = Registry.register( + BuiltInRegistries.BLOCK_ENTITY_TYPE, + Winterly.id("gift_box"), + FabricBlockEntityTypeBuilder.create(GiftBoxBlockEntity::new, getGiftBoxes()).build() + ); } public static GiftBoxBlock[] getGiftBoxes() { ArrayList gifts = new ArrayList<>(); - WinterlyBlocks.BLOCKS.forEach((identifier, block) -> { + CommonWinterlyBlocks.BLOCKS.forEach((identifier, block) -> { if(block instanceof GiftBoxBlock box) { gifts.add(box); } diff --git a/fabric/src/main/java/winterly/fabric/registry/WinterlyBlocks.java b/fabric/src/main/java/winterly/fabric/registry/WinterlyBlocks.java new file mode 100644 index 0000000..bc18ea3 --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/registry/WinterlyBlocks.java @@ -0,0 +1,81 @@ +package winterly.fabric.registry; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.material.PushReaction; +import winterly.Winterly; +import winterly.block.*; +import winterly.block.base.BasePaneBlock; +import winterly.block.base.BaseStairsBlock; +import winterly.fabric.block.FrozenFlowerBlock; +import winterly.fabric.block.FrozenGrassBlock; + +import static net.minecraft.world.level.block.Blocks.*; +import static winterly.registry.CommonWinterlyBlocks.*; +public class WinterlyBlocks { + + public static void init() { + ICICLE = add("icicle", new IcicleBlock(copyOf(ICE).pushReaction(PushReaction.DESTROY))); + ICICLE_BLOCK = add("icicle_block", new TransparentBlock(copyOf(PACKED_ICE).nonOpaque())); + PACKED_ICICLE_BLOCK = add("packed_icicle_block", new TransparentBlock(copyOf(PACKED_ICE).nonOpaque())); + ICICLE_PANE = add("icicle_pane", new BasePaneBlock(copyOf(PACKED_ICE).nonOpaque())); + ICICLE_BARS = add("icicle_bars", new BasePaneBlock(copyOf(ICE).nonOpaque())); + CRYOMARBLE_BLOCK = add("cryomarble_block", new Block(copyOf(DIAMOND_BLOCK))); + SNOWGUY = add("snowguy", new SnowguyBlock(copyOf(WHITE_WOOL).sounds(SoundType.SNOW))); + SNOWBALL_WALL = add("snowball_wall", new SnowballWallBlock(copyOf(WHITE_WOOL).sounds(SoundType.SNOW).nonOpaque())); + DENSE_SNOW = add("dense_snow", new Block(copyOf(WHITE_WOOL).sounds(SoundType.SNOW))); + DENSE_SNOW_STAIRS = add("dense_snow_stairs", new BaseStairsBlock(SNOW_BLOCK.defaultBlockState(), copyOf(WHITE_WOOL).sounds(SoundType.SNOW))); + DENSE_SNOW_SLAB = add("dense_snow_slab", new SlabBlock(copyOf(WHITE_WOOL).sounds(SoundType.SNOW))); + + SNOW_BRICKS = add("snow_bricks", new Block(copyOf(WHITE_WOOL).sounds(SoundType.SNOW))); + SNOW_BRICK_STAIRS = add("snow_brick_stairs", new BaseStairsBlock(SNOW_BLOCK.defaultBlockState(), copyOf(WHITE_WOOL).sounds(SoundType.SNOW))); + SNOW_BRICK_SLAB = add("snow_brick_slab", new SlabBlock(copyOf(WHITE_WOOL).sounds(SoundType.SNOW))); + FROZEN_GRASS = add("frozen_grass", new FrozenGrassBlock(FabricBlockSettings.create().mapColor(MapColor.SNOW).replaceable().notSolid().ticksRandomly().strength(0.1F).requiresTool().sounds(SoundType.SNOW).blockVision((state, world, pos) -> state.getValue(CommonFrozenGrassBlock.LAYERS) >= 8).pushReaction(PushReaction.DESTROY))); + FROZEN_FLOWER = add("frozen_flower", new FrozenFlowerBlock(FabricBlockSettings.create().mapColor(MapColor.SNOW).replaceable().notSolid().ticksRandomly().strength(0.1F).requiresTool().sounds(SoundType.GRASS).blockVision((state, world, pos) -> state.getValue(CommonFrozenFlowerBlock.LAYERS) >= 8).pushReaction(PushReaction.DESTROY))); + + RAW_CRYOMARBLE_SHARD = add("raw_cryomarble_shard", new IcicleBlock(copyOf(WHITE_WOOL).sounds(SoundType.GLASS).luminance(state -> 12))); + + RED_GIFT_BOX = add("red_gift_box", new GiftBoxBlock(copyOf(RED_WOOL).pistonBehavior(PushReaction.DESTROY))); + ORANGE_GIFT_BOX = add("orange_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + YELLOW_GIFT_BOX = add("yellow_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + GREEN_GIFT_BOX = add("green_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + CYAN_GIFT_BOX = add("cyan_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + BLUE_GIFT_BOX = add("blue_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + PURPLE_GIFT_BOX = add("purple_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + BLACK_GIFT_BOX = add("black_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + WHITE_GIFT_BOX = add("white_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + + GARLAND_LIGHTS = add("garland_lights", new GarlandLightsBlock(copyOf(GREEN_WOOL).pistonBehavior(PushReaction.DESTROY).noCollision().sounds(SoundType.CANDLE))); + RAINY_GARLAND_LIGHTS = add("rainy_garland_lights", new GarlandLightsBlock(copyOf(WHITE_WOOL).pistonBehavior(PushReaction.DESTROY).noCollision().sounds(SoundType.CANDLE))); + + ITEMS.forEach((id, item) -> Registry.register(BuiltInRegistries.ITEM, id, item)); + BLOCKS.forEach((id, block) -> Registry.register(BuiltInRegistries.BLOCK, id, block)); + } + + public static T add(String name, T block) { + return addBlockItem(name, block, new BlockItem(block, new Item.Properties())); + } + + private static T addBlockItem(String name, T block, BlockItem item) { + addBlock(name, block); + if (item != null) { + item.registerBlocks(Item.BY_BLOCK, item); + ITEMS.put(Winterly.id(name), item); + } + return block; + } + + private static T addBlock(String name, T block) { + BLOCKS.put(Winterly.id(name), block); + return block; + } + + public static FabricBlockSettings copyOf(Block block) { + return FabricBlockSettings.copyOf(block); + } +} diff --git a/fabric/src/main/java/winterly/fabric/registry/WinterlyFeatures.java b/fabric/src/main/java/winterly/fabric/registry/WinterlyFeatures.java new file mode 100644 index 0000000..d76965e --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/registry/WinterlyFeatures.java @@ -0,0 +1,52 @@ +package winterly.fabric.registry; + +import net.fabricmc.fabric.api.biome.v1.BiomeModifications; +import net.fabricmc.fabric.api.biome.v1.ModificationPhase; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BiomeTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import winterly.Winterly; +import winterly.worldgen.CryomarbleFeature; +import winterly.worldgen.UndergroundIcicleFeature; + +import static winterly.Winterly.id; + +public class WinterlyFeatures { + public static final Feature UNDERGROUND_ICICLE_FEATURE = new UndergroundIcicleFeature(); + public static final ResourceKey> UNDERGROUND_ICICLE_CONFIG = ResourceKey.create(Registries.CONFIGURED_FEATURE, Winterly.id("underground_icicle")); + public static final ResourceKey UNDERGROUND_ICICLE_PLACED = ResourceKey.create(Registries.PLACED_FEATURE, Winterly.id("underground_icicle")); + + + public static final Feature CRYOMARBLE_FEATURE = new CryomarbleFeature(); + public static final ResourceKey> CRYOMARBLE_CONFIG = ResourceKey.create(Registries.CONFIGURED_FEATURE, Winterly.id("cryomarble")); + public static final ResourceKey CRYOMARBLE_PLACED = ResourceKey.create(Registries.PLACED_FEATURE, Winterly.id("cryomarble")); + + public static void init() { + Registry.register(BuiltInRegistries.FEATURE, id("underground_icicle"), UNDERGROUND_ICICLE_FEATURE); + Registry.register(BuiltInRegistries.FEATURE, id("cryomarble"), CRYOMARBLE_FEATURE); + + BiomeModifications.create(Winterly.id("features")) + .add(ModificationPhase.ADDITIONS, ctx -> { + var entry = ctx.getBiomeRegistryEntry(); + var coldTag = TagKey.create(Registries.BIOME, new ResourceLocation("c", "climate_cold")); + return !entry.is(BiomeTags.IS_NETHER) && !entry.is(BiomeTags.IS_END) && entry.is(coldTag); + }, ctx -> { + ctx.getGenerationSettings().addFeature(GenerationStep.Decoration.UNDERGROUND_DECORATION, UNDERGROUND_ICICLE_PLACED); + }) + .add(ModificationPhase.ADDITIONS, ctx -> { + var entry = ctx.getBiomeRegistryEntry(); + return !entry.is(BiomeTags.IS_NETHER) && !entry.is(BiomeTags.IS_END); + }, ctx -> { + ctx.getGenerationSettings().addFeature(GenerationStep.Decoration.UNDERGROUND_DECORATION, CRYOMARBLE_PLACED); + }); + } +} diff --git a/fabric/src/main/java/winterly/fabric/registry/WinterlyItems.java b/fabric/src/main/java/winterly/fabric/registry/WinterlyItems.java new file mode 100644 index 0000000..ab97b59 --- /dev/null +++ b/fabric/src/main/java/winterly/fabric/registry/WinterlyItems.java @@ -0,0 +1,53 @@ +package winterly.fabric.registry; + +import net.fabricmc.fabric.api.item.v1.FabricItemSettings; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Tiers; +import winterly.Winterly; +import winterly.fabric.item.SantaHatItem; +import winterly.fabric.item.ScarfItem; +import winterly.item.tool.*; + +import static winterly.registry.CommonWinterlyItems.*; + +@SuppressWarnings("unused") +public class WinterlyItems { + + public static void init() { + RED_CANDY_CANE = add("red_candy_cane", new Item(settings().food(new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).fast().build()))); + GREEN_CANDY_CANE = add("green_candy_cane", new Item(settings().food(new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).fast().build()))); + BLUE_CANDY_CANE = add("blue_candy_cane", new Item(settings().food(new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).fast().build()))); + + CRYOMARBLE_SHARD = add("cryomarble_shard", new Item(settings())); + CRYOMARBLE = add("cryomarble", new Item(settings())); + + CRYOMARBLE_SWORD = add("cryomarble_sword", new CryomarbleSwordItem(Tiers.DIAMOND, 3, -2.4F, settings())); + CRYOMARBLE_SHOVEL = add("cryomarble_shovel", new CryomarbleShovelItem(Tiers.DIAMOND, 1.5F, -3.0F, settings())); + CRYOMARBLE_PICKAXE = add("cryomarble_pickaxe", new CryomarblePickaxeItem(Tiers.DIAMOND, 1, -2.8F, settings())); + CRYOMARBLE_AXE = add("cryomarble_axe", new CryomarbleAxeItem(Tiers.DIAMOND, 5.0F, -3.0F, settings())); + CRYOMARBLE_HOE = add("cryomarble_hoe", new CryomarbleHoeItem(Tiers.DIAMOND, -3, 0.0F, settings())); + + RED_SANTA_HAT = add("red_santa_hat", new SantaHatItem(settings(), "red")); + BLUE_SANTA_HAT = add("blue_santa_hat", new SantaHatItem(settings(), "blue")); + + WHITE_SCARF = add("white_scarf", new ScarfItem(settings(), "white")); + RED_SCARF = add("red_scarf", new ScarfItem(settings(), "red")); + GREEN_SCARF = add("green_scarf", new ScarfItem(settings(), "green")); + BLUE_SCARF = add("blue_scarf", new ScarfItem(settings(), "blue")); + RAINBOW_SCARF = add("rainbow_scarf", new ScarfItem(settings(), "rainbow")); + + ITEMS.forEach((id, item) -> Registry.register(BuiltInRegistries.ITEM, id, item)); + } + + private static T add(String name, T item) { + ITEMS.put(Winterly.id(name), item); + return item; + } + + private static FabricItemSettings settings() { + return new FabricItemSettings(); + } +} diff --git a/src/main/resources/data/trinkets/entities/winterly.json b/fabric/src/main/resources/data/trinkets/entities/winterly.json similarity index 100% rename from src/main/resources/data/trinkets/entities/winterly.json rename to fabric/src/main/resources/data/trinkets/entities/winterly.json diff --git a/src/main/resources/data/trinkets/tags/items/chest/necklace.json b/fabric/src/main/resources/data/trinkets/tags/items/chest/necklace.json similarity index 100% rename from src/main/resources/data/trinkets/tags/items/chest/necklace.json rename to fabric/src/main/resources/data/trinkets/tags/items/chest/necklace.json diff --git a/src/main/resources/data/trinkets/tags/items/head/hat.json b/fabric/src/main/resources/data/trinkets/tags/items/head/hat.json similarity index 100% rename from src/main/resources/data/trinkets/tags/items/head/hat.json rename to fabric/src/main/resources/data/trinkets/tags/items/head/hat.json diff --git a/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json similarity index 58% rename from src/main/resources/fabric.mod.json rename to fabric/src/main/resources/fabric.mod.json index ce21f15..10afb19 100644 --- a/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -1,39 +1,39 @@ { "schemaVersion": 1, - "id": "winterly", + "id": "${id}", "version": "${version}", - "name": "Winterly", - "description": "Winter expansion mod adding cold and sloppy stuff.", + "name": "${name}", + "description": "${description}", "authors": [ "PinkGoosik", "VioletSomik" ], "contact": { - "homepage": "https://modrinth.com/mod/winterly", - "sources": "https://github.com/tyap-lyap/winterly", - "issues": "https://github.com/tyap-lyap/winterly/issues" + "homepage": "${homepage_url}", + "sources": "${sources_url}", + "issues": "${issue_tracker_url}" }, - "license": "MIT", + "license": "${license}", "icon": "assets/winterly/icon.png", "environment": "*", "entrypoints": { "main": [ - "winterly.Winterly" + "winterly.fabric.WinterlyFabric" ], "client": [ - "winterly.client.WinterlyClient" + "winterly.fabric.client.WinterlyFabricClient" ], "cardinal-components": [ - "winterly.data.WinterlyComponents" + "winterly.fabric.data.WinterlyComponents" ], "modmenu": [ - "winterly.compat.WinterlyModMenuIntegration" + "winterly.fabric.compat.WinterlyModMenuIntegration" ] }, "mixins": [ - "winterly.mixins.json" + "${id}-common.mixins.json", + "${id}.mixins.json" ], - "accessWidener": "winterly.accesswidener", "custom": { "modmenu": { "links": { @@ -51,7 +51,7 @@ "fabric-api": "*", "cloth-config": "*", "trinkets": "*", - "minecraft": ">=1.20.3 <1.21", + "minecraft": "${minecraft_version_range_fabric}", "java": ">=17" } } diff --git a/fabric/src/main/resources/winterly.mixins.json b/fabric/src/main/resources/winterly.mixins.json new file mode 100644 index 0000000..0ee5726 --- /dev/null +++ b/fabric/src/main/resources/winterly.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "package": "winterly.fabric.mixin", + "compatibilityLevel": "JAVA_17", + "minVersion": "0.8", + "client": [ + "client.ArmorRendererMixin" + ], + "mixins": [ + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index c9ce60e..9056614 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,20 +1,39 @@ -# Done to increase the memory available to gradle. +# Gradle org.gradle.jvmargs = -Xmx2G org.gradle.parallel = true +org.gradle.daemon = true +org.gradle.debug = false -# Mod Properties -mod_version = 0.9.6+1.20.4 -maven_group = ru.pinkgoosik +# Build archives_base_name = winterly +maven_group = ru.pinkgoosik -# Dependencies | Check these on https://fabricmc.net/develop +# Mod Properties +mod_name = Winterly +mod_version = 0.10.0+1.20.4 +mod_description = Winter expansion mod adding cold and sloppy stuff. +mod_id = winterly +homepage_url = https://github.com/tyap-lyap/winterly +sources_url = https://github.com/tyap-lyap/winterly +issue_tracker_url = https://github.com/tyap-lyap/winterly/issues +license = MIT + +# Minecraft minecraft_version = 1.20.4 -yarn_mappings = 1.20.4+build.3 -fabric_loader = 0.15.3 -fabric_api = 0.92.0+1.20.4 +minecraft_version_range = [1.20.4,1.21) +minecraft_version_range_fabric = >=1.20.3 <1.21 +enabled_platforms = fabric,neoforge +# Fabric +fabric_loader_version = 0.15.3 +fabric_api_version = 0.93.1+1.20.4 trinkets_version = 3.8.0 cca_version = 5.4.0 cloth_config = 13.0.121 modmenu_version = 9.0.0 owo_lib = 0.12.0+1.20.3 + +# NeoForge +neoforge_version = 20.4.69-beta +neoforge_version_range = [20.4,) +curios_version = 7.0.0-beta.3+1.20.4 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..d64cd4917707c1f8861d8cb53dd15194d4248596 100644 GIT binary patch literal 43462 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 literal 60756 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 /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +131,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + 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 @@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# 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, 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" \ diff --git a/gradlew.bat b/gradlew.bat index f127cfd..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ 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% diff --git a/neoforge/build.gradle b/neoforge/build.gradle new file mode 100644 index 0000000..e56651a --- /dev/null +++ b/neoforge/build.gradle @@ -0,0 +1,82 @@ +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" +} + +architectury { + platformSetupLoomIde() + neoForge() +} + +base { + archivesName = "${rootProject.archives_base_name}-neoforge" +} + +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath +} + +configurations { + common + shadowCommon // Don't use shadow from the shadow plugin since it *excludes* files. + compileClasspath.extendsFrom common + runtimeClasspath.extendsFrom common + developmentNeoForge.extendsFrom common +} + +repositories { + maven { + name = "Illusive Soulworks maven" + url = "https://maven.theillusivec4.top/" + } + maven { url "https://maven.shedaniel.me/" } +} + +dependencies { + neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" + + // Remove the next line if you don't want to depend on the API +// modApi "dev.architectury:architectury-neoforge:${rootProject.architectury_version}" + + modCompileOnly("top.theillusivec4.curios:curios-neoforge:${rootProject.curios_version}:api") + // Use the full Curios API jar at runtime + modRuntimeOnly("top.theillusivec4.curios:curios-neoforge:${rootProject.curios_version}") + + modApi("me.shedaniel.cloth:cloth-config-neoforge:${rootProject.cloth_config}") + + common(project(path: ":common", configuration: "namedElements")) { transitive false } + shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } +} + + +processResources { + inputs.property "version", project.version + + filesMatching("META-INF/mods.toml") { + expand "version": project.version + } +} + +shadowJar { + exclude "fabric.mod.json" + exclude "architectury.common.json" + + configurations = [project.configurations.shadowCommon] + archiveClassifier = "dev-shadow" +} + +remapJar { + input.set shadowJar.archiveFile + dependsOn shadowJar +} + +sourcesJar { + def commonSources = project(":common").sourcesJar + dependsOn commonSources + from commonSources.archiveFile.map { zipTree(it) } +} + +components.java { + withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { + skip() + } +} diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties new file mode 100644 index 0000000..2914393 --- /dev/null +++ b/neoforge/gradle.properties @@ -0,0 +1 @@ +loom.platform=neoforge \ No newline at end of file diff --git a/neoforge/src/main/java/winterly/neoforge/WinterlyNeoforge.java b/neoforge/src/main/java/winterly/neoforge/WinterlyNeoforge.java new file mode 100644 index 0000000..252e0ed --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/WinterlyNeoforge.java @@ -0,0 +1,99 @@ +package winterly.neoforge; + +import net.minecraft.client.renderer.entity.*; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.CreativeModeTab; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.fml.loading.FMLEnvironment; +import net.neoforged.neoforge.client.ConfigScreenHandler; +import net.neoforged.neoforge.client.event.EntityRenderersEvent; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.neoforge.registries.DeferredRegister; +import top.theillusivec4.curios.api.client.CuriosRendererRegistry; +import top.theillusivec4.curios.api.client.ICurioRenderer; +import winterly.Winterly; +import winterly.client.WinterlyModelLayers; +import winterly.client.model.SantaHatModel; +import winterly.client.model.ScarfModel; +import winterly.client.render.DecorationFeatureRenderer; +import winterly.client.render.MobDecorationRenderers; +import winterly.config.WinterlyClientConfig; +import winterly.neoforge.data.WinterlyDataAttachments; +import winterly.neoforge.registry.WinterlyBlockEntities; +import winterly.neoforge.registry.WinterlyBlocks; +import winterly.neoforge.registry.WinterlyFeatures; +import winterly.neoforge.registry.WinterlyItems; +import winterly.registry.CommonWinterlyBlocks; +import winterly.registry.CommonWinterlyItems; + +import java.util.function.Supplier; + +@SuppressWarnings("unused") +@Mod(Winterly.MOD_ID) +public class WinterlyNeoforge { + public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, "winterly"); + + public static Supplier WINTERLY_TAB = CREATIVE_MODE_TABS.register("winterly", () -> CreativeModeTab.builder().icon(CommonWinterlyBlocks.SNOWGUY.asItem()::getDefaultInstance).title(Component.literal("Winterly")).build()); + + public WinterlyNeoforge(IEventBus bus) { + CREATIVE_MODE_TABS.register(bus); + + WinterlyItems.init(bus); + WinterlyBlocks.init(bus); + WinterlyBlockEntities.init(bus); + WinterlyFeatures.init(bus); + WinterlyDataAttachments.init(bus); + + bus.addListener(this::buildCreativeTab); + bus.addListener(this::registerModelLayers); + bus.addListener(this::registerRenderLayers); + bus.addListener(this::clientSetup); + bus.addListener(this::commonSetup); + + if(FMLEnvironment.dist.isClient()) { + ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () -> new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> WinterlyClientConfig.buildScreen(parent))); + } + } + + private void buildCreativeTab(BuildCreativeModeTabContentsEvent event) { + if (event.getTab() == WINTERLY_TAB.get()) { + CommonWinterlyItems.ITEMS.forEach((id, item) -> event.accept(item)); + CommonWinterlyBlocks.ITEMS.forEach((id, item) -> event.accept(item)); + } + } + + private void registerModelLayers(EntityRenderersEvent.RegisterLayerDefinitions event) { + event.registerLayerDefinition(WinterlyModelLayers.SANTA_HAT_LAYER, SantaHatModel::getTexturedModelData); + event.registerLayerDefinition(WinterlyModelLayers.SCARF_LAYER, ScarfModel::getTexturedModelData); + } + + private void registerRenderLayers(EntityRenderersEvent.AddLayers event) { + event.getContext().getEntityRenderDispatcher().renderers.forEach((entityType, entityRenderer) -> { + if(entityRenderer instanceof ZombieRenderer renderer) { + renderer.addLayer(new DecorationFeatureRenderer<>(renderer)); + } + if(entityRenderer instanceof DrownedRenderer renderer) { + renderer.addLayer(new DecorationFeatureRenderer<>(renderer)); + } + if(entityRenderer instanceof SkeletonRenderer renderer) { + renderer.addLayer(new DecorationFeatureRenderer<>(renderer)); + } + }); + } + + private void clientSetup(FMLClientSetupEvent event) { + CommonWinterlyItems.ITEMS.forEach((resourceLocation, item) -> { + if(item instanceof ICurioRenderer renderer) CuriosRendererRegistry.register(item, () -> renderer); + }); + MobDecorationRenderers.init(); + } + + private void commonSetup(FMLCommonSetupEvent event) { + + } +} diff --git a/neoforge/src/main/java/winterly/neoforge/block/BaseTransparentBlock.java b/neoforge/src/main/java/winterly/neoforge/block/BaseTransparentBlock.java new file mode 100644 index 0000000..40a8431 --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/block/BaseTransparentBlock.java @@ -0,0 +1,10 @@ +package winterly.neoforge.block; + +import net.minecraft.world.level.block.TransparentBlock; + +public class BaseTransparentBlock extends TransparentBlock { + + public BaseTransparentBlock(Properties arg) { + super(arg); + } +} diff --git a/neoforge/src/main/java/winterly/neoforge/data/WinterlyDataAttachments.java b/neoforge/src/main/java/winterly/neoforge/data/WinterlyDataAttachments.java new file mode 100644 index 0000000..5e90d3c --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/data/WinterlyDataAttachments.java @@ -0,0 +1,39 @@ +package winterly.neoforge.data; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.attachment.AttachmentType; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; +import org.jetbrains.annotations.Nullable; +import winterly.Winterly; +import winterly.data.CachedFlowers; + +import java.util.function.Supplier; + +public class WinterlyDataAttachments { + private static final DeferredRegister> ATTACHMENT_TYPES = DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, Winterly.MOD_ID); + + private static final Supplier> WORLD_DATA = ATTACHMENT_TYPES.register( + "world_data", () -> AttachmentType.builder(WorldData::new).serialize(new WorldData.WorldDataIAttachmentSerializer()).build() + ); + + public static void init(IEventBus eventBus) { + + CachedFlowers.instance = new CachedFlowers() { + @Override + public @Nullable Block getFlowerImpl(Level world, BlockPos pos) { + return world.getData(WORLD_DATA).cachedFlowers.get(pos); + } + + @Override + public void cacheFlowerImpl(Level world, BlockPos pos, Block flower) { + world.getData(WORLD_DATA).cachedFlowers.put(pos, flower); + } + }; + + ATTACHMENT_TYPES.register(eventBus); + } +} diff --git a/neoforge/src/main/java/winterly/neoforge/data/WorldData.java b/neoforge/src/main/java/winterly/neoforge/data/WorldData.java new file mode 100644 index 0000000..a253f76 --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/data/WorldData.java @@ -0,0 +1,61 @@ +package winterly.neoforge.data; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.neoforged.neoforge.attachment.IAttachmentSerializer; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class WorldData { + public Map cachedFlowers = new LinkedHashMap<>(); + + public static class WorldDataIAttachmentSerializer implements IAttachmentSerializer { + + @Override + public WorldData read(Tag nbt) { + WorldData data = new WorldData(); + + var cachedFlowersNbt = ((CompoundTag) nbt).getCompound("cachedFlowers"); + + if (!cachedFlowersNbt.isEmpty()) { + int size = cachedFlowersNbt.getInt("size"); + + for (int i = 0; i < size; i++) { + CompoundTag entry = cachedFlowersNbt.getCompound(String.valueOf(i)); + BlockPos pos = new BlockPos(entry.getInt("x"), entry.getInt("y"), entry.getInt("z")); + var block = BuiltInRegistries.BLOCK.getOptional(new ResourceLocation(entry.getString("block"))); + block.ifPresent(bl -> data.cachedFlowers.put(pos, bl)); + } + } + + return data; + } + + @Override + public Tag write(WorldData data) { + CompoundTag cachedFlowersNbt = new CompoundTag(); + cachedFlowersNbt.putInt("size", data.cachedFlowers.size()); + int index = -1; + + for (var entry : data.cachedFlowers.entrySet()) { + index++; + CompoundTag entryNbt = new CompoundTag(); + entryNbt.putInt("x", entry.getKey().getX()); + entryNbt.putInt("y", entry.getKey().getY()); + entryNbt.putInt("z", entry.getKey().getZ()); + entryNbt.putString("block", BuiltInRegistries.BLOCK.getKey(entry.getValue()).toString()); + cachedFlowersNbt.put(String.valueOf(index), entryNbt); + } + + CompoundTag nbt = new CompoundTag(); + nbt.put("cachedFlowers", cachedFlowersNbt); + + return nbt; + } + } +} diff --git a/neoforge/src/main/java/winterly/neoforge/item/SantaHatItem.java b/neoforge/src/main/java/winterly/neoforge/item/SantaHatItem.java new file mode 100644 index 0000000..9be059c --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/item/SantaHatItem.java @@ -0,0 +1,57 @@ +package winterly.neoforge.item; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.ChatFormatting; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.client.ICurioRenderer; +import top.theillusivec4.curios.api.type.capability.ICurioItem; +import winterly.Winterly; +import winterly.client.model.WinterlyModels; +import winterly.item.CommonSantaHatItem; + +import java.util.List; + +public class SantaHatItem extends CommonSantaHatItem implements ICurioRenderer { + + public SantaHatItem(Item.Properties settings, String color) { + super(settings, color); + + CuriosApi.registerCurio(this, new ICurioItem() { + + @Override + public boolean canEquip(SlotContext slotContext, ItemStack stack) { + return true; + } + }); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { + tooltip.add(Component.nullToEmpty(" ")); + tooltip.add(Component.translatable("tag.winterly.cosmetic").withStyle(ChatFormatting.GRAY)); + } + + @Override + public > void render(ItemStack stack, SlotContext slotContext, PoseStack matrices, RenderLayerParent renderLayerParent, MultiBufferSource renderTypeBuffer, int light, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if(renderLayerParent.getModel() instanceof HumanoidModel biped) { + WinterlyModels.SANTA_HAT_MODEL.hat.copyFrom(biped.head); + VertexConsumer vertexConsumer = renderTypeBuffer.getBuffer(RenderType.entityCutout(Winterly.id("textures/entity/" + color + "_santa_hat.png"))); + WinterlyModels.SANTA_HAT_MODEL.renderToBuffer(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/neoforge/src/main/java/winterly/neoforge/item/ScarfItem.java b/neoforge/src/main/java/winterly/neoforge/item/ScarfItem.java new file mode 100644 index 0000000..c359d90 --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/item/ScarfItem.java @@ -0,0 +1,57 @@ +package winterly.neoforge.item; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.ChatFormatting; +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.model.HumanoidModel; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.RenderLayerParent; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.SlotContext; +import top.theillusivec4.curios.api.client.ICurioRenderer; +import top.theillusivec4.curios.api.type.capability.ICurioItem; +import winterly.Winterly; +import winterly.client.model.WinterlyModels; +import winterly.item.CommonScarfItem; + +import java.util.List; + +public class ScarfItem extends CommonScarfItem implements ICurioRenderer { + + public ScarfItem(Item.Properties settings, String color) { + super(settings, color); + + CuriosApi.registerCurio(this, new ICurioItem() { + + @Override + public boolean canEquip(SlotContext slotContext, ItemStack stack) { + return true; + } + }); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { + tooltip.add(Component.nullToEmpty(" ")); + tooltip.add(Component.translatable("tag.winterly.cosmetic").withStyle(ChatFormatting.GRAY)); + } + + @Override + public > void render(ItemStack stack, SlotContext slotContext, PoseStack matrices, RenderLayerParent renderLayerParent, MultiBufferSource renderTypeBuffer, int light, float limbSwing, float limbSwingAmount, float partialTicks, float ageInTicks, float netHeadYaw, float headPitch) { + if(renderLayerParent.getModel() instanceof HumanoidModel biped){ + WinterlyModels.SCARF_MODEL.scarf.copyFrom(biped.body); + VertexConsumer vertexConsumer = renderTypeBuffer.getBuffer(RenderType.entityCutout(Winterly.id("textures/entity/" + color + "_scarf.png"))); + WinterlyModels.SCARF_MODEL.renderToBuffer(matrices, vertexConsumer, light, OverlayTexture.NO_OVERLAY, 1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/neoforge/src/main/java/winterly/neoforge/registry/WinterlyBlockEntities.java b/neoforge/src/main/java/winterly/neoforge/registry/WinterlyBlockEntities.java new file mode 100644 index 0000000..900814d --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/registry/WinterlyBlockEntities.java @@ -0,0 +1,40 @@ +package winterly.neoforge.registry; + +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.DeferredRegister; +import winterly.block.GiftBoxBlock; +import winterly.block.entity.GiftBoxBlockEntity; +import winterly.registry.CommonWinterlyBlocks; + +import java.util.ArrayList; + +import static winterly.registry.CommonWinterlyBlockEntities.GIFT_BOX_BLOCK_ENTITY; + +public class WinterlyBlockEntities { + public static final DeferredRegister> BLOCK_ENTITIES_REGISTERER = DeferredRegister.create(BuiltInRegistries.BLOCK_ENTITY_TYPE, "winterly"); + + public static void init(IEventBus eventBus) { + + BLOCK_ENTITIES_REGISTERER.register("gift_box", () -> { + var type = BlockEntityType.Builder.of(GiftBoxBlockEntity::new, getGiftBoxes()).build(null); + GIFT_BOX_BLOCK_ENTITY = type; + return type; + }); + + BLOCK_ENTITIES_REGISTERER.register(eventBus); + } + + public static GiftBoxBlock[] getGiftBoxes() { + ArrayList gifts = new ArrayList<>(); + + CommonWinterlyBlocks.BLOCKS.forEach((identifier, block) -> { + if(block instanceof GiftBoxBlock box) { + gifts.add(box); + } + }); + + return gifts.toArray(new GiftBoxBlock[0]); + } +} diff --git a/neoforge/src/main/java/winterly/neoforge/registry/WinterlyBlocks.java b/neoforge/src/main/java/winterly/neoforge/registry/WinterlyBlocks.java new file mode 100644 index 0000000..cbc0f48 --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/registry/WinterlyBlocks.java @@ -0,0 +1,86 @@ +package winterly.neoforge.registry; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.level.material.PushReaction; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredRegister; +import winterly.Winterly; +import winterly.block.*; +import winterly.block.base.BasePaneBlock; +import winterly.block.base.BaseStairsBlock; +import winterly.neoforge.block.BaseTransparentBlock; + +import java.util.function.Supplier; + +import static net.minecraft.world.level.block.Blocks.*; +import static winterly.registry.CommonWinterlyBlocks.*; +import static winterly.registry.CommonWinterlyItems.ITEMS; + +public class WinterlyBlocks { + public static final DeferredRegister.Blocks BLOCKS_REGISTERER = DeferredRegister.createBlocks("winterly"); + + public static void init(IEventBus eventBus) { + add("icicle", () -> ICICLE = new IcicleBlock(copyOf(ICE).pushReaction(PushReaction.DESTROY))); + add("icicle_block", () -> ICICLE_BLOCK = new BaseTransparentBlock(copyOf(PACKED_ICE).noOcclusion())); + add("packed_icicle_block", () -> PACKED_ICICLE_BLOCK = new BaseTransparentBlock(copyOf(PACKED_ICE).noOcclusion())); + add("icicle_pane", () -> ICICLE_PANE = new BasePaneBlock(copyOf(PACKED_ICE).noOcclusion())); + add("icicle_bars", () -> ICICLE_BARS = new BasePaneBlock(copyOf(ICE).noOcclusion())); + add("cryomarble_block", () -> CRYOMARBLE_BLOCK = new Block(copyOf(DIAMOND_BLOCK))); + add("snowguy", () -> SNOWGUY = new SnowguyBlock(copyOf(WHITE_WOOL).sound(SoundType.SNOW))); + add("snowball_wall", () -> SNOWBALL_WALL = new SnowballWallBlock(copyOf(WHITE_WOOL).sound(SoundType.SNOW).noOcclusion())); + add("dense_snow", () -> DENSE_SNOW = new Block(copyOf(WHITE_WOOL).sound(SoundType.SNOW))); + add("dense_snow_stairs", () -> DENSE_SNOW_STAIRS = new BaseStairsBlock(SNOW_BLOCK.defaultBlockState(), copyOf(WHITE_WOOL).sound(SoundType.SNOW))); + add("dense_snow_slab", () -> DENSE_SNOW_SLAB = new SlabBlock(copyOf(WHITE_WOOL).sound(SoundType.SNOW))); + + add("snow_bricks", () -> SNOW_BRICKS = new Block(copyOf(WHITE_WOOL).sound(SoundType.SNOW))); + add("snow_brick_stairs", () -> SNOW_BRICK_STAIRS = new BaseStairsBlock(SNOW_BLOCK.defaultBlockState(), copyOf(WHITE_WOOL).sound(SoundType.SNOW))); + add("snow_brick_slab", () -> SNOW_BRICK_SLAB = new SlabBlock(copyOf(WHITE_WOOL).sound(SoundType.SNOW))); + add("frozen_grass", () -> FROZEN_GRASS = new CommonFrozenGrassBlock(BlockBehaviour.Properties.of().mapColor(MapColor.SNOW).replaceable().forceSolidOff().randomTicks().strength(0.1F).requiresCorrectToolForDrops().sound(SoundType.SNOW).isViewBlocking((state, world, pos) -> state.getValue(CommonFrozenGrassBlock.LAYERS) >= 8).pushReaction(PushReaction.DESTROY))); + add("frozen_flower", () -> FROZEN_FLOWER = new CommonFrozenFlowerBlock(BlockBehaviour.Properties.of().mapColor(MapColor.SNOW).replaceable().forceSolidOff().randomTicks().strength(0.1F).requiresCorrectToolForDrops().sound(SoundType.GRASS).isViewBlocking((state, world, pos) -> state.getValue(CommonFrozenFlowerBlock.LAYERS) >= 8).pushReaction(PushReaction.DESTROY))); + + add("raw_cryomarble_shard", () -> RAW_CRYOMARBLE_SHARD = new IcicleBlock(copyOf(WHITE_WOOL).sound(SoundType.GLASS).lightLevel(state -> 12))); + + add("red_gift_box", () -> RED_GIFT_BOX = new GiftBoxBlock(copyOf(RED_WOOL).pushReaction(PushReaction.DESTROY))); + add("orange_gift_box", () -> ORANGE_GIFT_BOX = new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + add("yellow_gift_box", () -> YELLOW_GIFT_BOX = new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + add("green_gift_box", () -> GREEN_GIFT_BOX = new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + add("cyan_gift_box", () -> CYAN_GIFT_BOX = new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + add("blue_gift_box", () -> BLUE_GIFT_BOX = new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + add("purple_gift_box", () -> PURPLE_GIFT_BOX = new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + add("black_gift_box", () -> BLACK_GIFT_BOX = new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + add("white_gift_box", () -> WHITE_GIFT_BOX = new GiftBoxBlock(copyOf(RED_GIFT_BOX))); + + add("garland_lights", () -> GARLAND_LIGHTS = new GarlandLightsBlock(copyOf(GREEN_WOOL).pushReaction(PushReaction.DESTROY).noCollission().sound(SoundType.CANDLE))); + add("rainy_garland_lights", () -> RAINY_GARLAND_LIGHTS = new GarlandLightsBlock(copyOf(WHITE_WOOL).pushReaction(PushReaction.DESTROY).noCollission().sound(SoundType.CANDLE))); + +// ITEMS.forEach((id, item) -> Registry.register(BuiltInRegistries.ITEM, id, item)); +// BLOCKS.forEach((id, block) -> Registry.register(BuiltInRegistries.BLOCK, id, block)); + + BLOCKS_REGISTERER.register(eventBus); + } + + public static T add(String name, Supplier blockSup) { + DeferredBlock toReturn = BLOCKS_REGISTERER.register(name, () -> { + var block = blockSup.get(); + BLOCKS.put(Winterly.id(name), block); + return block; + }); + WinterlyItems.ITEMS_REGISTERER.register(name, () -> { + var item = new BlockItem(toReturn.get(), new Item.Properties()); + ITEMS.put(Winterly.id(name), item); + return item; + }); + return null; + } + + public static BlockBehaviour.Properties copyOf(Block block) { + return BlockBehaviour.Properties.ofFullCopy(block); + } +} diff --git a/neoforge/src/main/java/winterly/neoforge/registry/WinterlyFeatures.java b/neoforge/src/main/java/winterly/neoforge/registry/WinterlyFeatures.java new file mode 100644 index 0000000..1cb1cd0 --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/registry/WinterlyFeatures.java @@ -0,0 +1,20 @@ +package winterly.neoforge.registry; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; +import winterly.worldgen.CryomarbleFeature; +import winterly.worldgen.UndergroundIcicleFeature; + +public class WinterlyFeatures { + + public static final DeferredRegister> REGISTERER = DeferredRegister.create(BuiltInRegistries.FEATURE, "winterly"); + + public static void init(IEventBus eventBus) { + REGISTERER.register("underground_icicle", UndergroundIcicleFeature::new); + REGISTERER.register("cryomarble", CryomarbleFeature::new); + + REGISTERER.register(eventBus); + } +} diff --git a/neoforge/src/main/java/winterly/neoforge/registry/WinterlyItems.java b/neoforge/src/main/java/winterly/neoforge/registry/WinterlyItems.java new file mode 100644 index 0000000..479437c --- /dev/null +++ b/neoforge/src/main/java/winterly/neoforge/registry/WinterlyItems.java @@ -0,0 +1,62 @@ +package winterly.neoforge.registry; + +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Tiers; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; +import winterly.Winterly; +import winterly.item.tool.*; +import winterly.neoforge.item.SantaHatItem; +import winterly.neoforge.item.ScarfItem; + +import java.util.function.Supplier; + +import static winterly.registry.CommonWinterlyItems.*; + +@SuppressWarnings("unused") +public class WinterlyItems { + + public static final DeferredRegister.Items ITEMS_REGISTERER = DeferredRegister.createItems("winterly"); + + public static void init(IEventBus eventBus) { + add("red_candy_cane", () -> RED_CANDY_CANE = new Item(settings().food(new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).fast().build()))); + add("green_candy_cane", () -> GREEN_CANDY_CANE = new Item(settings().food(new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).fast().build()))); + add("blue_candy_cane", () -> BLUE_CANDY_CANE = new Item(settings().food(new FoodProperties.Builder().nutrition(2).saturationMod(0.1F).fast().build()))); + + add("cryomarble_shard", () -> CRYOMARBLE_SHARD = new Item(settings())); + add("cryomarble", () -> CRYOMARBLE = new Item(settings())); + + add("cryomarble_sword", () -> CRYOMARBLE_SWORD = new CryomarbleSwordItem(Tiers.DIAMOND, 3, -2.4F, settings())); + add("cryomarble_shovel", () -> CRYOMARBLE_SHOVEL = new CryomarbleShovelItem(Tiers.DIAMOND, 1.5F, -3.0F, settings())); + add("cryomarble_pickaxe", () -> CRYOMARBLE_PICKAXE = new CryomarblePickaxeItem(Tiers.DIAMOND, 1, -2.8F, settings())); + add("cryomarble_axe", () -> CRYOMARBLE_AXE = new CryomarbleAxeItem(Tiers.DIAMOND, 5.0F, -3.0F, settings())); + add("cryomarble_hoe", () -> CRYOMARBLE_HOE = new CryomarbleHoeItem(Tiers.DIAMOND, -3, 0.0F, settings())); + + add("red_santa_hat", () -> RED_SANTA_HAT = new SantaHatItem(settings(), "red")); + add("blue_santa_hat", () -> BLUE_SANTA_HAT = new SantaHatItem(settings(), "blue")); + + add("white_scarf", () -> WHITE_SCARF = new ScarfItem(settings(), "white")); + add("red_scarf", () -> RED_SCARF = new ScarfItem(settings(), "red")); + add("green_scarf", () -> GREEN_SCARF = new ScarfItem(settings(), "green")); + add("blue_scarf", () -> BLUE_SCARF = new ScarfItem(settings(), "blue")); + add("rainbow_scarf", () -> RAINBOW_SCARF = new ScarfItem(settings(), "rainbow")); + +// ITEMS.forEach((id, item) -> Registry.register(BuiltInRegistries.ITEM, id, item)); + ITEMS_REGISTERER.register(eventBus); + } + + private static T add(String name, Supplier sup) { +// ITEMS.put(Winterly.id(name), null); + ITEMS_REGISTERER.register(name, () -> { + var item = sup.get(); + ITEMS.put(Winterly.id(name), item); + return item; + }); + return null; + } + + private static Item.Properties settings() { + return new Item.Properties(); + } +} diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..3a0ae5a --- /dev/null +++ b/neoforge/src/main/resources/META-INF/mods.toml @@ -0,0 +1,18 @@ +modLoader = "javafml" +loaderVersion = "[2,)" +issueTrackerURL = "${issue_tracker_url}" # Change this to the link to your mod's issue tracker. +license = "${license}" + +[[mods]] +modId = "${id}" +displayName = "${name}" +version = "${version}" +description = '''${description}''' +authors = "PinkGoosik" +logoFile = "assets/winterly/icon.png" + +[[mixins]] +config = "${id}-common.mixins.json" + +[[mixins]] +config = "${id}.mixins.json" diff --git a/neoforge/src/main/resources/data/curios/tags/items/curio.json b/neoforge/src/main/resources/data/curios/tags/items/curio.json new file mode 100644 index 0000000..e66e6b4 --- /dev/null +++ b/neoforge/src/main/resources/data/curios/tags/items/curio.json @@ -0,0 +1,12 @@ +{ + "replace": false, + "values": [ + "winterly:red_santa_hat", + "winterly:blue_santa_hat", + "winterly:red_scarf", + "winterly:green_scarf", + "winterly:blue_scarf", + "winterly:white_scarf", + "winterly:rainbow_scarf" + ] +} \ No newline at end of file diff --git a/neoforge/src/main/resources/data/winterly/curios/entities/winterly.json b/neoforge/src/main/resources/data/winterly/curios/entities/winterly.json new file mode 100644 index 0000000..8d2c6ea --- /dev/null +++ b/neoforge/src/main/resources/data/winterly/curios/entities/winterly.json @@ -0,0 +1,11 @@ +{ + "entities": ["minecraft:player"], + "slots": [ + "belt", + "body", + "charm", + "head", + "necklace", + "ring" + ] +} \ No newline at end of file diff --git a/neoforge/src/main/resources/data/winterly/neoforge/biome_modifier/cryomarble.json b/neoforge/src/main/resources/data/winterly/neoforge/biome_modifier/cryomarble.json new file mode 100644 index 0000000..a802550 --- /dev/null +++ b/neoforge/src/main/resources/data/winterly/neoforge/biome_modifier/cryomarble.json @@ -0,0 +1,6 @@ +{ + "type": "neoforge:add_features", + "biomes": "#minecraft:is_overworld", + "features": "winterly:cryomarble", + "step": "underground_decoration" +} \ No newline at end of file diff --git a/neoforge/src/main/resources/data/winterly/neoforge/biome_modifier/underground_icicle.json b/neoforge/src/main/resources/data/winterly/neoforge/biome_modifier/underground_icicle.json new file mode 100644 index 0000000..759d169 --- /dev/null +++ b/neoforge/src/main/resources/data/winterly/neoforge/biome_modifier/underground_icicle.json @@ -0,0 +1,6 @@ +{ + "type": "neoforge:add_features", + "biomes": "#forge:is_cold/overworld", + "features": "winterly:underground_icicle", + "step": "underground_decoration" +} \ No newline at end of file diff --git a/neoforge/src/main/resources/pack.mcmeta b/neoforge/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..75408ef --- /dev/null +++ b/neoforge/src/main/resources/pack.mcmeta @@ -0,0 +1,6 @@ +{ + "pack": { + "description": "${description}", + "pack_format": 15 + } +} diff --git a/neoforge/src/main/resources/winterly.mixins.json b/neoforge/src/main/resources/winterly.mixins.json new file mode 100644 index 0000000..176b208 --- /dev/null +++ b/neoforge/src/main/resources/winterly.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "package": "winterly.neoforge.mixin", + "compatibilityLevel": "JAVA_17", + "minVersion": "0.8", + "client": [ + ], + "mixins": [ + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index cf0fb6c..95d03fb 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,27 @@ pluginManagement { - repositories { - mavenCentral() - gradlePluginPortal() - maven { url "https://maven.fabricmc.net" } - } + repositories { + maven { + name "FabricMC" + url "https://maven.fabricmc.net/" + } + + maven { + name "Architectury" + url "https://maven.architectury.dev/" + } + + maven { + name "MinecraftForge" + url "https://maven.minecraftforge.net/" + } + + mavenCentral() + gradlePluginPortal() + } } + +include("common") +include("fabric") +include("neoforge") + +rootProject.name = "Winterly" diff --git a/src/main/java/winterly/Winterly.java b/src/main/java/winterly/Winterly.java deleted file mode 100644 index 4af535f..0000000 --- a/src/main/java/winterly/Winterly.java +++ /dev/null @@ -1,63 +0,0 @@ -package winterly; - -import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; -import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.item.ItemGroup; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import winterly.compat.WinterlyOwoLibIntegration; -import winterly.config.WinterlyClothConfig; -import winterly.config.WinterlyConfig; -import winterly.registry.WinterlyBlockEntities; -import winterly.registry.WinterlyBlocks; -import winterly.registry.WinterlyFeatures; -import winterly.registry.WinterlyItems; - -public class Winterly implements ModInitializer { - public static final String MOD_ID = "winterly"; - public static final Logger LOGGER = LoggerFactory.getLogger("Winterly"); - public static ItemGroup itemGroup; - public static WinterlyConfig config = WinterlyClothConfig.init(); - - @Override - public void onInitialize() { - itemGroup = createItemGroup(); - WinterlyItems.init(); - WinterlyBlocks.init(); - WinterlyBlockEntities.init(); - WinterlyFeatures.init(); - - if(FabricLoader.getInstance().isModLoaded("owo")) { - WinterlyOwoLibIntegration.initItemGroup(); - ItemGroupEvents.modifyEntriesEvent(Registries.ITEM_GROUP.getKey(itemGroup).get()).register(entries -> { - WinterlyItems.ITEMS.forEach((id, item) -> entries.add(item.getDefaultStack())); - WinterlyBlocks.ITEMS.forEach((id, item) -> entries.add(item.getDefaultStack())); - }); - } - } - - private static ItemGroup createItemGroup() { - if(FabricLoader.getInstance().isModLoaded("owo")) { - return WinterlyOwoLibIntegration.createItemGroup(); - } - var group = FabricItemGroup.builder().displayName(Text.translatable("itemGroup.winterly.items")) - .icon(() -> WinterlyBlocks.SNOWGUY.asItem().getDefaultStack()) - .entries((displayContext, entries) -> { - WinterlyItems.ITEMS.forEach((id, item) -> entries.add(item.getDefaultStack())); - WinterlyBlocks.ITEMS.forEach((id, item) -> entries.add(item.getDefaultStack())); - }).build(); - Registry.register(Registries.ITEM_GROUP, id("items"), group); - return group; - } - - public static Identifier id(String path) { - return new Identifier(MOD_ID, path); - } - -} diff --git a/src/main/java/winterly/block/FrozenFlowerBlock.java b/src/main/java/winterly/block/FrozenFlowerBlock.java deleted file mode 100644 index a17f301..0000000 --- a/src/main/java/winterly/block/FrozenFlowerBlock.java +++ /dev/null @@ -1,187 +0,0 @@ -package winterly.block; - -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.ShapeContext; -import net.minecraft.entity.ai.pathing.NavigationType; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.IntProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.random.Random; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.LightType; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import org.jetbrains.annotations.Nullable; -import winterly.data.CachedFlowers; -import winterly.registry.WinterlyBlocks; - -import java.util.Objects; - -@SuppressWarnings("deprecation") -public class FrozenFlowerBlock extends Block { - public static final IntProperty LAYERS = IntProperty.of("layers", 0, 8); - public static final BooleanProperty PERSISTENT = Properties.PERSISTENT; - - protected static final VoxelShape[] LAYERS_TO_SHAPE = new VoxelShape[] { - Block.createCuboidShape(5.0, 0.0, 5.0, 11.0, 10.0, 11.0), - Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 2.0, 16.0), - Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 4.0, 16.0), - Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 6.0, 16.0), - Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 8.0, 16.0), - Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 10.0, 16.0), - Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 12.0, 16.0), - Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 14.0, 16.0), - Block.createCuboidShape(0.0, 0.0, 0.0, 16.0, 16.0, 16.0) - }; - - public FrozenFlowerBlock(Settings settings) { - super(settings); - this.setDefaultState(this.stateManager.getDefaultState().with(LAYERS, 0).with(PERSISTENT, false)); - } - - @Override - public BlockSoundGroup getSoundGroup(BlockState state) { - if(state.get(LAYERS) == 0) { - return BlockSoundGroup.GRASS; - } - else { - return BlockSoundGroup.SNOW; - } - } - - @Override - public boolean canPathfindThrough(BlockState state, BlockView world, BlockPos pos, NavigationType type) { - if(type.equals(NavigationType.LAND)) { - return state.get(LAYERS) < 5; - } - else return false; - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return LAYERS_TO_SHAPE[state.get(LAYERS)]; - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - if(state.get(LAYERS).equals(0) || state.get(LAYERS).equals(1)) { - return VoxelShapes.empty(); - } - else { - return LAYERS_TO_SHAPE[state.get(LAYERS) - 1]; - } - } - - @Override - public VoxelShape getSidesShape(BlockState state, BlockView world, BlockPos pos) { - return LAYERS_TO_SHAPE[state.get(LAYERS)]; - } - - @Override - public VoxelShape getCameraCollisionShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return LAYERS_TO_SHAPE[state.get(LAYERS)]; - } - - @Override - public boolean hasSidedTransparency(BlockState state) { - return true; - } - - @Override - public float getAmbientOcclusionLightLevel(BlockState state, BlockView world, BlockPos pos) { - return state.get(LAYERS) == 8 ? 0.2F : 1.0F; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - BlockPos down = pos.down(); - return this.canPlantOnTop(world.getBlockState(down)); - } - - protected boolean canPlantOnTop(BlockState floor) { - return floor.isIn(BlockTags.DIRT) || floor.isOf(Blocks.FARMLAND); - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - return !state.canPlaceAt(world, pos) ? Blocks.AIR.getDefaultState() : super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos); - } - - @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (world.getLightLevel(LightType.BLOCK, pos) > 11) { - dropStacks(state, world, pos); - if(state.get(LAYERS) != 0) { - var cachedFlower = CachedFlowers.getFlower(world.getRegistryKey(), pos); - world.setBlockState(pos, Objects.requireNonNullElse(cachedFlower, this).getDefaultState()); - } - } - else if(FabricLoader.getInstance().isModLoaded("seasons")) { - if(!state.get(PERSISTENT) && world.getLightLevel(LightType.SKY, pos) > 0 && world.getBiome(pos).value().getTemperature(pos) >= 0.15F) { - dropStacks(state, world, pos); - if(state.get(LAYERS) != 0) { - var cachedFlower = CachedFlowers.getFlower(world.getRegistryKey(), pos); - world.setBlockState(pos, Objects.requireNonNullElse(cachedFlower, this).getDefaultState()); - } - } - } - } - - @Override - public void onBroken(WorldAccess world, BlockPos pos, BlockState state) { - super.onBroken(world, pos, state); - - if(state.get(LAYERS) != 0 && world instanceof ServerWorld server) { - var cachedFlower = CachedFlowers.getFlower(server.getRegistryKey(), pos); - world.setBlockState(pos, Objects.requireNonNullElse(cachedFlower, this).getDefaultState(), Block.NOTIFY_ALL); - } - } - - @Override - public boolean canReplace(BlockState state, ItemPlacementContext context) { - int layers = state.get(LAYERS); - - if(layers == 8) { - return false; - } - if(context.getStack().isOf(Blocks.SNOW.asItem())) { - if(layers == 0) { - return true; - } - else { - return context.getSide() == Direction.UP; - } - } - return false; - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - BlockState state = ctx.getWorld().getBlockState(ctx.getBlockPos()); - if(state.isOf(Blocks.SNOW) || state.isOf(WinterlyBlocks.FROZEN_GRASS)) { - return getDefaultState().with(LAYERS, 1).with(PERSISTENT, true); - } - else { - return super.getPlacementState(ctx); - } - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(LAYERS); - builder.add(PERSISTENT); - } -} diff --git a/src/main/java/winterly/block/FrozenGrassBlock.java b/src/main/java/winterly/block/FrozenGrassBlock.java deleted file mode 100644 index f10793f..0000000 --- a/src/main/java/winterly/block/FrozenGrassBlock.java +++ /dev/null @@ -1,67 +0,0 @@ -package winterly.block; - -import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.SnowBlock; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.random.Random; -import net.minecraft.world.LightType; -import net.minecraft.world.WorldAccess; - -public class FrozenGrassBlock extends SnowBlock { - public static final BooleanProperty PERSISTENT = Properties.PERSISTENT; - - public FrozenGrassBlock(Settings settings) { - super(settings); - this.setDefaultState(this.stateManager.getDefaultState().with(LAYERS, 1).with(PERSISTENT, false)); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - super.appendProperties(builder); - builder.add(PERSISTENT); - } - - @Override - public boolean canReplace(BlockState state, ItemPlacementContext context) { - int layers = state.get(LAYERS); - - if(layers == 8 || context.getStack().isOf(this.asItem())) { - return false; - } - if(context.getStack().isOf(Blocks.SNOW.asItem())) { - return context.getSide() == Direction.UP; - } - - return layers == 1; - } - - @SuppressWarnings("deprecation") - @Override - public void randomTick(BlockState state, ServerWorld world, BlockPos pos, Random random) { - if (world.getLightLevel(LightType.BLOCK, pos) > 11) { - dropStacks(state, world, pos); - world.setBlockState(pos, Blocks.SHORT_GRASS.getDefaultState()); - } - else if(FabricLoader.getInstance().isModLoaded("seasons")) { - if(!state.get(PERSISTENT) && world.getLightLevel(LightType.SKY, pos) > 0 && world.getBiome(pos).value().getTemperature(pos) >= 0.15F) { - dropStacks(state, world, pos); - world.setBlockState(pos, Blocks.SHORT_GRASS.getDefaultState()); - } - } - } - - @Override - public void onBroken(WorldAccess world, BlockPos pos, BlockState state) { - super.onBroken(world, pos, state); - world.setBlockState(pos, Blocks.SHORT_GRASS.getDefaultState(), Block.NOTIFY_ALL); - } -} diff --git a/src/main/java/winterly/block/GarlandLightsBlock.java b/src/main/java/winterly/block/GarlandLightsBlock.java deleted file mode 100644 index dbeb5ff..0000000 --- a/src/main/java/winterly/block/GarlandLightsBlock.java +++ /dev/null @@ -1,81 +0,0 @@ -package winterly.block; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldView; -import org.jetbrains.annotations.Nullable; - -@SuppressWarnings("deprecation") -public class GarlandLightsBlock extends Block { - public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; - - private static final VoxelShape EAST_SHAPE = createCuboidShape(0, 3, 0, 1, 13, 16); - private static final VoxelShape WEST_SHAPE = createCuboidShape(15, 3, 0, 16, 13, 16); - private static final VoxelShape SOUTH_SHAPE = createCuboidShape(0, 3, 0, 16, 13, 1); - private static final VoxelShape NORTH_SHAPE = createCuboidShape(0, 3, 15, 16, 13, 16); - - public GarlandLightsBlock(Settings settings) { - super(settings); - this.setDefaultState(getDefaultState().with(FACING, Direction.NORTH)); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return switch (state.get(FACING)) { - case NORTH -> NORTH_SHAPE; - case SOUTH -> SOUTH_SHAPE; - case WEST -> WEST_SHAPE; - default -> EAST_SHAPE; - }; - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = state.get(FACING); - return this.canPlaceOn(world, pos.offset(direction.getOpposite())); - } - - private boolean canPlaceOn(BlockView world, BlockPos pos) { - BlockState state = world.getBlockState(pos); - return !state.isAir(); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - if (!ctx.canReplaceExisting()) { - BlockState state = ctx.getWorld().getBlockState(ctx.getBlockPos().offset(ctx.getSide().getOpposite())); - if (state.isOf(this) && state.get(FACING) == ctx.getSide()) { - return null; - } - } - - BlockState state = this.getDefaultState(); - WorldView world = ctx.getWorld(); - BlockPos pos = ctx.getBlockPos(); - - for(Direction direction : ctx.getPlacementDirections()) { - if (direction.getAxis().isHorizontal()) { - state = state.with(FACING, direction.getOpposite()); - if (state.canPlaceAt(world, pos)) { - return state; - } - } - } - return null; - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(FACING); - } -} diff --git a/src/main/java/winterly/block/GiftBoxBlock.java b/src/main/java/winterly/block/GiftBoxBlock.java deleted file mode 100644 index d96b099..0000000 --- a/src/main/java/winterly/block/GiftBoxBlock.java +++ /dev/null @@ -1,132 +0,0 @@ -package winterly.block; - -import net.minecraft.block.*; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.text.Style; -import net.minecraft.text.Text; -import net.minecraft.util.*; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -import winterly.Winterly; -import winterly.block.entity.GiftBoxBlockEntity; -import winterly.data.GiftBoxData; - -import java.util.List; - -@SuppressWarnings("deprecation") -public class GiftBoxBlock extends Block implements BlockEntityProvider { - public static final VoxelShape SHAPE = createCuboidShape(4, 0, 4, 12, 8, 12); - - public GiftBoxBlock(Settings settings) { - super(settings); - } - - @Nullable - @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { - return new GiftBoxBlockEntity(pos, state); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return GiftBoxBlock.SHAPE; - } - - @Override - public void onPlaced(World world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { - super.onPlaced(world, pos, state, placer, stack); - - if(world.getBlockEntity(pos) instanceof GiftBoxBlockEntity entity) { - entity.readNbt(stack.getOrCreateNbt()); - } - } - - @Override - public BlockState onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player) { - super.onBreak(world, pos, state, player); - - if(!world.isClient && world.getBlockEntity(pos) instanceof GiftBoxBlockEntity entity) { - ItemStack stack = player.getStackInHand(Hand.MAIN_HAND); - if(!EnchantmentHelper.get(stack).containsKey(Enchantments.SILK_TOUCH)) { - if(entity.stacks.isEmpty()) { - dropStack(world, pos, new ItemStack(this.asItem())); - } - else { - entity.stacks.forEach(st -> dropStack(world, pos, st)); - } - } - else { - ItemStack box = new ItemStack(this); - - if(!entity.stacks.isEmpty()) { - var nbt = new NbtCompound(); - entity.writeNbt(nbt); - box.setNbt(nbt); - } - dropStack(world, pos, box); - } - } - return state; - } - - @Override - public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) { - if(!world.isClient && world.getBlockEntity(pos) instanceof GiftBoxBlockEntity entity) { - var stack = player.getStackInHand(hand); - - if(!stack.isEmpty() && entity.stacks.size() < Winterly.config.getGiftBoxCapacity()) { - if(stack.getItem() instanceof BlockItem blockItem) { - if(blockItem.getBlock() instanceof ShulkerBoxBlock || blockItem.getBlock() instanceof GiftBoxBlock) { - return ActionResult.PASS; - } - } - entity.stacks.add(stack.copy()); - player.setStackInHand(hand, ItemStack.EMPTY); - world.playSound(null, pos, SoundEvents.ITEM_BUNDLE_INSERT, SoundCategory.BLOCKS, 1, 1); - return ActionResult.SUCCESS; - } - } - return super.onUse(state, world, pos, player, hand, hit); - } - - @Override - public void appendTooltip(ItemStack stack, @Nullable BlockView world, List tooltip, TooltipContext options) { - super.appendTooltip(stack, world, tooltip, options); - - if(stack.getOrCreateNbt().contains("giftBoxData")) { - var gift = GiftBoxData.fromNbt(stack.getOrCreateNbt().getCompound("giftBoxData")); - - gift.stacks.forEach(st -> { - String name = Language.getInstance().get(st.getTranslationKey()); - tooltip.add(Text.of("- " + name + " x" + st.getCount()).getWithStyle(Style.EMPTY.withColor(Formatting.GRAY)).get(0)); - }); - } - else { - Language lang = Language.getInstance(); - String key = "description.winterly.gift_box."; - - for(int i = 0; i <= 32; i++) { - if(lang.hasTranslation(key + i)) { - tooltip.add(Text.translatable(key + i).getWithStyle(Style.EMPTY.withColor(Formatting.GRAY)).get(0)); - } - if(!lang.hasTranslation(key + (i + 1))) { - break; - } - } - } - } -} diff --git a/src/main/java/winterly/block/IcicleBlock.java b/src/main/java/winterly/block/IcicleBlock.java deleted file mode 100644 index fb5c2af..0000000 --- a/src/main/java/winterly/block/IcicleBlock.java +++ /dev/null @@ -1,116 +0,0 @@ -package winterly.block; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.*; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.fluid.FluidState; -import net.minecraft.fluid.Fluids; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.BooleanProperty; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.state.property.Properties; -import net.minecraft.text.Text; -import net.minecraft.util.BlockMirror; -import net.minecraft.util.BlockRotation; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.WorldView; -import org.jetbrains.annotations.Nullable; -import winterly.registry.WinterlyBlocks; - -import java.util.List; - -@SuppressWarnings("deprecation") -public class IcicleBlock extends Block implements Waterloggable { - public static final BooleanProperty WATERLOGGED = Properties.WATERLOGGED; - public static final DirectionProperty FACING = Properties.FACING; - - public static final VoxelShape NORTH_SHAPE = createCuboidShape(3, 3, 9, 13, 13, 16); - public static final VoxelShape SOUTH_SHAPE = createCuboidShape(3, 3, 0, 13, 13, 7); - public static final VoxelShape EAST_SHAPE = createCuboidShape(0, 3, 3, 7, 13, 13); - public static final VoxelShape WEST_SHAPE = createCuboidShape(13, 3, 3, 16, 13, 13); - public static final VoxelShape UP_SHAPE = createCuboidShape(3, 0, 3, 13, 7, 13); - public static final VoxelShape DOWN_SHAPE = createCuboidShape(3, 9, 3, 13, 16, 13); - - public IcicleBlock(Settings settings) { - super(settings); - this.setDefaultState(this.getDefaultState().with(WATERLOGGED, Boolean.FALSE).with(FACING, Direction.DOWN)); - } - - @Override - public boolean canPlaceAt(BlockState state, WorldView world, BlockPos pos) { - Direction direction = state.get(FACING); - BlockPos blockPos = pos.offset(direction.getOpposite()); - BlockState blockState = world.getBlockState(blockPos); - return !blockState.isAir() && !blockState.isOf(this); - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - Direction direction = state.get(FACING); - return switch (direction) { - case NORTH -> NORTH_SHAPE; - case SOUTH -> SOUTH_SHAPE; - case EAST -> EAST_SHAPE; - case WEST -> WEST_SHAPE; - case DOWN -> DOWN_SHAPE; - default -> UP_SHAPE; - }; - } - - @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { - if (state.get(WATERLOGGED)) { - world.scheduleFluidTick(pos, Fluids.WATER, Fluids.WATER.getTickRate(world)); - } - return direction == state.get(FACING).getOpposite() && !state.canPlaceAt(world, pos) - ? Blocks.AIR.getDefaultState() - : super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos); - } - - @Nullable - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - WorldAccess world = ctx.getWorld(); - BlockPos pos = ctx.getBlockPos(); - return this.getDefaultState() - .with(WATERLOGGED, world.getFluidState(pos).getFluid() == Fluids.WATER) - .with(FACING, ctx.getSide()); - } - - @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return state.with(FACING, rotation.rotate(state.get(FACING))); - } - - @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return state.rotate(mirror.getRotation(state.get(FACING))); - } - - @Override - public FluidState getFluidState(BlockState state) { - return state.get(WATERLOGGED) ? Fluids.WATER.getStill(false) : super.getFluidState(state); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(WATERLOGGED, FACING); - } - - @Environment(EnvType.CLIENT) - @Override - public void appendTooltip(ItemStack stack, @Nullable BlockView world, List tooltip, TooltipContext options) { - if(this.equals(WinterlyBlocks.ICICLE)) { - tooltip.add(Text.translatable("tag.winterly.placeable").formatted(Formatting.GRAY)); - } - super.appendTooltip(stack, world, tooltip, options); - } -} diff --git a/src/main/java/winterly/block/SnowballWallBlock.java b/src/main/java/winterly/block/SnowballWallBlock.java deleted file mode 100644 index 9cc945f..0000000 --- a/src/main/java/winterly/block/SnowballWallBlock.java +++ /dev/null @@ -1,41 +0,0 @@ -package winterly.block; - -import com.mojang.serialization.MapCodec; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.state.StateManager; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; - -@SuppressWarnings("deprecation") -public class SnowballWallBlock extends HorizontalFacingBlock { - private static final VoxelShape SHAPE = createCuboidShape(4, 0, 4, 12, 12, 12); - - public SnowballWallBlock(Settings settings) { - super(settings); - } - - @Override - protected MapCodec getCodec() { - return null; - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return SHAPE; - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing().getOpposite()); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(FACING); - } -} diff --git a/src/main/java/winterly/block/SnowguyBlock.java b/src/main/java/winterly/block/SnowguyBlock.java deleted file mode 100644 index 97f188e..0000000 --- a/src/main/java/winterly/block/SnowguyBlock.java +++ /dev/null @@ -1,57 +0,0 @@ -package winterly.block; - -import com.mojang.serialization.MapCodec; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.HorizontalFacingBlock; -import net.minecraft.block.ShapeContext; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.state.StateManager; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.world.BlockView; -import org.jetbrains.annotations.Nullable; - -import java.util.List; - -@SuppressWarnings("deprecation") -public class SnowguyBlock extends HorizontalFacingBlock { - public static final VoxelShape SHAPE = createCuboidShape(4, 0, 4, 12, 14, 12); - - public SnowguyBlock(Settings settings) { - super(settings); - } - - @Override - protected MapCodec getCodec() { - return null; - } - - @Override - public VoxelShape getOutlineShape(BlockState state, BlockView world, BlockPos pos, ShapeContext context) { - return SHAPE; - } - - @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing().getOpposite()); - } - - @Override - protected void appendProperties(StateManager.Builder builder) { - builder.add(FACING); - } - - @Environment(EnvType.CLIENT) - @Override - public void appendTooltip(ItemStack stack, @Nullable BlockView world, List tooltip, TooltipContext options) { - tooltip.add(Text.translatable("tag.winterly.placeable").formatted(Formatting.GRAY)); - super.appendTooltip(stack, world, tooltip, options); - } -} diff --git a/src/main/java/winterly/block/base/BasePaneBlock.java b/src/main/java/winterly/block/base/BasePaneBlock.java deleted file mode 100644 index fb363e2..0000000 --- a/src/main/java/winterly/block/base/BasePaneBlock.java +++ /dev/null @@ -1,10 +0,0 @@ -package winterly.block.base; - -import net.minecraft.block.PaneBlock; - -public class BasePaneBlock extends PaneBlock { - - public BasePaneBlock(Settings settings) { - super(settings); - } -} diff --git a/src/main/java/winterly/block/base/BaseStairsBlock.java b/src/main/java/winterly/block/base/BaseStairsBlock.java deleted file mode 100644 index 3dc4efe..0000000 --- a/src/main/java/winterly/block/base/BaseStairsBlock.java +++ /dev/null @@ -1,11 +0,0 @@ -package winterly.block.base; - -import net.minecraft.block.BlockState; -import net.minecraft.block.StairsBlock; - -public class BaseStairsBlock extends StairsBlock { - - public BaseStairsBlock(BlockState base, Settings settings) { - super(base, settings); - } -} diff --git a/src/main/java/winterly/block/entity/GiftBoxBlockEntity.java b/src/main/java/winterly/block/entity/GiftBoxBlockEntity.java deleted file mode 100644 index a4ce201..0000000 --- a/src/main/java/winterly/block/entity/GiftBoxBlockEntity.java +++ /dev/null @@ -1,33 +0,0 @@ -package winterly.block.entity; - -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.BlockPos; -import winterly.data.GiftBoxData; -import winterly.registry.WinterlyBlockEntities; - -import java.util.ArrayList; - -public class GiftBoxBlockEntity extends BlockEntity { - public ArrayList stacks = new ArrayList<>(); - - public GiftBoxBlockEntity(BlockPos pos, BlockState state) { - super(WinterlyBlockEntities.GIFT_BOX_BLOCK_ENTITY, pos, state); - } - - @Override - public void writeNbt(NbtCompound nbt) { - super.writeNbt(nbt); - nbt.put("giftBoxData", GiftBoxData.toNbt(this)); - } - - @Override - public void readNbt(NbtCompound nbt) { - super.readNbt(nbt); - var data = GiftBoxData.fromNbt(nbt.getCompound("giftBoxData")); - this.stacks = data.stacks; - } - -} diff --git a/src/main/java/winterly/client/WinterlyClient.java b/src/main/java/winterly/client/WinterlyClient.java deleted file mode 100644 index 96b27e3..0000000 --- a/src/main/java/winterly/client/WinterlyClient.java +++ /dev/null @@ -1,56 +0,0 @@ -package winterly.client; - -import dev.emi.trinkets.api.client.TrinketRenderer; -import dev.emi.trinkets.api.client.TrinketRendererRegistry; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; -import net.fabricmc.fabric.api.client.rendering.v1.LivingEntityFeatureRendererRegistrationCallback; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.DrownedEntityRenderer; -import net.minecraft.client.render.entity.SkeletonEntityRenderer; -import net.minecraft.client.render.entity.ZombieEntityRenderer; -import winterly.block.*; -import winterly.client.render.DecorationFeatureRenderer; -import winterly.client.render.MobDecorationRenderers; -import winterly.registry.WinterlyBlocks; -import winterly.registry.WinterlyItems; - -public class WinterlyClient implements ClientModInitializer { - - @Override - public void onInitializeClient() { - WinterlyModelLayers.init(); - MobDecorationRenderers.init(); - - BlockRenderLayerMap map = BlockRenderLayerMap.INSTANCE; - WinterlyBlocks.BLOCKS.forEach((id, block) -> { - if(block instanceof GiftBoxBlock) map.putBlock(block, RenderLayer.getCutout()); - if(block instanceof GarlandLightsBlock) map.putBlock(block, RenderLayer.getCutout()); - if(block instanceof SnowguyBlock) map.putBlock(block, RenderLayer.getCutout()); - if(block instanceof IcicleBlock) map.putBlock(block, RenderLayer.getCutout()); - if(block instanceof FrozenGrassBlock) map.putBlock(block, RenderLayer.getCutout()); - if(block instanceof FrozenFlowerBlock) map.putBlock(block, RenderLayer.getCutout()); - }); - map.putBlock(WinterlyBlocks.ICICLE_BLOCK, RenderLayer.getTranslucent()); - map.putBlock(WinterlyBlocks.ICICLE_PANE, RenderLayer.getTranslucent()); - map.putBlock(WinterlyBlocks.ICICLE_BARS, RenderLayer.getCutout()); - - WinterlyItems.ITEMS.forEach((id, item) -> { - if(item instanceof TrinketRenderer renderer) TrinketRendererRegistry.registerRenderer(item, renderer); - }); - - LivingEntityFeatureRendererRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper, context) -> { - if(entityRenderer instanceof ZombieEntityRenderer renderer) { - registrationHelper.register(new DecorationFeatureRenderer<>(renderer)); - } - if(entityRenderer instanceof DrownedEntityRenderer renderer) { - registrationHelper.register(new DecorationFeatureRenderer<>(renderer)); - } - if(entityRenderer instanceof SkeletonEntityRenderer renderer) { - registrationHelper.register(new DecorationFeatureRenderer<>(renderer)); - } - }); - - } - -} diff --git a/src/main/java/winterly/client/WinterlyModelLayers.java b/src/main/java/winterly/client/WinterlyModelLayers.java deleted file mode 100644 index 9b454b7..0000000 --- a/src/main/java/winterly/client/WinterlyModelLayers.java +++ /dev/null @@ -1,22 +0,0 @@ -package winterly.client; - -import static net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry.registerModelLayer; -import net.minecraft.client.render.entity.model.EntityModelLayer; - -import winterly.client.model.SantaHatModel; -import winterly.client.model.ScarfModel; -import static winterly.Winterly.id; - -public class WinterlyModelLayers { - public static final EntityModelLayer SANTA_HAT_LAYER = of("santa_hat"); - public static final EntityModelLayer SCARF_LAYER = of("scarf"); - - private static EntityModelLayer of(String name){ - return new EntityModelLayer(id(name), "main"); - } - - public static void init() { - registerModelLayer(SANTA_HAT_LAYER, SantaHatModel::getTexturedModelData); - registerModelLayer(SCARF_LAYER, ScarfModel::getTexturedModelData); - } -} diff --git a/src/main/java/winterly/client/model/SantaHatModel.java b/src/main/java/winterly/client/model/SantaHatModel.java deleted file mode 100644 index adc71eb..0000000 --- a/src/main/java/winterly/client/model/SantaHatModel.java +++ /dev/null @@ -1,34 +0,0 @@ -package winterly.client.model; - -import com.google.common.collect.ImmutableList; -import net.minecraft.client.model.*; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; - -public class SantaHatModel extends Model { - public final ModelPart hat; - - public SantaHatModel(ModelPart root) { - super(RenderLayer::getEntityCutoutNoCull); - this.hat = root.getChild("hat"); - } - - public static TexturedModelData getTexturedModelData() { - ModelData modelData = new ModelData(); - ModelPartData modelPartData = modelData.getRoot(); - - ModelPartData hat = modelPartData.addChild("hat", ModelPartBuilder.create().uv(27, 14).cuboid(-4.0F, -8.0F, 7.0F, 3.0F, 3.0F, 3.0F), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); - - hat.addChild("cube_1", ModelPartBuilder.create().uv(0, 27).cuboid(-3.0F, -5.0F, 0.0F, 6.0F, 4.0F, 8.0F), ModelTransform.of(0.0F, -8.0F, 0.0F, -0.3491F, 0.0F, 0.0F)); - hat.addChild("cube_2", ModelPartBuilder.create().uv(0, 14).cuboid(-4.5F, -3.0F, -3.5F, 9.0F, 4.0F, 9.0F), ModelTransform.of(0.0F, -8.0F, 0.0F, -0.5236F, 0.0F, 0.0F)); - hat.addChild("cube_3", ModelPartBuilder.create().uv(0, 0).cuboid(-5.5F, 0.0F, -4.5F, 11.0F, 3.0F, 11.0F), ModelTransform.of(0.0F, -8.0F, 0.0F, -0.2618F, 0.0F, 0.0F)); - - return TexturedModelData.of(modelData, 64, 64); - } - - @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float r, float g, float b, float a) { - ImmutableList.of(this.hat).forEach((part) -> part.render(matrices, vertices, light, overlay, r, g, b, a)); - } -} diff --git a/src/main/java/winterly/client/model/ScarfModel.java b/src/main/java/winterly/client/model/ScarfModel.java deleted file mode 100644 index fc2b356..0000000 --- a/src/main/java/winterly/client/model/ScarfModel.java +++ /dev/null @@ -1,32 +0,0 @@ -package winterly.client.model; - -import com.google.common.collect.ImmutableList; -import net.minecraft.client.model.*; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.util.math.MatrixStack; - -public class ScarfModel extends Model { - public final ModelPart scarf; - - public ScarfModel(ModelPart root) { - super(RenderLayer::getEntityCutoutNoCull); - this.scarf = root.getChild("scarf"); - } - - public static TexturedModelData getTexturedModelData() { - ModelData modelData = new ModelData(); - ModelPartData modelPartData = modelData.getRoot(); - - ModelPartData scarf = modelPartData.addChild("scarf", ModelPartBuilder.create().uv(0, 0).cuboid(-5.0F, -1.0F, -5.0F, 10.0F, 3.0F, 10.0F, new Dilation(0.0F)), ModelTransform.pivot(0.0F, 24.0F, 0.0F)); - scarf.addChild("back_hanger", ModelPartBuilder.create().uv(0, 13).cuboid(-5.0F, 3.0F, 3.0F, 5.0F, 16.0F, 0.0F, new Dilation(0.0F)), ModelTransform.rotation(0.3491F, 0.0F, 0.0F)); - scarf.addChild("front_hanger", ModelPartBuilder.create().uv(0, 13).cuboid(-1.0F, 2.0F, -4.0F, 5.0F, 16.0F, 0.0F, new Dilation(0.0F)), ModelTransform.rotation(0.0F, -0.2618F, 0.0F)); - - return TexturedModelData.of(modelData, 64, 64); - } - - @Override - public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float r, float g, float b, float a) { - ImmutableList.of(this.scarf).forEach((part) -> part.render(matrices, vertices, light, overlay, r, g, b, a)); - } -} diff --git a/src/main/java/winterly/client/render/DecorationFeatureRenderer.java b/src/main/java/winterly/client/render/DecorationFeatureRenderer.java deleted file mode 100644 index fec56d7..0000000 --- a/src/main/java/winterly/client/render/DecorationFeatureRenderer.java +++ /dev/null @@ -1,26 +0,0 @@ -package winterly.client.render; - -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import winterly.extension.DecoratedMob; - -public class DecorationFeatureRenderer> extends FeatureRenderer { - - public DecorationFeatureRenderer(FeatureRendererContext context) { - super(context); - } - - @Override - public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { - if(entity instanceof DecoratedMob decorated) { - if(decorated.winterly$decorated()) { - MobDecorationRenderer renderer = MobDecorationRenderers.getRenderer(decorated.winterly$getIndex()); - renderer.render(this.getContextModel(), matrices, vertexConsumers, light, entity, limbAngle, limbDistance, tickDelta, animationProgress, headYaw, headPitch); - } - } - } -} diff --git a/src/main/java/winterly/client/render/MobDecorationRenderer.java b/src/main/java/winterly/client/render/MobDecorationRenderer.java deleted file mode 100644 index f668493..0000000 --- a/src/main/java/winterly/client/render/MobDecorationRenderer.java +++ /dev/null @@ -1,16 +0,0 @@ -package winterly.client.render; - -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; - -public abstract class MobDecorationRenderer { - public final String texture; - - public MobDecorationRenderer(String texture) { - this.texture = texture; - } - - abstract public void render(BipedEntityModel contextModel, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch); -} diff --git a/src/main/java/winterly/client/render/SantaHatRenderer.java b/src/main/java/winterly/client/render/SantaHatRenderer.java deleted file mode 100644 index f4a60b0..0000000 --- a/src/main/java/winterly/client/render/SantaHatRenderer.java +++ /dev/null @@ -1,25 +0,0 @@ -package winterly.client.render; - -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import winterly.Winterly; -import winterly.client.model.WinterlyModels; - -public class SantaHatRenderer extends MobDecorationRenderer { - - public SantaHatRenderer(String texture) { - super(texture); - } - - @Override - public void render(BipedEntityModel contextModel, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { - WinterlyModels.SANTA_HAT_MODEL.hat.copyTransform(contextModel.head); - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getEntityCutout(Winterly.id("textures/entity/" + texture + ".png"))); - WinterlyModels.SANTA_HAT_MODEL.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); - } -} diff --git a/src/main/java/winterly/client/render/ScarfRenderer.java b/src/main/java/winterly/client/render/ScarfRenderer.java deleted file mode 100644 index c0ccc09..0000000 --- a/src/main/java/winterly/client/render/ScarfRenderer.java +++ /dev/null @@ -1,25 +0,0 @@ -package winterly.client.render; - -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import winterly.Winterly; -import winterly.client.model.WinterlyModels; - -public class ScarfRenderer extends MobDecorationRenderer { - - public ScarfRenderer(String texture) { - super(texture); - } - - @Override - public void render(BipedEntityModel contextModel, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { - WinterlyModels.SCARF_MODEL.scarf.copyTransform(contextModel.body); - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getEntityCutout(Winterly.id("textures/entity/" + texture + ".png"))); - WinterlyModels.SCARF_MODEL.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); - } -} diff --git a/src/main/java/winterly/data/CachedFlowers.java b/src/main/java/winterly/data/CachedFlowers.java deleted file mode 100644 index 2b3341f..0000000 --- a/src/main/java/winterly/data/CachedFlowers.java +++ /dev/null @@ -1,40 +0,0 @@ -package winterly.data; - -import net.minecraft.block.Block; -import net.minecraft.registry.RegistryKey; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -import java.util.LinkedHashMap; -import java.util.Map; - -public class CachedFlowers { - - public static Map, Map> data = new LinkedHashMap<>(); - - @Nullable - public static Block getFlower(RegistryKey world, BlockPos pos) { - var map = data.get(world); - if(map != null) { - return map.get(pos); - } - else { - var newMap = new LinkedHashMap(); - data.put(world, newMap); - return null; - } - } - - public static void cacheFlower(RegistryKey world, BlockPos pos, Block flower) { - var map = data.get(world); - if(map != null) { - map.put(pos, flower); - } - else { - var newMap = new LinkedHashMap(); - newMap.put(pos, flower); - data.put(world, newMap); - } - } -} diff --git a/src/main/java/winterly/data/GiftBoxData.java b/src/main/java/winterly/data/GiftBoxData.java deleted file mode 100644 index 325d70e..0000000 --- a/src/main/java/winterly/data/GiftBoxData.java +++ /dev/null @@ -1,47 +0,0 @@ -package winterly.data; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; -import winterly.block.entity.GiftBoxBlockEntity; - -import java.util.ArrayList; - -public class GiftBoxData { - public ArrayList stacks = new ArrayList<>(); - - public static GiftBoxData fromNbt(NbtCompound nbt) { - GiftBoxData gift = new GiftBoxData(); - - int size = nbt.getInt("size"); - for(int i = 0; i < size; i++) { - NbtCompound entryNbt = nbt.getCompound(String.valueOf(i)); - - var item = Registries.ITEM.getOrEmpty(new Identifier(entryNbt.getString("item"))); - if(item.isPresent()) { - ItemStack temp = new ItemStack(item.get(), entryNbt.getInt("count")); - temp.setNbt((NbtCompound)entryNbt.get("nbt")); - gift.stacks.add(temp); - } - } - - return gift; - } - - public static NbtCompound toNbt(GiftBoxBlockEntity entity) { - NbtCompound nbt = new NbtCompound(); - nbt.putInt("size", entity.stacks.size()); - - for(int i = 0; i < entity.stacks.size(); i++) { - ItemStack stack = entity.stacks.get(i); - NbtCompound entryNbt = new NbtCompound(); - entryNbt.putString("item", Registries.ITEM.getId(stack.getItem()).toString()); - entryNbt.put("nbt", stack.getOrCreateNbt()); - entryNbt.putInt("count", stack.getCount()); - - nbt.put(Integer.toString(i), entryNbt); - } - return nbt; - } -} diff --git a/src/main/java/winterly/data/WorldData.java b/src/main/java/winterly/data/WorldData.java deleted file mode 100644 index d8d1e42..0000000 --- a/src/main/java/winterly/data/WorldData.java +++ /dev/null @@ -1,58 +0,0 @@ -package winterly.data; - -import dev.onyxstudios.cca.api.v3.component.ComponentV3; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -import java.util.LinkedHashMap; - -public class WorldData implements ComponentV3 { - - public World world; - - public WorldData(World world) { - this.world = world; - } - - @Override - public void readFromNbt(NbtCompound tag) { - CachedFlowers.data = new LinkedHashMap<>(); - var cachedFlowerNbt = tag.getCompound("cachedFlower"); - - if(!cachedFlowerNbt.isEmpty()) { - int size = cachedFlowerNbt.getInt("size"); - - for(int i = 0; i < size; i++) { - NbtCompound entry = cachedFlowerNbt.getCompound(String.valueOf(i)); - BlockPos pos = new BlockPos(entry.getInt("x"), entry.getInt("y"), entry.getInt("z")); - var block = Registries.BLOCK.getOrEmpty(new Identifier(entry.getString("block"))); - block.ifPresent(bl -> CachedFlowers.cacheFlower(world.getRegistryKey(), pos, bl)); - } - } - } - - @Override - public void writeToNbt(NbtCompound tag) { - NbtCompound cachedFlowerNbt = new NbtCompound(); - var map = CachedFlowers.data.get(world.getRegistryKey()); - if(map != null) { - cachedFlowerNbt.putInt("size", map.size()); - int index = -1; - - for(var entry : map.entrySet()) { - index++; - NbtCompound entryNbt = new NbtCompound(); - entryNbt.putInt("x", entry.getKey().getX()); - entryNbt.putInt("y", entry.getKey().getY()); - entryNbt.putInt("z", entry.getKey().getZ()); - entryNbt.putString("block", Registries.BLOCK.getId(entry.getValue()).toString()); - cachedFlowerNbt.put(String.valueOf(index), entryNbt); - } - tag.put("cachedFlower", cachedFlowerNbt); - } - - } -} diff --git a/src/main/java/winterly/item/SantaHatItem.java b/src/main/java/winterly/item/SantaHatItem.java deleted file mode 100644 index 9691775..0000000 --- a/src/main/java/winterly/item/SantaHatItem.java +++ /dev/null @@ -1,55 +0,0 @@ -package winterly.item; - -import dev.emi.trinkets.api.SlotReference; -import dev.emi.trinkets.api.Trinket; -import dev.emi.trinkets.api.TrinketsApi; -import dev.emi.trinkets.api.client.TrinketRenderer; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -import winterly.Winterly; -import winterly.client.model.WinterlyModels; - -import java.util.List; - -public class SantaHatItem extends Item implements Trinket, TrinketRenderer { - private final String color; - - public SantaHatItem(Settings settings, String color) { - super(settings); - this.color = color; - TrinketsApi.registerTrinket(this, this); - } - - @Environment(EnvType.CLIENT) - @Override - public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { - tooltip.add(Text.translatable("tag.winterly.cosmetic").formatted(Formatting.GRAY)); - tooltip.add(Text.of(" ")); - super.appendTooltip(stack, world, tooltip, context); - } - - @Environment(EnvType.CLIENT) - @Override - public void render(ItemStack stack, SlotReference slotReference, EntityModel contextModel, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { - if(contextModel instanceof BipedEntityModel biped) { - WinterlyModels.SANTA_HAT_MODEL.hat.copyTransform(biped.head); - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getEntityCutout(Winterly.id("textures/entity/" + color + "_santa_hat.png"))); - WinterlyModels.SANTA_HAT_MODEL.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); - } - } -} diff --git a/src/main/java/winterly/item/ScarfItem.java b/src/main/java/winterly/item/ScarfItem.java deleted file mode 100644 index bdbf6bf..0000000 --- a/src/main/java/winterly/item/ScarfItem.java +++ /dev/null @@ -1,55 +0,0 @@ -package winterly.item; - -import dev.emi.trinkets.api.SlotReference; -import dev.emi.trinkets.api.Trinket; -import dev.emi.trinkets.api.TrinketsApi; -import dev.emi.trinkets.api.client.TrinketRenderer; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -import winterly.Winterly; -import winterly.client.model.WinterlyModels; - -import java.util.List; - -public class ScarfItem extends Item implements Trinket, TrinketRenderer { - private final String color; - - public ScarfItem(Settings settings, String color) { - super(settings); - this.color = color; - TrinketsApi.registerTrinket(this, this); - } - - @Environment(EnvType.CLIENT) - @Override - public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { - tooltip.add(Text.translatable("tag.winterly.cosmetic").formatted(Formatting.GRAY)); - tooltip.add(Text.of(" ")); - super.appendTooltip(stack, world, tooltip, context); - } - - @Environment(EnvType.CLIENT) - @Override - public void render(ItemStack stack, SlotReference slotReference, EntityModel contextModel, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, LivingEntity entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { - if(contextModel instanceof BipedEntityModel biped){ - WinterlyModels.SCARF_MODEL.scarf.copyTransform(biped.body); - VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getEntityCutout(Winterly.id("textures/entity/" + color + "_scarf.png"))); - WinterlyModels.SCARF_MODEL.render(matrices, vertexConsumer, light, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); - } - } -} diff --git a/src/main/java/winterly/item/tool/CryomarbleAxeItem.java b/src/main/java/winterly/item/tool/CryomarbleAxeItem.java deleted file mode 100644 index e070201..0000000 --- a/src/main/java/winterly/item/tool/CryomarbleAxeItem.java +++ /dev/null @@ -1,21 +0,0 @@ -package winterly.item.tool; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.item.AxeItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ToolMaterial; - -public class CryomarbleAxeItem extends AxeItem { - - public CryomarbleAxeItem(ToolMaterial material, float attackDamage, float attackSpeed, Settings settings) { - super(material, attackDamage, attackSpeed, settings); - } - - @Override - public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) { - target.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 60, 0)); - return super.postHit(stack, target, attacker); - } -} diff --git a/src/main/java/winterly/item/tool/CryomarbleHoeItem.java b/src/main/java/winterly/item/tool/CryomarbleHoeItem.java deleted file mode 100644 index 1a66677..0000000 --- a/src/main/java/winterly/item/tool/CryomarbleHoeItem.java +++ /dev/null @@ -1,21 +0,0 @@ -package winterly.item.tool; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.item.HoeItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ToolMaterial; - -public class CryomarbleHoeItem extends HoeItem { - - public CryomarbleHoeItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { - super(material, attackDamage, attackSpeed, settings); - } - - @Override - public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) { - target.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 60, 0)); - return super.postHit(stack, target, attacker); - } -} diff --git a/src/main/java/winterly/item/tool/CryomarblePickaxeItem.java b/src/main/java/winterly/item/tool/CryomarblePickaxeItem.java deleted file mode 100644 index 7663d93..0000000 --- a/src/main/java/winterly/item/tool/CryomarblePickaxeItem.java +++ /dev/null @@ -1,21 +0,0 @@ -package winterly.item.tool; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.item.ItemStack; -import net.minecraft.item.PickaxeItem; -import net.minecraft.item.ToolMaterial; - -public class CryomarblePickaxeItem extends PickaxeItem { - - public CryomarblePickaxeItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { - super(material, attackDamage, attackSpeed, settings); - } - - @Override - public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) { - target.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 60, 0)); - return super.postHit(stack, target, attacker); - } -} diff --git a/src/main/java/winterly/item/tool/CryomarbleShovelItem.java b/src/main/java/winterly/item/tool/CryomarbleShovelItem.java deleted file mode 100644 index a22271b..0000000 --- a/src/main/java/winterly/item/tool/CryomarbleShovelItem.java +++ /dev/null @@ -1,21 +0,0 @@ -package winterly.item.tool; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ShovelItem; -import net.minecraft.item.ToolMaterial; - -public class CryomarbleShovelItem extends ShovelItem { - - public CryomarbleShovelItem(ToolMaterial material, float attackDamage, float attackSpeed, Settings settings) { - super(material, attackDamage, attackSpeed, settings); - } - - @Override - public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) { - target.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 60, 0)); - return super.postHit(stack, target, attacker); - } -} diff --git a/src/main/java/winterly/item/tool/CryomarbleSwordItem.java b/src/main/java/winterly/item/tool/CryomarbleSwordItem.java deleted file mode 100644 index 397968a..0000000 --- a/src/main/java/winterly/item/tool/CryomarbleSwordItem.java +++ /dev/null @@ -1,21 +0,0 @@ -package winterly.item.tool; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.item.ItemStack; -import net.minecraft.item.SwordItem; -import net.minecraft.item.ToolMaterial; - -public class CryomarbleSwordItem extends SwordItem { - - public CryomarbleSwordItem(ToolMaterial toolMaterial, int attackDamage, float attackSpeed, Settings settings) { - super(toolMaterial, attackDamage, attackSpeed, settings); - } - - @Override - public boolean postHit(ItemStack stack, LivingEntity target, LivingEntity attacker) { - target.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 60, 0)); - return super.postHit(stack, target, attacker); - } -} diff --git a/src/main/java/winterly/mixin/client/ArmorRendererMixin.java b/src/main/java/winterly/mixin/client/ArmorRendererMixin.java deleted file mode 100644 index 6bca21f..0000000 --- a/src/main/java/winterly/mixin/client/ArmorRendererMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package winterly.mixin.client; - -import dev.emi.trinkets.api.SlotReference; -import dev.emi.trinkets.api.TrinketComponent; -import dev.emi.trinkets.api.TrinketsApi; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.ArmorFeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Pair; -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; -import winterly.item.SantaHatItem; - -import java.util.Optional; - -@Mixin(ArmorFeatureRenderer.class) -public abstract class ArmorRendererMixin , A extends BipedEntityModel> extends FeatureRenderer { - - public ArmorRendererMixin(FeatureRendererContext context) { - super(context); - } - - @Inject(method = "renderArmor", at = @At("HEAD"), cancellable = true) - void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, T entity, EquipmentSlot armorSlot, int light, A model, CallbackInfo ci) { - if(entity instanceof PlayerEntity player) { - if(armorSlot.equals(EquipmentSlot.HEAD)) { - if(winterly$hasHatOn(player)) ci.cancel(); - } - } - } - - boolean winterly$hasHatOn(PlayerEntity player) { - Optional component = TrinketsApi.getTrinketComponent(player); - if(component.isPresent()) { - for(Pair pair : component.get().getAllEquipped()) { - if(pair.getRight().getItem() instanceof SantaHatItem) return true; - } - } - return false; - } -} diff --git a/src/main/java/winterly/mixin/common/BlockStateMixin.java b/src/main/java/winterly/mixin/common/BlockStateMixin.java deleted file mode 100644 index 70ac29e..0000000 --- a/src/main/java/winterly/mixin/common/BlockStateMixin.java +++ /dev/null @@ -1,58 +0,0 @@ -package winterly.mixin.common; - -import com.google.common.collect.ImmutableMap; -import com.mojang.serialization.MapCodec; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.state.State; -import net.minecraft.state.property.Property; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.BlockView; -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; -import winterly.block.FrozenFlowerBlock; -import winterly.registry.WinterlyBlocks; - -@Mixin(AbstractBlock.AbstractBlockState.class) -public abstract class BlockStateMixin extends State { - - protected BlockStateMixin(Block owner, ImmutableMap, Comparable> entries, MapCodec codec) { - super(owner, entries, codec); - } - - @Shadow - public abstract boolean isOf(Block block); - - @Shadow - @Final - private float hardness; - - @Inject(method = "getHardness", at = @At("HEAD"), cancellable = true) - void getHardness(BlockView world, BlockPos pos, CallbackInfoReturnable cir) { - if(isOf(WinterlyBlocks.FROZEN_FLOWER)) { - if(get(FrozenFlowerBlock.LAYERS) == 0) { - cir.setReturnValue(0.0F); - } - else { - cir.setReturnValue(hardness); - } - } - } - - @Inject(method = "isToolRequired", at = @At("HEAD"), cancellable = true) - void isToolRequired(CallbackInfoReturnable cir) { - if(isOf(WinterlyBlocks.FROZEN_FLOWER)) { - if(get(FrozenFlowerBlock.LAYERS) == 0) { - cir.setReturnValue(false); - } - else { - cir.setReturnValue(true); - } - } - } -} diff --git a/src/main/java/winterly/mixin/common/FreezeTopLayerMixin.java b/src/main/java/winterly/mixin/common/FreezeTopLayerMixin.java deleted file mode 100644 index 3702564..0000000 --- a/src/main/java/winterly/mixin/common/FreezeTopLayerMixin.java +++ /dev/null @@ -1,54 +0,0 @@ -package winterly.mixin.common; - -import net.minecraft.block.*; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.LightType; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.WorldView; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.FreezeTopLayerFeature; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; -import winterly.Winterly; -import winterly.block.FrozenFlowerBlock; -import winterly.registry.WinterlyBlocks; - -@Mixin(FreezeTopLayerFeature.class) -public abstract class FreezeTopLayerMixin { - - @Redirect(method = "generate", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;canSetSnow(Lnet/minecraft/world/WorldView;Lnet/minecraft/util/math/BlockPos;)Z")) - boolean canSetIce(Biome biome, WorldView view, BlockPos pos) { - - if(!biome.doesNotSnow(pos) && (pos.getY() >= view.getBottomY() && pos.getY() < view.getTopY() && view.getLightLevel(LightType.BLOCK, pos) < 10)) { - BlockState state = view.getBlockState(pos); - if(view instanceof StructureWorldAccess world) { - - if (Winterly.config.generateFrozenGrass && (state.isOf(Blocks.SHORT_GRASS) || state.isOf(Blocks.FERN) || state.isOf(Blocks.LARGE_FERN) || state.isOf(Blocks.TALL_GRASS))) { - world.setBlockState(pos, WinterlyBlocks.FROZEN_GRASS.getDefaultState(), 3); - BlockState floor = world.getBlockState(pos.down()); - if (floor.contains(SnowyBlock.SNOWY)) { - world.setBlockState(pos.down(), floor.with(SnowyBlock.SNOWY, Boolean.TRUE), 2); - } - if(state.isOf(Blocks.LARGE_FERN) || state.isOf(Blocks.TALL_GRASS)) { - world.setBlockState(pos.up(), Blocks.AIR.getDefaultState(), 2); - } - return false; - } - else if(Winterly.config.generateFrozenFlowers && (state.getBlock() instanceof FlowerBlock || state.getBlock() instanceof TallFlowerBlock)) { - world.setBlockState(pos, WinterlyBlocks.FROZEN_FLOWER.getDefaultState().with(FrozenFlowerBlock.LAYERS, 1), 3); - BlockState floor = world.getBlockState(pos.down()); - if (floor.contains(SnowyBlock.SNOWY)) { - world.setBlockState(pos.down(), floor.with(SnowyBlock.SNOWY, Boolean.TRUE), 2); - } - if(state.getBlock() instanceof TallFlowerBlock) { - world.setBlockState(pos.up(), Blocks.AIR.getDefaultState(), 2); - } - return false; - } - } - } - - return biome.canSetSnow(view, pos); - } -} diff --git a/src/main/java/winterly/mixin/common/MiningToolItemMixin.java b/src/main/java/winterly/mixin/common/MiningToolItemMixin.java deleted file mode 100644 index b49c1dc..0000000 --- a/src/main/java/winterly/mixin/common/MiningToolItemMixin.java +++ /dev/null @@ -1,56 +0,0 @@ -package winterly.mixin.common; - -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.item.ItemStack; -import net.minecraft.item.MiningToolItem; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.registry.tag.TagKey; -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; -import winterly.block.FrozenFlowerBlock; -import winterly.registry.WinterlyBlocks; - -@Mixin(MiningToolItem.class) -public abstract class MiningToolItemMixin { - - @Shadow - @Final - private TagKey effectiveBlocks; - - @Shadow - @Final - protected float miningSpeed; - - @Inject(method = "isSuitableFor", at = @At("HEAD"), cancellable = true) - void isSuitableFor(BlockState state, CallbackInfoReturnable cir) { - if(effectiveBlocks.equals(BlockTags.SHOVEL_MINEABLE)) { - if(state.isOf(WinterlyBlocks.FROZEN_FLOWER)) { - if(state.get(FrozenFlowerBlock.LAYERS) != 0) { - cir.setReturnValue(true); - } - else { - cir.setReturnValue(false); - } - } - } - } - - @Inject(method = "getMiningSpeedMultiplier", at = @At("HEAD"), cancellable = true) - void getMiningSpeedMultiplier(ItemStack stack, BlockState state, CallbackInfoReturnable cir) { - if(effectiveBlocks.equals(BlockTags.SHOVEL_MINEABLE)) { - if(state.isOf(WinterlyBlocks.FROZEN_FLOWER)) { - if(state.get(FrozenFlowerBlock.LAYERS) != 0) { - cir.setReturnValue(miningSpeed); - } - else { - cir.setReturnValue(1.0F); - } - } - } - } -} diff --git a/src/main/java/winterly/mixin/common/ServerWorldMixin.java b/src/main/java/winterly/mixin/common/ServerWorldMixin.java deleted file mode 100644 index a08a788..0000000 --- a/src/main/java/winterly/mixin/common/ServerWorldMixin.java +++ /dev/null @@ -1,42 +0,0 @@ -package winterly.mixin.common; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FlowerBlock; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.LightType; -import net.minecraft.world.World; -import net.minecraft.world.WorldView; -import net.minecraft.world.biome.Biome; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; -import winterly.Winterly; -import winterly.block.FrozenFlowerBlock; -import winterly.data.CachedFlowers; -import winterly.registry.WinterlyBlocks; - -@Mixin(ServerWorld.class) -public abstract class ServerWorldMixin { - - @Redirect(method = "tickIceAndSnow", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/biome/Biome;canSetSnow(Lnet/minecraft/world/WorldView;Lnet/minecraft/util/math/BlockPos;)Z")) - boolean canSetSnow(Biome biome, WorldView view, BlockPos pos) { - - if(!biome.doesNotSnow(pos) && (pos.getY() >= view.getBottomY() && pos.getY() < view.getTopY() && view.getLightLevel(LightType.BLOCK, pos) < 10)) { - BlockState state = view.getBlockState(pos); - if(view instanceof World world) { - if (state.isOf(Blocks.SHORT_GRASS) && Winterly.config.generateFrozenGrass) { - world.setBlockState(pos, WinterlyBlocks.FROZEN_GRASS.getDefaultState()); - return false; - } - else if(state.getBlock() instanceof FlowerBlock && Winterly.config.generateFrozenFlowers) { - world.setBlockState(pos, WinterlyBlocks.FROZEN_FLOWER.getDefaultState().with(FrozenFlowerBlock.LAYERS, 1)); - CachedFlowers.cacheFlower(((World) view).getRegistryKey(), pos, state.getBlock()); - return false; - } - } - } - return biome.canSetSnow(view, pos); - } -} diff --git a/src/main/java/winterly/mixin/common/SkeletonExtension.java b/src/main/java/winterly/mixin/common/SkeletonExtension.java deleted file mode 100644 index 1648984..0000000 --- a/src/main/java/winterly/mixin/common/SkeletonExtension.java +++ /dev/null @@ -1,77 +0,0 @@ -package winterly.mixin.common; - -import net.minecraft.entity.EntityData; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.mob.AbstractSkeletonEntity; -import net.minecraft.entity.mob.SkeletonEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; -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; -import winterly.Winterly; -import winterly.extension.DecoratedMob; -import winterly.util.HolidayUtils; - -@Mixin(SkeletonEntity.class) -public abstract class SkeletonExtension extends AbstractSkeletonEntity implements DecoratedMob { - private static final TrackedData winterly$DECORATED = DataTracker.registerData(SkeletonEntity.class, TrackedDataHandlerRegistry.BOOLEAN); - private static final TrackedData winterly$INDEX = DataTracker.registerData(SkeletonEntity.class, TrackedDataHandlerRegistry.INTEGER); - - protected SkeletonExtension(EntityType entityType, World world) { - super(entityType, world); - } - - @Override - public boolean winterly$decorated() { - return getDataTracker().get(winterly$DECORATED); - } - - @Override - public int winterly$getIndex() { - return getDataTracker().get(winterly$INDEX); - } - - @Inject(method = "initDataTracker", at = @At("TAIL")) - void initData(CallbackInfo ci) { - getDataTracker().startTracking(winterly$DECORATED, false); - getDataTracker().startTracking(winterly$INDEX, 0); - } - - @Inject(method = "writeCustomDataToNbt", at = @At("TAIL")) - void write(NbtCompound nbt, CallbackInfo ci) { - nbt.putBoolean("WinterlyDecorated", getDataTracker().get(winterly$DECORATED)); - nbt.putInt("WinterlyIndex", getDataTracker().get(winterly$INDEX)); - } - - @Inject(method = "readCustomDataFromNbt", at = @At("TAIL")) - void read(NbtCompound nbt, CallbackInfo ci) { - getDataTracker().set(winterly$DECORATED, nbt.getBoolean("WinterlyDecorated")); - getDataTracker().set(winterly$INDEX, nbt.getInt("WinterlyIndex")); - } - - @Override - public EntityData initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, NbtCompound entityNbt){ - entityData = super.initialize(world, difficulty, spawnReason, entityData, entityNbt); - if(!spawnReason.equals(SpawnReason.SPAWNER) && !spawnReason.equals(SpawnReason.CHUNK_GENERATION)) { - if(Winterly.config.mobDecorations.enabled && HolidayUtils.isWinter() || !Winterly.config.mobDecorations.onlyInWinter) { - if(!this.getWorld().getRegistryKey().equals(World.NETHER)) { - int chance = Winterly.config.mobDecorations.chance; - if(chance > 0 && Math.random() < (double)chance / 100) { - getDataTracker().set(winterly$DECORATED, true); - getDataTracker().set(winterly$INDEX, world.getRandom().nextInt(5)); - } - } - } - } - return entityData; - } - -} diff --git a/src/main/java/winterly/mixin/common/SnowBlockMixin.java b/src/main/java/winterly/mixin/common/SnowBlockMixin.java deleted file mode 100644 index 1167816..0000000 --- a/src/main/java/winterly/mixin/common/SnowBlockMixin.java +++ /dev/null @@ -1,37 +0,0 @@ -package winterly.mixin.common; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.FlowerBlock; -import net.minecraft.block.SnowBlock; -import net.minecraft.item.ItemPlacementContext; -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; -import winterly.block.FrozenFlowerBlock; -import winterly.block.FrozenGrassBlock; -import winterly.registry.WinterlyBlocks; - -@Mixin(SnowBlock.class) -public abstract class SnowBlockMixin { - - @Inject(method = "getPlacementState", at = @At("HEAD"), cancellable = true) - void getPlacementState(ItemPlacementContext ctx, CallbackInfoReturnable cir) { - BlockState state = ctx.getWorld().getBlockState(ctx.getBlockPos()); - if(state.isOf(WinterlyBlocks.FROZEN_GRASS)) { - int layers = state.get(SnowBlock.LAYERS); - cir.setReturnValue(state.with(SnowBlock.LAYERS, Math.min(8, layers + 1)).with(FrozenGrassBlock.PERSISTENT, true)); - } - else if(state.isOf(WinterlyBlocks.FROZEN_FLOWER)) { - int layers = state.get(FrozenFlowerBlock.LAYERS); - cir.setReturnValue(state.with(FrozenFlowerBlock.LAYERS, Math.min(8, layers + 1)).with(FrozenGrassBlock.PERSISTENT, true)); - } - else if(state.isOf(Blocks.SHORT_GRASS)) { - cir.setReturnValue(WinterlyBlocks.FROZEN_GRASS.getDefaultState().with(FrozenGrassBlock.PERSISTENT, true)); - } - else if(state.getBlock() instanceof FlowerBlock) { - cir.setReturnValue(WinterlyBlocks.FROZEN_FLOWER.getDefaultState().with(FrozenFlowerBlock.LAYERS, 1).with(FrozenFlowerBlock.PERSISTENT, true)); - } - } -} diff --git a/src/main/java/winterly/mixin/common/SpreadableBlockMixin.java b/src/main/java/winterly/mixin/common/SpreadableBlockMixin.java deleted file mode 100644 index f43ff6b..0000000 --- a/src/main/java/winterly/mixin/common/SpreadableBlockMixin.java +++ /dev/null @@ -1,23 +0,0 @@ -package winterly.mixin.common; - -import net.minecraft.block.BlockState; -import net.minecraft.block.SpreadableBlock; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldView; -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; -import winterly.registry.WinterlyBlocks; - -@Mixin(SpreadableBlock.class) -public abstract class SpreadableBlockMixin { - - @Inject(method = "canSurvive", at = @At("HEAD"), cancellable = true) - private static void canSurvive(BlockState state, WorldView world, BlockPos pos, CallbackInfoReturnable cir) { - BlockState up = world.getBlockState(pos.up()); - if(up.isOf(WinterlyBlocks.FROZEN_GRASS) || up.isOf(WinterlyBlocks.FROZEN_FLOWER)) { - cir.setReturnValue(true); - } - } -} diff --git a/src/main/java/winterly/mixin/common/ZombieExtension.java b/src/main/java/winterly/mixin/common/ZombieExtension.java deleted file mode 100644 index 2e7bda5..0000000 --- a/src/main/java/winterly/mixin/common/ZombieExtension.java +++ /dev/null @@ -1,77 +0,0 @@ -package winterly.mixin.common; - -import net.minecraft.entity.EntityData; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.mob.ZombieEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; -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; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import winterly.Winterly; -import winterly.extension.DecoratedMob; -import winterly.util.HolidayUtils; - -@Mixin(ZombieEntity.class) -public abstract class ZombieExtension extends HostileEntity implements DecoratedMob { - private static final TrackedData winterly$DECORATED = DataTracker.registerData(ZombieEntity.class, TrackedDataHandlerRegistry.BOOLEAN); - private static final TrackedData winterly$INDEX = DataTracker.registerData(ZombieEntity.class, TrackedDataHandlerRegistry.INTEGER); - - protected ZombieExtension(EntityType entityType, World world) { - super(entityType, world); - } - - @Override - public boolean winterly$decorated() { - return getDataTracker().get(winterly$DECORATED); - } - - @Override - public int winterly$getIndex() { - return getDataTracker().get(winterly$INDEX); - } - - @Inject(method = "initDataTracker", at = @At("TAIL")) - void initData(CallbackInfo ci) { - getDataTracker().startTracking(winterly$DECORATED, false); - getDataTracker().startTracking(winterly$INDEX, 0); - } - - @Inject(method = "writeCustomDataToNbt", at = @At("TAIL")) - void write(NbtCompound nbt, CallbackInfo ci) { - nbt.putBoolean("WinterlyDecorated", getDataTracker().get(winterly$DECORATED)); - nbt.putInt("WinterlyIndex", getDataTracker().get(winterly$INDEX)); - } - - @Inject(method = "readCustomDataFromNbt", at = @At("TAIL")) - void read(NbtCompound nbt, CallbackInfo ci) { - getDataTracker().set(winterly$DECORATED, nbt.getBoolean("WinterlyDecorated")); - getDataTracker().set(winterly$INDEX, nbt.getInt("WinterlyIndex")); - } - - @Inject(method = "initialize", at = @At("RETURN")) - void initialize(ServerWorldAccess world, LocalDifficulty difficulty, SpawnReason spawnReason, EntityData entityData, NbtCompound entityNbt, CallbackInfoReturnable cir) { - if(!spawnReason.equals(SpawnReason.SPAWNER) && !spawnReason.equals(SpawnReason.CHUNK_GENERATION) && !isBaby()) { - if(Winterly.config.mobDecorations.enabled && HolidayUtils.isWinter() || !Winterly.config.mobDecorations.onlyInWinter) { - if(!this.getWorld().getRegistryKey().equals(World.NETHER)) { - int chance = Winterly.config.mobDecorations.chance; - if(chance > 0 && Math.random() < (double)chance / 100) { - getDataTracker().set(winterly$DECORATED, true); - getDataTracker().set(winterly$INDEX, world.getRandom().nextInt(5)); - } - } - - } - } - } - -} diff --git a/src/main/java/winterly/registry/WinterlyBlocks.java b/src/main/java/winterly/registry/WinterlyBlocks.java deleted file mode 100644 index 742ced6..0000000 --- a/src/main/java/winterly/registry/WinterlyBlocks.java +++ /dev/null @@ -1,87 +0,0 @@ -package winterly.registry; - -import net.fabricmc.fabric.api.item.v1.FabricItemSettings; -import net.minecraft.block.*; -import net.minecraft.block.piston.PistonBehavior; -import net.minecraft.item.BlockItem; -import net.minecraft.item.Item; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.util.Identifier; -import winterly.Winterly; -import winterly.block.*; -import winterly.block.base.BasePaneBlock; -import winterly.block.base.BaseStairsBlock; - -import static net.minecraft.block.Blocks.*; -import static net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings.copyOf; - -import java.util.LinkedHashMap; -import java.util.Map; - -@SuppressWarnings("unused") -public class WinterlyBlocks { - public static final Map ITEMS = new LinkedHashMap<>(); - public static final Map BLOCKS = new LinkedHashMap<>(); - -// public static final Block RED_SOCK = add("red_sock", new SockBlock(copyOf(CANDLE).sounds(BlockSoundGroup.WOOL))); -// public static final Block GREEN_SOCK = add("green_sock", new SockBlock(copyOf(CANDLE).sounds(BlockSoundGroup.WOOL))); -// public static final Block BLUE_SOCK = add("blue_sock", new SockBlock(copyOf(CANDLE).sounds(BlockSoundGroup.WOOL))); - - public static final Block ICICLE = add("icicle", new IcicleBlock(copyOf(ICE).pistonBehavior(PistonBehavior.DESTROY))); - public static final Block ICICLE_BLOCK = add("icicle_block", new TransparentBlock(copyOf(PACKED_ICE).nonOpaque())); - public static final Block PACKED_ICICLE_BLOCK = add("packed_icicle_block", new TransparentBlock(copyOf(PACKED_ICE).nonOpaque())); - public static final Block ICICLE_PANE = add("icicle_pane", new BasePaneBlock(copyOf(PACKED_ICE).nonOpaque())); - public static final Block ICICLE_BARS = add("icicle_bars", new BasePaneBlock(copyOf(ICE).nonOpaque())); - public static final Block CRYOMARBLE_BLOCK = add("cryomarble_block", new Block(copyOf(DIAMOND_BLOCK))); - public static final Block SNOWGUY = add("snowguy", new SnowguyBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.SNOW))); - public static final Block SNOWBALL_WALL = add("snowball_wall", new SnowballWallBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.SNOW).nonOpaque())); - public static final Block DENSE_SNOW = add("dense_snow", new Block(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.SNOW))); - public static final Block DENSE_SNOW_STAIRS = add("dense_snow_stairs", new BaseStairsBlock(SNOW_BLOCK.getDefaultState(), copyOf(WHITE_WOOL).sounds(BlockSoundGroup.SNOW))); - public static final Block DENSE_SNOW_SLAB = add("dense_snow_slab", new SlabBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.SNOW))); - - public static final Block SNOW_BRICKS = add("snow_bricks", new Block(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.SNOW))); - public static final Block SNOW_BRICK_STAIRS = add("snow_brick_stairs", new BaseStairsBlock(SNOW_BLOCK.getDefaultState(), copyOf(WHITE_WOOL).sounds(BlockSoundGroup.SNOW))); - public static final Block SNOW_BRICK_SLAB = add("snow_brick_slab", new SlabBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.SNOW))); - public static final Block FROZEN_GRASS = add("frozen_grass", new FrozenGrassBlock(copyOf(AbstractBlock.Settings.create().mapColor(MapColor.WHITE).replaceable().notSolid().ticksRandomly().strength(0.1F).requiresTool().sounds(BlockSoundGroup.SNOW).blockVision((state, world, pos) -> state.get(FrozenGrassBlock.LAYERS) >= 8).pistonBehavior(PistonBehavior.DESTROY)))); - public static final Block FROZEN_FLOWER = add("frozen_flower", new FrozenFlowerBlock(copyOf(AbstractBlock.Settings.create().mapColor(MapColor.WHITE).replaceable().notSolid().ticksRandomly().strength(0.1F).requiresTool().sounds(BlockSoundGroup.GRASS).blockVision((state, world, pos) -> state.get(FrozenFlowerBlock.LAYERS) >= 8).pistonBehavior(PistonBehavior.DESTROY)))); - - public static final Block RAW_CRYOMARBLE_SHARD = add("raw_cryomarble_shard", new IcicleBlock(copyOf(WHITE_WOOL).sounds(BlockSoundGroup.GLASS).luminance(12))); - - public static final Block RED_GIFT_BOX = add("red_gift_box", new GiftBoxBlock(copyOf(RED_WOOL).pistonBehavior(PistonBehavior.DESTROY))); - public static final Block ORANGE_GIFT_BOX = add("orange_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); - public static final Block YELLOW_GIFT_BOX = add("yellow_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); - public static final Block GREEN_GIFT_BOX = add("green_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); - public static final Block CYAN_GIFT_BOX = add("cyan_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); - public static final Block BLUE_GIFT_BOX = add("blue_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); - public static final Block PURPLE_GIFT_BOX = add("purple_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); - public static final Block BLACK_GIFT_BOX = add("black_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); - public static final Block WHITE_GIFT_BOX = add("white_gift_box", new GiftBoxBlock(copyOf(RED_GIFT_BOX))); - - public static final Block GARLAND_LIGHTS = add("garland_lights", new GarlandLightsBlock(copyOf(GREEN_WOOL).pistonBehavior(PistonBehavior.DESTROY).noCollision().sounds(BlockSoundGroup.CANDLE))); - public static final Block RAINY_GARLAND_LIGHTS = add("rainy_garland_lights", new GarlandLightsBlock(copyOf(WHITE_WOOL).pistonBehavior(PistonBehavior.DESTROY).noCollision().sounds(BlockSoundGroup.CANDLE))); - - private static T add(String name, T block) { - return addBlockItem(name, block, new BlockItem(block, new FabricItemSettings())); - } - - private static T addBlockItem(String name, T block, BlockItem item) { - addBlock(name, block); - if (item != null) { - item.appendBlocks(Item.BLOCK_ITEMS, item); - ITEMS.put(Winterly.id(name), item); - } - return block; - } - - private static T addBlock(String name, T block) { - BLOCKS.put(Winterly.id(name), block); - return block; - } - - public static void init() { - ITEMS.forEach((id, item) -> Registry.register(Registries.ITEM, id, item)); - BLOCKS.forEach((id, block) -> Registry.register(Registries.BLOCK, id, block)); - } -} diff --git a/src/main/java/winterly/registry/WinterlyFeatures.java b/src/main/java/winterly/registry/WinterlyFeatures.java deleted file mode 100644 index 01ad141..0000000 --- a/src/main/java/winterly/registry/WinterlyFeatures.java +++ /dev/null @@ -1,46 +0,0 @@ -package winterly.registry; - -import net.fabricmc.fabric.api.biome.v1.BiomeModifications; -import net.fabricmc.fabric.api.biome.v1.ModificationPhase; -import net.minecraft.registry.*; -import net.minecraft.registry.tag.BiomeTags; -import net.minecraft.registry.tag.TagKey; -import net.minecraft.util.Identifier; -import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.feature.*; -import winterly.Winterly; -import winterly.worldgen.CryomarbleFeature; -import winterly.worldgen.UndergroundIcicleFeature; - -import static winterly.Winterly.id; - -public class WinterlyFeatures { - public static final Feature UNDERGROUND_ICICLE_FEATURE = new UndergroundIcicleFeature(); - public static final RegistryKey> UNDERGROUND_ICICLE_CONFIG = RegistryKey.of(RegistryKeys.CONFIGURED_FEATURE, Winterly.id("underground_icicle")); - public static final RegistryKey UNDERGROUND_ICICLE_PLACED = RegistryKey.of(RegistryKeys.PLACED_FEATURE, Winterly.id("underground_icicle")); - - - public static final Feature CRYOMARBLE_FEATURE = new CryomarbleFeature(); - public static final RegistryKey> CRYOMARBLE_CONFIG = RegistryKey.of(RegistryKeys.CONFIGURED_FEATURE, Winterly.id("cryomarble")); - public static final RegistryKey CRYOMARBLE_PLACED = RegistryKey.of(RegistryKeys.PLACED_FEATURE, Winterly.id("cryomarble")); - - public static void init() { - Registry.register(Registries.FEATURE, id("underground_icicle"), UNDERGROUND_ICICLE_FEATURE); - Registry.register(Registries.FEATURE, id("cryomarble"), CRYOMARBLE_FEATURE); - - BiomeModifications.create(Winterly.id("features")) - .add(ModificationPhase.ADDITIONS, ctx -> { - var entry = ctx.getBiomeRegistryEntry(); - var coldTag = TagKey.of(RegistryKeys.BIOME, new Identifier("c", "climate_cold")); - return !entry.isIn(BiomeTags.IS_NETHER) && !entry.isIn(BiomeTags.IS_END) && entry.isIn(coldTag); - }, ctx -> { - ctx.getGenerationSettings().addFeature(GenerationStep.Feature.UNDERGROUND_DECORATION, UNDERGROUND_ICICLE_PLACED); - }) - .add(ModificationPhase.ADDITIONS, ctx -> { - var entry = ctx.getBiomeRegistryEntry(); - return !entry.isIn(BiomeTags.IS_NETHER) && !entry.isIn(BiomeTags.IS_END); - }, ctx -> { - ctx.getGenerationSettings().addFeature(GenerationStep.Feature.UNDERGROUND_DECORATION, CRYOMARBLE_PLACED); - }); - } -} diff --git a/src/main/java/winterly/registry/WinterlyItems.java b/src/main/java/winterly/registry/WinterlyItems.java deleted file mode 100644 index 55393f9..0000000 --- a/src/main/java/winterly/registry/WinterlyItems.java +++ /dev/null @@ -1,63 +0,0 @@ -package winterly.registry; - -import net.fabricmc.fabric.api.item.v1.FabricItemSettings; -import net.minecraft.item.*; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.util.Identifier; -import winterly.Winterly; -import winterly.item.SantaHatItem; -import winterly.item.ScarfItem; -import winterly.item.tool.*; - -import java.util.LinkedHashMap; -import java.util.Map; - -@SuppressWarnings("unused") -public class WinterlyItems { - public static final Map ITEMS = new LinkedHashMap<>(); - -// public static final Item GINGERBREAD_MAN = add("gingerbread_man", new Item(settings().food(new FoodComponent.Builder().hunger(3).saturationModifier(0.5F).build()))); -// public static final Item EDIBLE_SNOW = add("edible_snow", new Item(settings().food(new FoodComponent.Builder().hunger(1).saturationModifier(0.1F).statusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 120, 0), 0.5F).statusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 120, 1), 0.5F).build()))); -// public static final Item PISS_SNOW = add("yellow_snow", new Item(settings().food(new FoodComponent.Builder().hunger(1).saturationModifier(0F).statusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 200, 0), 0.9F).statusEffect(new StatusEffectInstance(StatusEffects.POISON, 80, 1), 0.8F).build()))); - public static final Item RED_CANDY_CANE = add("red_candy_cane", new Item(settings().food(new FoodComponent.Builder().hunger(2).saturationModifier(0.1F).snack().build()))); - public static final Item GREEN_CANDY_CANE = add("green_candy_cane", new Item(settings().food(new FoodComponent.Builder().hunger(2).saturationModifier(0.1F).snack().build()))); - public static final Item BLUE_CANDY_CANE = add("blue_candy_cane", new Item(settings().food(new FoodComponent.Builder().hunger(2).saturationModifier(0.1F).snack().build()))); -// public static final Item YELLOW_CANDY_CANE = add("yellow_candy_cane", new Item(settings().food(new FoodComponent.Builder().hunger(2).saturationModifier(0.1F).snack().build()))); -// public static final Item CANDY_CANE = add("candy_cane", new Item(settings().food(new FoodComponent.Builder().hunger(2).saturationModifier(0.1F).snack().build()))); -// public static final Item MULLED_WINE = add("mulled_wine", new Item(settings().food(new FoodComponent.Builder().hunger(4).saturationModifier(0.2F).build()))); -// public static final Item EGGNOG = add("eggnog", new Item(settings().food(new FoodComponent.Builder().hunger(2).saturationModifier(0.4F).statusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 200, 0), 0.2F).build()))); -// public static final Item COCOA = add("cocoa", new Item(settings().food(new FoodComponent.Builder().hunger(4).saturationModifier(0.5F).build()))); -// public static final Item KIDS_CHAMPAGNE = add("kids_champagne", new Item(settings().food(new FoodComponent.Builder().hunger(10).saturationModifier(0.1F).statusEffect(new StatusEffectInstance(StatusEffects.REGENERATION, 100, 0), 0.3F).statusEffect(new StatusEffectInstance(StatusEffects.ABSORPTION, 400, 0), 0.3F).statusEffect(new StatusEffectInstance(StatusEffects.INSTANT_HEALTH, 0, 0), 0.3F).build()))); - - public static final Item CRYOMARBLE_SHARD = add("cryomarble_shard", new Item(settings())); - public static final Item CRYOMARBLE = add("cryomarble", new Item(settings())); - - public static final Item CRYOMARBLE_SWORD = add("cryomarble_sword", new CryomarbleSwordItem(ToolMaterials.DIAMOND, 3, -2.4F, settings())); - public static final Item CRYOMARBLE_SHOVEL = add("cryomarble_shovel", new CryomarbleShovelItem(ToolMaterials.DIAMOND, 1.5F, -3.0F, settings())); - public static final Item CRYOMARBLE_PICKAXE = add("cryomarble_pickaxe", new CryomarblePickaxeItem(ToolMaterials.DIAMOND, 1, -2.8F, settings())); - public static final Item CRYOMARBLE_AXE = add("cryomarble_axe", new CryomarbleAxeItem(ToolMaterials.DIAMOND, 5.0F, -3.0F, settings())); - public static final Item CRYOMARBLE_HOE = add("cryomarble_hoe", new CryomarbleHoeItem(ToolMaterials.DIAMOND, -3, 0.0F, settings())); - - public static final Item RED_SANTA_HAT = add("red_santa_hat", new SantaHatItem(settings(), "red")); - public static final Item BLUE_SANTA_HAT = add("blue_santa_hat", new SantaHatItem(settings(), "blue")); - - public static final Item WHITE_SCARF = add("white_scarf", new ScarfItem(settings(), "white")); - public static final Item RED_SCARF = add("red_scarf", new ScarfItem(settings(), "red")); - public static final Item GREEN_SCARF = add("green_scarf", new ScarfItem(settings(), "green")); - public static final Item BLUE_SCARF = add("blue_scarf", new ScarfItem(settings(), "blue")); - public static final Item RAINBOW_SCARF = add("rainbow_scarf", new ScarfItem(settings(), "rainbow")); - - private static T add(String name, T item) { - ITEMS.put(Winterly.id(name), item); - return item; - } - - private static FabricItemSettings settings() { - return new FabricItemSettings(); - } - - public static void init() { - ITEMS.forEach((id, item) -> Registry.register(Registries.ITEM, id, item)); - } -} diff --git a/src/main/java/winterly/util/HolidayUtils.java b/src/main/java/winterly/util/HolidayUtils.java deleted file mode 100644 index 1cda423..0000000 --- a/src/main/java/winterly/util/HolidayUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package winterly.util; - -import java.time.LocalDate; -import java.time.temporal.ChronoField; - -public final class HolidayUtils { - - public static boolean isWinter() { - LocalDate date = LocalDate.now(); - int month = date.get(ChronoField.MONTH_OF_YEAR); - return month == 12 || month == 1 || month == 2; - } -} diff --git a/src/main/java/winterly/worldgen/CryomarbleFeature.java b/src/main/java/winterly/worldgen/CryomarbleFeature.java deleted file mode 100644 index d2b4248..0000000 --- a/src/main/java/winterly/worldgen/CryomarbleFeature.java +++ /dev/null @@ -1,57 +0,0 @@ -package winterly.worldgen; - -import net.minecraft.block.Block; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; -import net.minecraft.world.gen.feature.util.FeatureContext; -import winterly.Winterly; -import winterly.block.IcicleBlock; -import winterly.registry.WinterlyBlocks; - -public class CryomarbleFeature extends Feature { - - public CryomarbleFeature() { - super(DefaultFeatureConfig.CODEC); - } - - @Override - public boolean generate(FeatureContext context) { - if(!Winterly.config.generateCryomarble) return false; - StructureWorldAccess world = context.getWorld(); - BlockPos origin = context.getOrigin(); - - for(int i = -20; i < 20; i++) { - BlockPos newOrigin = new BlockPos(origin.getX(), i, origin.getZ()); - if(world.getBlockState(newOrigin).isAir()) { - origin = newOrigin; - break; - } - } - if(context.getRandom().nextInt(16) != 0) return false; - - int spawned = 0; - - for(int x = -3; x < 3; x++) { - for(int z = -3; z < 3; z++) { - for(int y = -3; y < 3; y++) { - int xPos = origin.getX() + x; - int zPos = origin.getZ() + z; - int yPos = origin.getY() + y; - BlockPos pos = new BlockPos(xPos, yPos, zPos); - if(context.getRandom().nextInt(Math.abs(x) + Math.abs(y) + Math.abs(z) + 1) == 0) { - if(world.isAir(pos) && isStone(world.getBlockState(pos.down()))) { - if(spawned < 3) { - world.setBlockState(pos, WinterlyBlocks.RAW_CRYOMARBLE_SHARD.getDefaultState().with(IcicleBlock.FACING, Direction.UP), Block.NOTIFY_ALL); - spawned++; - }else return true; - } - } - } - } - } - return true; - } -} diff --git a/src/main/java/winterly/worldgen/UndergroundIcicleFeature.java b/src/main/java/winterly/worldgen/UndergroundIcicleFeature.java deleted file mode 100644 index 5ef76ed..0000000 --- a/src/main/java/winterly/worldgen/UndergroundIcicleFeature.java +++ /dev/null @@ -1,45 +0,0 @@ -package winterly.worldgen; - -import net.minecraft.block.Block; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.StructureWorldAccess; -import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; -import net.minecraft.world.gen.feature.util.FeatureContext; -import winterly.Winterly; -import winterly.registry.WinterlyBlocks; - -public class UndergroundIcicleFeature extends Feature { - - public UndergroundIcicleFeature() { - super(DefaultFeatureConfig.CODEC); - } - - @Override - public boolean generate(FeatureContext context) { - if(!Winterly.config.generateUndergroundIcicles) return false; - boolean generated = false; - int randomY = context.getRandom().nextInt(100) - 50; - - for (int x = 0; x < 10; x++) { - for (int z = 0; z < 10; z++) { - for (int y = 0; y < 10; y++) { - int xPos = context.getOrigin().getX() + x; - int zPos = context.getOrigin().getZ() + z; - int yPos = randomY + y; - BlockPos pos = new BlockPos(xPos, yPos, zPos); - StructureWorldAccess world = context.getWorld(); - if(context.getRandom().nextInt(4) == 0) { - if(world.isAir(pos)) { - if(isStone(world.getBlockState(pos.up()))) { - world.setBlockState(pos, WinterlyBlocks.ICICLE.getDefaultState(), Block.NOTIFY_ALL); - generated = true; - } - } - } - } - } - } - return generated; - } -} diff --git a/src/main/resources/winterly.accesswidener b/src/main/resources/winterly.accesswidener deleted file mode 100644 index 166a9b0..0000000 --- a/src/main/resources/winterly.accesswidener +++ /dev/null @@ -1,2 +0,0 @@ -accessWidener v1 named -accessible method net/minecraft/world/biome/Biome getTemperature (Lnet/minecraft/util/math/BlockPos;)F