From 07344e7fc9ec08001cfa33cf13490e51f0fcf8a2 Mon Sep 17 00:00:00 2001 From: Cloud Date: Thu, 21 Nov 2024 18:05:38 +0800 Subject: [PATCH] Reworked FuSticker --- .../59eb3dbb5f86130e09b3c62d89b9525ee01cf52d | 6 +- .../80812404ff558628abff6f0f3f20d1fff6d6b3e7 | 10 +- .../b53530ffe8f641d659e694e00e12c85c2c363439 | 4 +- .../fb495bcf374953a513aaf0fcc5c297e346a4f26b | 4 +- .../celebrations/blockstates/fu_sticker.json | 7 - .../blockstates/golden_fu_sticker.json | 7 - .../blockstates/inverted_fu_sticker.json | 7 - .../inverted_golden_fu_sticker.json | 7 - .../assets/celebrations/lang/en_us.json | 9 +- .../assets/celebrations/lang/zh_cn.json | 9 +- .../celebrations/models/block/fu_sticker.json | 5 - .../models/block/golden_fu_sticker.json | 5 - .../models/block/inverted_fu_sticker.json | 5 - .../block/inverted_golden_fu_sticker.json | 5 - .../loot_table/blocks/fu_sticker.json | 21 -- .../loot_table/blocks/golden_fu_sticker.json | 21 -- .../blocks/inverted_fu_sticker.json | 21 -- .../blocks/inverted_golden_fu_sticker.json | 21 -- .../celebrations/block/FuStickerBlock.java | 113 ---------- .../block/entity/FuStickerBlockEntity.java | 12 - .../client/event/CClientSetupEvents.java | 5 +- .../renderer/block/FuStickerRenderer.java | 75 ------- .../renderer/entity/FuStickerRenderer.java | 85 ++++++++ .../gen/lang/CChineseLanguageProvider.java | 9 +- .../gen/lang/CEnglishLanguageProvider.java | 9 +- .../data/gen/loot/CBlockLootSubProvider.java | 4 - .../data/gen/model/CBlockStateProvider.java | 4 - .../leomc/celebrations/entity/FuSticker.java | 206 ++++++++++++++++++ .../celebrations/item/FuStickerItem.java | 72 ++++++ .../celebrations/registry/CBlockEntities.java | 1 - .../leomc/celebrations/registry/CBlocks.java | 4 - .../celebrations/registry/CEntities.java | 2 + .../leomc/celebrations/registry/CItems.java | 16 +- .../textures/block/fu_sticker.png | Bin 419 -> 0 bytes .../textures/block/golden_fu_sticker.png | Bin 410 -> 0 bytes .../textures/block/inverted_fu_sticker.png | Bin 420 -> 0 bytes .../block/inverted_golden_fu_sticker.png | Bin 409 -> 0 bytes .../textures/entity/fu_sticker.png | Bin 0 -> 377 bytes .../textures/entity/golden_fu_sticker.png | Bin 0 -> 384 bytes .../textures/entity/inverted_fu_sticker.png | Bin 0 -> 383 bytes .../entity/inverted_golden_fu_sticker.png | Bin 0 -> 383 bytes 41 files changed, 399 insertions(+), 392 deletions(-) delete mode 100644 src/generated/resources/assets/celebrations/blockstates/fu_sticker.json delete mode 100644 src/generated/resources/assets/celebrations/blockstates/golden_fu_sticker.json delete mode 100644 src/generated/resources/assets/celebrations/blockstates/inverted_fu_sticker.json delete mode 100644 src/generated/resources/assets/celebrations/blockstates/inverted_golden_fu_sticker.json delete mode 100644 src/generated/resources/assets/celebrations/models/block/fu_sticker.json delete mode 100644 src/generated/resources/assets/celebrations/models/block/golden_fu_sticker.json delete mode 100644 src/generated/resources/assets/celebrations/models/block/inverted_fu_sticker.json delete mode 100644 src/generated/resources/assets/celebrations/models/block/inverted_golden_fu_sticker.json delete mode 100644 src/generated/resources/data/celebrations/loot_table/blocks/fu_sticker.json delete mode 100644 src/generated/resources/data/celebrations/loot_table/blocks/golden_fu_sticker.json delete mode 100644 src/generated/resources/data/celebrations/loot_table/blocks/inverted_fu_sticker.json delete mode 100644 src/generated/resources/data/celebrations/loot_table/blocks/inverted_golden_fu_sticker.json delete mode 100644 src/main/java/team/leomc/celebrations/block/FuStickerBlock.java delete mode 100644 src/main/java/team/leomc/celebrations/block/entity/FuStickerBlockEntity.java delete mode 100644 src/main/java/team/leomc/celebrations/client/renderer/block/FuStickerRenderer.java create mode 100644 src/main/java/team/leomc/celebrations/client/renderer/entity/FuStickerRenderer.java create mode 100644 src/main/java/team/leomc/celebrations/entity/FuSticker.java create mode 100644 src/main/java/team/leomc/celebrations/item/FuStickerItem.java delete mode 100644 src/main/resources/assets/celebrations/textures/block/fu_sticker.png delete mode 100644 src/main/resources/assets/celebrations/textures/block/golden_fu_sticker.png delete mode 100644 src/main/resources/assets/celebrations/textures/block/inverted_fu_sticker.png delete mode 100644 src/main/resources/assets/celebrations/textures/block/inverted_golden_fu_sticker.png create mode 100644 src/main/resources/assets/celebrations/textures/entity/fu_sticker.png create mode 100644 src/main/resources/assets/celebrations/textures/entity/golden_fu_sticker.png create mode 100644 src/main/resources/assets/celebrations/textures/entity/inverted_fu_sticker.png create mode 100644 src/main/resources/assets/celebrations/textures/entity/inverted_golden_fu_sticker.png diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index 99fde25..34034d1 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,14 +1,10 @@ -// 1.21 2024-07-26T18:16:26.7838952 Loot Tables +// 1.21 2024-09-12T18:45:34.2370559 Loot Tables f16854500c1fe7c108a688f323b1d43ec314c7f0 data/celebrations/loot_table/blocks/chinese_styled_bamboo_lantern.json 60535fb769799b40c4ad680dd775157ca407c7b3 data/celebrations/loot_table/blocks/chinese_styled_paper_lantern.json 14e52a830878533cee7bb9e1f7ffb84503fd8f53 data/celebrations/loot_table/blocks/chinese_styled_red_lantern.json b910e52f91ffe128a4d94c37b61fb699c992079a data/celebrations/loot_table/blocks/couplet.json 059de9e97efaf67a9c0bd18a1ebb34ab7f58a11e data/celebrations/loot_table/blocks/firework_bundle.json -971df10048a8d60c26e5c0ee42d229ef9fe12c47 data/celebrations/loot_table/blocks/fu_sticker.json -fb43c8227c2caaeb32bd595007ca5dbc85a20b13 data/celebrations/loot_table/blocks/golden_fu_sticker.json 05323398e49fa2c42e3589eb3aa39b6234a18484 data/celebrations/loot_table/blocks/horizontal_scroll.json -659862e733b216796c14e7c3e02dac19874b8a5a data/celebrations/loot_table/blocks/inverted_fu_sticker.json -e1e48f5b29801955968898e511e4dd098c069f22 data/celebrations/loot_table/blocks/inverted_golden_fu_sticker.json f615d7c82e77b608ba0a3b8e87b4cc2b895d2446 data/celebrations/loot_table/blocks/japanese_styled_paper_lantern.json 7b5266b8253cdeddf9c4f7ebbffd74c2ad5826bb data/celebrations/loot_table/blocks/japanese_styled_red_lantern.json 960e8fd76f6ff7f261b2103a5c2c9fe81e18f38a data/celebrations/loot_table/gameplay/villager_gift.json diff --git a/src/generated/resources/.cache/80812404ff558628abff6f0f3f20d1fff6d6b3e7 b/src/generated/resources/.cache/80812404ff558628abff6f0f3f20d1fff6d6b3e7 index d272f36..3d8acdc 100644 --- a/src/generated/resources/.cache/80812404ff558628abff6f0f3f20d1fff6d6b3e7 +++ b/src/generated/resources/.cache/80812404ff558628abff6f0f3f20d1fff6d6b3e7 @@ -1,20 +1,12 @@ -// 1.21 2024-07-25T16:52:36.2119642 Block States: celebrations +// 1.21 2024-09-12T18:45:34.2444271 Block States: celebrations e146236a6c2d3384be861f1842756c426aec2e26 assets/celebrations/blockstates/chinese_styled_bamboo_lantern.json 804ab30c8c046a45e094f74286778fdd662eb1f6 assets/celebrations/blockstates/chinese_styled_paper_lantern.json e56ec6c676272fde86dac556bd923511620b61f9 assets/celebrations/blockstates/chinese_styled_red_lantern.json 52c6d9067391f70ddf223e148f958493d7774c9d assets/celebrations/blockstates/couplet.json 854f2516f0ff34f5cf762271d38503f2576b5c7d assets/celebrations/blockstates/firework_bundle.json -6d0411bd38766b0a197a3c61a16a3bb84fc80370 assets/celebrations/blockstates/fu_sticker.json -7661b55372bc3695130c08387799f5d93fc682fd assets/celebrations/blockstates/golden_fu_sticker.json 35212d3f6fb8e37a67f965d4f07cbc84ecb80ceb assets/celebrations/blockstates/horizontal_scroll.json -12f1548467a762a9b77ff2a1e25a958c835b483d assets/celebrations/blockstates/inverted_fu_sticker.json -b05580ac75edca3a3cc59a45638f7b41e2ba5c83 assets/celebrations/blockstates/inverted_golden_fu_sticker.json a440fe568f7dee45c927db6c354ded828d589783 assets/celebrations/blockstates/japanese_styled_paper_lantern.json 2a8c21100e2db463ca8ce409ec4cbac5aab03ae8 assets/celebrations/blockstates/japanese_styled_red_lantern.json 10bf1bfa57f9c0c54437e19dee2ce0c0323a668c assets/celebrations/models/block/couplet.json 603de5cd4a90142720ec9f6eaf8509a1fbce30c9 assets/celebrations/models/block/firework_bundle.json -0b571e8a0832fc7dd1f1a295d6bcc94487b15728 assets/celebrations/models/block/fu_sticker.json -bed44ffe58c8f27ca4140d754aa9a1591bafb4c0 assets/celebrations/models/block/golden_fu_sticker.json 044cbb26bb86e77119b0f4cdee3ebdbedbf72838 assets/celebrations/models/block/horizontal_scroll.json -b3dd98a9e4b2842f7f8d2c334e950148c61a4b12 assets/celebrations/models/block/inverted_fu_sticker.json -810ee22bda95f45e489cacd549648a2e9a369d8e assets/celebrations/models/block/inverted_golden_fu_sticker.json diff --git a/src/generated/resources/.cache/b53530ffe8f641d659e694e00e12c85c2c363439 b/src/generated/resources/.cache/b53530ffe8f641d659e694e00e12c85c2c363439 index fee16c9..24bd8d5 100644 --- a/src/generated/resources/.cache/b53530ffe8f641d659e694e00e12c85c2c363439 +++ b/src/generated/resources/.cache/b53530ffe8f641d659e694e00e12c85c2c363439 @@ -1,2 +1,2 @@ -// 1.21 2024-08-31T20:50:35.7179308 Languages: zh_cn for mod: celebrations -3ccff4f74ebb1700a8e119a2e5bbd87eaa20a7fb assets/celebrations/lang/zh_cn.json +// 1.21 2024-09-12T18:45:34.2370559 Languages: zh_cn for mod: celebrations +381dd4339713a7cf26b187a0d9cbadeb276ce77d assets/celebrations/lang/zh_cn.json diff --git a/src/generated/resources/.cache/fb495bcf374953a513aaf0fcc5c297e346a4f26b b/src/generated/resources/.cache/fb495bcf374953a513aaf0fcc5c297e346a4f26b index dab2b98..7bab770 100644 --- a/src/generated/resources/.cache/fb495bcf374953a513aaf0fcc5c297e346a4f26b +++ b/src/generated/resources/.cache/fb495bcf374953a513aaf0fcc5c297e346a4f26b @@ -1,2 +1,2 @@ -// 1.21 2024-08-31T20:50:35.7179308 Languages: en_us for mod: celebrations -43f1aa404e8ae53e01195d659f596b2e9f695869 assets/celebrations/lang/en_us.json +// 1.21 2024-09-12T18:45:34.2370559 Languages: en_us for mod: celebrations +0cd6cb72ba709f8e948dbd553835e532323d5287 assets/celebrations/lang/en_us.json diff --git a/src/generated/resources/assets/celebrations/blockstates/fu_sticker.json b/src/generated/resources/assets/celebrations/blockstates/fu_sticker.json deleted file mode 100644 index 49ab98d..0000000 --- a/src/generated/resources/assets/celebrations/blockstates/fu_sticker.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "celebrations:block/fu_sticker" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/celebrations/blockstates/golden_fu_sticker.json b/src/generated/resources/assets/celebrations/blockstates/golden_fu_sticker.json deleted file mode 100644 index 5520475..0000000 --- a/src/generated/resources/assets/celebrations/blockstates/golden_fu_sticker.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "celebrations:block/golden_fu_sticker" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/celebrations/blockstates/inverted_fu_sticker.json b/src/generated/resources/assets/celebrations/blockstates/inverted_fu_sticker.json deleted file mode 100644 index 0fa8517..0000000 --- a/src/generated/resources/assets/celebrations/blockstates/inverted_fu_sticker.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "celebrations:block/inverted_fu_sticker" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/celebrations/blockstates/inverted_golden_fu_sticker.json b/src/generated/resources/assets/celebrations/blockstates/inverted_golden_fu_sticker.json deleted file mode 100644 index c4f6e12..0000000 --- a/src/generated/resources/assets/celebrations/blockstates/inverted_golden_fu_sticker.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "celebrations:block/inverted_golden_fu_sticker" - } - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/celebrations/lang/en_us.json b/src/generated/resources/assets/celebrations/lang/en_us.json index b343514..063a96e 100644 --- a/src/generated/resources/assets/celebrations/lang/en_us.json +++ b/src/generated/resources/assets/celebrations/lang/en_us.json @@ -4,11 +4,7 @@ "block.celebrations.chinese_styled_red_lantern": "Chinese Styled Red Lantern", "block.celebrations.couplet": "Couplet", "block.celebrations.firework_bundle": "Firework Bundle", - "block.celebrations.fu_sticker": "Fu Sticker", - "block.celebrations.golden_fu_sticker": "Golden Fu Sticker", "block.celebrations.horizontal_scroll": "Horizontal Scroll", - "block.celebrations.inverted_fu_sticker": "Inverted Fu Sticker", - "block.celebrations.inverted_golden_fu_sticker": "Inverted Golden Fu Sticker", "block.celebrations.japanese_styled_paper_lantern": "Japanese Styled Paper Lantern", "block.celebrations.japanese_styled_red_lantern": "Japanese Styled Red Lantern", "celebrations.configuration.celebration": "Celebrations", @@ -21,9 +17,14 @@ "celebrations.configuration.lanternGiveNonEnemyBeneficialEffect": "Lanterns Give Non-enemy Mobs Beneficial Effects", "celebrations.configuration.lanternGiveNonEnemyHarmfulEffect": "Lanterns Give Non-enemy Mobs Harmful Effects", "entity.celebrations.balloon": "Balloon", + "entity.celebrations.fu_sticker": "Fu Sticker", "fml.menu.mods.info.description.celebrations": "A mod about celebrating!", "item.celebrations.balloon": "Balloon", + "item.celebrations.fu_sticker": "Fu Sticker", "item.celebrations.gold_powder": "Gold Powder", + "item.celebrations.golden_fu_sticker": "Golden Fu Sticker", + "item.celebrations.inverted_fu_sticker": "Inverted Fu Sticker", + "item.celebrations.inverted_golden_fu_sticker": "Inverted Golden Fu Sticker", "item.celebrations.party_hat": "Party Hat", "item.celebrations.red_paper": "Red Paper", "message.celebrations.cannot_ignite_due_to_gift": "This lantern contains a gift and cannot be lit now", diff --git a/src/generated/resources/assets/celebrations/lang/zh_cn.json b/src/generated/resources/assets/celebrations/lang/zh_cn.json index 6742363..c8905ec 100644 --- a/src/generated/resources/assets/celebrations/lang/zh_cn.json +++ b/src/generated/resources/assets/celebrations/lang/zh_cn.json @@ -4,11 +4,7 @@ "block.celebrations.chinese_styled_red_lantern": "中式红灯笼", "block.celebrations.couplet": "对联", "block.celebrations.firework_bundle": "烟花桶", - "block.celebrations.fu_sticker": "福字", - "block.celebrations.golden_fu_sticker": "金色福字", "block.celebrations.horizontal_scroll": "横批", - "block.celebrations.inverted_fu_sticker": "倒福字", - "block.celebrations.inverted_golden_fu_sticker": "金色倒福字", "block.celebrations.japanese_styled_paper_lantern": "日式纸灯笼", "block.celebrations.japanese_styled_red_lantern": "日式红灯笼", "celebrations.configuration.celebration": "庆祝", @@ -21,9 +17,14 @@ "celebrations.configuration.lanternGiveNonEnemyBeneficialEffect": "灯笼给予非敌对生物增益效果", "celebrations.configuration.lanternGiveNonEnemyHarmfulEffect": "灯笼给予非敌对生物负面效果", "entity.celebrations.balloon": "气球", + "entity.celebrations.fu_sticker": "福字", "fml.menu.mods.info.description.celebrations": "一个关于庆祝的模组!", "item.celebrations.balloon": "气球", + "item.celebrations.fu_sticker": "福字", "item.celebrations.gold_powder": "金粉", + "item.celebrations.golden_fu_sticker": "金色福字", + "item.celebrations.inverted_fu_sticker": "倒福字", + "item.celebrations.inverted_golden_fu_sticker": "金色倒福字", "item.celebrations.party_hat": "派对帽", "item.celebrations.red_paper": "红纸", "message.celebrations.cannot_ignite_due_to_gift": "这盏灯笼装有礼物,现在无法点燃", diff --git a/src/generated/resources/assets/celebrations/models/block/fu_sticker.json b/src/generated/resources/assets/celebrations/models/block/fu_sticker.json deleted file mode 100644 index 0fd3f44..0000000 --- a/src/generated/resources/assets/celebrations/models/block/fu_sticker.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "textures": { - "particle": "celebrations:block/fu_sticker" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/celebrations/models/block/golden_fu_sticker.json b/src/generated/resources/assets/celebrations/models/block/golden_fu_sticker.json deleted file mode 100644 index 9eb8e3a..0000000 --- a/src/generated/resources/assets/celebrations/models/block/golden_fu_sticker.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "textures": { - "particle": "celebrations:block/golden_fu_sticker" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/celebrations/models/block/inverted_fu_sticker.json b/src/generated/resources/assets/celebrations/models/block/inverted_fu_sticker.json deleted file mode 100644 index 5743dd2..0000000 --- a/src/generated/resources/assets/celebrations/models/block/inverted_fu_sticker.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "textures": { - "particle": "celebrations:block/inverted_fu_sticker" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/celebrations/models/block/inverted_golden_fu_sticker.json b/src/generated/resources/assets/celebrations/models/block/inverted_golden_fu_sticker.json deleted file mode 100644 index a49c2a9..0000000 --- a/src/generated/resources/assets/celebrations/models/block/inverted_golden_fu_sticker.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "textures": { - "particle": "celebrations:block/inverted_golden_fu_sticker" - } -} \ No newline at end of file diff --git a/src/generated/resources/data/celebrations/loot_table/blocks/fu_sticker.json b/src/generated/resources/data/celebrations/loot_table/blocks/fu_sticker.json deleted file mode 100644 index 2214f15..0000000 --- a/src/generated/resources/data/celebrations/loot_table/blocks/fu_sticker.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "celebrations:fu_sticker" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "celebrations:blocks/fu_sticker" -} \ No newline at end of file diff --git a/src/generated/resources/data/celebrations/loot_table/blocks/golden_fu_sticker.json b/src/generated/resources/data/celebrations/loot_table/blocks/golden_fu_sticker.json deleted file mode 100644 index 79920df..0000000 --- a/src/generated/resources/data/celebrations/loot_table/blocks/golden_fu_sticker.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "celebrations:golden_fu_sticker" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "celebrations:blocks/golden_fu_sticker" -} \ No newline at end of file diff --git a/src/generated/resources/data/celebrations/loot_table/blocks/inverted_fu_sticker.json b/src/generated/resources/data/celebrations/loot_table/blocks/inverted_fu_sticker.json deleted file mode 100644 index 92adfe6..0000000 --- a/src/generated/resources/data/celebrations/loot_table/blocks/inverted_fu_sticker.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "celebrations:inverted_fu_sticker" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "celebrations:blocks/inverted_fu_sticker" -} \ No newline at end of file diff --git a/src/generated/resources/data/celebrations/loot_table/blocks/inverted_golden_fu_sticker.json b/src/generated/resources/data/celebrations/loot_table/blocks/inverted_golden_fu_sticker.json deleted file mode 100644 index e769f61..0000000 --- a/src/generated/resources/data/celebrations/loot_table/blocks/inverted_golden_fu_sticker.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "celebrations:inverted_golden_fu_sticker" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "celebrations:blocks/inverted_golden_fu_sticker" -} \ No newline at end of file diff --git a/src/main/java/team/leomc/celebrations/block/FuStickerBlock.java b/src/main/java/team/leomc/celebrations/block/FuStickerBlock.java deleted file mode 100644 index 07cb722..0000000 --- a/src/main/java/team/leomc/celebrations/block/FuStickerBlock.java +++ /dev/null @@ -1,113 +0,0 @@ -package team.leomc.celebrations.block; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import com.mojang.serialization.MapCodec; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -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.*; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockBehaviour; -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 team.leomc.celebrations.block.entity.FuStickerBlockEntity; - -import java.util.Map; - -public class FuStickerBlock extends BaseEntityBlock implements SimpleWaterloggedBlock { - public static final MapCodec CODEC = simpleCodec(FuStickerBlock::new); - public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; - public static final BooleanProperty WATERLOGGED = BlockStateProperties.WATERLOGGED; - private static final Map AABBS = Maps.newEnumMap(ImmutableMap.of(Direction.NORTH, Block.box(0.0D, 0.0D, 14.0D, 16.0D, 16.0D, 16.0D), Direction.SOUTH, Block.box(0.0D, 0.0D, 0.0D, 16.0D, 16.0D, 2.0D), Direction.EAST, Block.box(0.0D, 0.0D, 0.0D, 2.0D, 16.0D, 16.0D), Direction.WEST, Block.box(14.0D, 0.0D, 0.0D, 16.0D, 16.0D, 16.0D))); - - public FuStickerBlock(BlockBehaviour.Properties properties) { - super(properties); - this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH).setValue(WATERLOGGED, Boolean.valueOf(false))); - } - - @Override - protected MapCodec codec() { - return CODEC; - } - - @Nullable - @Override - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return new FuStickerBlockEntity(pos, state); - } - - public ResourceLocation getTextureLocation() { - ResourceLocation blockKey = BuiltInRegistries.BLOCK.getKey(asBlock()); - return blockKey.withPrefix("textures/block/").withSuffix(".png"); - } - - public VoxelShape getShape(BlockState state, BlockGetter blockGetter, BlockPos pos, CollisionContext context) { - return AABBS.get(state.getValue(FACING)); - } - - public boolean canSurvive(BlockState state, LevelReader levelReader, BlockPos pos) { - return levelReader.getBlockState(pos.relative(state.getValue(FACING).getOpposite())).isSolid(); - } - - public float getYRotationDegrees(BlockState state) { - return state.getValue(FACING).toYRot(); - } - - @Nullable - public BlockState getStateForPlacement(BlockPlaceContext context) { - BlockState blockstate = this.defaultBlockState(); - FluidState fluidstate = context.getLevel().getFluidState(context.getClickedPos()); - LevelReader levelreader = context.getLevel(); - BlockPos blockpos = context.getClickedPos(); - Direction[] adirection = context.getNearestLookingDirections(); - - for (Direction direction : adirection) { - if (direction.getAxis().isHorizontal()) { - Direction direction1 = direction.getOpposite(); - blockstate = blockstate.setValue(FACING, direction1); - if (blockstate.canSurvive(levelreader, blockpos)) { - return blockstate.setValue(WATERLOGGED, Boolean.valueOf(fluidstate.getType() == Fluids.WATER)); - } - } - } - - return null; - } - - public FluidState getFluidState(BlockState state) { - return state.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(state); - } - - public BlockState updateShape(BlockState state, Direction direction, BlockState blockState, LevelAccessor levelAccessor, BlockPos pos, BlockPos blockPos) { - if (state.getValue(WATERLOGGED)) { - levelAccessor.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(levelAccessor)); - } - return direction.getOpposite() == state.getValue(FACING) && !state.canSurvive(levelAccessor, pos) ? Blocks.AIR.defaultBlockState() : super.updateShape(state, direction, blockState, levelAccessor, pos, blockPos); - } - - public BlockState rotate(BlockState state, Rotation rotation) { - return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); - } - - public BlockState mirror(BlockState state, Mirror mirror) { - return state.rotate(mirror.getRotation(state.getValue(FACING))); - } - - protected void createBlockStateDefinition(StateDefinition.Builder stateBuilder) { - stateBuilder.add(FACING, WATERLOGGED); - } -} diff --git a/src/main/java/team/leomc/celebrations/block/entity/FuStickerBlockEntity.java b/src/main/java/team/leomc/celebrations/block/entity/FuStickerBlockEntity.java deleted file mode 100644 index 80e2a1a..0000000 --- a/src/main/java/team/leomc/celebrations/block/entity/FuStickerBlockEntity.java +++ /dev/null @@ -1,12 +0,0 @@ -package team.leomc.celebrations.block.entity; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import team.leomc.celebrations.registry.CBlockEntities; - -public class FuStickerBlockEntity extends BlockEntity { - public FuStickerBlockEntity(BlockPos pos, BlockState state) { - super(CBlockEntities.FU_STICKER.get(), pos, state); - } -} diff --git a/src/main/java/team/leomc/celebrations/client/event/CClientSetupEvents.java b/src/main/java/team/leomc/celebrations/client/event/CClientSetupEvents.java index f3c37f0..5c88a0e 100644 --- a/src/main/java/team/leomc/celebrations/client/event/CClientSetupEvents.java +++ b/src/main/java/team/leomc/celebrations/client/event/CClientSetupEvents.java @@ -11,9 +11,9 @@ import team.leomc.celebrations.Celebrations; import team.leomc.celebrations.client.model.entity.BalloonModel; import team.leomc.celebrations.client.renderer.block.CoupletRenderer; -import team.leomc.celebrations.client.renderer.block.FuStickerRenderer; import team.leomc.celebrations.client.renderer.block.HorizontalScrollRenderer; import team.leomc.celebrations.client.renderer.entity.BalloonRenderer; +import team.leomc.celebrations.client.renderer.entity.FuStickerRenderer; import team.leomc.celebrations.item.component.BalloonData; import team.leomc.celebrations.item.component.PartyHat; import team.leomc.celebrations.registry.CBlockEntities; @@ -44,9 +44,9 @@ private static void onClientSetup(FMLClientSetupEvent event) { @SubscribeEvent private static void onRegisterEntityRenderers(EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(CEntities.BALLOON.get(), BalloonRenderer::new); + event.registerEntityRenderer(CEntities.FU_STICKER.get(), FuStickerRenderer::new); event.registerBlockEntityRenderer(CBlockEntities.COUPLET.get(), CoupletRenderer::new); event.registerBlockEntityRenderer(CBlockEntities.HORIZONTAL_SCROLL.get(), HorizontalScrollRenderer::new); - event.registerBlockEntityRenderer(CBlockEntities.FU_STICKER.get(), FuStickerRenderer::new); } @SubscribeEvent @@ -66,6 +66,5 @@ public static void onRegisterLayerDefinitions(EntityRenderersEvent.RegisterLayer event.registerLayerDefinition(BalloonModel.LAYER_LOCATION, BalloonModel::createBodyLayer); event.registerLayerDefinition(CoupletRenderer.LAYER_LOCATION, CoupletRenderer::createCoupletLayer); event.registerLayerDefinition(HorizontalScrollRenderer.LAYER_LOCATION, HorizontalScrollRenderer::createScrollLayer); - event.registerLayerDefinition(FuStickerRenderer.LAYER_LOCATION, FuStickerRenderer::createStickerLayer); } } diff --git a/src/main/java/team/leomc/celebrations/client/renderer/block/FuStickerRenderer.java b/src/main/java/team/leomc/celebrations/client/renderer/block/FuStickerRenderer.java deleted file mode 100644 index cc1c5b8..0000000 --- a/src/main/java/team/leomc/celebrations/client/renderer/block/FuStickerRenderer.java +++ /dev/null @@ -1,75 +0,0 @@ -package team.leomc.celebrations.client.renderer.block; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Axis; -import net.minecraft.client.model.Model; -import net.minecraft.client.model.geom.ModelLayerLocation; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.*; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import team.leomc.celebrations.Celebrations; -import team.leomc.celebrations.block.FuStickerBlock; -import team.leomc.celebrations.block.entity.FuStickerBlockEntity; - -@OnlyIn(Dist.CLIENT) -public class FuStickerRenderer implements BlockEntityRenderer { - public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation(Celebrations.id("fu_sticker"), "main"); - private final StickerModel stickerModel; - - public FuStickerRenderer(BlockEntityRendererProvider.Context context) { - this.stickerModel = new StickerModel(context.bakeLayer(LAYER_LOCATION)); - } - - public void render(FuStickerBlockEntity entity, float f, PoseStack stack, MultiBufferSource bufferSource, int i, int i1) { - BlockState blockstate = entity.getBlockState(); - FuStickerBlock stickerBlock = (FuStickerBlock) blockstate.getBlock(); - stack.pushPose(); - - float angle = -stickerBlock.getYRotationDegrees(blockstate); - stack.translate(0.5F, 1.5F, 0.5F); - stack.mulPose(Axis.YP.rotationDegrees(angle)); - stack.translate(0, 0, -0.49F); - - stack.pushPose(); - stack.scale(1, -1, -1); - VertexConsumer vertexconsumer = bufferSource.getBuffer(stickerModel.renderType(stickerBlock.getTextureLocation())); - this.stickerModel.root.render(stack, vertexconsumer, i, i1); - stack.popPose(); - - stack.popPose(); - } - - public static LayerDefinition createStickerLayer() { - MeshDefinition meshdefinition = new MeshDefinition(); - PartDefinition partdefinition = meshdefinition.getRoot(); - - PartDefinition main = partdefinition.addOrReplaceChild("main", CubeListBuilder.create().texOffs(0, 0).addBox(-8.0F, -16.0F, 0.0F, 16.0F, 16.0F, 0.0F, new CubeDeformation(0.0F)), PartPose.offset(0.0F, 24.0F, 0.0F)); - - return LayerDefinition.create(meshdefinition, 32, 32); - } - - @OnlyIn(Dist.CLIENT) - public static final class StickerModel extends Model { - public final ModelPart root; - private final ModelPart main; - - public StickerModel(ModelPart root) { - super(RenderType::entityCutoutNoCull); - this.root = root; - this.main = root.getChild("main"); - } - - @Override - public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, int color) { - main.render(poseStack, vertexConsumer, packedLight, packedOverlay, color); - } - } -} diff --git a/src/main/java/team/leomc/celebrations/client/renderer/entity/FuStickerRenderer.java b/src/main/java/team/leomc/celebrations/client/renderer/entity/FuStickerRenderer.java new file mode 100644 index 0000000..a32e005 --- /dev/null +++ b/src/main/java/team/leomc/celebrations/client/renderer/entity/FuStickerRenderer.java @@ -0,0 +1,85 @@ +package team.leomc.celebrations.client.renderer.entity; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.DoorBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoorHingeSide; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import org.joml.Matrix4f; +import team.leomc.celebrations.Celebrations; +import team.leomc.celebrations.entity.FuSticker; +import team.leomc.celebrations.registry.CItems; + +@OnlyIn(Dist.CLIENT) +public class FuStickerRenderer extends EntityRenderer { + private static final ResourceLocation FU = Celebrations.id("textures/entity/fu_sticker.png"); + private static final ResourceLocation INVERTED_FU = Celebrations.id("textures/entity/inverted_fu_sticker.png"); + private static final ResourceLocation GOLDEN_FU = Celebrations.id("textures/entity/golden_fu_sticker.png"); + private static final ResourceLocation INVERTED_GOLDEN_FU = Celebrations.id("textures/entity/inverted_golden_fu_sticker.png"); + + public FuStickerRenderer(EntityRendererProvider.Context context) { + super(context); + } + + @Override + public void render(FuSticker entity, float yaw, float partialTicks, PoseStack poseStack, MultiBufferSource bufferSource, int light) { + poseStack.pushPose(); + poseStack.translate(0.0, -0.5, 0.0); + + BlockState blockState = entity.level().getBlockState(entity.getAttachedPos()); + if (blockState.getBlock() instanceof DoorBlock) { + Direction facing = blockState.getValue(DoorBlock.FACING); + boolean isOpen = blockState.getValue(DoorBlock.OPEN); + DoorHingeSide hingeSide = blockState.getValue(DoorBlock.HINGE); + + switch (facing) { + case EAST -> poseStack.mulPose(Axis.YP.rotationDegrees(-90.0F)); + case WEST -> poseStack.mulPose(Axis.YP.rotationDegrees(90.0F)); + case SOUTH -> poseStack.mulPose(Axis.YP.rotationDegrees(180.0F)); + default -> {} + } + + if (isOpen) { + float openRotation = (hingeSide == DoorHingeSide.LEFT) ? 90.0F : -90.0F; + poseStack.mulPose(Axis.YP.rotationDegrees(openRotation)); + } + } + + VertexConsumer buffer = bufferSource.getBuffer(RenderType.entityCutout(getTextureLocation(entity))); + PoseStack.Pose pose = poseStack.last(); + Matrix4f matrix = pose.pose(); + + int lightLevel = isGoldFu(entity) ? 240 : light; + + buffer.addVertex(matrix, -0.5f, 0.0f, 0.0f).setColor(255, 255, 255, 255).setUv(0.0f, 0.0f).setOverlay(OverlayTexture.NO_OVERLAY).setLight(lightLevel).setNormal(pose, 0f, 0f, 1f); + buffer.addVertex(matrix, 0.5f, 0.0f, 0.0f).setColor(255, 255, 255, 255).setUv(1.0f, 0.0f).setOverlay(OverlayTexture.NO_OVERLAY).setLight(lightLevel).setNormal(pose, 0f, 0f, 1f); + buffer.addVertex(matrix, 0.5f, 1.0f, 0.0f).setColor(255, 255, 255, 255).setUv(1.0f, 1.0f).setOverlay(OverlayTexture.NO_OVERLAY).setLight(lightLevel).setNormal(pose, 0f, 0f, 1f); + buffer.addVertex(matrix, -0.5f, 1.0f, 0.0f).setColor(255, 255, 255, 255).setUv(0.0f, 1.0f).setOverlay(OverlayTexture.NO_OVERLAY).setLight(lightLevel).setNormal(pose, 0f, 0f, 1f); + poseStack.popPose(); + super.render(entity, yaw, partialTicks, poseStack, bufferSource, light); + } + + + + @Override + public ResourceLocation getTextureLocation(FuSticker fuSticker) { + ItemStack fu = fuSticker.getItem(); + return fu.is(CItems.FU_STICKER.get()) ? FU : fu.is(CItems.INVERTED_FU_STICKER.get()) ? INVERTED_FU : fu.is(CItems.GOLDEN_FU_STICKER.get()) ? GOLDEN_FU : INVERTED_GOLDEN_FU; + } + + public Boolean isGoldFu(FuSticker fuSticker) { + ItemStack fu = fuSticker.getItem(); + return fu.is(CItems.GOLDEN_FU_STICKER.get()) || fu.is(CItems.INVERTED_GOLDEN_FU_STICKER.get()); + } +} diff --git a/src/main/java/team/leomc/celebrations/data/gen/lang/CChineseLanguageProvider.java b/src/main/java/team/leomc/celebrations/data/gen/lang/CChineseLanguageProvider.java index 8ceb120..88dcc1a 100644 --- a/src/main/java/team/leomc/celebrations/data/gen/lang/CChineseLanguageProvider.java +++ b/src/main/java/team/leomc/celebrations/data/gen/lang/CChineseLanguageProvider.java @@ -32,16 +32,17 @@ protected void addTranslations() { add(CBlocks.JAPANESE_STYLED_RED_LANTERN.get(), "日式红灯笼"); add(CBlocks.COUPLET.get(), "对联"); add(CBlocks.HORIZONTAL_SCROLL.get(), "横批"); - add(CBlocks.FU_STICKER.get(), "福字"); - add(CBlocks.INVERTED_FU_STICKER.get(), "倒福字"); - add(CBlocks.GOLDEN_FU_STICKER.get(), "金色福字"); - add(CBlocks.INVERTED_GOLDEN_FU_STICKER.get(), "金色倒福字"); add(CBlocks.FIREWORK_BUNDLE.get(), "烟花桶"); + add(CItems.FU_STICKER.get(), "福字"); + add(CItems.INVERTED_FU_STICKER.get(), "倒福字"); + add(CItems.GOLDEN_FU_STICKER.get(), "金色福字"); + add(CItems.INVERTED_GOLDEN_FU_STICKER.get(), "金色倒福字"); add(CItems.RED_PAPER.get(), "红纸"); add(CItems.GOLD_POWDER.get(), "金粉"); add(CItems.PARTY_HAT.get(), "派对帽"); add(CItems.BALLOON.get(), "气球"); add(CEntities.BALLOON.get(), "气球"); + add(CEntities.FU_STICKER.get(), "福字"); add("party_hat_type." + Celebrations.ID + ".stripes", "横纹"); add("party_hat_type." + Celebrations.ID + ".tilt_stripes", "斜纹"); add("party_hat_type." + Celebrations.ID + ".dots", "点状纹"); diff --git a/src/main/java/team/leomc/celebrations/data/gen/lang/CEnglishLanguageProvider.java b/src/main/java/team/leomc/celebrations/data/gen/lang/CEnglishLanguageProvider.java index 81c1a01..5d8df7f 100644 --- a/src/main/java/team/leomc/celebrations/data/gen/lang/CEnglishLanguageProvider.java +++ b/src/main/java/team/leomc/celebrations/data/gen/lang/CEnglishLanguageProvider.java @@ -32,16 +32,17 @@ protected void addTranslations() { add(CBlocks.JAPANESE_STYLED_RED_LANTERN.get(), "Japanese Styled Red Lantern"); add(CBlocks.COUPLET.get(), "Couplet"); add(CBlocks.HORIZONTAL_SCROLL.get(), "Horizontal Scroll"); - add(CBlocks.FU_STICKER.get(), "Fu Sticker"); - add(CBlocks.INVERTED_FU_STICKER.get(), "Inverted Fu Sticker"); - add(CBlocks.GOLDEN_FU_STICKER.get(), "Golden Fu Sticker"); - add(CBlocks.INVERTED_GOLDEN_FU_STICKER.get(), "Inverted Golden Fu Sticker"); add(CBlocks.FIREWORK_BUNDLE.get(), "Firework Bundle"); + add(CItems.FU_STICKER.get(), "Fu Sticker"); + add(CItems.INVERTED_FU_STICKER.get(), "Inverted Fu Sticker"); + add(CItems.GOLDEN_FU_STICKER.get(), "Golden Fu Sticker"); + add(CItems.INVERTED_GOLDEN_FU_STICKER.get(), "Inverted Golden Fu Sticker"); add(CItems.RED_PAPER.get(), "Red Paper"); add(CItems.GOLD_POWDER.get(), "Gold Powder"); add(CItems.PARTY_HAT.get(), "Party Hat"); add(CItems.BALLOON.get(), "Balloon"); add(CEntities.BALLOON.get(), "Balloon"); + add(CEntities.FU_STICKER.get(), "Fu Sticker"); add("party_hat_type." + Celebrations.ID + ".stripes", " Stripes"); add("party_hat_type." + Celebrations.ID + ".tilt_stripes", " Tilt Stripes"); add("party_hat_type." + Celebrations.ID + ".dots", " Dots"); diff --git a/src/main/java/team/leomc/celebrations/data/gen/loot/CBlockLootSubProvider.java b/src/main/java/team/leomc/celebrations/data/gen/loot/CBlockLootSubProvider.java index 5dca4c1..a70da2a 100644 --- a/src/main/java/team/leomc/celebrations/data/gen/loot/CBlockLootSubProvider.java +++ b/src/main/java/team/leomc/celebrations/data/gen/loot/CBlockLootSubProvider.java @@ -25,10 +25,6 @@ protected void generate() { dropSelf(CBlocks.JAPANESE_STYLED_RED_LANTERN.get()); dropSelf(CBlocks.COUPLET.get()); dropSelf(CBlocks.HORIZONTAL_SCROLL.get()); - dropSelf(CBlocks.FU_STICKER.get()); - dropSelf(CBlocks.INVERTED_FU_STICKER.get()); - dropSelf(CBlocks.GOLDEN_FU_STICKER.get()); - dropSelf(CBlocks.INVERTED_GOLDEN_FU_STICKER.get()); dropSelf(CBlocks.FIREWORK_BUNDLE.get()); } diff --git a/src/main/java/team/leomc/celebrations/data/gen/model/CBlockStateProvider.java b/src/main/java/team/leomc/celebrations/data/gen/model/CBlockStateProvider.java index 9815df9..ec17332 100644 --- a/src/main/java/team/leomc/celebrations/data/gen/model/CBlockStateProvider.java +++ b/src/main/java/team/leomc/celebrations/data/gen/model/CBlockStateProvider.java @@ -31,10 +31,6 @@ protected void registerStatesAndModels() { simpleExisting(CBlocks.JAPANESE_STYLED_RED_LANTERN.get()); particleOnly(CBlocks.COUPLET.get()); particleOnly(CBlocks.HORIZONTAL_SCROLL.get()); - particleOnly(CBlocks.FU_STICKER.get()); - particleOnly(CBlocks.INVERTED_FU_STICKER.get()); - particleOnly(CBlocks.GOLDEN_FU_STICKER.get()); - particleOnly(CBlocks.INVERTED_GOLDEN_FU_STICKER.get()); cubeBottomTop(CBlocks.FIREWORK_BUNDLE.get()); } diff --git a/src/main/java/team/leomc/celebrations/entity/FuSticker.java b/src/main/java/team/leomc/celebrations/entity/FuSticker.java new file mode 100644 index 0000000..18b3647 --- /dev/null +++ b/src/main/java/team/leomc/celebrations/entity/FuSticker.java @@ -0,0 +1,206 @@ +package team.leomc.celebrations.entity; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.server.level.ServerEntity; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.HangingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.AirBlock; +import net.minecraft.world.level.block.DoorBlock; +import net.minecraft.world.level.block.IronBarsBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.DoorHingeSide; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.Nullable; +import team.leomc.celebrations.registry.CEntities; + +public class FuSticker extends HangingEntity { + private static final EntityDataAccessor ITEM_STACK = SynchedEntityData.defineId(FuSticker.class, EntityDataSerializers.ITEM_STACK); + private static final EntityDataAccessor ATTACHED_POS = SynchedEntityData.defineId(FuSticker.class, EntityDataSerializers.BLOCK_POS); + private static final EntityDataAccessor ORIGINAL_POS = SynchedEntityData.defineId(FuSticker.class, EntityDataSerializers.BLOCK_POS); + private ItemStack fuSticker; + private BlockPos attachedPos; + private BlockPos originalPos; + + public FuSticker(EntityType entityType, Level level) { + super(entityType, level); + } + + private FuSticker(Level level, BlockPos pos, Direction direction) { + super(CEntities.FU_STICKER.get(), level, pos); + setDirection(direction); + } + + public static FuSticker create(Level level, BlockPos pos, BlockPos attachedPos,Direction direction, ItemStack itemStack) { + FuSticker fuStickerEntity = new FuSticker(level, pos, direction); + fuStickerEntity.setItem(itemStack); + fuStickerEntity.setAttachedPos(attachedPos); + fuStickerEntity.setOriginalPos(pos); + return fuStickerEntity; + } + + @Override + protected AABB calculateBoundingBox(BlockPos blockPos, Direction direction) { + Direction.Axis direction$axis = direction.getAxis(); + BlockState attachedBlockState = getAttachedBlockState(); + + if (attachedBlockState.getBlock() instanceof DoorBlock) { + if (attachedBlockState.getValue(DoorBlock.OPEN)) { + this.pos = getAttachedPos(); + Direction.Axis counterClockWiseAxis = direction.getCounterClockWise().getAxis(); + double d0 = counterClockWiseAxis == Direction.Axis.X ? 0.0625 : 0.5; + double d1 = counterClockWiseAxis == Direction.Axis.Y ? 0.0625 : 0.5; + double d2 = counterClockWiseAxis == Direction.Axis.Z ? 0.0625 : 0.5; + if (attachedBlockState.getValue(DoorBlock.HINGE) == DoorHingeSide.LEFT) { + Vec3 leftVec3 = Vec3.atCenterOf(getAttachedPos()).relative(direction.getClockWise(), 0.28125); + return AABB.ofSize(leftVec3, d0, d1, d2); + } else { + Vec3 rightVec3 = Vec3.atCenterOf(getAttachedPos()).relative(direction.getCounterClockWise(), 0.28125); + return AABB.ofSize(rightVec3, d0, d1, d2); + } + } + } + + double d0 = direction$axis == Direction.Axis.X ? 0.0625 : 0.5; + double d1 = direction$axis == Direction.Axis.Y ? 0.0625 : 0.5; + double d2 = direction$axis == Direction.Axis.Z ? 0.0625 : 0.5; + + if (isAttachedPane()) { + Vec3 paneVec3 = Vec3.atCenterOf(getAttachedPos()).relative(direction, 0.09375); + return AABB.ofSize(paneVec3, d0, d1, d2); + } + + this.pos = getOriginalPos(); + Vec3 blockVec3 = Vec3.atCenterOf(getOriginalPos()).relative(direction, -0.46875); + return AABB.ofSize(blockVec3, d0, d1, d2); + } + + public BlockState getAttachedBlockState() { + return this.level().getBlockState(getAttachedPos()); + } + + public boolean isAttachedPane() { + return this.level().getBlockState(getAttachedPos()).getBlock() instanceof IronBarsBlock; + } + + @Override + public boolean survives() { + if (!(this.level().getBlockState(getAttachedPos()).getBlock() instanceof AirBlock)) { + return true; + } + return super.survives(); + } + + @Override + public void playPlacementSound() { + this.playSound(SoundEvents.AZALEA_LEAVES_PLACE, 1.0F, 1.0F); + } + + @Override + public void dropItem(@Nullable Entity entity) { + if (fuSticker == null) { + return; + } + if (this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + this.playSound(SoundEvents.AZALEA_LEAVES_BREAK, 1.0F, 1.0F); + if (entity instanceof Player player) { + if (player.hasInfiniteMaterials()) { + return; + } + } + + this.spawnAtLocation(this.fuSticker); + } + } + + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + builder.define(ITEM_STACK, ItemStack.EMPTY); + builder.define(ATTACHED_POS, BlockPos.ZERO); + builder.define(ORIGINAL_POS, BlockPos.ZERO); + } + + @Override + public void addAdditionalSaveData(CompoundTag compound) { + compound.putByte("facing", (byte)this.direction.get2DDataValue()); + compound.put("Item", this.fuSticker.save(this.registryAccess())); + compound.putInt("attachedPosX", this.attachedPos.getX()); + compound.putInt("attachedPosY", this.attachedPos.getY()); + compound.putInt("attachedPosZ", this.attachedPos.getZ()); + compound.putInt("originalPosX", this.originalPos.getX()); + compound.putInt("originalPosY", this.originalPos.getY()); + compound.putInt("originalPosZ", this.originalPos.getZ()); + super.addAdditionalSaveData(compound); + } + + @Override + public void readAdditionalSaveData(CompoundTag compound) { + this.direction = Direction.from2DDataValue(compound.getByte("facing")); + CompoundTag compoundtag = compound.getCompound("Item"); + setItem(ItemStack.parse(this.registryAccess(), compoundtag).orElse(ItemStack.EMPTY)); + BlockPos blockpos = new BlockPos(compound.getInt("attachedPosX"), compound.getInt("attachedPosY"), compound.getInt("attachedPosZ")); + setAttachedPos(blockpos); + BlockPos blockpos1 = new BlockPos(compound.getInt("originalPosX"), compound.getInt("originalPosY"), compound.getInt("originalPosZ")); + setOriginalPos(blockpos1); + super.readAdditionalSaveData(compound); + this.setDirection(this.direction); + } + + @Override + public Packet getAddEntityPacket(ServerEntity entity) { + return new ClientboundAddEntityPacket(this, this.direction.get3DDataValue(), this.getPos()); + } + + @Override + public void recreateFromPacket(ClientboundAddEntityPacket packet) { + super.recreateFromPacket(packet); + this.setDirection(Direction.from3DDataValue(packet.getData())); + } + + public void setItem(ItemStack stack) { + this.fuSticker = stack.copyWithCount(1); + this.getEntityData().set(ITEM_STACK, stack.copyWithCount(1)); + } + + public ItemStack getItem() { + return this.getEntityData().get(ITEM_STACK); + } + + public void setAttachedPos(BlockPos attachedPos) { + this.attachedPos = attachedPos; + this.getEntityData().set(ATTACHED_POS, attachedPos); + } + + public BlockPos getAttachedPos() { + return this.getEntityData().get(ATTACHED_POS); + } + + public void setOriginalPos(BlockPos originalPos) { + this.originalPos = originalPos; + this.getEntityData().set(ORIGINAL_POS, originalPos); + } + + public BlockPos getOriginalPos() { + return this.getEntityData().get(ORIGINAL_POS); + } + + @Override + public void tick() { + super.tick(); + recalculateBoundingBox(); + } +} diff --git a/src/main/java/team/leomc/celebrations/item/FuStickerItem.java b/src/main/java/team/leomc/celebrations/item/FuStickerItem.java new file mode 100644 index 0000000..bbe4d8d --- /dev/null +++ b/src/main/java/team/leomc/celebrations/item/FuStickerItem.java @@ -0,0 +1,72 @@ +package team.leomc.celebrations.item; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.decoration.HangingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.DoorBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.gameevent.GameEvent; +import team.leomc.celebrations.entity.FuSticker; + +public class FuStickerItem extends Item { + + public FuStickerItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResult useOn(UseOnContext context) { + BlockPos blockpos = context.getClickedPos(); + BlockState blockState = context.getLevel().getBlockState(blockpos); + Direction direction = context.getClickedFace(); + BlockPos blockpos1 = blockpos.relative(direction); + Player player = context.getPlayer(); + ItemStack itemstack = context.getItemInHand(); + Level level = context.getLevel(); + if (player != null && !this.mayPlace(player, direction, itemstack, blockpos1)) { + return InteractionResult.FAIL; + } else { + if (blockState.getBlock() instanceof DoorBlock) { + if (blockState.getValue(DoorBlock.OPEN)) { + return InteractionResult.FAIL; + } + if (direction.getOpposite() != blockState.getValue(DoorBlock.FACING)) { + return InteractionResult.FAIL; + } + } + + FuSticker hangingentity = FuSticker.create(level, blockpos1, blockpos, direction, itemstack); + CustomData customdata = (CustomData)itemstack.getOrDefault(DataComponents.ENTITY_DATA, CustomData.EMPTY); + if (!customdata.isEmpty()) { + EntityType.updateCustomEntityTag(level, player, (Entity)hangingentity, customdata); + } + + if (((HangingEntity)hangingentity).survives()) { + if (!level.isClientSide) { + ((HangingEntity)hangingentity).playPlacementSound(); + level.gameEvent(player, GameEvent.ENTITY_PLACE, ((HangingEntity)hangingentity).position()); + level.addFreshEntity((Entity)hangingentity); + } + + itemstack.shrink(1); + return InteractionResult.sidedSuccess(level.isClientSide); + } else { + return InteractionResult.CONSUME; + } + } + } + + protected boolean mayPlace(Player player, Direction direction, ItemStack hangingEntityStack, BlockPos pos) { + return !direction.getAxis().isVertical() && player.mayUseItemAt(pos, direction, hangingEntityStack); + } +} diff --git a/src/main/java/team/leomc/celebrations/registry/CBlockEntities.java b/src/main/java/team/leomc/celebrations/registry/CBlockEntities.java index ab65bf3..c4daa56 100644 --- a/src/main/java/team/leomc/celebrations/registry/CBlockEntities.java +++ b/src/main/java/team/leomc/celebrations/registry/CBlockEntities.java @@ -13,6 +13,5 @@ public class CBlockEntities { public static final DeferredHolder, BlockEntityType> LANTERN = BLOCK_ENTITIES.register("lantern", () -> BlockEntityType.Builder.of(LanternBlockEntity::new, CBlocks.CHINESE_STYLED_BAMBOO_LANTERN.get(), CBlocks.CHINESE_STYLED_PAPER_LANTERN.get(), CBlocks.CHINESE_STYLED_RED_LANTERN.get(), CBlocks.JAPANESE_STYLED_PAPER_LANTERN.get(), CBlocks.JAPANESE_STYLED_RED_LANTERN.get()).build(null)); public static final DeferredHolder, BlockEntityType> COUPLET = BLOCK_ENTITIES.register("couplet", () -> BlockEntityType.Builder.of(CoupletBlockEntity::new, CBlocks.COUPLET.get()).build(null)); public static final DeferredHolder, BlockEntityType> HORIZONTAL_SCROLL = BLOCK_ENTITIES.register("horizontal_scroll", () -> BlockEntityType.Builder.of(HorizontalScrollBlockEntity::new, CBlocks.HORIZONTAL_SCROLL.get()).build(null)); - public static final DeferredHolder, BlockEntityType> FU_STICKER = BLOCK_ENTITIES.register("fu_sticker", () -> BlockEntityType.Builder.of(FuStickerBlockEntity::new, CBlocks.FU_STICKER.get(), CBlocks.INVERTED_FU_STICKER.get(), CBlocks.GOLDEN_FU_STICKER.get(), CBlocks.INVERTED_GOLDEN_FU_STICKER.get()).build(null)); public static final DeferredHolder, BlockEntityType> FIREWORK_BUNDLE = BLOCK_ENTITIES.register("firework_bundle", () -> BlockEntityType.Builder.of(FireworkBundleBlockEntity::new, CBlocks.FIREWORK_BUNDLE.get()).build(null)); } diff --git a/src/main/java/team/leomc/celebrations/registry/CBlocks.java b/src/main/java/team/leomc/celebrations/registry/CBlocks.java index 677eb97..53ff0e7 100644 --- a/src/main/java/team/leomc/celebrations/registry/CBlocks.java +++ b/src/main/java/team/leomc/celebrations/registry/CBlocks.java @@ -94,9 +94,5 @@ public VoxelShape getShape(BlockState state, BlockGetter getter, BlockPos pos, C public static final DeferredBlock COUPLET = BLOCKS.register("couplet", () -> new CoupletBlock(BlockBehaviour.Properties.of().noCollission().mapColor(MapColor.COLOR_RED).sound(SoundType.AZALEA_LEAVES).instabreak())); public static final DeferredBlock HORIZONTAL_SCROLL = BLOCKS.register("horizontal_scroll", () -> new HorizontalScrollBlock(BlockBehaviour.Properties.of().noCollission().mapColor(MapColor.COLOR_RED).sound(SoundType.AZALEA_LEAVES).instabreak())); - public static final DeferredBlock FU_STICKER = BLOCKS.register("fu_sticker", () -> new FuStickerBlock(BlockBehaviour.Properties.of().noCollission().mapColor(MapColor.COLOR_RED).sound(SoundType.AZALEA_LEAVES).instabreak())); - public static final DeferredBlock INVERTED_FU_STICKER = BLOCKS.register("inverted_fu_sticker", () -> new FuStickerBlock(BlockBehaviour.Properties.of().noCollission().mapColor(MapColor.COLOR_RED).sound(SoundType.AZALEA_LEAVES).instabreak())); - public static final DeferredBlock GOLDEN_FU_STICKER = BLOCKS.register("golden_fu_sticker", () -> new FuStickerBlock(BlockBehaviour.Properties.of().noCollission().mapColor(MapColor.COLOR_RED).sound(SoundType.AZALEA_LEAVES).instabreak())); - public static final DeferredBlock INVERTED_GOLDEN_FU_STICKER = BLOCKS.register("inverted_golden_fu_sticker", () -> new FuStickerBlock(BlockBehaviour.Properties.of().noCollission().mapColor(MapColor.COLOR_RED).sound(SoundType.AZALEA_LEAVES).instabreak())); public static final DeferredBlock FIREWORK_BUNDLE = BLOCKS.register("firework_bundle", () -> new FireworkBundleBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.TNT).mapColor(MapColor.COLOR_BROWN))); } diff --git a/src/main/java/team/leomc/celebrations/registry/CEntities.java b/src/main/java/team/leomc/celebrations/registry/CEntities.java index e56a5c9..96b21a5 100644 --- a/src/main/java/team/leomc/celebrations/registry/CEntities.java +++ b/src/main/java/team/leomc/celebrations/registry/CEntities.java @@ -7,9 +7,11 @@ import net.neoforged.neoforge.registries.DeferredRegister; import team.leomc.celebrations.Celebrations; import team.leomc.celebrations.entity.Balloon; +import team.leomc.celebrations.entity.FuSticker; public class CEntities { public static final DeferredRegister> ENTITY_TYPES = DeferredRegister.create(BuiltInRegistries.ENTITY_TYPE, Celebrations.ID); public static final DeferredHolder, EntityType> BALLOON = ENTITY_TYPES.register("balloon", () -> EntityType.Builder.of(Balloon::new, MobCategory.MISC).sized(0.5f, 0.75f).clientTrackingRange(10).updateInterval(1).build(Celebrations.id("balloon").toString())); + public static final DeferredHolder, EntityType> FU_STICKER = ENTITY_TYPES.register("fu_sticker", () -> EntityType.Builder.of(FuSticker::new, MobCategory.MISC).sized(0.5f, 0.75f).clientTrackingRange(10).updateInterval(1).build(Celebrations.id("fu_sticker").toString())); } diff --git a/src/main/java/team/leomc/celebrations/registry/CItems.java b/src/main/java/team/leomc/celebrations/registry/CItems.java index 9ddbc58..8852682 100644 --- a/src/main/java/team/leomc/celebrations/registry/CItems.java +++ b/src/main/java/team/leomc/celebrations/registry/CItems.java @@ -1,16 +1,12 @@ package team.leomc.celebrations.registry; -import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeItem; import net.minecraft.world.item.Item; import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredRegister; import team.leomc.celebrations.Celebrations; -import team.leomc.celebrations.item.CoupletItem; -import team.leomc.celebrations.item.FireworkBundleItem; -import team.leomc.celebrations.item.LanternItem; -import team.leomc.celebrations.item.PartyHatItem; +import team.leomc.celebrations.item.*; public class CItems { public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(Celebrations.ID); @@ -24,11 +20,6 @@ public class CItems { public static final DeferredItem COUPLET = ITEMS.register("couplet", () -> new CoupletItem(CBlocks.COUPLET.get(), new Item.Properties())); public static final DeferredItem HORIZONTAL_SCROLL = ITEMS.register("horizontal_scroll", () -> new CoupletItem(CBlocks.HORIZONTAL_SCROLL.get(), new Item.Properties())); - public static final DeferredItem FU_STICKER = ITEMS.register("fu_sticker", () -> new BlockItem(CBlocks.FU_STICKER.get(), new Item.Properties())); - public static final DeferredItem INVERTED_FU_STICKER = ITEMS.register("inverted_fu_sticker", () -> new BlockItem(CBlocks.INVERTED_FU_STICKER.get(), new Item.Properties())); - public static final DeferredItem GOLDEN_FU_STICKER = ITEMS.register("golden_fu_sticker", () -> new BlockItem(CBlocks.GOLDEN_FU_STICKER.get(), new Item.Properties())); - public static final DeferredItem INVERTED_GOLDEN_FU_STICKER = ITEMS.register("inverted_golden_fu_sticker", () -> new BlockItem(CBlocks.INVERTED_GOLDEN_FU_STICKER.get(), new Item.Properties())); - public static final DeferredItem FIREWORK_BUNDLE = ITEMS.register("firework_bundle", () -> new FireworkBundleItem(CBlocks.FIREWORK_BUNDLE.get(), new Item.Properties())); public static final DeferredItem RED_PAPER = ITEMS.register("red_paper", () -> new Item(new Item.Properties())); @@ -37,4 +28,9 @@ public class CItems { public static final DeferredItem PARTY_HAT = ITEMS.register("party_hat", () -> new PartyHatItem(new Item.Properties().stacksTo(1))); public static final DeferredItem BALLOON = ITEMS.register("balloon", () -> new Item(new Item.Properties().stacksTo(1))); + + public static final DeferredItem FU_STICKER = ITEMS.register("fu_sticker", () -> new FuStickerItem(new Item.Properties())); + public static final DeferredItem INVERTED_FU_STICKER = ITEMS.register("inverted_fu_sticker", () -> new FuStickerItem(new Item.Properties())); + public static final DeferredItem GOLDEN_FU_STICKER = ITEMS.register("golden_fu_sticker", () -> new FuStickerItem(new Item.Properties())); + public static final DeferredItem INVERTED_GOLDEN_FU_STICKER = ITEMS.register("inverted_golden_fu_sticker", () -> new FuStickerItem(new Item.Properties())); } diff --git a/src/main/resources/assets/celebrations/textures/block/fu_sticker.png b/src/main/resources/assets/celebrations/textures/block/fu_sticker.png deleted file mode 100644 index de4d32332d6cf5ac847c096e523498d10468b911..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmV;U0bKrxP)hMqNy{`%gFbo_qfPoct$&1F$+qV0Db(P|UGV4v|Nno1^jG*wh6G@~N}gYv|dC zNF>}vo~4Lbvb)P>@Ur@3P$|=!#}&*JAAsxpInN(fY9exCVReka_FQU#in&nZtWd!D8Nw-ww@%v}zg|x>okx00E z^0i6?-_-Kieuxf<$bx*YfT#$_?mqyLG2BMfWLc3*NJvOXNJvNk`~fY*llLdMU>pDd N002ovPDHLkV1hrk#Q6XK diff --git a/src/main/resources/assets/celebrations/textures/block/golden_fu_sticker.png b/src/main/resources/assets/celebrations/textures/block/golden_fu_sticker.png deleted file mode 100644 index 05ce9f5b83fb111b941dd52f3d6d74016f2773ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)`Wm$*z5g`48fsqL@ z6YR_&Zj6hDfxaiE6FL(IfaNI3o|@6=)}YObi?E0ijBPR7p)v8zAaD8WZG_%)qmanI z2I9s5AfyvIyI78rOo(3PHJ|#Q@TY6MJ$wNGT6X;qy%I<5$y^H@i<-?mNZc6yR_K0w zx{aO`ZWJ{KI`FqzWRhwnh>r3k%L=n(E)L*m9TZ;rEe^IITo4H;~@7g175?wuQQ zKSWg~WQgxIz?%T%{RaSU4gbRrnJjUILZMJ76bbAs=7>1t<6^+nZp>72cTg1_^tGE<@K$qe_DI)zR;?f@=U8Jj{qllGY=~N4v7K|le zI@pVss##37d!{7Z-TQv`es_ToM%A)6s+PU5F~=gp#MSrG%kbdX$PGyG*ZKC_RW=?I zI}7d;kJCh8vAfHX2hhkFv}fzUz{%1EpqS3^^gfErgdrbf z0$C|QE1#v{C8(Jfv}bE-<^>&lMZrrPtG9!IZ3NGjL&shLaGy!hcas3zBz}1O`UdcK z;`-dAJ~;kFoWSO2bt`30if{TLkCO#;-ExO9}Gn?o$>RQW`Mxf_uXV<;;`o; zl8rT9I6H%H3ue3*QJ9H1#19%!O+bAA0Z@A2KWff#iEA_(jYgx<0Q>@LzoD9G=-4y> O0000G%>_e(F~~&X;zrN~`3TIcCJufI2NG9iKLW6zVRP(M4S~dz#ZAjX z%VHhOYl}b^uG{^l>*e+S|9AJ^9V9TWmxFP=93;i;N+wA>{(biHzBN|40TG{mM{}ja zbWE%*xJf)s6Dy1Tyj=zWgO*F)}{F z{mz_TRb62kad800@)0BUXi1@M0uWq8Nl#o)nF%9)=8}D(ZQ@uyj^&4$Plt<@A61#i z%0My&m~}l)+9s7+E}XNgdqA{9s>nce1cMKctNSAWo*%xr?HvQ~*!-k)y$=xX#A)87 zY3<$-S@>(MUbP&Ec)SjPP+U+Y4jbCA-3^*1Wh1`0o$<>QYqQY=vrLFzaaT1p@{#a=->~?CS4sJL#Uy&I29p{LZf6j zhk74LdOhDMce&@i?|bhKP$&rlo`eBctzjxyd}rgsCYlPKZz`I*_6&?>>E8Oi2^p+1 zX$_Jv;L&Q0*tT&0`6Vs+$~eW-dqy1V!d=C-1&`~9Z3_VKTz$0iVfYJa=mH+s3G}!Q zkL!4;kKmgQ9?Ea}Ki^bj!bHMv1>lr;}W~f~aU8paT%0vbqG=Ss*$>4vLjRUTFi2(2m X8?KXQ>Rr4R00000NkvXXu0mjfK&Yl! literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/celebrations/textures/entity/golden_fu_sticker.png b/src/main/resources/assets/celebrations/textures/entity/golden_fu_sticker.png new file mode 100644 index 0000000000000000000000000000000000000000..d8c691ee212249813dfed6b81221e3cfe74b7fe3 GIT binary patch literal 384 zcmV-`0e}99P)W8ExV1P5{L-WVx z+oV>2f1*nSSWxn7c^Q)TboZF0BCbMKXyL!AAusctAz)zp?1W d!t@dWz5sKSi5g95W~cxF002ovPDHLkV1m0hrrZDk literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/celebrations/textures/entity/inverted_golden_fu_sticker.png b/src/main/resources/assets/celebrations/textures/entity/inverted_golden_fu_sticker.png new file mode 100644 index 0000000000000000000000000000000000000000..1346e2d75059c2de69c3b800d1fa1229aee9f08f GIT binary patch literal 383 zcmV-_0f7FAP))=nujc)k`Qrsci~>)N0#BN9EEBBG)9!W=VS;DNytwNfICRE|makn@ z!6uQ?$JfiTyt{cPjWSNI_Dk?QUIB1+xrcT5Bs76h;K|0oDUyGSC>S7(GTN>~KVElY zu`#JthllG|0Gh!L0DfrWhc;=HmAaWN^I}w?9R582sV*jx#=yZ3?E-p!{3vw?&~_ba zDq%6qQ6n@44)b_bh{+>C8fCOjcQs>copB=62<^~j9l72I!Bnjg;QnGs@766