diff --git a/src/generated/resources/.cache/002701d48eee4c36b62b24b011e74b0624793d05 b/src/generated/resources/.cache/002701d48eee4c36b62b24b011e74b0624793d05 index 7dec2a19..bc9c23d7 100644 --- a/src/generated/resources/.cache/002701d48eee4c36b62b24b011e74b0624793d05 +++ b/src/generated/resources/.cache/002701d48eee4c36b62b24b011e74b0624793d05 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-24T15:02:18.4232762 oreganized Block States +// 1.20.1 2024-10-25T13:00:50.0568446 oreganized Block States d85b0fb9e5cad1d9c4f22ed192b0fa621ee3373c assets/oreganized/blockstates/black_crystal_glass.json 05bb006ff7f48557fe5c5333bc120f7206052717 assets/oreganized/blockstates/black_crystal_glass_pane.json 5de0c522692198c3b8b01df17d8952035b80c8d9 assets/oreganized/blockstates/black_vigil_candle.json @@ -9,6 +9,7 @@ d85b0fb9e5cad1d9c4f22ed192b0fa621ee3373c assets/oreganized/blockstates/black_cry 8f4bdde9fa05052630cd12fb4da9889024377adf assets/oreganized/blockstates/brown_crystal_glass.json d59afe9c89ba1e614ce5943fdc8aa3d450585560 assets/oreganized/blockstates/brown_crystal_glass_pane.json 17e53257c89e754a0e69726cf9311f2c682f3470 assets/oreganized/blockstates/brown_vigil_candle.json +1bb1418117bc19542ba78cbb66a5fd3d23cac117 assets/oreganized/blockstates/burial_dirt.json 3c5c1979dfdd7174c48384591f2628f19f75fad1 assets/oreganized/blockstates/chiseled_glance.json 40088e383637c88f443a53fbafce9ade2ca40ddd assets/oreganized/blockstates/cut_lead.json 493ed64157b69a2cd174f244e50d75ccec5b7531 assets/oreganized/blockstates/cyan_crystal_glass.json @@ -228,6 +229,7 @@ d6bb8eb53138bc0091f9e73c3c8990e005b3926b assets/oreganized/models/block/brown_vi 3a20c447376d131b2691256c961da470ce87a6f9 assets/oreganized/models/block/brown_vigil_candle_triple_ceiling.json d02f1462c0da981e9db0433370305d33fef769fa assets/oreganized/models/block/brown_vigil_candle_triple_ceiling_lit.json 66d2fbfb6ffede8be2d217cb5e169a8e2a0f569d assets/oreganized/models/block/brown_vigil_candle_triple_lit.json +6333e54a2b61b252d96e4c4f76cf85836e64bacc assets/oreganized/models/block/burial_dirt.json 4f188c17f6b739d6090b40856dee05dae6b32316 assets/oreganized/models/block/chiseled_glance.json a9aeea1dec59b5c1594205bb9bc7034f30f447f0 assets/oreganized/models/block/cut_lead.json 65035089ce2758727d5b6cbc94c1a51c92ce613d assets/oreganized/models/block/cyan_concrete_powder.json diff --git a/src/generated/resources/.cache/4d87f6c700406347abbc935fa7e5d5e893a595b5 b/src/generated/resources/.cache/4d87f6c700406347abbc935fa7e5d5e893a595b5 index 02795826..813b6981 100644 --- a/src/generated/resources/.cache/4d87f6c700406347abbc935fa7e5d5e893a595b5 +++ b/src/generated/resources/.cache/4d87f6c700406347abbc935fa7e5d5e893a595b5 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-22T21:24:48.3830539 oreganized Item Models +// 1.20.1 2024-10-25T13:00:50.0648453 oreganized Item Models 18fcb236eeab67fa16a0014d9af5ba7dd6f9e7c8 assets/oreganized/models/item/black_crystal_glass.json 30bbb36792cb2d3f0a8a399f25238120cdf7e659 assets/oreganized/models/item/black_crystal_glass_pane.json e79054a9c107cbd9357eebf3aacbcd7c27955b9b assets/oreganized/models/item/black_vigil_candle.json @@ -9,6 +9,7 @@ b7158c4246d64e83d23470e470f46e2afc0999b1 assets/oreganized/models/item/bone_pile ca77522dcfcf982429256fd99ca0e9f2c195bd73 assets/oreganized/models/item/brown_crystal_glass.json cc365240dd7450add26aeaf5e0e689e985a4e5ad assets/oreganized/models/item/brown_crystal_glass_pane.json 5ad09a7c21c27fa1710fd42e043558b61c872912 assets/oreganized/models/item/brown_vigil_candle.json +daf453ebc13e1d60597b108b0912322efa406712 assets/oreganized/models/item/burial_dirt.json 87ae9e55b9b93036e2004b186696da47cbc5ca81 assets/oreganized/models/item/bush_hammer.json 9cb46711c71fcec37eae98916aa50acbe76cf96d assets/oreganized/models/item/chiseled_glance.json 0873e5720c3f7d81c4ef7e3f3d333e14a87e6757 assets/oreganized/models/item/crossbow_lead_bolt.json diff --git a/src/generated/resources/.cache/5bb646c3cee204f41a1b59a2c0d9083b5f7155b0 b/src/generated/resources/.cache/5bb646c3cee204f41a1b59a2c0d9083b5f7155b0 index f3fc75bd..73fdec78 100644 --- a/src/generated/resources/.cache/5bb646c3cee204f41a1b59a2c0d9083b5f7155b0 +++ b/src/generated/resources/.cache/5bb646c3cee204f41a1b59a2c0d9083b5f7155b0 @@ -1,4 +1,4 @@ -// 1.20.1 2024-10-24T15:33:23.489208 Oreganized Block Tags +// 1.20.1 2024-10-25T13:00:50.065928 Oreganized Block Tags 7a2d68d81bc5ee59f9a2f4ba68ddb39bfd9c875d data/forge/tags/blocks/glass.json d96b4f83e03abe39a1b97d92b7818c8f6b2e5c68 data/forge/tags/blocks/glass_panes.json d062c23ad5308b7de0b2e86f6531ea724530f898 data/forge/tags/blocks/melts_lead.json @@ -40,4 +40,4 @@ eaca08d04b1742f418e6bc0964dd32cf16035d88 data/oreganized/tags/blocks/mineable/sc cf3608bd187922aeb48c566c19e8482b0dca34c7 data/oreganized/tags/blocks/prevents_lead_cloud.json 06c2e2e512966767a31df77e646e41c4c39e3dd3 data/oreganized/tags/blocks/silktouch_using_scribe.json 3112fb4a1df2953e2c3572fa47f886bf8e5bd679 data/oreganized/tags/blocks/stone_types/glance.json -d83fef2771b28de02bd241459bd9e94b38482fe9 data/oreganized/tags/blocks/vigil_candles.json +de4e070ae6815e75f0e299d75ad3557f7660820f data/oreganized/tags/blocks/vigil_candles.json diff --git a/src/generated/resources/.cache/86c4ba3fec62c329e6b7e74d87569e08181a0d37 b/src/generated/resources/.cache/86c4ba3fec62c329e6b7e74d87569e08181a0d37 deleted file mode 100644 index 0b55c618..00000000 --- a/src/generated/resources/.cache/86c4ba3fec62c329e6b7e74d87569e08181a0d37 +++ /dev/null @@ -1,53 +0,0 @@ -// 1.20.1 2024-09-20T10:43:10.6795167 Oreganized Item Tags -3a2cbf8d34e9bde2e22d59d4437fa80361d53291 data/farmersdelight/tags/items/tools/knives.json -d8d286ea76e30a635512bc93d68815770003ff41 data/forge/tags/items/buckets/molten_lead.json -7a2d68d81bc5ee59f9a2f4ba68ddb39bfd9c875d data/forge/tags/items/glass.json -d96b4f83e03abe39a1b97d92b7818c8f6b2e5c68 data/forge/tags/items/glass_panes.json -e49cb4f6d619d05263a53690780f08940350b817 data/forge/tags/items/ingots.json -9115563bba2db6e89c2c107626da06ea199aa2c7 data/forge/tags/items/ingots/electrum.json -a5caec7ffef5e22f645062fbd7b1228c4e2bf60f data/forge/tags/items/ingots/lead.json -a38d481017d07adc5bcd423740718cac7cdaa829 data/forge/tags/items/ingots/silver.json -ecba5d070ab794f58b1ecd4e50396e5f1501ff78 data/forge/tags/items/nuggets.json -e6d8bf8310f21dfaeb310a9ab910735a569354bd data/forge/tags/items/nuggets/electrum.json -3b248cf90493366509ef462ef2ab45c771ef6f8c data/forge/tags/items/nuggets/lead.json -baec62ac3425b057aabc65f53f289a83c009337a data/forge/tags/items/nuggets/netherite.json -c009685a7974533094c2347c1eeb929f9e00da3f data/forge/tags/items/nuggets/silver.json -4e9173550595ca2ada5744dc749553e93b05954f data/forge/tags/items/ores.json -dc9cc2dca9fa3a28a0458ec282e3e0fe81999ee1 data/forge/tags/items/ores/lead.json -bb86ac7ab19373da790ec5711f473614e4b62d79 data/forge/tags/items/ores/silver.json -084242f542331c46b8889564325f204f7b8bb6a4 data/forge/tags/items/ores_in_ground/deepslate.json -ec067464a41bb65b72566d6a4e4ffccb80261bf7 data/forge/tags/items/ores_in_ground/stone.json -66ba659939fbf946a12fd974e4b1aa050d6c0d1c data/forge/tags/items/raw_materials.json -eb55c33bcf31bb18b06d5138f9d4ae7877d9739d data/forge/tags/items/raw_materials/lead.json -84d8f3093299dc4984a33c737ac8ff8964e135da data/forge/tags/items/raw_materials/silver.json -3d43625006347afbc2d100972433d9af9db7ac3e data/forge/tags/items/shields.json -346b0b24e693e29050a326ff267fb8c28bcfd21d data/forge/tags/items/storage_blocks.json -7a1e2c391ad442cdc57f69ce1737207bc52bfb84 data/forge/tags/items/storage_blocks/electrum.json -bb0420ecbadc747d984fcef0fe7fc67586bc3231 data/forge/tags/items/storage_blocks/lead.json -4fb94c8b6f6641d27d70e8ff338e81cee30a321c data/forge/tags/items/storage_blocks/raw_lead.json -05f4708355ed88fe57116020dd93ac53f3098dba data/forge/tags/items/storage_blocks/raw_silver.json -bff6697a058fddfe9e14615bc043fcb2071fd6fc data/forge/tags/items/storage_blocks/silver.json -4c880b8d05c88b2f9b44580057a8b4d2fd6fddc4 data/forge/tags/items/tools/bush_hammer.json -3a2cbf8d34e9bde2e22d59d4437fa80361d53291 data/forge/tags/items/tools/knives.json -ddc75b2f884f2deef1eb71418b0fc4ff6784c5f1 data/minecraft/tags/items/axes.json -9115563bba2db6e89c2c107626da06ea199aa2c7 data/minecraft/tags/items/beacon_payment_items.json -503ad75af537d0ffef02ada9fb9afb5f5cd8e83b data/minecraft/tags/items/doors.json -eef83cdf136be620185d326ac306dc8b3680b0ce data/minecraft/tags/items/hoes.json -5978220d099c8bf975bbd69e364ac49628f6dec7 data/minecraft/tags/items/music_discs.json -b20c1b1653f973a0f1474db47ae9c0e1f8515c42 data/minecraft/tags/items/pickaxes.json -c52b4dbffb6c07a4fbc75a2ce481671384feb984 data/minecraft/tags/items/shovels.json -e9873026bc587ab0729bda85f9d2a6ca7790d410 data/minecraft/tags/items/slabs.json -e231a716e19756d6a2326e873062dab206b37184 data/minecraft/tags/items/stairs.json -959791060c5661f7f86dedec67300177b0735bec data/minecraft/tags/items/swords.json -0071c009a80f1ab7661b261dcf94799070b8cbea data/minecraft/tags/items/trapdoors.json -bd1440ab62499b2be9d2d4050f2d30cbb306b34f data/minecraft/tags/items/trimmable_armor.json -9c01ba5c2837c6d506fea127ca2a1b2ba24e2fe0 data/minecraft/tags/items/trim_materials.json -a4acb3623320f801e89e3451f8b7d9e2246f99d0 data/minecraft/tags/items/walls.json -6c25715524e8df396dd757255895117ff2451b25 data/nethersdelight/tags/items/tools/machetes.json -81fb1b18afaa14ae90800b23c32de565d1389bb3 data/oreganized/tags/items/crystal_glass.json -f1dfddab1e3f2dec1e7ed1c3fbf9f6a7f261cf08 data/oreganized/tags/items/crystal_glass_panes.json -bf2ad799074f5c44acee490bdf3d3ae81d56997b data/oreganized/tags/items/gargoyle_snack.json -4d89056c908550931c1f2008f9817f5d3ff7aa68 data/oreganized/tags/items/has_kinetic_damage.json -376b7c9ff449a4b98cb7b1f65b47d658c4e39428 data/oreganized/tags/items/lighter_than_lead.json -3112fb4a1df2953e2c3572fa47f886bf8e5bd679 data/oreganized/tags/items/stone_types/glance.json -3d43625006347afbc2d100972433d9af9db7ac3e data/shieldexp/tags/items/shields.json diff --git a/src/generated/resources/.cache/940881aeb46562922fcc484940bba42a0d973262 b/src/generated/resources/.cache/940881aeb46562922fcc484940bba42a0d973262 deleted file mode 100644 index 3d998949..00000000 --- a/src/generated/resources/.cache/940881aeb46562922fcc484940bba42a0d973262 +++ /dev/null @@ -1,2 +0,0 @@ -// 1.20.1 2023-08-24T20:32:13.557772638 Oreganized Fluid Tags -c3cccb389de4652cbb5430ae9f57b2bb843b544f data/forge/tags/fluids/molten_lead.json diff --git a/src/generated/resources/.cache/fab176c00984ff045b6565b8b962718c23b968ec b/src/generated/resources/.cache/fab176c00984ff045b6565b8b962718c23b968ec deleted file mode 100644 index c52a6e82..00000000 --- a/src/generated/resources/.cache/fab176c00984ff045b6565b8b962718c23b968ec +++ /dev/null @@ -1,3 +0,0 @@ -// 1.20.1 2023-08-24T20:32:13.555038231 Oreganized Biome Tags -d7dd92daad66eaa897e786e9a1a0bfddcc0e1fbf data/oreganized/tags/worldgen/biome/has_structure/boulder.json -123a8c4cf362352d397dc85738c4e8bb2ef2dc40 data/oreganized/tags/worldgen/biome/rich_in_lead_ore.json diff --git a/src/generated/resources/assets/oreganized/blockstates/burial_dirt.json b/src/generated/resources/assets/oreganized/blockstates/burial_dirt.json new file mode 100644 index 00000000..8c7ac15a --- /dev/null +++ b/src/generated/resources/assets/oreganized/blockstates/burial_dirt.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "oreganized:block/burial_dirt" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/oreganized/lang/en_us.json b/src/generated/resources/assets/oreganized/lang/en_us.json index f870b06a..ed155f52 100644 --- a/src/generated/resources/assets/oreganized/lang/en_us.json +++ b/src/generated/resources/assets/oreganized/lang/en_us.json @@ -34,6 +34,7 @@ "block.oreganized.brown_crystal_glass": "Brown Crystal Glass", "block.oreganized.brown_crystal_glass_pane": "Brown Crystal Glass Pane", "block.oreganized.brown_vigil_candle": "Brown Vigil Candle", + "block.oreganized.burial_dirt": "Burial Dirt", "block.oreganized.chiseled_glance": "Chiseled Glance", "block.oreganized.cut_lead": "Cut Lead", "block.oreganized.cyan_crystal_glass": "Cyan Crystal Glass", @@ -135,6 +136,7 @@ "death.attack.molten_lead": "%1$s refused to let go of the soaring hot metal", "effect.oreganized.stunning": "Brain Damage", "effect.oreganized.stunning.description": "Paralyzes the victim periodically with random intervals", + "entity.oreganized.holler": "Holler", "entity.oreganized.lead_bolt": "Lead Bolt", "entity.oreganized.shrapnel_bomb": "Shrapnel Bomb", "entity.oreganized.shrapnel_bomb_minecart": "Shrapnel Bomb Minecart", diff --git a/src/generated/resources/assets/oreganized/models/block/burial_dirt.json b/src/generated/resources/assets/oreganized/models/block/burial_dirt.json new file mode 100644 index 00000000..b2bd3832 --- /dev/null +++ b/src/generated/resources/assets/oreganized/models/block/burial_dirt.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "oreganized:block/burial_dirt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/oreganized/models/item/burial_dirt.json b/src/generated/resources/assets/oreganized/models/item/burial_dirt.json new file mode 100644 index 00000000..51eddcda --- /dev/null +++ b/src/generated/resources/assets/oreganized/models/item/burial_dirt.json @@ -0,0 +1,3 @@ +{ + "parent": "oreganized:block/burial_dirt" +} \ No newline at end of file diff --git a/src/generated/resources/data/oreganized/loot_tables/blocks/burial_dirt.json b/src/generated/resources/data/oreganized/loot_tables/blocks/burial_dirt.json new file mode 100644 index 00000000..cf8773ed --- /dev/null +++ b/src/generated/resources/data/oreganized/loot_tables/blocks/burial_dirt.json @@ -0,0 +1,58 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "oreganized:burial_dirt" + }, + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:inverted", + "term": { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + } + ], + "name": "minecraft:dirt" + } + ] + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "oreganized:blocks/burial_dirt" +} \ No newline at end of file diff --git a/src/generated/resources/data/oreganized/loot_tables/entities/holler.json b/src/generated/resources/data/oreganized/loot_tables/entities/holler.json new file mode 100644 index 00000000..30b34f4a --- /dev/null +++ b/src/generated/resources/data/oreganized/loot_tables/entities/holler.json @@ -0,0 +1,4 @@ +{ + "type": "minecraft:entity", + "random_sequence": "oreganized:entities/holler" +} \ No newline at end of file diff --git a/src/generated/resources/data/oreganized/tags/blocks/vigil_candles.json b/src/generated/resources/data/oreganized/tags/blocks/vigil_candles.json index 1f396b24..868d4469 100644 --- a/src/generated/resources/data/oreganized/tags/blocks/vigil_candles.json +++ b/src/generated/resources/data/oreganized/tags/blocks/vigil_candles.json @@ -1,21 +1,21 @@ { "values": [ "oreganized:vigil_candle", - "oreganized:cyan_vigil_candle", - "oreganized:brown_vigil_candle", + "oreganized:blue_vigil_candle", + "oreganized:red_vigil_candle", "oreganized:black_vigil_candle", + "oreganized:gray_vigil_candle", + "oreganized:yellow_vigil_candle", + "oreganized:light_gray_vigil_candle", "oreganized:green_vigil_candle", "oreganized:lime_vigil_candle", - "oreganized:magenta_vigil_candle", - "oreganized:pink_vigil_candle", - "oreganized:blue_vigil_candle", "oreganized:light_blue_vigil_candle", - "oreganized:orange_vigil_candle", - "oreganized:yellow_vigil_candle", "oreganized:white_vigil_candle", - "oreganized:light_gray_vigil_candle", - "oreganized:red_vigil_candle", + "oreganized:pink_vigil_candle", + "oreganized:orange_vigil_candle", + "oreganized:magenta_vigil_candle", "oreganized:purple_vigil_candle", - "oreganized:gray_vigil_candle" + "oreganized:brown_vigil_candle", + "oreganized:cyan_vigil_candle" ] } \ No newline at end of file diff --git a/src/main/java/galena/oreganized/Oreganized.java b/src/main/java/galena/oreganized/Oreganized.java index 5f6c3ed5..f98f5243 100644 --- a/src/main/java/galena/oreganized/Oreganized.java +++ b/src/main/java/galena/oreganized/Oreganized.java @@ -9,6 +9,7 @@ import galena.oreganized.compat.supplementaries.AmendmentsCompat; import galena.oreganized.content.block.LeadOreBlock; import galena.oreganized.content.block.MoltenLeadCauldronBlock; +import galena.oreganized.content.entity.holler.Holler; import galena.oreganized.content.entity.LeadBoltEntity; import galena.oreganized.data.OAdvancements; import galena.oreganized.data.OBiomeTags; @@ -53,6 +54,7 @@ import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.metadata.pack.PackMetadataSection; import net.minecraft.tags.FluidTags; +import net.minecraft.world.entity.SpawnPlacements; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.entity.projectile.Projectile; @@ -69,6 +71,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.DispenserBlock; import net.minecraft.world.level.block.FireBlock; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement; import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool; import net.minecraftforge.common.BasicItemListing; @@ -79,6 +82,8 @@ import net.minecraftforge.common.util.MutableHashedLinkedMap; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; +import net.minecraftforge.event.entity.EntityAttributeCreationEvent; +import net.minecraftforge.event.entity.SpawnPlacementRegisterEvent; import net.minecraftforge.event.village.VillagerTradesEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -131,6 +136,8 @@ public Oreganized() { modBus.addListener(this::clientSetup); modBus.addListener(this::gatherData); modBus.addListener(this::buildCreativeModeTabContents); + modBus.addListener(this::registerAttributes); + modBus.addListener(this::registerSpawnPlacements); forgeBus.addListener(this::injectVillagerTrades); LOOT_MODIFIERS.register("add_item", () -> AddItemLootModifier.CODEC); @@ -171,6 +178,15 @@ public Oreganized() { //context.registerConfig(ModConfig.Type.CLIENT, OreganizedConfig.CLIENT_SPEC); } + private void registerAttributes(EntityAttributeCreationEvent event) { + event.put(OEntityTypes.HOLLER.get(), Holler.createAttributes().build()); + } + + private void registerSpawnPlacements(SpawnPlacementRegisterEvent event) { + event.register(OEntityTypes.HOLLER.get(), SpawnPlacements.Type.ON_GROUND, Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Holler::checkHollerSpawnRules, SpawnPlacementRegisterEvent.Operation.REPLACE); + } + + private void injectVillagerTrades(VillagerTradesEvent event) { if (event.getType() == VillagerProfession.MASON) { event.getTrades().get(5).add(new BasicItemListing(14, new ItemStack(OBlocks.GARGOYLE.get()), 5, 30, 0.05F)); @@ -381,6 +397,7 @@ public void buildCreativeModeTabContents(BuildCreativeModeTabContentsEvent event putAfter(entries, Blocks.ICE, OBlocks.GROOVED_ICE); putAfter(entries, Blocks.PACKED_ICE, OBlocks.GROOVED_PACKED_ICE); putAfter(entries, Blocks.BLUE_ICE, OBlocks.GROOVED_BLUE_ICE); + putAfter(entries, Blocks.FARMLAND, OBlocks.BURIAL_DIRT); putAfter(entries, Blocks.BONE_BLOCK, OBlocks.BONE_PILE); } if (tab == CreativeModeTabs.REDSTONE_BLOCKS) { diff --git a/src/main/java/galena/oreganized/client/OModelLayers.java b/src/main/java/galena/oreganized/client/OModelLayers.java new file mode 100644 index 00000000..04a42996 --- /dev/null +++ b/src/main/java/galena/oreganized/client/OModelLayers.java @@ -0,0 +1,16 @@ +package galena.oreganized.client; + +import com.google.common.collect.Sets; +import galena.oreganized.Oreganized; +import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.Set; + +@OnlyIn(Dist.CLIENT) +public class OModelLayers { + + public static final ModelLayerLocation HOLLER = new ModelLayerLocation(new ResourceLocation(Oreganized.MOD_ID, "holler"), "main"); +} diff --git a/src/main/java/galena/oreganized/client/OreganizedClient.java b/src/main/java/galena/oreganized/client/OreganizedClient.java index 87b6c8e4..3f7ebc52 100644 --- a/src/main/java/galena/oreganized/client/OreganizedClient.java +++ b/src/main/java/galena/oreganized/client/OreganizedClient.java @@ -2,17 +2,21 @@ import com.mojang.math.Axis; import galena.oreganized.Oreganized; +import galena.oreganized.client.model.HollerModel; +import galena.oreganized.client.render.entity.HollerRender; import galena.oreganized.client.render.entity.LeadBoltRender; import galena.oreganized.client.render.entity.ShrapnelBombMinecartRender; import galena.oreganized.client.render.entity.ShrapnelBombRender; import galena.oreganized.client.render.gui.StunningOverlay; import galena.oreganized.index.OBlocks; +import galena.oreganized.index.OEffects; import galena.oreganized.index.OEntityTypes; import galena.oreganized.index.OItems; import galena.oreganized.world.IDoorProgressHolder; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.player.PlayerRenderer; @@ -20,8 +24,12 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; +import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.HumanoidArm; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.CrossbowItem; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; @@ -29,8 +37,10 @@ import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.RegisterGuiOverlaysEvent; import net.minecraftforge.client.event.RenderHandEvent; +import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.client.gui.overlay.VanillaGuiOverlay; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -96,6 +106,12 @@ public static void registerEntityRenderers(EntityRenderersEvent.RegisterRenderer event.registerEntityRenderer(OEntityTypes.SHRAPNEL_BOMB.get(), ShrapnelBombRender::new); event.registerEntityRenderer(OEntityTypes.SHRAPNEL_BOMB_MINECART.get(), ShrapnelBombMinecartRender::new); event.registerEntityRenderer(OEntityTypes.LEAD_BOLT.get(), LeadBoltRender::new); + event.registerEntityRenderer(OEntityTypes.HOLLER.get(), HollerRender::new); + } + + @SubscribeEvent + public static void registerModelLayers(EntityRenderersEvent.RegisterLayerDefinitions event) { + event.registerLayerDefinition(OModelLayers.HOLLER, HollerModel::createBodyLayer); } @SubscribeEvent @@ -112,6 +128,37 @@ public static void renderThirdPersonArm(ModelPart arm, boolean rightArm) { @Mod.EventBusSubscriber(modid = Oreganized.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.FORGE) public static class ForgeBusEvents { + public static MobEffectInstance fogEffect; + private static int timer = 0; + + @SubscribeEvent + public static void clientTick(TickEvent.ClientTickEvent event) { + if (!(Minecraft.getInstance().gameRenderer.getMainCamera().getEntity() instanceof Player player)) return; + fogEffect = player.getEffect(OEffects.FOG.get()); + } + + @SubscribeEvent + public static void fogEffectFog(ViewportEvent.RenderFog event) { + if (fogEffect != null && fogEffect.getFactorData().isPresent()) { + LivingEntity entity = (LivingEntity) Minecraft.getInstance().gameRenderer.getMainCamera().getEntity(); + float f = Mth.lerp(fogEffect.getFactorData().get().getFactor(entity, (float) event.getPartialTick()), event.getFarPlaneDistance(), 25.0F); + event.setNearPlaneDistance(event.getMode() == FogRenderer.FogMode.FOG_SKY ? -2F : f * -0.5F); + event.setFarPlaneDistance(f); + event.setCanceled(true); + } + } + + @SubscribeEvent + public static void fogEffectColor(ViewportEvent.ComputeFogColor event) { + if (fogEffect != null) { + LivingEntity entity = (LivingEntity) Minecraft.getInstance().gameRenderer.getMainCamera().getEntity(); + float color = fogEffect.getFactorData().isPresent() ? 1.2F - (fogEffect.getFactorData().get()).getFactor(entity, (float) event.getPartialTick()) : 0.0F; + event.setRed(event.getRed()*color); + event.setGreen(event.getGreen()*color); + event.setBlue(event.getBlue()*color); + } + } + @SubscribeEvent public static void addTooltips(ItemTooltipEvent event) { if (event.getItemStack().is(OItems.BUSH_HAMMER.get())) { diff --git a/src/main/java/galena/oreganized/client/model/HollerModel.java b/src/main/java/galena/oreganized/client/model/HollerModel.java new file mode 100644 index 00000000..d1912d04 --- /dev/null +++ b/src/main/java/galena/oreganized/client/model/HollerModel.java @@ -0,0 +1,60 @@ +package galena.oreganized.client.model; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.model.EntityModel; +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.RenderType; +import net.minecraft.world.entity.Entity; + +public class HollerModel extends EntityModel { + private final ModelPart head; + private final ModelPart body; + private final ModelPart right_arm; + private final ModelPart left_arm; + + public HollerModel(ModelPart root) { + super(RenderType::entityTranslucent); + this.head = root.getChild("head"); + this.body = root.getChild("body"); + this.right_arm = root.getChild("right_arm"); + this.left_arm = root.getChild("left_arm"); + } + + public static LayerDefinition createBodyLayer() { + MeshDefinition meshdefinition = new MeshDefinition(); + PartDefinition partdefinition = meshdefinition.getRoot(); + + PartDefinition head = partdefinition.addOrReplaceChild("head", CubeListBuilder.create().texOffs(0, 0).addBox(-2.5F, -5, -2.5F, 5, 5, 5) + .texOffs(10, 28).addBox(-1.5F, 0, -2.5F, 3, 2, 2) + .texOffs(12, 16).addBox(-2.5F, -5, -2.5F, 5, 5, 5, new CubeDeformation(0.5F)), PartPose.offset(0, 18, 0)); + + PartDefinition body = partdefinition.addOrReplaceChild("body", CubeListBuilder.create().texOffs(0, 10).addBox(-1.5F, 0, -1, 3, 4, 2) + .texOffs(0, 16).addBox(-1.5F, 4, -1, 3, 5, 2, new CubeDeformation(-0.2F)) + .texOffs(0, 16).addBox(-1.5F, 2.5F, -1, 3, 2, 2, new CubeDeformation(-0.2F)), PartPose.offset(0, 18, 0)); + + PartDefinition right_arm = partdefinition.addOrReplaceChild("right_arm", CubeListBuilder.create().texOffs(22, 0).addBox(-0.75F, -0.5F, -1, 2, 6, 2) + .texOffs(2, 24).mirror().addBox(-0.75F, -0.5F, -0.9F, 5, 6, 0).mirror(false) + .texOffs(2, 24).mirror().addBox(1.25F, -0.5F, 0.9F, 5, 6, 0).mirror(false), PartPose.offsetAndRotation(-1.75F, 18.5F, 0, 0, 0, 1.5708F)); + + PartDefinition left_arm = partdefinition.addOrReplaceChild("left_arm", CubeListBuilder.create().texOffs(22, 26).addBox(-6.25F, -0.5F, 0.9F, 5, 6, 0) + .texOffs(22, 26).addBox(-4.25F, -0.5F, -0.9F, 5, 6, 0) + .texOffs(22, 8).addBox(-1.25F, -0.5F, -1, 2, 6, 2), PartPose.offsetAndRotation(1.75F, 18.5F, 0, 0, 0, -1.5708F)); + + return LayerDefinition.create(meshdefinition, 32, 32); + } + + @Override + public void setupAnim(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch) { + } + + @Override + public void renderToBuffer(PoseStack poseStack, VertexConsumer vertexConsumer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha) { + head.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + body.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + right_arm.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + left_arm.render(poseStack, vertexConsumer, packedLight, packedOverlay, red, green, blue, alpha); + } +} \ No newline at end of file diff --git a/src/main/java/galena/oreganized/client/render/entity/HollerRender.java b/src/main/java/galena/oreganized/client/render/entity/HollerRender.java new file mode 100644 index 00000000..ab9d2066 --- /dev/null +++ b/src/main/java/galena/oreganized/client/render/entity/HollerRender.java @@ -0,0 +1,32 @@ +package galena.oreganized.client.render.entity; + +import galena.oreganized.Oreganized; +import galena.oreganized.client.OModelLayers; +import galena.oreganized.client.model.HollerModel; +import galena.oreganized.content.entity.holler.Holler; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.MobRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +@OnlyIn(Dist.CLIENT) +public class HollerRender extends MobRenderer> { + + private static final ResourceLocation HOLLER_TEXTURE = new ResourceLocation(Oreganized.MOD_ID, "textures/entity/holler.png"); + + public HollerRender(EntityRendererProvider.Context context) { + super(context, new HollerModel<>(context.bakeLayer(OModelLayers.HOLLER)), 0.4F); + } + + @Override + public ResourceLocation getTextureLocation(Holler holler) { + return HOLLER_TEXTURE; + } + + @Override + protected int getBlockLightLevel(Holler p_114496_, BlockPos p_114497_) { + return 15; + } +} diff --git a/src/main/java/galena/oreganized/content/block/BurialDirtBlock.java b/src/main/java/galena/oreganized/content/block/BurialDirtBlock.java new file mode 100644 index 00000000..2c4163a6 --- /dev/null +++ b/src/main/java/galena/oreganized/content/block/BurialDirtBlock.java @@ -0,0 +1,47 @@ +package galena.oreganized.content.block; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.monster.Skeleton; +import net.minecraft.world.entity.monster.Zombie; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +public class BurialDirtBlock extends Block { + public BurialDirtBlock(Properties properties) { + super(properties); + } + + @Override + public boolean isRandomlyTicking(BlockState state) { + return true; + } + + @Override + public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) { + if (!level.getBlockState(pos.above()).isAir()) level.setBlockAndUpdate(pos, Blocks.DIRT.withPropertiesOf(state)); + if (level.isNight() && random.nextFloat() < 0.1) { + spawnZombie(level, pos); + level.setBlockAndUpdate(pos, Blocks.DIRT.withPropertiesOf(state)); + } + } + + @Override + public void spawnAfterBreak(BlockState state, ServerLevel level, BlockPos pos, ItemStack stack, boolean dropExperience) { + spawnZombie(level, pos); + } + + public void spawnZombie(Level level, BlockPos pos) { + Zombie zombie = EntityType.ZOMBIE.create(level); + if (zombie != null) { + zombie.moveTo(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 0, 0); + level.addFreshEntity(zombie); + zombie.spawnAnim(); + } + } +} diff --git a/src/main/java/galena/oreganized/content/block/VigilCandleBlock.java b/src/main/java/galena/oreganized/content/block/VigilCandleBlock.java index 6ee3146a..d804b224 100644 --- a/src/main/java/galena/oreganized/content/block/VigilCandleBlock.java +++ b/src/main/java/galena/oreganized/content/block/VigilCandleBlock.java @@ -23,7 +23,6 @@ import net.minecraft.world.level.material.Fluids; import net.minecraft.world.phys.BlockHitResult; 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; @@ -44,21 +43,9 @@ private static VoxelShape shape(double x, double y, double z) { private static VoxelShape[] createShapes(boolean hanging) { return new VoxelShape[]{ shape(5, hanging ? 2 : 0, 5), - Shapes.or( - shape(6 + (hanging ? 0 : 1), hanging ? 2 : 0, 1), - shape(3, 0, 9) - ), - Shapes.or( - shape(1, 0, 2 + (hanging ? 2 : 0)), - shape(9, hanging ? 2 : 0, 1), - shape(7 + (hanging ? 2 : 0), hanging ? 4 : 0, 9) - ), - Shapes.or( - shape(1, hanging ? 4 : 0, 1), - shape(9, 0, 1), - shape(1, 0, 9), - shape(9, hanging ? 2 : 0, 9) - ) + Block.box(3, 0, 1, hanging ? 12 : 13, hanging ? 12 : 10, 15), + Block.box(1, 0, 1, 15, hanging ? 14 : 10, 15), + Block.box(1, 0, 1, 15, hanging ? 14 : 10, 15) }; } @@ -94,8 +81,7 @@ public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, Co var candles = state.getValue(CANDLES); var hanging = state.getValue(HANGING); var index = candles - 1; - return createShapes(hanging)[index]; - //return (handing ? HANGING_SHAPES : SHAPES)[index]; + return (hanging ? HANGING_SHAPES : SHAPES)[index]; } @Override diff --git a/src/main/java/galena/oreganized/content/effect/FogEffect.java b/src/main/java/galena/oreganized/content/effect/FogEffect.java new file mode 100644 index 00000000..d9e114b0 --- /dev/null +++ b/src/main/java/galena/oreganized/content/effect/FogEffect.java @@ -0,0 +1,20 @@ +package galena.oreganized.content.effect; + +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.LivingEntity; + +import java.util.function.Supplier; + +public class FogEffect extends MobEffect { + public FogEffect() { + super(MobEffectCategory.NEUTRAL, 2696993); + this.setFactorDataFactory(() -> new MobEffectInstance.FactorData(22)); + } + + @Override + public void applyEffectTick(LivingEntity entity, int amplifier) { + + } +} diff --git a/src/main/java/galena/oreganized/content/entity/holler/Holler.java b/src/main/java/galena/oreganized/content/entity/holler/Holler.java new file mode 100644 index 00000000..8914962a --- /dev/null +++ b/src/main/java/galena/oreganized/content/entity/holler/Holler.java @@ -0,0 +1,230 @@ +package galena.oreganized.content.entity.holler; + +import com.google.common.collect.ImmutableList; +import com.mojang.serialization.Dynamic; +import galena.oreganized.index.OBlocks; +import galena.oreganized.index.OEffects; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.protocol.game.DebugPackets; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.RandomSource; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffectUtil; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.*; +import net.minecraft.world.entity.ai.Brain; +import net.minecraft.world.entity.ai.attributes.AttributeSupplier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.ai.control.FlyingMoveControl; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.navigation.FlyingPathNavigation; +import net.minecraft.world.entity.ai.navigation.PathNavigation; +import net.minecraft.world.entity.ai.sensing.Sensor; +import net.minecraft.world.entity.ai.sensing.SensorType; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowyDirtBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +import javax.annotation.Nullable; +import java.time.LocalDate; +import java.time.temporal.ChronoField; + +public class Holler extends PathfinderMob { + + private static final ImmutableList>> SENSOR_TYPES = ImmutableList.of( + SensorType.NEAREST_LIVING_ENTITIES, + SensorType.NEAREST_PLAYERS, + SensorType.HURT_BY + ); + + + private static final ImmutableList> MEMORY_TYPES = ImmutableList.of( + MemoryModuleType.PATH, + MemoryModuleType.LOOK_TARGET, + MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, + MemoryModuleType.WALK_TARGET, + MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, + MemoryModuleType.NEAREST_PLAYERS, + MemoryModuleType.HURT_BY, + MemoryModuleType.IS_PANICKING + ); + + public Holler(EntityType entityType, Level level) { + super(entityType, level); + moveControl = new FlyingMoveControl(this, 20, true); + } + + protected Brain.Provider brainProvider() { + return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + } + + protected Brain makeBrain(Dynamic p_218344_) { + return HollerAi.makeBrain(brainProvider().makeBrain(p_218344_)); + } + + @Override + public Brain getBrain() { + return (Brain) super.getBrain(); + } + + @Override + public boolean removeWhenFarAway(double p_21542_) { + return false; + } + + @Override + protected void customServerAiStep() { + level().getProfiler().push("hollerBrain"); + getBrain().tick((ServerLevel)level(), this); + level().getProfiler().pop(); + level().getProfiler().push("hollerActivityUpdate"); + HollerAi.updateActivity(this); + level().getProfiler().pop(); + super.customServerAiStep(); + if ((tickCount + getId()) % 120 == 0) { + applyFogAround((ServerLevel) level(), position(), this, 20); + } + } + + public static void applyFogAround(ServerLevel level, Vec3 pos, @Nullable Entity source, int radius) { + MobEffectInstance mobeffectinstance = new MobEffectInstance(OEffects.FOG.get(), 260, 0, false, false); + MobEffectUtil.addEffectToPlayersAround(level, source, pos, radius, mobeffectinstance, 200); + } + + @Override + public void aiStep() { + super.aiStep(); + if (!level().isClientSide && isAlive() && tickCount % 10 == 0) { + heal(1.0F); + } + } + + @Override + protected void sendDebugPackets() { + super.sendDebugPackets(); + DebugPackets.sendEntityBrain(this); + } + + @Override + public void tick() { + noPhysics = true; + super.tick(); + noPhysics = false; + setNoGravity(true); + } + + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes() + .add(Attributes.MAX_HEALTH, 20.0) + .add(Attributes.FLYING_SPEED, 0.10000000149011612) + .add(Attributes.MOVEMENT_SPEED, 0.10000000149011612) + .add(Attributes.ATTACK_DAMAGE, 2.0) + .add(Attributes.FOLLOW_RANGE, 48.0); + } + + @Override + protected PathNavigation createNavigation(Level level) { + FlyingPathNavigation flyingpathnavigation = new FlyingPathNavigation(this, level); + flyingpathnavigation.setCanOpenDoors(false); + flyingpathnavigation.setCanFloat(true); + flyingpathnavigation.setCanPassDoors(true); + return flyingpathnavigation; + } + + @Override + public void travel(Vec3 vec3) { + if (isControlledByLocalInstance()) { + if (isInWater()) { + moveRelative(0.02F, vec3); + move(MoverType.SELF, getDeltaMovement()); + setDeltaMovement(getDeltaMovement().scale(0.800000011920929)); + } else if (isInLava()) { + moveRelative(0.02F, vec3); + move(MoverType.SELF, getDeltaMovement()); + setDeltaMovement(getDeltaMovement().scale(0.5)); + } else { + moveRelative(getSpeed(), vec3); + move(MoverType.SELF, getDeltaMovement()); + setDeltaMovement(getDeltaMovement().scale(0.9100000262260437)); + } + } + + calculateEntityAnimation(false); + tryCheckInsideBlocks(); + } + + @Override + protected void playStepSound(BlockPos pos, BlockState state) { + } + + @Override + protected void checkFallDamage(double p_218316_, boolean p_218317_, BlockState state, BlockPos pos) { + } + + @Override + protected SoundEvent getAmbientSound() { + return SoundEvents.ALLAY_AMBIENT_WITHOUT_ITEM; + } + + @Override + public SoundEvent getHurtSound(DamageSource damageSource) { + return SoundEvents.ALLAY_HURT; + } + + @Override + protected SoundEvent getDeathSound() { + return SoundEvents.VEX_DEATH; + } + + @Override + protected float getSoundVolume() { + return 0.4F; + } + + @Override + protected void onInsideBlock(BlockState state) { + if ((state.getBlock() instanceof SnowyDirtBlock || state.is(Blocks.DIRT)) && isPanicking()) { + BlockPos.withinManhattan(blockPosition(), 3, 1, 3).forEach(pos -> { + if (level().getBlockState(pos).getBlock() instanceof SnowyDirtBlock && level().random.nextFloat() < 0.25) + level().setBlockAndUpdate(pos, OBlocks.BURIAL_DIRT.get().withPropertiesOf(state)); + double x = getX()+0.5+random.nextInt(-100, 100)*0.01; + double y = getY()+1+random.nextInt(-100, 100)*0.01; + double z = getZ()+0.5+random.nextInt(-100, 100)*0.01; + if (!level().isClientSide) ((ServerLevel) level()).sendParticles(ParticleTypes.SMOKE, x, y, z, 3, 0, 0, 0, 0); + }); + + if (!level().isClientSide) { + ServerLevel level = (ServerLevel) level(); + double x = getX()+0.5+random.nextInt(-100, 100)*0.01; + double y = getY()+random.nextInt(-100, 100)*0.01; + double z = getZ()+0.5+random.nextInt(-100, 100)*0.01; + level.sendParticles(ParticleTypes.SMOKE, x, y, z, 3, 0, 0, 0, 0); + } + remove(RemovalReason.KILLED); + } + } + + public static boolean checkHollerSpawnRules(EntityType entityType, LevelAccessor levelAccessor, MobSpawnType spawnType, BlockPos pos, RandomSource random) { + return levelAccessor.getBrightness(LightLayer.SKY, pos) < random.nextInt(8) && random.nextInt(10) > (isHalloween() ? 2 : 5) && checkMobSpawnRules(entityType, levelAccessor, spawnType, pos, random); + } + + public boolean isPanicking() { + return brain.getMemory(MemoryModuleType.IS_PANICKING).isPresent(); + } + + private static boolean isHalloween() { + LocalDate $$0 = LocalDate.now(); + int $$1 = $$0.get(ChronoField.DAY_OF_MONTH); + int $$2 = $$0.get(ChronoField.MONTH_OF_YEAR); + return $$2 == 10 && $$1 >= 20 || $$2 == 11 && $$1 <= 3; + } +} diff --git a/src/main/java/galena/oreganized/content/entity/holler/HollerAi.java b/src/main/java/galena/oreganized/content/entity/holler/HollerAi.java new file mode 100644 index 00000000..d502d503 --- /dev/null +++ b/src/main/java/galena/oreganized/content/entity/holler/HollerAi.java @@ -0,0 +1,43 @@ +package galena.oreganized.content.entity.holler; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.mojang.datafixers.util.Pair; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.entity.ai.Brain; +import net.minecraft.world.entity.ai.behavior.*; +import net.minecraft.world.entity.schedule.Activity; + +public class HollerAi { + + public HollerAi() { + } + + protected static Brain makeBrain(Brain hollerBrain) { + initCoreActivity(hollerBrain); + initIdleActivity(hollerBrain); + hollerBrain.setCoreActivities(ImmutableSet.of(Activity.CORE)); + hollerBrain.setDefaultActivity(Activity.IDLE); + hollerBrain.useDefaultActivity(); + return hollerBrain; + } + + private static void initCoreActivity(Brain hollerBrain) { + hollerBrain.addActivity(Activity.CORE, 0, ImmutableList.of(new Swim(0.8F), new HollerPanic(3F), new LookAtTargetSink(45, 90), new MoveToTargetSink())); + } + + private static void initIdleActivity(Brain hollerBrain) { + hollerBrain.addActivity(Activity.IDLE, ImmutableList.of( + Pair.of(0, SetEntityLookTargetSometimes.create(6.0F, UniformInt.of(30, 60))), + Pair.of(1, new RunOne<>(ImmutableList.of( + Pair.of(RandomStroll.fly(1.0F), 2), + Pair.of(SetWalkTargetFromLookTarget.create(1.0F, 3), 2), + Pair.of(new DoNothing(30, 60), 1) + )))) + ); + } + + public static void updateActivity(Holler holler) { + holler.getBrain().setActiveActivityToFirstValid(ImmutableList.of(Activity.IDLE)); + } +} diff --git a/src/main/java/galena/oreganized/content/entity/holler/HollerPanic.java b/src/main/java/galena/oreganized/content/entity/holler/HollerPanic.java new file mode 100644 index 00000000..f482af85 --- /dev/null +++ b/src/main/java/galena/oreganized/content/entity/holler/HollerPanic.java @@ -0,0 +1,48 @@ +package galena.oreganized.content.entity.holler; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.FluidTags; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.behavior.AnimalPanic; +import net.minecraft.world.entity.ai.memory.MemoryModuleType; +import net.minecraft.world.entity.ai.memory.WalkTarget; +import net.minecraft.world.entity.ai.util.LandRandomPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowyDirtBlock; +import net.minecraft.world.phys.Vec3; + +import java.util.Optional; +import java.util.function.Predicate; + +public class HollerPanic extends AnimalPanic { + private final float speedMultiplier; + + public HollerPanic(float p_147385_) { + super(p_147385_); + this.speedMultiplier = p_147385_; + } + + @Override + protected void tick(ServerLevel level, PathfinderMob mob, long p_147405_) { + if (mob.getNavigation().isDone()) { + Vec3 panicPosition = this.getPanicPos(level, (Holler) mob); + if (panicPosition != null) { + mob.getBrain().setMemory(MemoryModuleType.WALK_TARGET, new WalkTarget(panicPosition, speedMultiplier, 0)); + } + } + } + + private Vec3 getPanicPos(ServerLevel level, Holler holler) { + Optional dirtPosition = lookForDirt(level, holler).map(Vec3::atBottomCenterOf); + return dirtPosition.orElseGet(() -> LandRandomPos.getPos(holler, 5, 5)); + } + + private Optional lookForDirt(BlockGetter blockGetter, Holler holler) { + BlockPos hollerPos = holler.blockPosition(); + Predicate isDirtBlock = (pos) -> (blockGetter.getBlockState(pos).getBlock() instanceof SnowyDirtBlock || blockGetter.getBlockState(pos).is(Blocks.DIRT)); + return BlockPos.findClosestMatch(hollerPos, 10, 10, isDirtBlock); + } +} diff --git a/src/main/java/galena/oreganized/data/OBlockStates.java b/src/main/java/galena/oreganized/data/OBlockStates.java index 81efa792..d4ba5e8a 100644 --- a/src/main/java/galena/oreganized/data/OBlockStates.java +++ b/src/main/java/galena/oreganized/data/OBlockStates.java @@ -112,6 +112,8 @@ protected void registerStatesAndModels() { simpleBlock(OBlocks.GROOVED_PACKED_ICE); simpleBlock(OBlocks.GROOVED_BLUE_ICE); + simpleBlock(OBlocks.BURIAL_DIRT); + gargoyleBlock(OBlocks.GARGOYLE); sepulcherBlock(OBlocks.SEPULCHER); simpleBlock(OBlocks.BONE_PILE.get(), models().cubeColumn(blockTexture(OBlocks.BONE_PILE.get()).getPath(), Oreganized.modLoc("block/bone_pile_side"), Oreganized.modLoc("block/sepulcher_rot_5"))); diff --git a/src/main/java/galena/oreganized/data/OItemModels.java b/src/main/java/galena/oreganized/data/OItemModels.java index 18e088e1..64cd5334 100644 --- a/src/main/java/galena/oreganized/data/OItemModels.java +++ b/src/main/java/galena/oreganized/data/OItemModels.java @@ -130,6 +130,7 @@ protected void registerModels() { block(OBlocks.GROOVED_PACKED_ICE); block(OBlocks.GROOVED_BLUE_ICE); + block(OBlocks.BURIAL_DIRT); block(OBlocks.SEPULCHER); block(OBlocks.BONE_PILE); OBlocks.vigilCandles().forEach(this::normalItem); diff --git a/src/main/java/galena/oreganized/data/OLootTables.java b/src/main/java/galena/oreganized/data/OLootTables.java index 42cdc6b1..8904ae84 100644 --- a/src/main/java/galena/oreganized/data/OLootTables.java +++ b/src/main/java/galena/oreganized/data/OLootTables.java @@ -113,6 +113,16 @@ protected void generate() { LootItem.lootTableItem(OBlocks.LEAD_BARS.get()) ))))); + add(OBlocks.BURIAL_DIRT.get(), LootTable.lootTable() + .withPool(LootPool.lootPool() + .setRolls(ConstantValue.exactly(1.0F)) + .add(AlternativesEntry.alternatives( + LootItem.lootTableItem(OBlocks.BURIAL_DIRT.get()) + .when(HAS_SILK_TOUCH), + LootItem.lootTableItem(Blocks.DIRT) + .when(HAS_NO_SILK_TOUCH) + )))); + //dropSelf(QCompatRegistry.GLANCE_PILLAR); //slab(QCompatRegistry.RAW_LEAD_BRICK_SLAB); //slab(QCompatRegistry.RAW_SILVER_BRICK_SLAB); @@ -169,7 +179,7 @@ public EntityLoot() { @Override public void generate() { - + add(OEntityTypes.HOLLER.get(), LootTable.lootTable()); } @Override diff --git a/src/main/java/galena/oreganized/data/provider/OBlockLootProvider.java b/src/main/java/galena/oreganized/data/provider/OBlockLootProvider.java index db527ac7..fedba0de 100644 --- a/src/main/java/galena/oreganized/data/provider/OBlockLootProvider.java +++ b/src/main/java/galena/oreganized/data/provider/OBlockLootProvider.java @@ -37,6 +37,12 @@ public void dropAsSilk(Supplier block) { super.dropWhenSilkTouch(block.get()); } + public void dropOtherWithoutSilk(Supplier block, Supplier other) { + super.dropWhenSilkTouch(block.get()); + + super.otherWhenSilkTouch(block.get(), other.get()); + } + public void dropWithSilk(Supplier block, Supplier drop) { add(block.get(), (result) -> createSingleItemTableWithSilkTouch(result, drop.get())); } diff --git a/src/main/java/galena/oreganized/index/OBlocks.java b/src/main/java/galena/oreganized/index/OBlocks.java index bf9a2c33..01955bdd 100644 --- a/src/main/java/galena/oreganized/index/OBlocks.java +++ b/src/main/java/galena/oreganized/index/OBlocks.java @@ -3,6 +3,7 @@ import com.google.common.collect.ImmutableBiMap; import com.teamabnormals.blueprint.core.util.registry.BlockSubRegistryHelper; import galena.oreganized.Oreganized; +import galena.oreganized.content.block.*; import galena.oreganized.content.block.BonePileBlock; import galena.oreganized.content.block.BulbBlock; import galena.oreganized.content.block.CrystalGlassBlock; @@ -145,6 +146,8 @@ private static BlockBehaviour.Properties leadDecoProperties() { public static final RegistryObject GROOVED_PACKED_ICE = register("grooved_packed_ice", () -> new Block(BlockBehaviour.Properties.copy(Blocks.PACKED_ICE).friction(0.6F))); public static final RegistryObject GROOVED_BLUE_ICE = register("grooved_blue_ice", () -> new Block(BlockBehaviour.Properties.copy(Blocks.BLUE_ICE).friction(0.6F))); + public static final RegistryObject BURIAL_DIRT = register("burial_dirt", () -> new BurialDirtBlock(BlockBehaviour.Properties.copy(Blocks.DIRT))); + public static final List> CRYSTAL_GLASS = List.of( WHITE_CRYSTAL_GLASS, ORANGE_CRYSTAL_GLASS, MAGENTA_CRYSTAL_GLASS, LIGHT_BLUE_CRYSTAL_GLASS, YELLOW_CRYSTAL_GLASS, LIME_CRYSTAL_GLASS, PINK_CRYSTAL_GLASS, GRAY_CRYSTAL_GLASS, LIGHT_GRAY_CRYSTAL_GLASS, diff --git a/src/main/java/galena/oreganized/index/OEffects.java b/src/main/java/galena/oreganized/index/OEffects.java index d95eceb5..f1a46467 100644 --- a/src/main/java/galena/oreganized/index/OEffects.java +++ b/src/main/java/galena/oreganized/index/OEffects.java @@ -1,6 +1,7 @@ package galena.oreganized.index; import galena.oreganized.Oreganized; +import galena.oreganized.content.effect.FogEffect; import galena.oreganized.content.effect.StunningEffect; import net.minecraft.world.effect.MobEffect; import net.minecraftforge.registries.DeferredRegister; @@ -12,4 +13,6 @@ public class OEffects { public static final DeferredRegister EFFECTS = DeferredRegister.create(ForgeRegistries.MOB_EFFECTS, Oreganized.MOD_ID); public static final RegistryObject STUNNING = EFFECTS.register("stunning", StunningEffect::new); + public static final RegistryObject FOG = EFFECTS.register("fog", FogEffect::new); + } diff --git a/src/main/java/galena/oreganized/index/OEntityTypes.java b/src/main/java/galena/oreganized/index/OEntityTypes.java index 0e59d51d..a65e7303 100644 --- a/src/main/java/galena/oreganized/index/OEntityTypes.java +++ b/src/main/java/galena/oreganized/index/OEntityTypes.java @@ -1,6 +1,7 @@ package galena.oreganized.index; import galena.oreganized.Oreganized; +import galena.oreganized.content.entity.holler.Holler; import galena.oreganized.content.entity.LeadBoltEntity; import galena.oreganized.content.entity.MinecartShrapnelBomb; import galena.oreganized.content.entity.ShrapnelBomb; @@ -18,4 +19,6 @@ public class OEntityTypes { public static final RegistryObject> SHRAPNEL_BOMB_MINECART = ENTITIES.register("shrapnel_bomb_minecart", () -> EntityType.Builder.of(MinecartShrapnelBomb::new, MobCategory.MISC).sized(0.98F, 0.7F).clientTrackingRange(8).build("shrapnel_bomb_minecart")); public static final RegistryObject> LEAD_BOLT = ENTITIES.register("lead_bolt", () -> EntityType.Builder.of(LeadBoltEntity::new, MobCategory.MISC).sized(0.5F, 0.5F).clientTrackingRange(4).updateInterval(20).build("lead_bolt")); + public static final RegistryObject> HOLLER = ENTITIES.register("holler", () -> EntityType.Builder.of(Holler::new, MobCategory.CREATURE).sized(0.35F, 0.6F).clientTrackingRange(8).updateInterval(2).build("holler")); + } diff --git a/src/main/java/galena/oreganized/index/OItems.java b/src/main/java/galena/oreganized/index/OItems.java index b2cc6856..59310568 100644 --- a/src/main/java/galena/oreganized/index/OItems.java +++ b/src/main/java/galena/oreganized/index/OItems.java @@ -13,18 +13,7 @@ import galena.oreganized.content.item.ScribeItem; import galena.oreganized.content.item.SilverMirrorItem; import net.minecraft.world.entity.vehicle.AbstractMinecart; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.AxeItem; -import net.minecraft.world.item.BucketItem; -import net.minecraft.world.item.HoeItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.PickaxeItem; -import net.minecraft.world.item.Rarity; -import net.minecraft.world.item.RecordItem; -import net.minecraft.world.item.ShieldItem; -import net.minecraft.world.item.ShovelItem; -import net.minecraft.world.item.SwordItem; +import net.minecraft.world.item.*; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.RegistryObject; @@ -97,4 +86,8 @@ public static Supplier compat(String modid, Function SHRAPNEL_BOMB_MINECART = HELPER.createItem("shrapnel_bomb_minecart", () -> new MinecartShrapnelBombItem(AbstractMinecart.Type.TNT, OEntityTypes.SHRAPNEL_BOMB_MINECART)); + + // Misc +// public static final RegistryObject HOLLER_SPAWN_EGG = HELPER.createItem("holler_spawn_egg", +// () -> new SpawnEggItem(OEntityTypes.HOLLER.get(), 56063, 44543, new Item.Properties())); } \ No newline at end of file diff --git a/src/main/resources/assets/oreganized/textures/entity/holler.png b/src/main/resources/assets/oreganized/textures/entity/holler.png index 0f08716b..5637861e 100644 Binary files a/src/main/resources/assets/oreganized/textures/entity/holler.png and b/src/main/resources/assets/oreganized/textures/entity/holler.png differ diff --git a/src/main/resources/data/oreganized/forge/biome_modifier/spawn_holler.json b/src/main/resources/data/oreganized/forge/biome_modifier/spawn_holler.json new file mode 100644 index 00000000..c2445e38 --- /dev/null +++ b/src/main/resources/data/oreganized/forge/biome_modifier/spawn_holler.json @@ -0,0 +1,10 @@ +{ + "type": "forge:add_spawns", + "biomes": "#minecraft:is_overworld", + "spawners": { + "type": "oreganized:holler", + "weight": 10, + "minCount": 1, + "maxCount": 2 + } +} \ No newline at end of file